diff --git a/Documents/Backlog/Product Backlog.md b/Documents/Backlog/Product Backlog.md index 198cfda..8964b15 100644 --- a/Documents/Backlog/Product Backlog.md +++ b/Documents/Backlog/Product Backlog.md @@ -2,29 +2,30 @@ | ID |User Story|Effort|Priority|Validation Criteria|Status|Who Completed This Task| |:---:|:---:|:---:|:---:|:---:|:---:|:---:| -|001|~~As a priest, I want to be able to change the order of the songs for each service.~~|3|HIGH|A portal will be accessible by all priest that add their church.|COMPLETED|Callum| -|002|~~As a priest, I want to be able to search through the sermons.~~|1|HIGH|Implement a list of the available songs to the left of the portals screen.|COMPLETED|Callum| -|003|As a priest, I want to be able to print the schedule for songs that will be sung this service, in order.|3|HIGH|There will be a print feature on the portal app.|INPOGRESS|Callum| -|004|~~As a priest, I want to be able to scroll on the portal when my songs go off the screen.~~|1|HIGH|Ability to scroll on the list exists.|COMPLETED|Callum| -|005|~~As a priest, I want to be able to select different days in a calendar and see the songs for that day.~~|4|MEDIUM|Ability to select a day on a calendar exists, and each day loads a different set of data.|COMPLETED|Callum| -|006|As a priest, I want to be able to set up a profile for my church so I can set up the songs independently of other churches.|3|MEDIUM|Ability to register a church and have a unique database for each church exists.|UNSTARTED|| -|007|As a priest, I want the portal to automatically set up the common songs.|8|LOW|Ability to have a pre-built day of songs based on what is common.|UNSTARTED|| -|025|~~As a priest I want to be able to remove songs from my playlist~~|4|HIGH|There will be a remove button next to every song in the playlist.|COMPLETED|Callum| -|008|~~As an administrator or priest, I want to be able to connect my PayPal account to the church’s profile on the app, so that my churchgoers can donate to my institution.~~|8|HIGH|Ability to register a PayPal account to a church to receive donations.|CANCELED|Scrapped, no way to make separate church accounts without something like Vimeo.| -|009|As a priest, I want to be able to set up an account for my church account.|6|HIGH|Ability to search registered churches by name exists.|UNSTARTED|| -|010|As a priest, I want to be able to sign into my church on the portal.|5|HIGH|Things won't be left out of date.|UNSTARTED|| -|011|~~As a churchgoer, I want to be able to access the options menu to edit the appearance of the application (font size, color)~~.|1|MEDUIM|There is a menu button on both the front page of the IOS and Android app.|COMPLETED|Wanda| -|012|~~As a churchgoer, I want to be able to select which church I attend so I can access the correct songs|5|HIGH|Ability to select a registered church from the app exists.~~|Completeed|Adrian & Wanda| -|013| ~~As a churchgoer, I want to be able to set the amount I am going to donate to the church, if at all.~~|4|LOW|Ability to set a number of dollars for donation exists. |CANCELED|Scrapped, no way to make separate church accounts without something like Vimeo.| -|014|~~As a churchgoer, I want to be able to manually be able to search for the church I attend out of all the registered churches.~~|4|HIGH|Ability to sign in to church profile exists.|CANCELED|Scrapped, no way to make separate church accounts without something like Vimeo.| -|015|As a churchgoer, I want to be able to see the current sermons that are been sung at the service.|3|LOW|As the user goes through the song, the app will take you straight from the current song to the next.|UNSTARTED|| -|016|As A member of the church, I want to be able to connect to an external device to get today sermons.|5|HIGH|We will allow users to connect to either a Raspberry Pi or Arduino, via Bluetooth to get the current service.|UNSTARTED|| -|017|As a churchgoer, I want to be able to access songs and sermons from previous and upcoming days.|4|MEDUIM|We will have a menu where you can select what day you want to view the sermons from.|UNSTARTED|| -|019|As an administrator or priest, I want to be able to add songs to the database.|3|MEDUIM|we will add a tab to allow priests to add songs to there churches database.|UNSTARTED|| -|020|As an administrator or priest, I want to be able to edit songs in the database.|2|LOW|we will add an edit button to the list of songs that you can choose from.|UNSTARTED|| -|022|As a priest, I want to be able to access the songs database via the net.|4|HIGH|We will have a portal website that accesses the database.|UNSTARTED|| -|023|As a priest I want to be able to choose from a list of songs to sing during the ceremony.|2|MEDUIM|There will be a SQL database with a selection of songs|UNSTARTED|| -|024|~~As a priest I want to be able to add songs to my playlist.~~|3|HIGH|There will be a list of the songs to add to the playlist.|COMPLETED|Callum| -|026|~~As a priest I want my list to be ordered once I have updated the order of the songs.~~|10|HIGH|There will be a button that once pressed it will update the order of songs on the portal.|COMPLETED|Callum| + | 001 | ~~As a priest, I want to be able to change the order of the songs for each service.~~ | 3 | HIGH | A portal will be accesible by all priest that add their church. | COMPLETED | Callum | + | 002 | ~~As a priest, I want to be able to search through the sermons.~~ | 1 | HIGH | Implement a list of the available songs to the left of the portals screen. | COMPLETED | Callum | + | 003 | ~~As a priest, I want to be able to print the schedule for songs that will be sung this service, in order.~~ | 3 | HIGH | There will be a print feature on the portal app. | COMPLETED | Callum | + | 004 | ~~As a priest, I want be able to scroll on the portal when my songs go off the screen.~~ | 1 | HIGH | Ability to scroll on the list exists. | COMPLETED | Callum | + | 005 | ~~As a priest, I want be able to select different days in a calendar and see the songs for that day. ~~| 4 | MEDIUM | Ability to select a day on a calendar exists, and each day loads a different set of data. | COMPLETED | Callum | + | 006 | ~~As a priest, I want to be able to set up a profile for my church so we I can set up the songs independently of other churches. ~~| 3 | MEDIUM | Ability to register a church and have a unique database for each church exists. | COMPLETED | Callum | + | 007 | As a priest, I want the portal to automatically set up the common songs. | 8 | LOW | Ability to have a pre-built day of songs based on what is common. | UNSTARTED | | + | 008 | As an administrator or priest, I want to be able to connect my PayPal account to the church’s profile on the app, so that my churchgoers can donate to my institution. | 8 | HIGH | Ability to register a PayPal account to a church to receive donations. | CANCELED | Scrapped, no way to make seperate church accounts without something like vimeo. | + | 009 | ~~As a priest, I want to be able to set up a account for my church account.~~ | 6 | HIGH | Ability to search registered churches by name exists.~~ | COMPLETED | Adrian, Wanda | + | 010 | ~~As a priest, I want to be able to sign into my church on the portal.~~ | 5 | HIGH | Things won't be left out of date. | COMPLETED | Callum | + | 011 | ~~As a churchgoer, I want to be able to access the options menu to edit the appearance of the application (font size, color)~~. | 1 | MEDUIM | There is a menu button on both the front page of the IOS and Android app. | COMPLETED | Adrian, Wanda | + | 012 | ~~As a churchgoer, I want to be able to select which church I attend so I can access the correct songs~~ | 5 | HIGH | Ability to select a registered church from the app exists. | COMPLETED | Adrian, Wanda | + | 013 | As a churchgoer, I want to be able to set the amount I am going to donate to the church, if at all. | 4 | LOW | Ability to set a number of dollars for donation exists. | CANCELED | Scrapped, no way to make seperate church accounts without something like vimeo. | + | 014 | ~~As a churchgoer, I want to be able to manually be able to search for the church I attend out of all the registered churches.~~ | 4 | HIGH | Ability to sign in to church profile exists. | COMPLETED | Adrian, Wanda | + | 015 | As a churchgoer, I want to be able to see the current sermons that is been sung at the service. | 3 | LOW | As the user goes through the song, the app will take you straight from the current song to the next. | UNSTARTED | | + | 016 | As A member of the church, I want to be able to connect to a external device to get today sermons. | 5 | HIGH | We will allow users to connect to either a raspberry Pi or Arduino, via bluetooth to get the current service. | UNSTARTED | | + | 017 | ~~As a churchgoer, I want to be able to access songs and sermons from previous and upcoming days.~~ | 4 | MEDUIM | We will have a menu were you can select what day you want to view the sermons from. | COMPLETED | Adrian, Wanda | + | 019 | ~~As an administrator or priest, I want to be able to add songs to the database.~~ | 3 | MEDUIM | we will add a tab to allow priests to add songs to there churches database. | COMPLETED | Callum | + | 020 | ~~As an administrator or priest, I want to be able to edit songs in the database.~~ | 2 | LOW | we will add a edit putton to the list of songs that you can choose from. | COMPLETED | Callum | + | 021 | As an priest, I want to be able to see the length of the song in the database. | 10 | LOW | Each song is accompanied by the word count. | UNSTARTED | | + | 022 | ~~As a priest, I want to be able to access the songs database via the net.~~ | 4 | HIGH | We will have a portal website that accesses the database. | COMPLETED | Callum, Adrian, Wanda | + | 023 | ~~As a priest I want to be able choose from a list of songs to sing during the ceremony.~~ | 2 | MEDUIM | There will be a SQL database with a selection of songs | COMPLETED | Callum | + | 024 | ~~As a priest I want to be able to add songs to my playlist~~ | 3 | HIGH | There will be a list of the songs to add to the playlist. | COMPLETED | Callum | + | 025 | ~~As a priest I want to be able to remove songs from my playlist~~ | 4 | HIGH | There will be a remove button next to every song in the playlist. | COMPLETED | Callum | + | 025 | ~~As a priest I want my list to be ordered once I have updated the order of the songs.~~ | 10 | HIGH | There will be a button that once pressed it will update the order of songs on the portal. | COMPLETED | Callum | [Link for an easier time to edit. This data is not connected to this link will likely be more up to date](https://docs.google.com/spreadsheets/d/1XN6rKwXLS9GsNlR3xUBHYqMU5o3qh3YpbnUO6bJzAT0/edit?usp=sharing) diff --git a/Documents/Backlog/Sprint 3 Backlog.md b/Documents/Backlog/Sprint 3 Backlog.md new file mode 100644 index 0000000..50d8e06 --- /dev/null +++ b/Documents/Backlog/Sprint 3 Backlog.md @@ -0,0 +1,13 @@ +# Sprint 3 Backlog + +| ID |User Story|Effort|Priority|Validation Criteria|Status|Who Completed This Task| +|:---:|:---:|:---:|:---:|:---:|:---:|:---:| +| 006 | As a priest, I want to be able to set up a profile for my church so I can set up the songs independently of other churches. | 3 | MEDUIM | Ability to register a church and have a unique database for each church exists. | COMPLETED | Callum| +| 009 | As a priest, I want to be able to set up an account for my church account. | 6 | HIGH | Ability to search registered churches by name exists. | COMPLETED | Callum| +| 010 | As a priest, I want to be able to sign into my church on the portal. | 5 | HIGH | Things won't be left out of date. | COMPLETED | Callum| +| 019 | As an administrator or priest, I want to be able to add songs to the database. | 3 | MEDUIM | we will add a tab to allow priests to add songs to there churches database. | COMPLETED | Callum| +| 022 | As a priest, I want to be able to access the songs database via the net. | 4 | HIGH | We will have a portal website that accesses the database. | COMPLETED | Callum, Adrian, Wanda | +| 023 | As a priest I want to be able to choose from a list of songs to sing during the ceremony. | 2 | MEDUIM | There will be a SQL database with a selection of songs | COMPLETED | Callum| +| 012 | As a churchgoer, I want to be able to select which church I attend so I can access the correct songs | 5 | HIGH | Ability to select a registered church from the app exists. | COMPLETED | Adrian, Wanda| + +[Link for an easier time to edit. This data is not connected to this link will likely be more up to date](https://docs.google.com/spreadsheets/d/1XN6rKwXLS9GsNlR3xUBHYqMU5o3qh3YpbnUO6bJzAT0/edit?usp=sharing) diff --git a/Documents/Diagrams/README.md b/Documents/Diagrams/README.md index e5c9667..cc063f1 100644 --- a/Documents/Diagrams/README.md +++ b/Documents/Diagrams/README.md @@ -9,7 +9,8 @@ You should have a diagram of your high level architecture in this section, along You should have an UML class diagram in this section, along with a description of each class and a table that relates each component to one or more user stories. At a minimum, you need 1 diagram of your major classes. You are encouraged to also include more detailed diagrams that include all of your classes. -[UML Diagram](https://github.com/CallumCoy/Scriptor/blob/master/Documents/Diagrams/UML%20Plan.md) +- [UML Diagram](https://github.com/CallumCoy/Scriptor/blob/master/Documents/Diagrams/UML%20Plan.md) +- [HTML Class Digram](https://github.com/CallumCoy/Scriptor/blob/master/Documents/Diagrams/html%20Class%20Diagram.md) # Data Design diff --git a/Documents/Diagrams/UML Plan.md b/Documents/Diagrams/UML Plan.md index a2058a3..0dc36a2 100644 --- a/Documents/Diagrams/UML Plan.md +++ b/Documents/Diagrams/UML Plan.md @@ -1 +1,5 @@ -![basic UML plan](https://i.gyazo.com/c817a60dbd7fb8ae60ed37d926719c7f.png) +Android: +![Android UML plan](https://i.gyazo.com/8a0d5ca8286acc739aa0af6fba0a3dca.png) + +iOS: +![iOS UML plan](https://i.gyazo.com/3f891fea987192534d9f2577886a8553.jpg) diff --git a/Documents/Diagrams/html Class Diagram.md b/Documents/Diagrams/html Class Diagram.md new file mode 100644 index 0000000..11e0b9f --- /dev/null +++ b/Documents/Diagrams/html Class Diagram.md @@ -0,0 +1 @@ +![html Class Diagram](https://i.gyazo.com/deba21a4fa7a707718934b2b25600943.png) diff --git a/Documents/Requirements.md b/Documents/Requirements.md index a00f943..1b5eda6 100644 --- a/Documents/Requirements.md +++ b/Documents/Requirements.md @@ -2,40 +2,40 @@ | Requirement # | User Story # | Requirement | Status | |:---:|:---:|:---:|:---:| -| 000 | 001 | There will be a text box to input a numeric value. | COMPLETED | -| 001 | 001 | Upon pressing the submit button, the portal will then change the order on the database. | COMPLETED | -| 002 | 002 | There will be a list of songs that can be added. | COMPLETED | -| 003 | 002 | This song will be updated accordingly to the database. | UNSTARTED | -| 004 | 003 | There will be a button that will invoke the submit function, then print out the updated schedule. | UNSTARTED | -| 005 | 004 | There will be a scroll bar for the available songs. | COMPLETED | -| 006 | 004 | There will be a scroll bar for the list of songs. | COMPLETED | -| 007 | 005 | There will be a drop down bar for the day, month, and year. | COMPLETED | -| 008 | 005 | Upon clicking the search button the portal will pull the set songs for that day. | UNSTARTED | -| 009 | 006 | Upon entering out portal sight there will be a register button to create a account on our database. | UNSTARTED | -| 010 | 007 | Our database will have a defualt list for each day. | UNSTARTED | -| 012 | 009 | The curch tag will have a auto complete sequence. | COMPLETED | -| 013 | 010 | On the front page of our portal there will be text box for church and password. | COMPLETED | -| 014 | 010 | Upon entering the correct combination you can access the portal. | UNSTARTED | -| 015 | 011 | There will be a gear to the bottom right of the main page. | COMPLETE | -| 016 | 011 | There will be a change font size option. | COMPLETE | -| 017 | 011 | There will be a change colour option. | COMPLETED | -| 018 | 012 | There will a be a text box for you to enter the church you attend. | COMPLETED | -| 019 | 013 | ~~There will be a selection of commonly donated amounts as buttons.~~ | CANCELLED | -| 020 | 013 | ~~There will be a custom input box for those that don't want any of the options.~~ | CANCELLED | -| 021 | 014 | The search for church text box from requirement 12 will have a autocomplete function. | COMPLETED | -| 022 | 015 | The app will autamatical change song, based off of a timer for how long each song is. | UNSTARTED | -| 023 | 016 | There will be a Arduino that allows people to connect via bluetooth. | UNSTARTED | -| 024 | 016 | Once connected, the Arduino will update Scripto. | UNSTARTED | -| 025 | 017 | On the main menu there will be a dropdown bar to select the date. | UNSTARTED | -| 026 | 017 | Upon pressing view it will take you to the sermons from that day. | UNSTARTED | -| 028 | 019 | On the portal we will have a second page for adding/editing songs. | UNSTARTED | -| 029 | 019 | There will be a section to input a .txt document. | UNSTARTED | -| 030 | 020 | Upon selecting a song from the adding/editing page, the textbox will fill up with text from the repected song. | UNSTARTED | -| 031 | 020 | Upon clicking submit it will update the song. | UNSTARTED | -| 032 | 021 | Each song within the database will have a word count with it. | UNSTARTED | -| 033 | 022 | The app will connect to the song list database. | UNSTARTED | -| 034 | 022 | The portal will connect to the database. | UNSTARTED | -| 035 | 023 | The list of songs from requirement 1 will pull data from the song database. | UNSTARTED | -| 036 | 024 |There will be a submit button, that will look at the list of selected songs and the inputted order. It will then rearange them so that the songs reflect the user inputted order.|COMPLETED| +| 000 | 001 | There will be a text box to input a numeric value. | COMPLETED | +| 001 | 001 | Upon pressing the submit button, the portal will then change the order on the database. | COMPLETED | +| 002 | 002 | There will be a list of songs that can be added. | COMPLETED | +| 003 | 002 | This song will be updated accordingly to the database | COMPLETED | +| 004 | 003 | There will be a button that will invoke the submit function, then print out the updated schedule. | INPROGRESS | +| 005 | 004 | There will be a scroll bar for the available songs. | COMPLETED | +| 006 | 004 | There will be a scroll bar for the list of songs | COMPLETED | +| 007 | 005 | There will be a drop down bar for the day, month, and year. | COMPLETED | +| 008 | 005 | Upon clicking the search button the portal will pull the set songs for that day. | COMPLETED | +| 009 | 006 | Upon entering out portal sight there will be a register button to create a account on our database | COMPLETED | +| 010 | 007 | Our database will have a defualt list for each day | UNSTARTED | +| 012 | 009 | The curch tag will have a auto complete sequence. | COMPLETED | +| 013 | 010 | On the front page of our portal there will be text box for church and password. | COMPLETED | +| 014 | 010 | Upon entering the correct combination you can access the portal. | COMPLETED | +| 015 | 011 | There will be a gear to the bottom right of the main page. | COMPLETE | +| 016 | 011 | There will be a change font size option | COMPLETE | +| 017 | 011 | There will be a change colour option. | INPROGRESS | +| 018 | 012 | There will a be a text box for you to enter the church you attend | COMPLETED | +| 019 | 013 | There will be a selection of commonly donated amounts as buttons. | CANCELED | +| 020 | 013 | There will be a custom input box for those that don't want any of the options. | CANCELED | +| 021 | 014 | The search for church text box from requirement 12 will have a autocomplete function. | UNSTARTED | +| 022 | 015 | The app will automatically change song, based off of a timer for how long each song is. | UNSTARTED | +| 023 | 016 | There will be a Arduino that allows people to connect via bluetooth. | UNSTARTED | +| 024 | 016 | Once connected, the Arduino will update Scripto | UNSTARTED | +| 025 | 017 | On the main menu there will be a dropdown bar to select the date | COMPLETED | +| 026 | 017 | Upon pressing view it will take you to the sermons from that day | COMPLETED | +| 028 | 019 | On the portal we will have a second page for adding/editing songs | COMPLETED | +| 029 | 019 | There will be a section to input a .txt document. | UNSTARTED | +| 030 | 020 | Upon selecting a song from the adding/editing page, the textbox will fill up with text from the repected song | COMPLETED | +| 031 | 020 | Upon clicking submit it will update the song | COMPLETED | +| 032 | 021 | Each song within the database will have a words count accomenied with it. | UNSTARTED | +| 033 | 022 | The app will connect to the song list database. | COMPLETED | +| 034 | 022 | The portal will connect to the database. | COMPLETED | +| 035 | 023 | The list of songs from requirement 1 will pull data from the song database. | COMPLETED | +| 036 | 024 | There will be a submit button, that will look at the list of selected songs and the inputted order. It will then rearange them so that the songs reflect the user inputted order. | COMPLETED | [Can also be found on the spreed sheet](https://docs.google.com/spreadsheets/d/1XN6rKwXLS9GsNlR3xUBHYqMU5o3qh3YpbnUO6bJzAT0/edit#gid=1934002586) diff --git a/README.md b/README.md index 3b875c0..db58084 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,26 @@ For Sprint two we hope to have all of the mandatory features for the portal, and - [Andriod Code](https://github.com/CallumCoy/Scriptor/tree/master/code/Android%20App) - [IOS Code](https://github.com/CallumCoy/Scriptor/tree/master/code/iOS) - [Web Code](https://github.com/CallumCoy/Scriptor/tree/master/code/Portal) +- Test Cases + - [Android Manual Test Cases](https://github.com/CallumCoy/Scriptor/tree/master/code/Android%20App/Manual%20Tests) + - [Android Automatic Test Cases](https://github.com/CallumCoy/Scriptor/tree/master/code/Android%20App/src/test/java/com/scriptor) +- [Product Demonstration(this link will redirect you to Youtube)](https://www.youtube.com/watch?v=A906-8VW6pE&feature=youtu.be) + +# Sprint 3 + +For Sprint two we hope to have all of the mandatory features for the portal, and the phone apps. Along with we want to have the database set up. + +- [Product Backlog](https://github.com/CallumCoy/Scriptor/blob/master/Documents/Backlog/Product%20Backlog.md) +- [Current Sprint Backlog](https://github.com/CallumCoy/Scriptor/blob/master/Documents/Backlog/Sprint%203%20Backlog.md) + - [Burndown Chart (This will redirect you to Google Sheets)](https://docs.google.com/spreadsheets/d/1lUnZI9tesP9iD1U9ASGLT4vclyECX21mVmoN7oNkOxo/edit?usp=sharing) +- [Design Documents](https://github.com/CallumCoy/Scriptor/tree/master/Documents/Diagrams) + - [UML Plan](https://github.com/CallumCoy/Scriptor/blob/master/Documents/Diagrams/UML%20Plan.md) + - [SQL plan](https://github.com/CallumCoy/Scriptor/blob/master/Documents/Diagrams/SQL%20Database.md) + - [HTML Design Plan](https://github.com/CallumCoy/Scriptor/blob/Cal's-Branch/Documents/Diagrams/htmlDiagram.md) +- [Source Code](https://github.com/CallumCoy/Scriptor/tree/master/code) + - [Andriod Code](https://github.com/CallumCoy/Scriptor/tree/master/code/Android%20App) + - [IOS Code](https://github.com/CallumCoy/Scriptor/tree/master/code/iOS) + - [Web Code](https://github.com/CallumCoy/Scriptor/tree/master/code/Portal) - Test Cases - [Android Manual Test Cases](https://github.com/CallumCoy/Scriptor/tree/master/code/Android%20App/Manual%20Tests) - [Android Automatic Test Cases](https://github.com/CallumCoy/Scriptor/tree/master/code/Android%20App/src/test/java/com/scriptor) @@ -67,3 +87,6 @@ For Sprint two we hope to have all of the mandatory features for the portal, and - [Manual Testing](https://github.com/CallumCoy/Scriptor/blob/master/code/Portal/Manual%20Tests%20for%20the%20portal.md) - [Automatic Testing](https://github.com/CallumCoy/Scriptor/blob/master/code/Portal/js/automaticTests.js) - [Product Demonstration(this link will redirect you to Youtube)](https://www.youtube.com/watch?v=A906-8VW6pE&feature=youtu.be) + - [Website](https://www.youtube.com/watch?v=ZwAPcq655C4&feature=youtu.be) + - [Android App](https://youtu.be/tDg5Sfv2wHw) + - [Complete Project](https://youtu.be/G18yTy3goSE) diff --git a/code/.DS_Store b/code/.DS_Store new file mode 100644 index 0000000..51b4737 Binary files /dev/null and b/code/.DS_Store differ diff --git a/code/Android App/.DS_Store b/code/Android App/.DS_Store deleted file mode 100644 index a080101..0000000 Binary files a/code/Android App/.DS_Store and /dev/null differ diff --git a/code/Android App/Manual Tests/TEST011.txt b/code/Android App/Manual Tests/TEST011.txt index bf18b39..6ab938a 100644 --- a/code/Android App/Manual Tests/TEST011.txt +++ b/code/Android App/Manual Tests/TEST011.txt @@ -10,4 +10,5 @@ Observation: Should change text to smaller size Step 3: Action: Repeat step 2 for normal, medium, and large buttons + Observation: Should change text size in respect to button being clicked. diff --git a/code/Android App/Manual Tests/TEST015.txt b/code/Android App/Manual Tests/TEST015.txt index 361880d..5f0ec6a 100644 --- a/code/Android App/Manual Tests/TEST015.txt +++ b/code/Android App/Manual Tests/TEST015.txt @@ -9,4 +9,5 @@ For now: Step 1: Action: Click on Click to View Today's Songs and Sermons button that should be on homepage -Observation: The button should disappear and song list should appear + +Observation: The button should disappear and song list should appear \ No newline at end of file diff --git a/code/Android App/app.iml b/code/Android App/app.iml deleted file mode 100755 index 39aa7f1..0000000 --- a/code/Android App/app.iml +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/code/Android App/build.gradle b/code/Android App/build.gradle deleted file mode 100755 index e888ff7..0000000 --- a/code/Android App/build.gradle +++ /dev/null @@ -1,29 +0,0 @@ -apply plugin: 'com.android.application' - -android { - compileSdkVersion 28 - defaultConfig { - applicationId "com.scriptor" - minSdkVersion 15 - targetSdkVersion 28 - versionCode 1 - versionName "1.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'com.android.support:appcompat-v7:28.0.0' - implementation 'com.android.support.constraint:constraint-layout:1.1.3' - implementation 'com.android.support:design:28.0.0' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'com.android.support.test:runner:1.0.2' - androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/arch/core/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/arch/core/R.java deleted file mode 100755 index 12cade9..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/arch/core/R.java +++ /dev/null @@ -1,12 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.arch.core; - -public final class R { - private R() {} - -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/arch/lifecycle/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/arch/lifecycle/R.java deleted file mode 100755 index 0f10659..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/arch/lifecycle/R.java +++ /dev/null @@ -1,12 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.arch.lifecycle; - -public final class R { - private R() {} - -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/arch/lifecycle/livedata/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/arch/lifecycle/livedata/R.java deleted file mode 100755 index ff73747..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/arch/lifecycle/livedata/R.java +++ /dev/null @@ -1,12 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.arch.lifecycle.livedata; - -public final class R { - private R() {} - -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/arch/lifecycle/livedata/core/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/arch/lifecycle/livedata/core/R.java deleted file mode 100755 index 198f37a..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/arch/lifecycle/livedata/core/R.java +++ /dev/null @@ -1,12 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.arch.lifecycle.livedata.core; - -public final class R { - private R() {} - -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/arch/lifecycle/viewmodel/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/arch/lifecycle/viewmodel/R.java deleted file mode 100755 index cac0df7..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/arch/lifecycle/viewmodel/R.java +++ /dev/null @@ -1,12 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.arch.lifecycle.viewmodel; - -public final class R { - private R() {} - -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/asynclayoutinflater/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/asynclayoutinflater/R.java deleted file mode 100755 index 343b5a8..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/asynclayoutinflater/R.java +++ /dev/null @@ -1,183 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.support.asynclayoutinflater; - -public final class R { - private R() {} - - public static final class attr { - private attr() {} - - public static final int alpha = 0x7f040027; - public static final int font = 0x7f0400d7; - public static final int fontProviderAuthority = 0x7f0400d9; - public static final int fontProviderCerts = 0x7f0400da; - public static final int fontProviderFetchStrategy = 0x7f0400db; - public static final int fontProviderFetchTimeout = 0x7f0400dc; - public static final int fontProviderPackage = 0x7f0400dd; - public static final int fontProviderQuery = 0x7f0400de; - public static final int fontStyle = 0x7f0400df; - public static final int fontVariationSettings = 0x7f0400e0; - public static final int fontWeight = 0x7f0400e1; - public static final int ttcIndex = 0x7f040208; - } - public static final class color { - private color() {} - - public static final int notification_action_color_filter = 0x7f06006a; - public static final int notification_icon_bg_color = 0x7f06006b; - public static final int ripple_material_light = 0x7f060075; - public static final int secondary_text_default_material_light = 0x7f060077; - } - public static final class dimen { - private dimen() {} - - public static final int compat_button_inset_horizontal_material = 0x7f07004e; - public static final int compat_button_inset_vertical_material = 0x7f07004f; - public static final int compat_button_padding_horizontal_material = 0x7f070050; - public static final int compat_button_padding_vertical_material = 0x7f070051; - public static final int compat_control_corner_material = 0x7f070052; - public static final int compat_notification_large_icon_max_height = 0x7f070053; - public static final int compat_notification_large_icon_max_width = 0x7f070054; - public static final int notification_action_icon_size = 0x7f0700c5; - public static final int notification_action_text_size = 0x7f0700c6; - public static final int notification_big_circle_margin = 0x7f0700c7; - public static final int notification_content_margin_start = 0x7f0700c8; - public static final int notification_large_icon_height = 0x7f0700c9; - public static final int notification_large_icon_width = 0x7f0700ca; - public static final int notification_main_column_padding_top = 0x7f0700cb; - public static final int notification_media_narrow_margin = 0x7f0700cc; - public static final int notification_right_icon_size = 0x7f0700cd; - public static final int notification_right_side_padding_top = 0x7f0700ce; - public static final int notification_small_icon_background_padding = 0x7f0700cf; - public static final int notification_small_icon_size_as_large = 0x7f0700d0; - public static final int notification_subtext_size = 0x7f0700d1; - public static final int notification_top_pad = 0x7f0700d2; - public static final int notification_top_pad_large_text = 0x7f0700d3; - } - public static final class drawable { - private drawable() {} - - public static final int notification_action_background = 0x7f08006b; - public static final int notification_bg = 0x7f08006c; - public static final int notification_bg_low = 0x7f08006d; - public static final int notification_bg_low_normal = 0x7f08006e; - public static final int notification_bg_low_pressed = 0x7f08006f; - public static final int notification_bg_normal = 0x7f080070; - public static final int notification_bg_normal_pressed = 0x7f080071; - public static final int notification_icon_background = 0x7f080072; - public static final int notification_template_icon_bg = 0x7f080073; - public static final int notification_template_icon_low_bg = 0x7f080074; - public static final int notification_tile_bg = 0x7f080075; - public static final int notify_panel_notification_icon_bg = 0x7f080076; - } - public static final class id { - private id() {} - - public static final int action_container = 0x7f09000d; - public static final int action_divider = 0x7f09000f; - public static final int action_image = 0x7f090010; - public static final int action_text = 0x7f090017; - public static final int actions = 0x7f090018; - public static final int async = 0x7f09001e; - public static final int blocking = 0x7f090022; - public static final int chronometer = 0x7f09002b; - public static final int forever = 0x7f09004f; - public static final int icon = 0x7f090056; - public static final int icon_group = 0x7f090057; - public static final int info = 0x7f09005a; - public static final int italic = 0x7f09005c; - public static final int line1 = 0x7f090062; - public static final int line3 = 0x7f090063; - public static final int normal = 0x7f090071; - public static final int notification_background = 0x7f090073; - public static final int notification_main_column = 0x7f090074; - public static final int notification_main_column_container = 0x7f090075; - public static final int right_icon = 0x7f090082; - public static final int right_side = 0x7f090083; - public static final int tag_transition_group = 0x7f0900b1; - public static final int tag_unhandled_key_event_manager = 0x7f0900b2; - public static final int tag_unhandled_key_listeners = 0x7f0900b3; - public static final int text = 0x7f0900b4; - public static final int text2 = 0x7f0900b5; - public static final int time = 0x7f0900bd; - public static final int title = 0x7f0900be; - } - public static final class integer { - private integer() {} - - public static final int status_bar_notification_info_maxnum = 0x7f0a000e; - } - public static final class layout { - private layout() {} - - public static final int notification_action = 0x7f0c0030; - public static final int notification_action_tombstone = 0x7f0c0031; - public static final int notification_template_custom_big = 0x7f0c0032; - public static final int notification_template_icon_group = 0x7f0c0033; - public static final int notification_template_part_chronometer = 0x7f0c0034; - public static final int notification_template_part_time = 0x7f0c0035; - } - public static final class string { - private string() {} - - public static final int status_bar_notification_info_overflow = 0x7f0f0037; - } - public static final class style { - private style() {} - - public static final int TextAppearance_Compat_Notification = 0x7f10011c; - public static final int TextAppearance_Compat_Notification_Info = 0x7f10011d; - public static final int TextAppearance_Compat_Notification_Line2 = 0x7f10011e; - public static final int TextAppearance_Compat_Notification_Time = 0x7f10011f; - public static final int TextAppearance_Compat_Notification_Title = 0x7f100120; - public static final int Widget_Compat_NotificationActionContainer = 0x7f1001c6; - public static final int Widget_Compat_NotificationActionText = 0x7f1001c7; - } - public static final class styleable { - private styleable() {} - - public static final int[] ColorStateListItem = { 0x10101a5, 0x101031f, 0x7f040027 }; - public static final int ColorStateListItem_android_color = 0; - public static final int ColorStateListItem_android_alpha = 1; - public static final int ColorStateListItem_alpha = 2; - public static final int[] FontFamily = { 0x7f0400d9, 0x7f0400da, 0x7f0400db, 0x7f0400dc, 0x7f0400dd, 0x7f0400de }; - public static final int FontFamily_fontProviderAuthority = 0; - public static final int FontFamily_fontProviderCerts = 1; - public static final int FontFamily_fontProviderFetchStrategy = 2; - public static final int FontFamily_fontProviderFetchTimeout = 3; - public static final int FontFamily_fontProviderPackage = 4; - public static final int FontFamily_fontProviderQuery = 5; - public static final int[] FontFamilyFont = { 0x1010532, 0x1010533, 0x101053f, 0x101056f, 0x1010570, 0x7f0400d7, 0x7f0400df, 0x7f0400e0, 0x7f0400e1, 0x7f040208 }; - public static final int FontFamilyFont_android_font = 0; - public static final int FontFamilyFont_android_fontWeight = 1; - public static final int FontFamilyFont_android_fontStyle = 2; - public static final int FontFamilyFont_android_ttcIndex = 3; - public static final int FontFamilyFont_android_fontVariationSettings = 4; - public static final int FontFamilyFont_font = 5; - public static final int FontFamilyFont_fontStyle = 6; - public static final int FontFamilyFont_fontVariationSettings = 7; - public static final int FontFamilyFont_fontWeight = 8; - public static final int FontFamilyFont_ttcIndex = 9; - public static final int[] GradientColor = { 0x101019d, 0x101019e, 0x10101a1, 0x10101a2, 0x10101a3, 0x10101a4, 0x1010201, 0x101020b, 0x1010510, 0x1010511, 0x1010512, 0x1010513 }; - public static final int GradientColor_android_startColor = 0; - public static final int GradientColor_android_endColor = 1; - public static final int GradientColor_android_type = 2; - public static final int GradientColor_android_centerX = 3; - public static final int GradientColor_android_centerY = 4; - public static final int GradientColor_android_gradientRadius = 5; - public static final int GradientColor_android_tileMode = 6; - public static final int GradientColor_android_centerColor = 7; - public static final int GradientColor_android_startX = 8; - public static final int GradientColor_android_startY = 9; - public static final int GradientColor_android_endX = 10; - public static final int GradientColor_android_endY = 11; - public static final int[] GradientColorItem = { 0x10101a5, 0x1010514 }; - public static final int GradientColorItem_android_color = 0; - public static final int GradientColorItem_android_offset = 1; - } -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/compat/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/compat/R.java deleted file mode 100755 index 724f429..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/compat/R.java +++ /dev/null @@ -1,183 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.support.compat; - -public final class R { - private R() {} - - public static final class attr { - private attr() {} - - public static final int alpha = 0x7f040027; - public static final int font = 0x7f0400d7; - public static final int fontProviderAuthority = 0x7f0400d9; - public static final int fontProviderCerts = 0x7f0400da; - public static final int fontProviderFetchStrategy = 0x7f0400db; - public static final int fontProviderFetchTimeout = 0x7f0400dc; - public static final int fontProviderPackage = 0x7f0400dd; - public static final int fontProviderQuery = 0x7f0400de; - public static final int fontStyle = 0x7f0400df; - public static final int fontVariationSettings = 0x7f0400e0; - public static final int fontWeight = 0x7f0400e1; - public static final int ttcIndex = 0x7f040208; - } - public static final class color { - private color() {} - - public static final int notification_action_color_filter = 0x7f06006a; - public static final int notification_icon_bg_color = 0x7f06006b; - public static final int ripple_material_light = 0x7f060075; - public static final int secondary_text_default_material_light = 0x7f060077; - } - public static final class dimen { - private dimen() {} - - public static final int compat_button_inset_horizontal_material = 0x7f07004e; - public static final int compat_button_inset_vertical_material = 0x7f07004f; - public static final int compat_button_padding_horizontal_material = 0x7f070050; - public static final int compat_button_padding_vertical_material = 0x7f070051; - public static final int compat_control_corner_material = 0x7f070052; - public static final int compat_notification_large_icon_max_height = 0x7f070053; - public static final int compat_notification_large_icon_max_width = 0x7f070054; - public static final int notification_action_icon_size = 0x7f0700c5; - public static final int notification_action_text_size = 0x7f0700c6; - public static final int notification_big_circle_margin = 0x7f0700c7; - public static final int notification_content_margin_start = 0x7f0700c8; - public static final int notification_large_icon_height = 0x7f0700c9; - public static final int notification_large_icon_width = 0x7f0700ca; - public static final int notification_main_column_padding_top = 0x7f0700cb; - public static final int notification_media_narrow_margin = 0x7f0700cc; - public static final int notification_right_icon_size = 0x7f0700cd; - public static final int notification_right_side_padding_top = 0x7f0700ce; - public static final int notification_small_icon_background_padding = 0x7f0700cf; - public static final int notification_small_icon_size_as_large = 0x7f0700d0; - public static final int notification_subtext_size = 0x7f0700d1; - public static final int notification_top_pad = 0x7f0700d2; - public static final int notification_top_pad_large_text = 0x7f0700d3; - } - public static final class drawable { - private drawable() {} - - public static final int notification_action_background = 0x7f08006b; - public static final int notification_bg = 0x7f08006c; - public static final int notification_bg_low = 0x7f08006d; - public static final int notification_bg_low_normal = 0x7f08006e; - public static final int notification_bg_low_pressed = 0x7f08006f; - public static final int notification_bg_normal = 0x7f080070; - public static final int notification_bg_normal_pressed = 0x7f080071; - public static final int notification_icon_background = 0x7f080072; - public static final int notification_template_icon_bg = 0x7f080073; - public static final int notification_template_icon_low_bg = 0x7f080074; - public static final int notification_tile_bg = 0x7f080075; - public static final int notify_panel_notification_icon_bg = 0x7f080076; - } - public static final class id { - private id() {} - - public static final int action_container = 0x7f09000d; - public static final int action_divider = 0x7f09000f; - public static final int action_image = 0x7f090010; - public static final int action_text = 0x7f090017; - public static final int actions = 0x7f090018; - public static final int async = 0x7f09001e; - public static final int blocking = 0x7f090022; - public static final int chronometer = 0x7f09002b; - public static final int forever = 0x7f09004f; - public static final int icon = 0x7f090056; - public static final int icon_group = 0x7f090057; - public static final int info = 0x7f09005a; - public static final int italic = 0x7f09005c; - public static final int line1 = 0x7f090062; - public static final int line3 = 0x7f090063; - public static final int normal = 0x7f090071; - public static final int notification_background = 0x7f090073; - public static final int notification_main_column = 0x7f090074; - public static final int notification_main_column_container = 0x7f090075; - public static final int right_icon = 0x7f090082; - public static final int right_side = 0x7f090083; - public static final int tag_transition_group = 0x7f0900b1; - public static final int tag_unhandled_key_event_manager = 0x7f0900b2; - public static final int tag_unhandled_key_listeners = 0x7f0900b3; - public static final int text = 0x7f0900b4; - public static final int text2 = 0x7f0900b5; - public static final int time = 0x7f0900bd; - public static final int title = 0x7f0900be; - } - public static final class integer { - private integer() {} - - public static final int status_bar_notification_info_maxnum = 0x7f0a000e; - } - public static final class layout { - private layout() {} - - public static final int notification_action = 0x7f0c0030; - public static final int notification_action_tombstone = 0x7f0c0031; - public static final int notification_template_custom_big = 0x7f0c0032; - public static final int notification_template_icon_group = 0x7f0c0033; - public static final int notification_template_part_chronometer = 0x7f0c0034; - public static final int notification_template_part_time = 0x7f0c0035; - } - public static final class string { - private string() {} - - public static final int status_bar_notification_info_overflow = 0x7f0f0037; - } - public static final class style { - private style() {} - - public static final int TextAppearance_Compat_Notification = 0x7f10011c; - public static final int TextAppearance_Compat_Notification_Info = 0x7f10011d; - public static final int TextAppearance_Compat_Notification_Line2 = 0x7f10011e; - public static final int TextAppearance_Compat_Notification_Time = 0x7f10011f; - public static final int TextAppearance_Compat_Notification_Title = 0x7f100120; - public static final int Widget_Compat_NotificationActionContainer = 0x7f1001c6; - public static final int Widget_Compat_NotificationActionText = 0x7f1001c7; - } - public static final class styleable { - private styleable() {} - - public static final int[] ColorStateListItem = { 0x10101a5, 0x101031f, 0x7f040027 }; - public static final int ColorStateListItem_android_color = 0; - public static final int ColorStateListItem_android_alpha = 1; - public static final int ColorStateListItem_alpha = 2; - public static final int[] FontFamily = { 0x7f0400d9, 0x7f0400da, 0x7f0400db, 0x7f0400dc, 0x7f0400dd, 0x7f0400de }; - public static final int FontFamily_fontProviderAuthority = 0; - public static final int FontFamily_fontProviderCerts = 1; - public static final int FontFamily_fontProviderFetchStrategy = 2; - public static final int FontFamily_fontProviderFetchTimeout = 3; - public static final int FontFamily_fontProviderPackage = 4; - public static final int FontFamily_fontProviderQuery = 5; - public static final int[] FontFamilyFont = { 0x1010532, 0x1010533, 0x101053f, 0x101056f, 0x1010570, 0x7f0400d7, 0x7f0400df, 0x7f0400e0, 0x7f0400e1, 0x7f040208 }; - public static final int FontFamilyFont_android_font = 0; - public static final int FontFamilyFont_android_fontWeight = 1; - public static final int FontFamilyFont_android_fontStyle = 2; - public static final int FontFamilyFont_android_ttcIndex = 3; - public static final int FontFamilyFont_android_fontVariationSettings = 4; - public static final int FontFamilyFont_font = 5; - public static final int FontFamilyFont_fontStyle = 6; - public static final int FontFamilyFont_fontVariationSettings = 7; - public static final int FontFamilyFont_fontWeight = 8; - public static final int FontFamilyFont_ttcIndex = 9; - public static final int[] GradientColor = { 0x101019d, 0x101019e, 0x10101a1, 0x10101a2, 0x10101a3, 0x10101a4, 0x1010201, 0x101020b, 0x1010510, 0x1010511, 0x1010512, 0x1010513 }; - public static final int GradientColor_android_startColor = 0; - public static final int GradientColor_android_endColor = 1; - public static final int GradientColor_android_type = 2; - public static final int GradientColor_android_centerX = 3; - public static final int GradientColor_android_centerY = 4; - public static final int GradientColor_android_gradientRadius = 5; - public static final int GradientColor_android_tileMode = 6; - public static final int GradientColor_android_centerColor = 7; - public static final int GradientColor_android_startX = 8; - public static final int GradientColor_android_startY = 9; - public static final int GradientColor_android_endX = 10; - public static final int GradientColor_android_endY = 11; - public static final int[] GradientColorItem = { 0x10101a5, 0x1010514 }; - public static final int GradientColorItem_android_color = 0; - public static final int GradientColorItem_android_offset = 1; - } -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/constraint/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/constraint/R.java deleted file mode 100755 index 9f068ad..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/constraint/R.java +++ /dev/null @@ -1,242 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.support.constraint; - -public final class R { - private R() {} - - public static final class attr { - private attr() {} - - public static final int barrierAllowsGoneWidgets = 0x7f040037; - public static final int barrierDirection = 0x7f040038; - public static final int chainUseRtl = 0x7f040061; - public static final int constraintSet = 0x7f040093; - public static final int constraint_referenced_ids = 0x7f040094; - public static final int content = 0x7f040095; - public static final int emptyVisibility = 0x7f0400bc; - public static final int layout_constrainedHeight = 0x7f040117; - public static final int layout_constrainedWidth = 0x7f040118; - public static final int layout_constraintBaseline_creator = 0x7f040119; - public static final int layout_constraintBaseline_toBaselineOf = 0x7f04011a; - public static final int layout_constraintBottom_creator = 0x7f04011b; - public static final int layout_constraintBottom_toBottomOf = 0x7f04011c; - public static final int layout_constraintBottom_toTopOf = 0x7f04011d; - public static final int layout_constraintCircle = 0x7f04011e; - public static final int layout_constraintCircleAngle = 0x7f04011f; - public static final int layout_constraintCircleRadius = 0x7f040120; - public static final int layout_constraintDimensionRatio = 0x7f040121; - public static final int layout_constraintEnd_toEndOf = 0x7f040122; - public static final int layout_constraintEnd_toStartOf = 0x7f040123; - public static final int layout_constraintGuide_begin = 0x7f040124; - public static final int layout_constraintGuide_end = 0x7f040125; - public static final int layout_constraintGuide_percent = 0x7f040126; - public static final int layout_constraintHeight_default = 0x7f040127; - public static final int layout_constraintHeight_max = 0x7f040128; - public static final int layout_constraintHeight_min = 0x7f040129; - public static final int layout_constraintHeight_percent = 0x7f04012a; - public static final int layout_constraintHorizontal_bias = 0x7f04012b; - public static final int layout_constraintHorizontal_chainStyle = 0x7f04012c; - public static final int layout_constraintHorizontal_weight = 0x7f04012d; - public static final int layout_constraintLeft_creator = 0x7f04012e; - public static final int layout_constraintLeft_toLeftOf = 0x7f04012f; - public static final int layout_constraintLeft_toRightOf = 0x7f040130; - public static final int layout_constraintRight_creator = 0x7f040131; - public static final int layout_constraintRight_toLeftOf = 0x7f040132; - public static final int layout_constraintRight_toRightOf = 0x7f040133; - public static final int layout_constraintStart_toEndOf = 0x7f040134; - public static final int layout_constraintStart_toStartOf = 0x7f040135; - public static final int layout_constraintTop_creator = 0x7f040136; - public static final int layout_constraintTop_toBottomOf = 0x7f040137; - public static final int layout_constraintTop_toTopOf = 0x7f040138; - public static final int layout_constraintVertical_bias = 0x7f040139; - public static final int layout_constraintVertical_chainStyle = 0x7f04013a; - public static final int layout_constraintVertical_weight = 0x7f04013b; - public static final int layout_constraintWidth_default = 0x7f04013c; - public static final int layout_constraintWidth_max = 0x7f04013d; - public static final int layout_constraintWidth_min = 0x7f04013e; - public static final int layout_constraintWidth_percent = 0x7f04013f; - public static final int layout_editor_absoluteX = 0x7f040141; - public static final int layout_editor_absoluteY = 0x7f040142; - public static final int layout_goneMarginBottom = 0x7f040143; - public static final int layout_goneMarginEnd = 0x7f040144; - public static final int layout_goneMarginLeft = 0x7f040145; - public static final int layout_goneMarginRight = 0x7f040146; - public static final int layout_goneMarginStart = 0x7f040147; - public static final int layout_goneMarginTop = 0x7f040148; - public static final int layout_optimizationLevel = 0x7f04014b; - } - public static final class id { - private id() {} - - public static final int bottom = 0x7f090023; - public static final int end = 0x7f090043; - public static final int gone = 0x7f090051; - public static final int invisible = 0x7f09005b; - public static final int left = 0x7f090061; - public static final int packed = 0x7f090077; - public static final int parent = 0x7f090079; - public static final int percent = 0x7f09007c; - public static final int right = 0x7f090081; - public static final int spread = 0x7f0900a6; - public static final int spread_inside = 0x7f0900a7; - public static final int start = 0x7f0900ac; - public static final int top = 0x7f0900c2; - public static final int wrap = 0x7f0900d1; - } - public static final class styleable { - private styleable() {} - - public static final int[] ConstraintLayout_Layout = { 0x10100c4, 0x101011f, 0x1010120, 0x101013f, 0x1010140, 0x7f040037, 0x7f040038, 0x7f040061, 0x7f040093, 0x7f040094, 0x7f040117, 0x7f040118, 0x7f040119, 0x7f04011a, 0x7f04011b, 0x7f04011c, 0x7f04011d, 0x7f04011e, 0x7f04011f, 0x7f040120, 0x7f040121, 0x7f040122, 0x7f040123, 0x7f040124, 0x7f040125, 0x7f040126, 0x7f040127, 0x7f040128, 0x7f040129, 0x7f04012a, 0x7f04012b, 0x7f04012c, 0x7f04012d, 0x7f04012e, 0x7f04012f, 0x7f040130, 0x7f040131, 0x7f040132, 0x7f040133, 0x7f040134, 0x7f040135, 0x7f040136, 0x7f040137, 0x7f040138, 0x7f040139, 0x7f04013a, 0x7f04013b, 0x7f04013c, 0x7f04013d, 0x7f04013e, 0x7f04013f, 0x7f040141, 0x7f040142, 0x7f040143, 0x7f040144, 0x7f040145, 0x7f040146, 0x7f040147, 0x7f040148, 0x7f04014b }; - public static final int ConstraintLayout_Layout_android_orientation = 0; - public static final int ConstraintLayout_Layout_android_maxWidth = 1; - public static final int ConstraintLayout_Layout_android_maxHeight = 2; - public static final int ConstraintLayout_Layout_android_minWidth = 3; - public static final int ConstraintLayout_Layout_android_minHeight = 4; - public static final int ConstraintLayout_Layout_barrierAllowsGoneWidgets = 5; - public static final int ConstraintLayout_Layout_barrierDirection = 6; - public static final int ConstraintLayout_Layout_chainUseRtl = 7; - public static final int ConstraintLayout_Layout_constraintSet = 8; - public static final int ConstraintLayout_Layout_constraint_referenced_ids = 9; - public static final int ConstraintLayout_Layout_layout_constrainedHeight = 10; - public static final int ConstraintLayout_Layout_layout_constrainedWidth = 11; - public static final int ConstraintLayout_Layout_layout_constraintBaseline_creator = 12; - public static final int ConstraintLayout_Layout_layout_constraintBaseline_toBaselineOf = 13; - public static final int ConstraintLayout_Layout_layout_constraintBottom_creator = 14; - public static final int ConstraintLayout_Layout_layout_constraintBottom_toBottomOf = 15; - public static final int ConstraintLayout_Layout_layout_constraintBottom_toTopOf = 16; - public static final int ConstraintLayout_Layout_layout_constraintCircle = 17; - public static final int ConstraintLayout_Layout_layout_constraintCircleAngle = 18; - public static final int ConstraintLayout_Layout_layout_constraintCircleRadius = 19; - public static final int ConstraintLayout_Layout_layout_constraintDimensionRatio = 20; - public static final int ConstraintLayout_Layout_layout_constraintEnd_toEndOf = 21; - public static final int ConstraintLayout_Layout_layout_constraintEnd_toStartOf = 22; - public static final int ConstraintLayout_Layout_layout_constraintGuide_begin = 23; - public static final int ConstraintLayout_Layout_layout_constraintGuide_end = 24; - public static final int ConstraintLayout_Layout_layout_constraintGuide_percent = 25; - public static final int ConstraintLayout_Layout_layout_constraintHeight_default = 26; - public static final int ConstraintLayout_Layout_layout_constraintHeight_max = 27; - public static final int ConstraintLayout_Layout_layout_constraintHeight_min = 28; - public static final int ConstraintLayout_Layout_layout_constraintHeight_percent = 29; - public static final int ConstraintLayout_Layout_layout_constraintHorizontal_bias = 30; - public static final int ConstraintLayout_Layout_layout_constraintHorizontal_chainStyle = 31; - public static final int ConstraintLayout_Layout_layout_constraintHorizontal_weight = 32; - public static final int ConstraintLayout_Layout_layout_constraintLeft_creator = 33; - public static final int ConstraintLayout_Layout_layout_constraintLeft_toLeftOf = 34; - public static final int ConstraintLayout_Layout_layout_constraintLeft_toRightOf = 35; - public static final int ConstraintLayout_Layout_layout_constraintRight_creator = 36; - public static final int ConstraintLayout_Layout_layout_constraintRight_toLeftOf = 37; - public static final int ConstraintLayout_Layout_layout_constraintRight_toRightOf = 38; - public static final int ConstraintLayout_Layout_layout_constraintStart_toEndOf = 39; - public static final int ConstraintLayout_Layout_layout_constraintStart_toStartOf = 40; - public static final int ConstraintLayout_Layout_layout_constraintTop_creator = 41; - public static final int ConstraintLayout_Layout_layout_constraintTop_toBottomOf = 42; - public static final int ConstraintLayout_Layout_layout_constraintTop_toTopOf = 43; - public static final int ConstraintLayout_Layout_layout_constraintVertical_bias = 44; - public static final int ConstraintLayout_Layout_layout_constraintVertical_chainStyle = 45; - public static final int ConstraintLayout_Layout_layout_constraintVertical_weight = 46; - public static final int ConstraintLayout_Layout_layout_constraintWidth_default = 47; - public static final int ConstraintLayout_Layout_layout_constraintWidth_max = 48; - public static final int ConstraintLayout_Layout_layout_constraintWidth_min = 49; - public static final int ConstraintLayout_Layout_layout_constraintWidth_percent = 50; - public static final int ConstraintLayout_Layout_layout_editor_absoluteX = 51; - public static final int ConstraintLayout_Layout_layout_editor_absoluteY = 52; - public static final int ConstraintLayout_Layout_layout_goneMarginBottom = 53; - public static final int ConstraintLayout_Layout_layout_goneMarginEnd = 54; - public static final int ConstraintLayout_Layout_layout_goneMarginLeft = 55; - public static final int ConstraintLayout_Layout_layout_goneMarginRight = 56; - public static final int ConstraintLayout_Layout_layout_goneMarginStart = 57; - public static final int ConstraintLayout_Layout_layout_goneMarginTop = 58; - public static final int ConstraintLayout_Layout_layout_optimizationLevel = 59; - public static final int[] ConstraintLayout_placeholder = { 0x7f040095, 0x7f0400bc }; - public static final int ConstraintLayout_placeholder_content = 0; - public static final int ConstraintLayout_placeholder_emptyVisibility = 1; - public static final int[] ConstraintSet = { 0x10100c4, 0x10100d0, 0x10100dc, 0x10100f4, 0x10100f5, 0x10100f7, 0x10100f8, 0x10100f9, 0x10100fa, 0x101011f, 0x1010120, 0x101013f, 0x1010140, 0x101031f, 0x1010320, 0x1010321, 0x1010322, 0x1010323, 0x1010324, 0x1010325, 0x1010326, 0x1010327, 0x1010328, 0x10103b5, 0x10103b6, 0x10103fa, 0x1010440, 0x7f040037, 0x7f040038, 0x7f040061, 0x7f040094, 0x7f040117, 0x7f040118, 0x7f040119, 0x7f04011a, 0x7f04011b, 0x7f04011c, 0x7f04011d, 0x7f04011e, 0x7f04011f, 0x7f040120, 0x7f040121, 0x7f040122, 0x7f040123, 0x7f040124, 0x7f040125, 0x7f040126, 0x7f040127, 0x7f040128, 0x7f040129, 0x7f04012a, 0x7f04012b, 0x7f04012c, 0x7f04012d, 0x7f04012e, 0x7f04012f, 0x7f040130, 0x7f040131, 0x7f040132, 0x7f040133, 0x7f040134, 0x7f040135, 0x7f040136, 0x7f040137, 0x7f040138, 0x7f040139, 0x7f04013a, 0x7f04013b, 0x7f04013c, 0x7f04013d, 0x7f04013e, 0x7f04013f, 0x7f040141, 0x7f040142, 0x7f040143, 0x7f040144, 0x7f040145, 0x7f040146, 0x7f040147, 0x7f040148 }; - public static final int ConstraintSet_android_orientation = 0; - public static final int ConstraintSet_android_id = 1; - public static final int ConstraintSet_android_visibility = 2; - public static final int ConstraintSet_android_layout_width = 3; - public static final int ConstraintSet_android_layout_height = 4; - public static final int ConstraintSet_android_layout_marginLeft = 5; - public static final int ConstraintSet_android_layout_marginTop = 6; - public static final int ConstraintSet_android_layout_marginRight = 7; - public static final int ConstraintSet_android_layout_marginBottom = 8; - public static final int ConstraintSet_android_maxWidth = 9; - public static final int ConstraintSet_android_maxHeight = 10; - public static final int ConstraintSet_android_minWidth = 11; - public static final int ConstraintSet_android_minHeight = 12; - public static final int ConstraintSet_android_alpha = 13; - public static final int ConstraintSet_android_transformPivotX = 14; - public static final int ConstraintSet_android_transformPivotY = 15; - public static final int ConstraintSet_android_translationX = 16; - public static final int ConstraintSet_android_translationY = 17; - public static final int ConstraintSet_android_scaleX = 18; - public static final int ConstraintSet_android_scaleY = 19; - public static final int ConstraintSet_android_rotation = 20; - public static final int ConstraintSet_android_rotationX = 21; - public static final int ConstraintSet_android_rotationY = 22; - public static final int ConstraintSet_android_layout_marginStart = 23; - public static final int ConstraintSet_android_layout_marginEnd = 24; - public static final int ConstraintSet_android_translationZ = 25; - public static final int ConstraintSet_android_elevation = 26; - public static final int ConstraintSet_barrierAllowsGoneWidgets = 27; - public static final int ConstraintSet_barrierDirection = 28; - public static final int ConstraintSet_chainUseRtl = 29; - public static final int ConstraintSet_constraint_referenced_ids = 30; - public static final int ConstraintSet_layout_constrainedHeight = 31; - public static final int ConstraintSet_layout_constrainedWidth = 32; - public static final int ConstraintSet_layout_constraintBaseline_creator = 33; - public static final int ConstraintSet_layout_constraintBaseline_toBaselineOf = 34; - public static final int ConstraintSet_layout_constraintBottom_creator = 35; - public static final int ConstraintSet_layout_constraintBottom_toBottomOf = 36; - public static final int ConstraintSet_layout_constraintBottom_toTopOf = 37; - public static final int ConstraintSet_layout_constraintCircle = 38; - public static final int ConstraintSet_layout_constraintCircleAngle = 39; - public static final int ConstraintSet_layout_constraintCircleRadius = 40; - public static final int ConstraintSet_layout_constraintDimensionRatio = 41; - public static final int ConstraintSet_layout_constraintEnd_toEndOf = 42; - public static final int ConstraintSet_layout_constraintEnd_toStartOf = 43; - public static final int ConstraintSet_layout_constraintGuide_begin = 44; - public static final int ConstraintSet_layout_constraintGuide_end = 45; - public static final int ConstraintSet_layout_constraintGuide_percent = 46; - public static final int ConstraintSet_layout_constraintHeight_default = 47; - public static final int ConstraintSet_layout_constraintHeight_max = 48; - public static final int ConstraintSet_layout_constraintHeight_min = 49; - public static final int ConstraintSet_layout_constraintHeight_percent = 50; - public static final int ConstraintSet_layout_constraintHorizontal_bias = 51; - public static final int ConstraintSet_layout_constraintHorizontal_chainStyle = 52; - public static final int ConstraintSet_layout_constraintHorizontal_weight = 53; - public static final int ConstraintSet_layout_constraintLeft_creator = 54; - public static final int ConstraintSet_layout_constraintLeft_toLeftOf = 55; - public static final int ConstraintSet_layout_constraintLeft_toRightOf = 56; - public static final int ConstraintSet_layout_constraintRight_creator = 57; - public static final int ConstraintSet_layout_constraintRight_toLeftOf = 58; - public static final int ConstraintSet_layout_constraintRight_toRightOf = 59; - public static final int ConstraintSet_layout_constraintStart_toEndOf = 60; - public static final int ConstraintSet_layout_constraintStart_toStartOf = 61; - public static final int ConstraintSet_layout_constraintTop_creator = 62; - public static final int ConstraintSet_layout_constraintTop_toBottomOf = 63; - public static final int ConstraintSet_layout_constraintTop_toTopOf = 64; - public static final int ConstraintSet_layout_constraintVertical_bias = 65; - public static final int ConstraintSet_layout_constraintVertical_chainStyle = 66; - public static final int ConstraintSet_layout_constraintVertical_weight = 67; - public static final int ConstraintSet_layout_constraintWidth_default = 68; - public static final int ConstraintSet_layout_constraintWidth_max = 69; - public static final int ConstraintSet_layout_constraintWidth_min = 70; - public static final int ConstraintSet_layout_constraintWidth_percent = 71; - public static final int ConstraintSet_layout_editor_absoluteX = 72; - public static final int ConstraintSet_layout_editor_absoluteY = 73; - public static final int ConstraintSet_layout_goneMarginBottom = 74; - public static final int ConstraintSet_layout_goneMarginEnd = 75; - public static final int ConstraintSet_layout_goneMarginLeft = 76; - public static final int ConstraintSet_layout_goneMarginRight = 77; - public static final int ConstraintSet_layout_goneMarginStart = 78; - public static final int ConstraintSet_layout_goneMarginTop = 79; - public static final int[] LinearConstraintLayout = { 0x10100c4 }; - public static final int LinearConstraintLayout_android_orientation = 0; - } -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/coordinatorlayout/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/coordinatorlayout/R.java deleted file mode 100755 index 104a581..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/coordinatorlayout/R.java +++ /dev/null @@ -1,211 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.support.coordinatorlayout; - -public final class R { - private R() {} - - public static final class attr { - private attr() {} - - public static final int alpha = 0x7f040027; - public static final int coordinatorLayoutStyle = 0x7f0400a4; - public static final int font = 0x7f0400d7; - public static final int fontProviderAuthority = 0x7f0400d9; - public static final int fontProviderCerts = 0x7f0400da; - public static final int fontProviderFetchStrategy = 0x7f0400db; - public static final int fontProviderFetchTimeout = 0x7f0400dc; - public static final int fontProviderPackage = 0x7f0400dd; - public static final int fontProviderQuery = 0x7f0400de; - public static final int fontStyle = 0x7f0400df; - public static final int fontVariationSettings = 0x7f0400e0; - public static final int fontWeight = 0x7f0400e1; - public static final int keylines = 0x7f04010d; - public static final int layout_anchor = 0x7f040112; - public static final int layout_anchorGravity = 0x7f040113; - public static final int layout_behavior = 0x7f040114; - public static final int layout_dodgeInsetEdges = 0x7f040140; - public static final int layout_insetEdge = 0x7f040149; - public static final int layout_keyline = 0x7f04014a; - public static final int statusBarBackground = 0x7f0401a6; - public static final int ttcIndex = 0x7f040208; - } - public static final class color { - private color() {} - - public static final int notification_action_color_filter = 0x7f06006a; - public static final int notification_icon_bg_color = 0x7f06006b; - public static final int ripple_material_light = 0x7f060075; - public static final int secondary_text_default_material_light = 0x7f060077; - } - public static final class dimen { - private dimen() {} - - public static final int compat_button_inset_horizontal_material = 0x7f07004e; - public static final int compat_button_inset_vertical_material = 0x7f07004f; - public static final int compat_button_padding_horizontal_material = 0x7f070050; - public static final int compat_button_padding_vertical_material = 0x7f070051; - public static final int compat_control_corner_material = 0x7f070052; - public static final int compat_notification_large_icon_max_height = 0x7f070053; - public static final int compat_notification_large_icon_max_width = 0x7f070054; - public static final int notification_action_icon_size = 0x7f0700c5; - public static final int notification_action_text_size = 0x7f0700c6; - public static final int notification_big_circle_margin = 0x7f0700c7; - public static final int notification_content_margin_start = 0x7f0700c8; - public static final int notification_large_icon_height = 0x7f0700c9; - public static final int notification_large_icon_width = 0x7f0700ca; - public static final int notification_main_column_padding_top = 0x7f0700cb; - public static final int notification_media_narrow_margin = 0x7f0700cc; - public static final int notification_right_icon_size = 0x7f0700cd; - public static final int notification_right_side_padding_top = 0x7f0700ce; - public static final int notification_small_icon_background_padding = 0x7f0700cf; - public static final int notification_small_icon_size_as_large = 0x7f0700d0; - public static final int notification_subtext_size = 0x7f0700d1; - public static final int notification_top_pad = 0x7f0700d2; - public static final int notification_top_pad_large_text = 0x7f0700d3; - } - public static final class drawable { - private drawable() {} - - public static final int notification_action_background = 0x7f08006b; - public static final int notification_bg = 0x7f08006c; - public static final int notification_bg_low = 0x7f08006d; - public static final int notification_bg_low_normal = 0x7f08006e; - public static final int notification_bg_low_pressed = 0x7f08006f; - public static final int notification_bg_normal = 0x7f080070; - public static final int notification_bg_normal_pressed = 0x7f080071; - public static final int notification_icon_background = 0x7f080072; - public static final int notification_template_icon_bg = 0x7f080073; - public static final int notification_template_icon_low_bg = 0x7f080074; - public static final int notification_tile_bg = 0x7f080075; - public static final int notify_panel_notification_icon_bg = 0x7f080076; - } - public static final class id { - private id() {} - - public static final int action_container = 0x7f09000d; - public static final int action_divider = 0x7f09000f; - public static final int action_image = 0x7f090010; - public static final int action_text = 0x7f090017; - public static final int actions = 0x7f090018; - public static final int async = 0x7f09001e; - public static final int blocking = 0x7f090022; - public static final int bottom = 0x7f090023; - public static final int chronometer = 0x7f09002b; - public static final int end = 0x7f090043; - public static final int forever = 0x7f09004f; - public static final int icon = 0x7f090056; - public static final int icon_group = 0x7f090057; - public static final int info = 0x7f09005a; - public static final int italic = 0x7f09005c; - public static final int left = 0x7f090061; - public static final int line1 = 0x7f090062; - public static final int line3 = 0x7f090063; - public static final int none = 0x7f090070; - public static final int normal = 0x7f090071; - public static final int notification_background = 0x7f090073; - public static final int notification_main_column = 0x7f090074; - public static final int notification_main_column_container = 0x7f090075; - public static final int right = 0x7f090081; - public static final int right_icon = 0x7f090082; - public static final int right_side = 0x7f090083; - public static final int start = 0x7f0900ac; - public static final int tag_transition_group = 0x7f0900b1; - public static final int tag_unhandled_key_event_manager = 0x7f0900b2; - public static final int tag_unhandled_key_listeners = 0x7f0900b3; - public static final int text = 0x7f0900b4; - public static final int text2 = 0x7f0900b5; - public static final int time = 0x7f0900bd; - public static final int title = 0x7f0900be; - public static final int top = 0x7f0900c2; - } - public static final class integer { - private integer() {} - - public static final int status_bar_notification_info_maxnum = 0x7f0a000e; - } - public static final class layout { - private layout() {} - - public static final int notification_action = 0x7f0c0030; - public static final int notification_action_tombstone = 0x7f0c0031; - public static final int notification_template_custom_big = 0x7f0c0032; - public static final int notification_template_icon_group = 0x7f0c0033; - public static final int notification_template_part_chronometer = 0x7f0c0034; - public static final int notification_template_part_time = 0x7f0c0035; - } - public static final class string { - private string() {} - - public static final int status_bar_notification_info_overflow = 0x7f0f0037; - } - public static final class style { - private style() {} - - public static final int TextAppearance_Compat_Notification = 0x7f10011c; - public static final int TextAppearance_Compat_Notification_Info = 0x7f10011d; - public static final int TextAppearance_Compat_Notification_Line2 = 0x7f10011e; - public static final int TextAppearance_Compat_Notification_Time = 0x7f10011f; - public static final int TextAppearance_Compat_Notification_Title = 0x7f100120; - public static final int Widget_Compat_NotificationActionContainer = 0x7f1001c6; - public static final int Widget_Compat_NotificationActionText = 0x7f1001c7; - public static final int Widget_Support_CoordinatorLayout = 0x7f1001f6; - } - public static final class styleable { - private styleable() {} - - public static final int[] ColorStateListItem = { 0x10101a5, 0x101031f, 0x7f040027 }; - public static final int ColorStateListItem_android_color = 0; - public static final int ColorStateListItem_android_alpha = 1; - public static final int ColorStateListItem_alpha = 2; - public static final int[] CoordinatorLayout = { 0x7f04010d, 0x7f0401a6 }; - public static final int CoordinatorLayout_keylines = 0; - public static final int CoordinatorLayout_statusBarBackground = 1; - public static final int[] CoordinatorLayout_Layout = { 0x10100b3, 0x7f040112, 0x7f040113, 0x7f040114, 0x7f040140, 0x7f040149, 0x7f04014a }; - public static final int CoordinatorLayout_Layout_android_layout_gravity = 0; - public static final int CoordinatorLayout_Layout_layout_anchor = 1; - public static final int CoordinatorLayout_Layout_layout_anchorGravity = 2; - public static final int CoordinatorLayout_Layout_layout_behavior = 3; - public static final int CoordinatorLayout_Layout_layout_dodgeInsetEdges = 4; - public static final int CoordinatorLayout_Layout_layout_insetEdge = 5; - public static final int CoordinatorLayout_Layout_layout_keyline = 6; - public static final int[] FontFamily = { 0x7f0400d9, 0x7f0400da, 0x7f0400db, 0x7f0400dc, 0x7f0400dd, 0x7f0400de }; - public static final int FontFamily_fontProviderAuthority = 0; - public static final int FontFamily_fontProviderCerts = 1; - public static final int FontFamily_fontProviderFetchStrategy = 2; - public static final int FontFamily_fontProviderFetchTimeout = 3; - public static final int FontFamily_fontProviderPackage = 4; - public static final int FontFamily_fontProviderQuery = 5; - public static final int[] FontFamilyFont = { 0x1010532, 0x1010533, 0x101053f, 0x101056f, 0x1010570, 0x7f0400d7, 0x7f0400df, 0x7f0400e0, 0x7f0400e1, 0x7f040208 }; - public static final int FontFamilyFont_android_font = 0; - public static final int FontFamilyFont_android_fontWeight = 1; - public static final int FontFamilyFont_android_fontStyle = 2; - public static final int FontFamilyFont_android_ttcIndex = 3; - public static final int FontFamilyFont_android_fontVariationSettings = 4; - public static final int FontFamilyFont_font = 5; - public static final int FontFamilyFont_fontStyle = 6; - public static final int FontFamilyFont_fontVariationSettings = 7; - public static final int FontFamilyFont_fontWeight = 8; - public static final int FontFamilyFont_ttcIndex = 9; - public static final int[] GradientColor = { 0x101019d, 0x101019e, 0x10101a1, 0x10101a2, 0x10101a3, 0x10101a4, 0x1010201, 0x101020b, 0x1010510, 0x1010511, 0x1010512, 0x1010513 }; - public static final int GradientColor_android_startColor = 0; - public static final int GradientColor_android_endColor = 1; - public static final int GradientColor_android_type = 2; - public static final int GradientColor_android_centerX = 3; - public static final int GradientColor_android_centerY = 4; - public static final int GradientColor_android_gradientRadius = 5; - public static final int GradientColor_android_tileMode = 6; - public static final int GradientColor_android_centerColor = 7; - public static final int GradientColor_android_startX = 8; - public static final int GradientColor_android_startY = 9; - public static final int GradientColor_android_endX = 10; - public static final int GradientColor_android_endY = 11; - public static final int[] GradientColorItem = { 0x10101a5, 0x1010514 }; - public static final int GradientColorItem_android_color = 0; - public static final int GradientColorItem_android_offset = 1; - } -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/coreui/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/coreui/R.java deleted file mode 100755 index 38cb913..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/coreui/R.java +++ /dev/null @@ -1,211 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.support.coreui; - -public final class R { - private R() {} - - public static final class attr { - private attr() {} - - public static final int alpha = 0x7f040027; - public static final int coordinatorLayoutStyle = 0x7f0400a4; - public static final int font = 0x7f0400d7; - public static final int fontProviderAuthority = 0x7f0400d9; - public static final int fontProviderCerts = 0x7f0400da; - public static final int fontProviderFetchStrategy = 0x7f0400db; - public static final int fontProviderFetchTimeout = 0x7f0400dc; - public static final int fontProviderPackage = 0x7f0400dd; - public static final int fontProviderQuery = 0x7f0400de; - public static final int fontStyle = 0x7f0400df; - public static final int fontVariationSettings = 0x7f0400e0; - public static final int fontWeight = 0x7f0400e1; - public static final int keylines = 0x7f04010d; - public static final int layout_anchor = 0x7f040112; - public static final int layout_anchorGravity = 0x7f040113; - public static final int layout_behavior = 0x7f040114; - public static final int layout_dodgeInsetEdges = 0x7f040140; - public static final int layout_insetEdge = 0x7f040149; - public static final int layout_keyline = 0x7f04014a; - public static final int statusBarBackground = 0x7f0401a6; - public static final int ttcIndex = 0x7f040208; - } - public static final class color { - private color() {} - - public static final int notification_action_color_filter = 0x7f06006a; - public static final int notification_icon_bg_color = 0x7f06006b; - public static final int ripple_material_light = 0x7f060075; - public static final int secondary_text_default_material_light = 0x7f060077; - } - public static final class dimen { - private dimen() {} - - public static final int compat_button_inset_horizontal_material = 0x7f07004e; - public static final int compat_button_inset_vertical_material = 0x7f07004f; - public static final int compat_button_padding_horizontal_material = 0x7f070050; - public static final int compat_button_padding_vertical_material = 0x7f070051; - public static final int compat_control_corner_material = 0x7f070052; - public static final int compat_notification_large_icon_max_height = 0x7f070053; - public static final int compat_notification_large_icon_max_width = 0x7f070054; - public static final int notification_action_icon_size = 0x7f0700c5; - public static final int notification_action_text_size = 0x7f0700c6; - public static final int notification_big_circle_margin = 0x7f0700c7; - public static final int notification_content_margin_start = 0x7f0700c8; - public static final int notification_large_icon_height = 0x7f0700c9; - public static final int notification_large_icon_width = 0x7f0700ca; - public static final int notification_main_column_padding_top = 0x7f0700cb; - public static final int notification_media_narrow_margin = 0x7f0700cc; - public static final int notification_right_icon_size = 0x7f0700cd; - public static final int notification_right_side_padding_top = 0x7f0700ce; - public static final int notification_small_icon_background_padding = 0x7f0700cf; - public static final int notification_small_icon_size_as_large = 0x7f0700d0; - public static final int notification_subtext_size = 0x7f0700d1; - public static final int notification_top_pad = 0x7f0700d2; - public static final int notification_top_pad_large_text = 0x7f0700d3; - } - public static final class drawable { - private drawable() {} - - public static final int notification_action_background = 0x7f08006b; - public static final int notification_bg = 0x7f08006c; - public static final int notification_bg_low = 0x7f08006d; - public static final int notification_bg_low_normal = 0x7f08006e; - public static final int notification_bg_low_pressed = 0x7f08006f; - public static final int notification_bg_normal = 0x7f080070; - public static final int notification_bg_normal_pressed = 0x7f080071; - public static final int notification_icon_background = 0x7f080072; - public static final int notification_template_icon_bg = 0x7f080073; - public static final int notification_template_icon_low_bg = 0x7f080074; - public static final int notification_tile_bg = 0x7f080075; - public static final int notify_panel_notification_icon_bg = 0x7f080076; - } - public static final class id { - private id() {} - - public static final int action_container = 0x7f09000d; - public static final int action_divider = 0x7f09000f; - public static final int action_image = 0x7f090010; - public static final int action_text = 0x7f090017; - public static final int actions = 0x7f090018; - public static final int async = 0x7f09001e; - public static final int blocking = 0x7f090022; - public static final int bottom = 0x7f090023; - public static final int chronometer = 0x7f09002b; - public static final int end = 0x7f090043; - public static final int forever = 0x7f09004f; - public static final int icon = 0x7f090056; - public static final int icon_group = 0x7f090057; - public static final int info = 0x7f09005a; - public static final int italic = 0x7f09005c; - public static final int left = 0x7f090061; - public static final int line1 = 0x7f090062; - public static final int line3 = 0x7f090063; - public static final int none = 0x7f090070; - public static final int normal = 0x7f090071; - public static final int notification_background = 0x7f090073; - public static final int notification_main_column = 0x7f090074; - public static final int notification_main_column_container = 0x7f090075; - public static final int right = 0x7f090081; - public static final int right_icon = 0x7f090082; - public static final int right_side = 0x7f090083; - public static final int start = 0x7f0900ac; - public static final int tag_transition_group = 0x7f0900b1; - public static final int tag_unhandled_key_event_manager = 0x7f0900b2; - public static final int tag_unhandled_key_listeners = 0x7f0900b3; - public static final int text = 0x7f0900b4; - public static final int text2 = 0x7f0900b5; - public static final int time = 0x7f0900bd; - public static final int title = 0x7f0900be; - public static final int top = 0x7f0900c2; - } - public static final class integer { - private integer() {} - - public static final int status_bar_notification_info_maxnum = 0x7f0a000e; - } - public static final class layout { - private layout() {} - - public static final int notification_action = 0x7f0c0030; - public static final int notification_action_tombstone = 0x7f0c0031; - public static final int notification_template_custom_big = 0x7f0c0032; - public static final int notification_template_icon_group = 0x7f0c0033; - public static final int notification_template_part_chronometer = 0x7f0c0034; - public static final int notification_template_part_time = 0x7f0c0035; - } - public static final class string { - private string() {} - - public static final int status_bar_notification_info_overflow = 0x7f0f0037; - } - public static final class style { - private style() {} - - public static final int TextAppearance_Compat_Notification = 0x7f10011c; - public static final int TextAppearance_Compat_Notification_Info = 0x7f10011d; - public static final int TextAppearance_Compat_Notification_Line2 = 0x7f10011e; - public static final int TextAppearance_Compat_Notification_Time = 0x7f10011f; - public static final int TextAppearance_Compat_Notification_Title = 0x7f100120; - public static final int Widget_Compat_NotificationActionContainer = 0x7f1001c6; - public static final int Widget_Compat_NotificationActionText = 0x7f1001c7; - public static final int Widget_Support_CoordinatorLayout = 0x7f1001f6; - } - public static final class styleable { - private styleable() {} - - public static final int[] ColorStateListItem = { 0x10101a5, 0x101031f, 0x7f040027 }; - public static final int ColorStateListItem_android_color = 0; - public static final int ColorStateListItem_android_alpha = 1; - public static final int ColorStateListItem_alpha = 2; - public static final int[] CoordinatorLayout = { 0x7f04010d, 0x7f0401a6 }; - public static final int CoordinatorLayout_keylines = 0; - public static final int CoordinatorLayout_statusBarBackground = 1; - public static final int[] CoordinatorLayout_Layout = { 0x10100b3, 0x7f040112, 0x7f040113, 0x7f040114, 0x7f040140, 0x7f040149, 0x7f04014a }; - public static final int CoordinatorLayout_Layout_android_layout_gravity = 0; - public static final int CoordinatorLayout_Layout_layout_anchor = 1; - public static final int CoordinatorLayout_Layout_layout_anchorGravity = 2; - public static final int CoordinatorLayout_Layout_layout_behavior = 3; - public static final int CoordinatorLayout_Layout_layout_dodgeInsetEdges = 4; - public static final int CoordinatorLayout_Layout_layout_insetEdge = 5; - public static final int CoordinatorLayout_Layout_layout_keyline = 6; - public static final int[] FontFamily = { 0x7f0400d9, 0x7f0400da, 0x7f0400db, 0x7f0400dc, 0x7f0400dd, 0x7f0400de }; - public static final int FontFamily_fontProviderAuthority = 0; - public static final int FontFamily_fontProviderCerts = 1; - public static final int FontFamily_fontProviderFetchStrategy = 2; - public static final int FontFamily_fontProviderFetchTimeout = 3; - public static final int FontFamily_fontProviderPackage = 4; - public static final int FontFamily_fontProviderQuery = 5; - public static final int[] FontFamilyFont = { 0x1010532, 0x1010533, 0x101053f, 0x101056f, 0x1010570, 0x7f0400d7, 0x7f0400df, 0x7f0400e0, 0x7f0400e1, 0x7f040208 }; - public static final int FontFamilyFont_android_font = 0; - public static final int FontFamilyFont_android_fontWeight = 1; - public static final int FontFamilyFont_android_fontStyle = 2; - public static final int FontFamilyFont_android_ttcIndex = 3; - public static final int FontFamilyFont_android_fontVariationSettings = 4; - public static final int FontFamilyFont_font = 5; - public static final int FontFamilyFont_fontStyle = 6; - public static final int FontFamilyFont_fontVariationSettings = 7; - public static final int FontFamilyFont_fontWeight = 8; - public static final int FontFamilyFont_ttcIndex = 9; - public static final int[] GradientColor = { 0x101019d, 0x101019e, 0x10101a1, 0x10101a2, 0x10101a3, 0x10101a4, 0x1010201, 0x101020b, 0x1010510, 0x1010511, 0x1010512, 0x1010513 }; - public static final int GradientColor_android_startColor = 0; - public static final int GradientColor_android_endColor = 1; - public static final int GradientColor_android_type = 2; - public static final int GradientColor_android_centerX = 3; - public static final int GradientColor_android_centerY = 4; - public static final int GradientColor_android_gradientRadius = 5; - public static final int GradientColor_android_tileMode = 6; - public static final int GradientColor_android_centerColor = 7; - public static final int GradientColor_android_startX = 8; - public static final int GradientColor_android_startY = 9; - public static final int GradientColor_android_endX = 10; - public static final int GradientColor_android_endY = 11; - public static final int[] GradientColorItem = { 0x10101a5, 0x1010514 }; - public static final int GradientColorItem_android_color = 0; - public static final int GradientColorItem_android_offset = 1; - } -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/coreutils/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/coreutils/R.java deleted file mode 100755 index dd69a0f..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/coreutils/R.java +++ /dev/null @@ -1,183 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.support.coreutils; - -public final class R { - private R() {} - - public static final class attr { - private attr() {} - - public static final int alpha = 0x7f040027; - public static final int font = 0x7f0400d7; - public static final int fontProviderAuthority = 0x7f0400d9; - public static final int fontProviderCerts = 0x7f0400da; - public static final int fontProviderFetchStrategy = 0x7f0400db; - public static final int fontProviderFetchTimeout = 0x7f0400dc; - public static final int fontProviderPackage = 0x7f0400dd; - public static final int fontProviderQuery = 0x7f0400de; - public static final int fontStyle = 0x7f0400df; - public static final int fontVariationSettings = 0x7f0400e0; - public static final int fontWeight = 0x7f0400e1; - public static final int ttcIndex = 0x7f040208; - } - public static final class color { - private color() {} - - public static final int notification_action_color_filter = 0x7f06006a; - public static final int notification_icon_bg_color = 0x7f06006b; - public static final int ripple_material_light = 0x7f060075; - public static final int secondary_text_default_material_light = 0x7f060077; - } - public static final class dimen { - private dimen() {} - - public static final int compat_button_inset_horizontal_material = 0x7f07004e; - public static final int compat_button_inset_vertical_material = 0x7f07004f; - public static final int compat_button_padding_horizontal_material = 0x7f070050; - public static final int compat_button_padding_vertical_material = 0x7f070051; - public static final int compat_control_corner_material = 0x7f070052; - public static final int compat_notification_large_icon_max_height = 0x7f070053; - public static final int compat_notification_large_icon_max_width = 0x7f070054; - public static final int notification_action_icon_size = 0x7f0700c5; - public static final int notification_action_text_size = 0x7f0700c6; - public static final int notification_big_circle_margin = 0x7f0700c7; - public static final int notification_content_margin_start = 0x7f0700c8; - public static final int notification_large_icon_height = 0x7f0700c9; - public static final int notification_large_icon_width = 0x7f0700ca; - public static final int notification_main_column_padding_top = 0x7f0700cb; - public static final int notification_media_narrow_margin = 0x7f0700cc; - public static final int notification_right_icon_size = 0x7f0700cd; - public static final int notification_right_side_padding_top = 0x7f0700ce; - public static final int notification_small_icon_background_padding = 0x7f0700cf; - public static final int notification_small_icon_size_as_large = 0x7f0700d0; - public static final int notification_subtext_size = 0x7f0700d1; - public static final int notification_top_pad = 0x7f0700d2; - public static final int notification_top_pad_large_text = 0x7f0700d3; - } - public static final class drawable { - private drawable() {} - - public static final int notification_action_background = 0x7f08006b; - public static final int notification_bg = 0x7f08006c; - public static final int notification_bg_low = 0x7f08006d; - public static final int notification_bg_low_normal = 0x7f08006e; - public static final int notification_bg_low_pressed = 0x7f08006f; - public static final int notification_bg_normal = 0x7f080070; - public static final int notification_bg_normal_pressed = 0x7f080071; - public static final int notification_icon_background = 0x7f080072; - public static final int notification_template_icon_bg = 0x7f080073; - public static final int notification_template_icon_low_bg = 0x7f080074; - public static final int notification_tile_bg = 0x7f080075; - public static final int notify_panel_notification_icon_bg = 0x7f080076; - } - public static final class id { - private id() {} - - public static final int action_container = 0x7f09000d; - public static final int action_divider = 0x7f09000f; - public static final int action_image = 0x7f090010; - public static final int action_text = 0x7f090017; - public static final int actions = 0x7f090018; - public static final int async = 0x7f09001e; - public static final int blocking = 0x7f090022; - public static final int chronometer = 0x7f09002b; - public static final int forever = 0x7f09004f; - public static final int icon = 0x7f090056; - public static final int icon_group = 0x7f090057; - public static final int info = 0x7f09005a; - public static final int italic = 0x7f09005c; - public static final int line1 = 0x7f090062; - public static final int line3 = 0x7f090063; - public static final int normal = 0x7f090071; - public static final int notification_background = 0x7f090073; - public static final int notification_main_column = 0x7f090074; - public static final int notification_main_column_container = 0x7f090075; - public static final int right_icon = 0x7f090082; - public static final int right_side = 0x7f090083; - public static final int tag_transition_group = 0x7f0900b1; - public static final int tag_unhandled_key_event_manager = 0x7f0900b2; - public static final int tag_unhandled_key_listeners = 0x7f0900b3; - public static final int text = 0x7f0900b4; - public static final int text2 = 0x7f0900b5; - public static final int time = 0x7f0900bd; - public static final int title = 0x7f0900be; - } - public static final class integer { - private integer() {} - - public static final int status_bar_notification_info_maxnum = 0x7f0a000e; - } - public static final class layout { - private layout() {} - - public static final int notification_action = 0x7f0c0030; - public static final int notification_action_tombstone = 0x7f0c0031; - public static final int notification_template_custom_big = 0x7f0c0032; - public static final int notification_template_icon_group = 0x7f0c0033; - public static final int notification_template_part_chronometer = 0x7f0c0034; - public static final int notification_template_part_time = 0x7f0c0035; - } - public static final class string { - private string() {} - - public static final int status_bar_notification_info_overflow = 0x7f0f0037; - } - public static final class style { - private style() {} - - public static final int TextAppearance_Compat_Notification = 0x7f10011c; - public static final int TextAppearance_Compat_Notification_Info = 0x7f10011d; - public static final int TextAppearance_Compat_Notification_Line2 = 0x7f10011e; - public static final int TextAppearance_Compat_Notification_Time = 0x7f10011f; - public static final int TextAppearance_Compat_Notification_Title = 0x7f100120; - public static final int Widget_Compat_NotificationActionContainer = 0x7f1001c6; - public static final int Widget_Compat_NotificationActionText = 0x7f1001c7; - } - public static final class styleable { - private styleable() {} - - public static final int[] ColorStateListItem = { 0x10101a5, 0x101031f, 0x7f040027 }; - public static final int ColorStateListItem_android_color = 0; - public static final int ColorStateListItem_android_alpha = 1; - public static final int ColorStateListItem_alpha = 2; - public static final int[] FontFamily = { 0x7f0400d9, 0x7f0400da, 0x7f0400db, 0x7f0400dc, 0x7f0400dd, 0x7f0400de }; - public static final int FontFamily_fontProviderAuthority = 0; - public static final int FontFamily_fontProviderCerts = 1; - public static final int FontFamily_fontProviderFetchStrategy = 2; - public static final int FontFamily_fontProviderFetchTimeout = 3; - public static final int FontFamily_fontProviderPackage = 4; - public static final int FontFamily_fontProviderQuery = 5; - public static final int[] FontFamilyFont = { 0x1010532, 0x1010533, 0x101053f, 0x101056f, 0x1010570, 0x7f0400d7, 0x7f0400df, 0x7f0400e0, 0x7f0400e1, 0x7f040208 }; - public static final int FontFamilyFont_android_font = 0; - public static final int FontFamilyFont_android_fontWeight = 1; - public static final int FontFamilyFont_android_fontStyle = 2; - public static final int FontFamilyFont_android_ttcIndex = 3; - public static final int FontFamilyFont_android_fontVariationSettings = 4; - public static final int FontFamilyFont_font = 5; - public static final int FontFamilyFont_fontStyle = 6; - public static final int FontFamilyFont_fontVariationSettings = 7; - public static final int FontFamilyFont_fontWeight = 8; - public static final int FontFamilyFont_ttcIndex = 9; - public static final int[] GradientColor = { 0x101019d, 0x101019e, 0x10101a1, 0x10101a2, 0x10101a3, 0x10101a4, 0x1010201, 0x101020b, 0x1010510, 0x1010511, 0x1010512, 0x1010513 }; - public static final int GradientColor_android_startColor = 0; - public static final int GradientColor_android_endColor = 1; - public static final int GradientColor_android_type = 2; - public static final int GradientColor_android_centerX = 3; - public static final int GradientColor_android_centerY = 4; - public static final int GradientColor_android_gradientRadius = 5; - public static final int GradientColor_android_tileMode = 6; - public static final int GradientColor_android_centerColor = 7; - public static final int GradientColor_android_startX = 8; - public static final int GradientColor_android_startY = 9; - public static final int GradientColor_android_endX = 10; - public static final int GradientColor_android_endY = 11; - public static final int[] GradientColorItem = { 0x10101a5, 0x1010514 }; - public static final int GradientColorItem_android_color = 0; - public static final int GradientColorItem_android_offset = 1; - } -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/cursoradapter/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/cursoradapter/R.java deleted file mode 100755 index a0feaf5..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/cursoradapter/R.java +++ /dev/null @@ -1,12 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.support.cursoradapter; - -public final class R { - private R() {} - -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/customview/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/customview/R.java deleted file mode 100755 index f63fe0e..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/customview/R.java +++ /dev/null @@ -1,183 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.support.customview; - -public final class R { - private R() {} - - public static final class attr { - private attr() {} - - public static final int alpha = 0x7f040027; - public static final int font = 0x7f0400d7; - public static final int fontProviderAuthority = 0x7f0400d9; - public static final int fontProviderCerts = 0x7f0400da; - public static final int fontProviderFetchStrategy = 0x7f0400db; - public static final int fontProviderFetchTimeout = 0x7f0400dc; - public static final int fontProviderPackage = 0x7f0400dd; - public static final int fontProviderQuery = 0x7f0400de; - public static final int fontStyle = 0x7f0400df; - public static final int fontVariationSettings = 0x7f0400e0; - public static final int fontWeight = 0x7f0400e1; - public static final int ttcIndex = 0x7f040208; - } - public static final class color { - private color() {} - - public static final int notification_action_color_filter = 0x7f06006a; - public static final int notification_icon_bg_color = 0x7f06006b; - public static final int ripple_material_light = 0x7f060075; - public static final int secondary_text_default_material_light = 0x7f060077; - } - public static final class dimen { - private dimen() {} - - public static final int compat_button_inset_horizontal_material = 0x7f07004e; - public static final int compat_button_inset_vertical_material = 0x7f07004f; - public static final int compat_button_padding_horizontal_material = 0x7f070050; - public static final int compat_button_padding_vertical_material = 0x7f070051; - public static final int compat_control_corner_material = 0x7f070052; - public static final int compat_notification_large_icon_max_height = 0x7f070053; - public static final int compat_notification_large_icon_max_width = 0x7f070054; - public static final int notification_action_icon_size = 0x7f0700c5; - public static final int notification_action_text_size = 0x7f0700c6; - public static final int notification_big_circle_margin = 0x7f0700c7; - public static final int notification_content_margin_start = 0x7f0700c8; - public static final int notification_large_icon_height = 0x7f0700c9; - public static final int notification_large_icon_width = 0x7f0700ca; - public static final int notification_main_column_padding_top = 0x7f0700cb; - public static final int notification_media_narrow_margin = 0x7f0700cc; - public static final int notification_right_icon_size = 0x7f0700cd; - public static final int notification_right_side_padding_top = 0x7f0700ce; - public static final int notification_small_icon_background_padding = 0x7f0700cf; - public static final int notification_small_icon_size_as_large = 0x7f0700d0; - public static final int notification_subtext_size = 0x7f0700d1; - public static final int notification_top_pad = 0x7f0700d2; - public static final int notification_top_pad_large_text = 0x7f0700d3; - } - public static final class drawable { - private drawable() {} - - public static final int notification_action_background = 0x7f08006b; - public static final int notification_bg = 0x7f08006c; - public static final int notification_bg_low = 0x7f08006d; - public static final int notification_bg_low_normal = 0x7f08006e; - public static final int notification_bg_low_pressed = 0x7f08006f; - public static final int notification_bg_normal = 0x7f080070; - public static final int notification_bg_normal_pressed = 0x7f080071; - public static final int notification_icon_background = 0x7f080072; - public static final int notification_template_icon_bg = 0x7f080073; - public static final int notification_template_icon_low_bg = 0x7f080074; - public static final int notification_tile_bg = 0x7f080075; - public static final int notify_panel_notification_icon_bg = 0x7f080076; - } - public static final class id { - private id() {} - - public static final int action_container = 0x7f09000d; - public static final int action_divider = 0x7f09000f; - public static final int action_image = 0x7f090010; - public static final int action_text = 0x7f090017; - public static final int actions = 0x7f090018; - public static final int async = 0x7f09001e; - public static final int blocking = 0x7f090022; - public static final int chronometer = 0x7f09002b; - public static final int forever = 0x7f09004f; - public static final int icon = 0x7f090056; - public static final int icon_group = 0x7f090057; - public static final int info = 0x7f09005a; - public static final int italic = 0x7f09005c; - public static final int line1 = 0x7f090062; - public static final int line3 = 0x7f090063; - public static final int normal = 0x7f090071; - public static final int notification_background = 0x7f090073; - public static final int notification_main_column = 0x7f090074; - public static final int notification_main_column_container = 0x7f090075; - public static final int right_icon = 0x7f090082; - public static final int right_side = 0x7f090083; - public static final int tag_transition_group = 0x7f0900b1; - public static final int tag_unhandled_key_event_manager = 0x7f0900b2; - public static final int tag_unhandled_key_listeners = 0x7f0900b3; - public static final int text = 0x7f0900b4; - public static final int text2 = 0x7f0900b5; - public static final int time = 0x7f0900bd; - public static final int title = 0x7f0900be; - } - public static final class integer { - private integer() {} - - public static final int status_bar_notification_info_maxnum = 0x7f0a000e; - } - public static final class layout { - private layout() {} - - public static final int notification_action = 0x7f0c0030; - public static final int notification_action_tombstone = 0x7f0c0031; - public static final int notification_template_custom_big = 0x7f0c0032; - public static final int notification_template_icon_group = 0x7f0c0033; - public static final int notification_template_part_chronometer = 0x7f0c0034; - public static final int notification_template_part_time = 0x7f0c0035; - } - public static final class string { - private string() {} - - public static final int status_bar_notification_info_overflow = 0x7f0f0037; - } - public static final class style { - private style() {} - - public static final int TextAppearance_Compat_Notification = 0x7f10011c; - public static final int TextAppearance_Compat_Notification_Info = 0x7f10011d; - public static final int TextAppearance_Compat_Notification_Line2 = 0x7f10011e; - public static final int TextAppearance_Compat_Notification_Time = 0x7f10011f; - public static final int TextAppearance_Compat_Notification_Title = 0x7f100120; - public static final int Widget_Compat_NotificationActionContainer = 0x7f1001c6; - public static final int Widget_Compat_NotificationActionText = 0x7f1001c7; - } - public static final class styleable { - private styleable() {} - - public static final int[] ColorStateListItem = { 0x10101a5, 0x101031f, 0x7f040027 }; - public static final int ColorStateListItem_android_color = 0; - public static final int ColorStateListItem_android_alpha = 1; - public static final int ColorStateListItem_alpha = 2; - public static final int[] FontFamily = { 0x7f0400d9, 0x7f0400da, 0x7f0400db, 0x7f0400dc, 0x7f0400dd, 0x7f0400de }; - public static final int FontFamily_fontProviderAuthority = 0; - public static final int FontFamily_fontProviderCerts = 1; - public static final int FontFamily_fontProviderFetchStrategy = 2; - public static final int FontFamily_fontProviderFetchTimeout = 3; - public static final int FontFamily_fontProviderPackage = 4; - public static final int FontFamily_fontProviderQuery = 5; - public static final int[] FontFamilyFont = { 0x1010532, 0x1010533, 0x101053f, 0x101056f, 0x1010570, 0x7f0400d7, 0x7f0400df, 0x7f0400e0, 0x7f0400e1, 0x7f040208 }; - public static final int FontFamilyFont_android_font = 0; - public static final int FontFamilyFont_android_fontWeight = 1; - public static final int FontFamilyFont_android_fontStyle = 2; - public static final int FontFamilyFont_android_ttcIndex = 3; - public static final int FontFamilyFont_android_fontVariationSettings = 4; - public static final int FontFamilyFont_font = 5; - public static final int FontFamilyFont_fontStyle = 6; - public static final int FontFamilyFont_fontVariationSettings = 7; - public static final int FontFamilyFont_fontWeight = 8; - public static final int FontFamilyFont_ttcIndex = 9; - public static final int[] GradientColor = { 0x101019d, 0x101019e, 0x10101a1, 0x10101a2, 0x10101a3, 0x10101a4, 0x1010201, 0x101020b, 0x1010510, 0x1010511, 0x1010512, 0x1010513 }; - public static final int GradientColor_android_startColor = 0; - public static final int GradientColor_android_endColor = 1; - public static final int GradientColor_android_type = 2; - public static final int GradientColor_android_centerX = 3; - public static final int GradientColor_android_centerY = 4; - public static final int GradientColor_android_gradientRadius = 5; - public static final int GradientColor_android_tileMode = 6; - public static final int GradientColor_android_centerColor = 7; - public static final int GradientColor_android_startX = 8; - public static final int GradientColor_android_startY = 9; - public static final int GradientColor_android_endX = 10; - public static final int GradientColor_android_endY = 11; - public static final int[] GradientColorItem = { 0x10101a5, 0x1010514 }; - public static final int GradientColorItem_android_color = 0; - public static final int GradientColorItem_android_offset = 1; - } -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/design/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/design/R.java deleted file mode 100755 index a265780..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/design/R.java +++ /dev/null @@ -1,2513 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.support.design; - -public final class R { - private R() {} - - public static final class anim { - private anim() {} - - public static final int abc_fade_in = 0x7f010000; - public static final int abc_fade_out = 0x7f010001; - public static final int abc_grow_fade_in_from_bottom = 0x7f010002; - public static final int abc_popup_enter = 0x7f010003; - public static final int abc_popup_exit = 0x7f010004; - public static final int abc_shrink_fade_out_from_bottom = 0x7f010005; - public static final int abc_slide_in_bottom = 0x7f010006; - public static final int abc_slide_in_top = 0x7f010007; - public static final int abc_slide_out_bottom = 0x7f010008; - public static final int abc_slide_out_top = 0x7f010009; - public static final int abc_tooltip_enter = 0x7f01000a; - public static final int abc_tooltip_exit = 0x7f01000b; - public static final int design_bottom_sheet_slide_in = 0x7f01000c; - public static final int design_bottom_sheet_slide_out = 0x7f01000d; - public static final int design_snackbar_in = 0x7f01000e; - public static final int design_snackbar_out = 0x7f01000f; - } - public static final class animator { - private animator() {} - - public static final int design_appbar_state_list_animator = 0x7f020000; - public static final int design_fab_hide_motion_spec = 0x7f020001; - public static final int design_fab_show_motion_spec = 0x7f020002; - public static final int mtrl_btn_state_list_anim = 0x7f020003; - public static final int mtrl_btn_unelevated_state_list_anim = 0x7f020004; - public static final int mtrl_chip_state_list_anim = 0x7f020005; - public static final int mtrl_fab_hide_motion_spec = 0x7f020006; - public static final int mtrl_fab_show_motion_spec = 0x7f020007; - public static final int mtrl_fab_transformation_sheet_collapse_spec = 0x7f020008; - public static final int mtrl_fab_transformation_sheet_expand_spec = 0x7f020009; - } - public static final class attr { - private attr() {} - - public static final int actionBarDivider = 0x7f040000; - public static final int actionBarItemBackground = 0x7f040001; - public static final int actionBarPopupTheme = 0x7f040002; - public static final int actionBarSize = 0x7f040003; - public static final int actionBarSplitStyle = 0x7f040004; - public static final int actionBarStyle = 0x7f040005; - public static final int actionBarTabBarStyle = 0x7f040006; - public static final int actionBarTabStyle = 0x7f040007; - public static final int actionBarTabTextStyle = 0x7f040008; - public static final int actionBarTheme = 0x7f040009; - public static final int actionBarWidgetTheme = 0x7f04000a; - public static final int actionButtonStyle = 0x7f04000b; - public static final int actionDropDownStyle = 0x7f04000c; - public static final int actionLayout = 0x7f04000d; - public static final int actionMenuTextAppearance = 0x7f04000e; - public static final int actionMenuTextColor = 0x7f04000f; - public static final int actionModeBackground = 0x7f040010; - public static final int actionModeCloseButtonStyle = 0x7f040011; - public static final int actionModeCloseDrawable = 0x7f040012; - public static final int actionModeCopyDrawable = 0x7f040013; - public static final int actionModeCutDrawable = 0x7f040014; - public static final int actionModeFindDrawable = 0x7f040015; - public static final int actionModePasteDrawable = 0x7f040016; - public static final int actionModePopupWindowStyle = 0x7f040017; - public static final int actionModeSelectAllDrawable = 0x7f040018; - public static final int actionModeShareDrawable = 0x7f040019; - public static final int actionModeSplitBackground = 0x7f04001a; - public static final int actionModeStyle = 0x7f04001b; - public static final int actionModeWebSearchDrawable = 0x7f04001c; - public static final int actionOverflowButtonStyle = 0x7f04001d; - public static final int actionOverflowMenuStyle = 0x7f04001e; - public static final int actionProviderClass = 0x7f04001f; - public static final int actionViewClass = 0x7f040020; - public static final int activityChooserViewStyle = 0x7f040021; - public static final int alertDialogButtonGroupStyle = 0x7f040022; - public static final int alertDialogCenterButtons = 0x7f040023; - public static final int alertDialogStyle = 0x7f040024; - public static final int alertDialogTheme = 0x7f040025; - public static final int allowStacking = 0x7f040026; - public static final int alpha = 0x7f040027; - public static final int alphabeticModifiers = 0x7f040028; - public static final int arrowHeadLength = 0x7f040029; - public static final int arrowShaftLength = 0x7f04002a; - public static final int autoCompleteTextViewStyle = 0x7f04002b; - public static final int autoSizeMaxTextSize = 0x7f04002c; - public static final int autoSizeMinTextSize = 0x7f04002d; - public static final int autoSizePresetSizes = 0x7f04002e; - public static final int autoSizeStepGranularity = 0x7f04002f; - public static final int autoSizeTextType = 0x7f040030; - public static final int background = 0x7f040031; - public static final int backgroundSplit = 0x7f040032; - public static final int backgroundStacked = 0x7f040033; - public static final int backgroundTint = 0x7f040034; - public static final int backgroundTintMode = 0x7f040035; - public static final int barLength = 0x7f040036; - public static final int behavior_autoHide = 0x7f040039; - public static final int behavior_fitToContents = 0x7f04003a; - public static final int behavior_hideable = 0x7f04003b; - public static final int behavior_overlapTop = 0x7f04003c; - public static final int behavior_peekHeight = 0x7f04003d; - public static final int behavior_skipCollapsed = 0x7f04003e; - public static final int borderWidth = 0x7f04003f; - public static final int borderlessButtonStyle = 0x7f040040; - public static final int bottomAppBarStyle = 0x7f040041; - public static final int bottomNavigationStyle = 0x7f040042; - public static final int bottomSheetDialogTheme = 0x7f040043; - public static final int bottomSheetStyle = 0x7f040044; - public static final int boxBackgroundColor = 0x7f040045; - public static final int boxBackgroundMode = 0x7f040046; - public static final int boxCollapsedPaddingTop = 0x7f040047; - public static final int boxCornerRadiusBottomEnd = 0x7f040048; - public static final int boxCornerRadiusBottomStart = 0x7f040049; - public static final int boxCornerRadiusTopEnd = 0x7f04004a; - public static final int boxCornerRadiusTopStart = 0x7f04004b; - public static final int boxStrokeColor = 0x7f04004c; - public static final int boxStrokeWidth = 0x7f04004d; - public static final int buttonBarButtonStyle = 0x7f04004e; - public static final int buttonBarNegativeButtonStyle = 0x7f04004f; - public static final int buttonBarNeutralButtonStyle = 0x7f040050; - public static final int buttonBarPositiveButtonStyle = 0x7f040051; - public static final int buttonBarStyle = 0x7f040052; - public static final int buttonGravity = 0x7f040053; - public static final int buttonIconDimen = 0x7f040054; - public static final int buttonPanelSideLayout = 0x7f040055; - public static final int buttonStyle = 0x7f040056; - public static final int buttonStyleSmall = 0x7f040057; - public static final int buttonTint = 0x7f040058; - public static final int buttonTintMode = 0x7f040059; - public static final int cardBackgroundColor = 0x7f04005a; - public static final int cardCornerRadius = 0x7f04005b; - public static final int cardElevation = 0x7f04005c; - public static final int cardMaxElevation = 0x7f04005d; - public static final int cardPreventCornerOverlap = 0x7f04005e; - public static final int cardUseCompatPadding = 0x7f04005f; - public static final int cardViewStyle = 0x7f040060; - public static final int checkboxStyle = 0x7f040062; - public static final int checkedChip = 0x7f040063; - public static final int checkedIcon = 0x7f040064; - public static final int checkedIconEnabled = 0x7f040065; - public static final int checkedIconVisible = 0x7f040066; - public static final int checkedTextViewStyle = 0x7f040067; - public static final int chipBackgroundColor = 0x7f040068; - public static final int chipCornerRadius = 0x7f040069; - public static final int chipEndPadding = 0x7f04006a; - public static final int chipGroupStyle = 0x7f04006b; - public static final int chipIcon = 0x7f04006c; - public static final int chipIconEnabled = 0x7f04006d; - public static final int chipIconSize = 0x7f04006e; - public static final int chipIconTint = 0x7f04006f; - public static final int chipIconVisible = 0x7f040070; - public static final int chipMinHeight = 0x7f040071; - public static final int chipSpacing = 0x7f040072; - public static final int chipSpacingHorizontal = 0x7f040073; - public static final int chipSpacingVertical = 0x7f040074; - public static final int chipStandaloneStyle = 0x7f040075; - public static final int chipStartPadding = 0x7f040076; - public static final int chipStrokeColor = 0x7f040077; - public static final int chipStrokeWidth = 0x7f040078; - public static final int chipStyle = 0x7f040079; - public static final int closeIcon = 0x7f04007a; - public static final int closeIconEnabled = 0x7f04007b; - public static final int closeIconEndPadding = 0x7f04007c; - public static final int closeIconSize = 0x7f04007d; - public static final int closeIconStartPadding = 0x7f04007e; - public static final int closeIconTint = 0x7f04007f; - public static final int closeIconVisible = 0x7f040080; - public static final int closeItemLayout = 0x7f040081; - public static final int collapseContentDescription = 0x7f040082; - public static final int collapseIcon = 0x7f040083; - public static final int collapsedTitleGravity = 0x7f040084; - public static final int collapsedTitleTextAppearance = 0x7f040085; - public static final int color = 0x7f040086; - public static final int colorAccent = 0x7f040087; - public static final int colorBackgroundFloating = 0x7f040088; - public static final int colorButtonNormal = 0x7f040089; - public static final int colorControlActivated = 0x7f04008a; - public static final int colorControlHighlight = 0x7f04008b; - public static final int colorControlNormal = 0x7f04008c; - public static final int colorError = 0x7f04008d; - public static final int colorPrimary = 0x7f04008e; - public static final int colorPrimaryDark = 0x7f04008f; - public static final int colorSecondary = 0x7f040090; - public static final int colorSwitchThumbNormal = 0x7f040091; - public static final int commitIcon = 0x7f040092; - public static final int contentDescription = 0x7f040096; - public static final int contentInsetEnd = 0x7f040097; - public static final int contentInsetEndWithActions = 0x7f040098; - public static final int contentInsetLeft = 0x7f040099; - public static final int contentInsetRight = 0x7f04009a; - public static final int contentInsetStart = 0x7f04009b; - public static final int contentInsetStartWithNavigation = 0x7f04009c; - public static final int contentPadding = 0x7f04009d; - public static final int contentPaddingBottom = 0x7f04009e; - public static final int contentPaddingLeft = 0x7f04009f; - public static final int contentPaddingRight = 0x7f0400a0; - public static final int contentPaddingTop = 0x7f0400a1; - public static final int contentScrim = 0x7f0400a2; - public static final int controlBackground = 0x7f0400a3; - public static final int coordinatorLayoutStyle = 0x7f0400a4; - public static final int cornerRadius = 0x7f0400a5; - public static final int counterEnabled = 0x7f0400a6; - public static final int counterMaxLength = 0x7f0400a7; - public static final int counterOverflowTextAppearance = 0x7f0400a8; - public static final int counterTextAppearance = 0x7f0400a9; - public static final int customNavigationLayout = 0x7f0400aa; - public static final int defaultQueryHint = 0x7f0400ab; - public static final int dialogCornerRadius = 0x7f0400ac; - public static final int dialogPreferredPadding = 0x7f0400ad; - public static final int dialogTheme = 0x7f0400ae; - public static final int displayOptions = 0x7f0400af; - public static final int divider = 0x7f0400b0; - public static final int dividerHorizontal = 0x7f0400b1; - public static final int dividerPadding = 0x7f0400b2; - public static final int dividerVertical = 0x7f0400b3; - public static final int drawableSize = 0x7f0400b4; - public static final int drawerArrowStyle = 0x7f0400b5; - public static final int dropDownListViewStyle = 0x7f0400b6; - public static final int dropdownListPreferredItemHeight = 0x7f0400b7; - public static final int editTextBackground = 0x7f0400b8; - public static final int editTextColor = 0x7f0400b9; - public static final int editTextStyle = 0x7f0400ba; - public static final int elevation = 0x7f0400bb; - public static final int enforceMaterialTheme = 0x7f0400bd; - public static final int enforceTextAppearance = 0x7f0400be; - public static final int errorEnabled = 0x7f0400bf; - public static final int errorTextAppearance = 0x7f0400c0; - public static final int expandActivityOverflowButtonDrawable = 0x7f0400c1; - public static final int expanded = 0x7f0400c2; - public static final int expandedTitleGravity = 0x7f0400c3; - public static final int expandedTitleMargin = 0x7f0400c4; - public static final int expandedTitleMarginBottom = 0x7f0400c5; - public static final int expandedTitleMarginEnd = 0x7f0400c6; - public static final int expandedTitleMarginStart = 0x7f0400c7; - public static final int expandedTitleMarginTop = 0x7f0400c8; - public static final int expandedTitleTextAppearance = 0x7f0400c9; - public static final int fabAlignmentMode = 0x7f0400ca; - public static final int fabCradleMargin = 0x7f0400cb; - public static final int fabCradleRoundedCornerRadius = 0x7f0400cc; - public static final int fabCradleVerticalOffset = 0x7f0400cd; - public static final int fabCustomSize = 0x7f0400ce; - public static final int fabSize = 0x7f0400cf; - public static final int fastScrollEnabled = 0x7f0400d0; - public static final int fastScrollHorizontalThumbDrawable = 0x7f0400d1; - public static final int fastScrollHorizontalTrackDrawable = 0x7f0400d2; - public static final int fastScrollVerticalThumbDrawable = 0x7f0400d3; - public static final int fastScrollVerticalTrackDrawable = 0x7f0400d4; - public static final int firstBaselineToTopHeight = 0x7f0400d5; - public static final int floatingActionButtonStyle = 0x7f0400d6; - public static final int font = 0x7f0400d7; - public static final int fontFamily = 0x7f0400d8; - public static final int fontProviderAuthority = 0x7f0400d9; - public static final int fontProviderCerts = 0x7f0400da; - public static final int fontProviderFetchStrategy = 0x7f0400db; - public static final int fontProviderFetchTimeout = 0x7f0400dc; - public static final int fontProviderPackage = 0x7f0400dd; - public static final int fontProviderQuery = 0x7f0400de; - public static final int fontStyle = 0x7f0400df; - public static final int fontVariationSettings = 0x7f0400e0; - public static final int fontWeight = 0x7f0400e1; - public static final int foregroundInsidePadding = 0x7f0400e2; - public static final int gapBetweenBars = 0x7f0400e3; - public static final int goIcon = 0x7f0400e4; - public static final int headerLayout = 0x7f0400e5; - public static final int height = 0x7f0400e6; - public static final int helperText = 0x7f0400e7; - public static final int helperTextEnabled = 0x7f0400e8; - public static final int helperTextTextAppearance = 0x7f0400e9; - public static final int hideMotionSpec = 0x7f0400ea; - public static final int hideOnContentScroll = 0x7f0400eb; - public static final int hideOnScroll = 0x7f0400ec; - public static final int hintAnimationEnabled = 0x7f0400ed; - public static final int hintEnabled = 0x7f0400ee; - public static final int hintTextAppearance = 0x7f0400ef; - public static final int homeAsUpIndicator = 0x7f0400f0; - public static final int homeLayout = 0x7f0400f1; - public static final int hoveredFocusedTranslationZ = 0x7f0400f2; - public static final int icon = 0x7f0400f3; - public static final int iconEndPadding = 0x7f0400f4; - public static final int iconGravity = 0x7f0400f5; - public static final int iconPadding = 0x7f0400f6; - public static final int iconSize = 0x7f0400f7; - public static final int iconStartPadding = 0x7f0400f8; - public static final int iconTint = 0x7f0400f9; - public static final int iconTintMode = 0x7f0400fa; - public static final int iconifiedByDefault = 0x7f0400fb; - public static final int imageButtonStyle = 0x7f0400fc; - public static final int indeterminateProgressStyle = 0x7f0400fd; - public static final int initialActivityCount = 0x7f0400fe; - public static final int insetForeground = 0x7f0400ff; - public static final int isLightTheme = 0x7f040100; - public static final int itemBackground = 0x7f040101; - public static final int itemHorizontalPadding = 0x7f040102; - public static final int itemHorizontalTranslationEnabled = 0x7f040103; - public static final int itemIconPadding = 0x7f040104; - public static final int itemIconSize = 0x7f040105; - public static final int itemIconTint = 0x7f040106; - public static final int itemPadding = 0x7f040107; - public static final int itemSpacing = 0x7f040108; - public static final int itemTextAppearance = 0x7f040109; - public static final int itemTextAppearanceActive = 0x7f04010a; - public static final int itemTextAppearanceInactive = 0x7f04010b; - public static final int itemTextColor = 0x7f04010c; - public static final int keylines = 0x7f04010d; - public static final int labelVisibilityMode = 0x7f04010e; - public static final int lastBaselineToBottomHeight = 0x7f04010f; - public static final int layout = 0x7f040110; - public static final int layoutManager = 0x7f040111; - public static final int layout_anchor = 0x7f040112; - public static final int layout_anchorGravity = 0x7f040113; - public static final int layout_behavior = 0x7f040114; - public static final int layout_collapseMode = 0x7f040115; - public static final int layout_collapseParallaxMultiplier = 0x7f040116; - public static final int layout_dodgeInsetEdges = 0x7f040140; - public static final int layout_insetEdge = 0x7f040149; - public static final int layout_keyline = 0x7f04014a; - public static final int layout_scrollFlags = 0x7f04014c; - public static final int layout_scrollInterpolator = 0x7f04014d; - public static final int liftOnScroll = 0x7f04014e; - public static final int lineHeight = 0x7f04014f; - public static final int lineSpacing = 0x7f040150; - public static final int listChoiceBackgroundIndicator = 0x7f040151; - public static final int listDividerAlertDialog = 0x7f040152; - public static final int listItemLayout = 0x7f040153; - public static final int listLayout = 0x7f040154; - public static final int listMenuViewStyle = 0x7f040155; - public static final int listPopupWindowStyle = 0x7f040156; - public static final int listPreferredItemHeight = 0x7f040157; - public static final int listPreferredItemHeightLarge = 0x7f040158; - public static final int listPreferredItemHeightSmall = 0x7f040159; - public static final int listPreferredItemPaddingLeft = 0x7f04015a; - public static final int listPreferredItemPaddingRight = 0x7f04015b; - public static final int logo = 0x7f04015c; - public static final int logoDescription = 0x7f04015d; - public static final int materialButtonStyle = 0x7f04015e; - public static final int materialCardViewStyle = 0x7f04015f; - public static final int maxActionInlineWidth = 0x7f040160; - public static final int maxButtonHeight = 0x7f040161; - public static final int maxImageSize = 0x7f040162; - public static final int measureWithLargestChild = 0x7f040163; - public static final int menu = 0x7f040164; - public static final int multiChoiceItemLayout = 0x7f040165; - public static final int navigationContentDescription = 0x7f040166; - public static final int navigationIcon = 0x7f040167; - public static final int navigationMode = 0x7f040168; - public static final int navigationViewStyle = 0x7f040169; - public static final int numericModifiers = 0x7f04016a; - public static final int overlapAnchor = 0x7f04016b; - public static final int paddingBottomNoButtons = 0x7f04016c; - public static final int paddingEnd = 0x7f04016d; - public static final int paddingStart = 0x7f04016e; - public static final int paddingTopNoTitle = 0x7f04016f; - public static final int panelBackground = 0x7f040170; - public static final int panelMenuListTheme = 0x7f040171; - public static final int panelMenuListWidth = 0x7f040172; - public static final int passwordToggleContentDescription = 0x7f040173; - public static final int passwordToggleDrawable = 0x7f040174; - public static final int passwordToggleEnabled = 0x7f040175; - public static final int passwordToggleTint = 0x7f040176; - public static final int passwordToggleTintMode = 0x7f040177; - public static final int popupMenuStyle = 0x7f040178; - public static final int popupTheme = 0x7f040179; - public static final int popupWindowStyle = 0x7f04017a; - public static final int preserveIconSpacing = 0x7f04017b; - public static final int pressedTranslationZ = 0x7f04017c; - public static final int progressBarPadding = 0x7f04017d; - public static final int progressBarStyle = 0x7f04017e; - public static final int queryBackground = 0x7f04017f; - public static final int queryHint = 0x7f040180; - public static final int radioButtonStyle = 0x7f040181; - public static final int ratingBarStyle = 0x7f040182; - public static final int ratingBarStyleIndicator = 0x7f040183; - public static final int ratingBarStyleSmall = 0x7f040184; - public static final int reverseLayout = 0x7f040185; - public static final int rippleColor = 0x7f040186; - public static final int scrimAnimationDuration = 0x7f040187; - public static final int scrimBackground = 0x7f040188; - public static final int scrimVisibleHeightTrigger = 0x7f040189; - public static final int searchHintIcon = 0x7f04018a; - public static final int searchIcon = 0x7f04018b; - public static final int searchViewStyle = 0x7f04018c; - public static final int seekBarStyle = 0x7f04018d; - public static final int selectableItemBackground = 0x7f04018e; - public static final int selectableItemBackgroundBorderless = 0x7f04018f; - public static final int showAsAction = 0x7f040190; - public static final int showDividers = 0x7f040191; - public static final int showMotionSpec = 0x7f040192; - public static final int showText = 0x7f040193; - public static final int showTitle = 0x7f040194; - public static final int singleChoiceItemLayout = 0x7f040195; - public static final int singleLine = 0x7f040196; - public static final int singleSelection = 0x7f040197; - public static final int snackbarButtonStyle = 0x7f040198; - public static final int snackbarStyle = 0x7f040199; - public static final int spanCount = 0x7f04019a; - public static final int spinBars = 0x7f04019b; - public static final int spinnerDropDownItemStyle = 0x7f04019c; - public static final int spinnerStyle = 0x7f04019d; - public static final int splitTrack = 0x7f04019e; - public static final int srcCompat = 0x7f04019f; - public static final int stackFromEnd = 0x7f0401a0; - public static final int state_above_anchor = 0x7f0401a1; - public static final int state_collapsed = 0x7f0401a2; - public static final int state_collapsible = 0x7f0401a3; - public static final int state_liftable = 0x7f0401a4; - public static final int state_lifted = 0x7f0401a5; - public static final int statusBarBackground = 0x7f0401a6; - public static final int statusBarScrim = 0x7f0401a7; - public static final int strokeColor = 0x7f0401a8; - public static final int strokeWidth = 0x7f0401a9; - public static final int subMenuArrow = 0x7f0401aa; - public static final int submitBackground = 0x7f0401ab; - public static final int subtitle = 0x7f0401ac; - public static final int subtitleTextAppearance = 0x7f0401ad; - public static final int subtitleTextColor = 0x7f0401ae; - public static final int subtitleTextStyle = 0x7f0401af; - public static final int suggestionRowLayout = 0x7f0401b0; - public static final int switchMinWidth = 0x7f0401b1; - public static final int switchPadding = 0x7f0401b2; - public static final int switchStyle = 0x7f0401b3; - public static final int switchTextAppearance = 0x7f0401b4; - public static final int tabBackground = 0x7f0401b5; - public static final int tabContentStart = 0x7f0401b6; - public static final int tabGravity = 0x7f0401b7; - public static final int tabIconTint = 0x7f0401b8; - public static final int tabIconTintMode = 0x7f0401b9; - public static final int tabIndicator = 0x7f0401ba; - public static final int tabIndicatorAnimationDuration = 0x7f0401bb; - public static final int tabIndicatorColor = 0x7f0401bc; - public static final int tabIndicatorFullWidth = 0x7f0401bd; - public static final int tabIndicatorGravity = 0x7f0401be; - public static final int tabIndicatorHeight = 0x7f0401bf; - public static final int tabInlineLabel = 0x7f0401c0; - public static final int tabMaxWidth = 0x7f0401c1; - public static final int tabMinWidth = 0x7f0401c2; - public static final int tabMode = 0x7f0401c3; - public static final int tabPadding = 0x7f0401c4; - public static final int tabPaddingBottom = 0x7f0401c5; - public static final int tabPaddingEnd = 0x7f0401c6; - public static final int tabPaddingStart = 0x7f0401c7; - public static final int tabPaddingTop = 0x7f0401c8; - public static final int tabRippleColor = 0x7f0401c9; - public static final int tabSelectedTextColor = 0x7f0401ca; - public static final int tabStyle = 0x7f0401cb; - public static final int tabTextAppearance = 0x7f0401cc; - public static final int tabTextColor = 0x7f0401cd; - public static final int tabUnboundedRipple = 0x7f0401ce; - public static final int textAllCaps = 0x7f0401cf; - public static final int textAppearanceBody1 = 0x7f0401d0; - public static final int textAppearanceBody2 = 0x7f0401d1; - public static final int textAppearanceButton = 0x7f0401d2; - public static final int textAppearanceCaption = 0x7f0401d3; - public static final int textAppearanceHeadline1 = 0x7f0401d4; - public static final int textAppearanceHeadline2 = 0x7f0401d5; - public static final int textAppearanceHeadline3 = 0x7f0401d6; - public static final int textAppearanceHeadline4 = 0x7f0401d7; - public static final int textAppearanceHeadline5 = 0x7f0401d8; - public static final int textAppearanceHeadline6 = 0x7f0401d9; - public static final int textAppearanceLargePopupMenu = 0x7f0401da; - public static final int textAppearanceListItem = 0x7f0401db; - public static final int textAppearanceListItemSecondary = 0x7f0401dc; - public static final int textAppearanceListItemSmall = 0x7f0401dd; - public static final int textAppearanceOverline = 0x7f0401de; - public static final int textAppearancePopupMenuHeader = 0x7f0401df; - public static final int textAppearanceSearchResultSubtitle = 0x7f0401e0; - public static final int textAppearanceSearchResultTitle = 0x7f0401e1; - public static final int textAppearanceSmallPopupMenu = 0x7f0401e2; - public static final int textAppearanceSubtitle1 = 0x7f0401e3; - public static final int textAppearanceSubtitle2 = 0x7f0401e4; - public static final int textColorAlertDialogListItem = 0x7f0401e5; - public static final int textColorSearchUrl = 0x7f0401e6; - public static final int textEndPadding = 0x7f0401e7; - public static final int textInputStyle = 0x7f0401e8; - public static final int textStartPadding = 0x7f0401e9; - public static final int theme = 0x7f0401ea; - public static final int thickness = 0x7f0401eb; - public static final int thumbTextPadding = 0x7f0401ec; - public static final int thumbTint = 0x7f0401ed; - public static final int thumbTintMode = 0x7f0401ee; - public static final int tickMark = 0x7f0401ef; - public static final int tickMarkTint = 0x7f0401f0; - public static final int tickMarkTintMode = 0x7f0401f1; - public static final int tint = 0x7f0401f2; - public static final int tintMode = 0x7f0401f3; - public static final int title = 0x7f0401f4; - public static final int titleEnabled = 0x7f0401f5; - public static final int titleMargin = 0x7f0401f6; - public static final int titleMarginBottom = 0x7f0401f7; - public static final int titleMarginEnd = 0x7f0401f8; - public static final int titleMarginStart = 0x7f0401f9; - public static final int titleMarginTop = 0x7f0401fa; - public static final int titleMargins = 0x7f0401fb; - public static final int titleTextAppearance = 0x7f0401fc; - public static final int titleTextColor = 0x7f0401fd; - public static final int titleTextStyle = 0x7f0401fe; - public static final int toolbarId = 0x7f0401ff; - public static final int toolbarNavigationButtonStyle = 0x7f040200; - public static final int toolbarStyle = 0x7f040201; - public static final int tooltipForegroundColor = 0x7f040202; - public static final int tooltipFrameBackground = 0x7f040203; - public static final int tooltipText = 0x7f040204; - public static final int track = 0x7f040205; - public static final int trackTint = 0x7f040206; - public static final int trackTintMode = 0x7f040207; - public static final int ttcIndex = 0x7f040208; - public static final int useCompatPadding = 0x7f040209; - public static final int viewInflaterClass = 0x7f04020a; - public static final int voiceIcon = 0x7f04020b; - public static final int windowActionBar = 0x7f04020c; - public static final int windowActionBarOverlay = 0x7f04020d; - public static final int windowActionModeOverlay = 0x7f04020e; - public static final int windowFixedHeightMajor = 0x7f04020f; - public static final int windowFixedHeightMinor = 0x7f040210; - public static final int windowFixedWidthMajor = 0x7f040211; - public static final int windowFixedWidthMinor = 0x7f040212; - public static final int windowMinWidthMajor = 0x7f040213; - public static final int windowMinWidthMinor = 0x7f040214; - public static final int windowNoTitle = 0x7f040215; - } - public static final class bool { - private bool() {} - - public static final int abc_action_bar_embed_tabs = 0x7f050000; - public static final int abc_allow_stacked_button_bar = 0x7f050001; - public static final int abc_config_actionMenuItemAllCaps = 0x7f050002; - public static final int mtrl_btn_textappearance_all_caps = 0x7f050003; - } - public static final class color { - private color() {} - - public static final int abc_background_cache_hint_selector_material_dark = 0x7f060000; - public static final int abc_background_cache_hint_selector_material_light = 0x7f060001; - public static final int abc_btn_colored_borderless_text_material = 0x7f060002; - public static final int abc_btn_colored_text_material = 0x7f060003; - public static final int abc_color_highlight_material = 0x7f060004; - public static final int abc_hint_foreground_material_dark = 0x7f060005; - public static final int abc_hint_foreground_material_light = 0x7f060006; - public static final int abc_input_method_navigation_guard = 0x7f060007; - public static final int abc_primary_text_disable_only_material_dark = 0x7f060008; - public static final int abc_primary_text_disable_only_material_light = 0x7f060009; - public static final int abc_primary_text_material_dark = 0x7f06000a; - public static final int abc_primary_text_material_light = 0x7f06000b; - public static final int abc_search_url_text = 0x7f06000c; - public static final int abc_search_url_text_normal = 0x7f06000d; - public static final int abc_search_url_text_pressed = 0x7f06000e; - public static final int abc_search_url_text_selected = 0x7f06000f; - public static final int abc_secondary_text_material_dark = 0x7f060010; - public static final int abc_secondary_text_material_light = 0x7f060011; - public static final int abc_tint_btn_checkable = 0x7f060012; - public static final int abc_tint_default = 0x7f060013; - public static final int abc_tint_edittext = 0x7f060014; - public static final int abc_tint_seek_thumb = 0x7f060015; - public static final int abc_tint_spinner = 0x7f060016; - public static final int abc_tint_switch_track = 0x7f060017; - public static final int accent_material_dark = 0x7f060018; - public static final int accent_material_light = 0x7f060019; - public static final int background_floating_material_dark = 0x7f06001a; - public static final int background_floating_material_light = 0x7f06001b; - public static final int background_material_dark = 0x7f06001c; - public static final int background_material_light = 0x7f06001d; - public static final int bright_foreground_disabled_material_dark = 0x7f06001e; - public static final int bright_foreground_disabled_material_light = 0x7f06001f; - public static final int bright_foreground_inverse_material_dark = 0x7f060020; - public static final int bright_foreground_inverse_material_light = 0x7f060021; - public static final int bright_foreground_material_dark = 0x7f060022; - public static final int bright_foreground_material_light = 0x7f060023; - public static final int button_material_dark = 0x7f060024; - public static final int button_material_light = 0x7f060025; - public static final int cardview_dark_background = 0x7f060026; - public static final int cardview_light_background = 0x7f060027; - public static final int cardview_shadow_end_color = 0x7f060028; - public static final int cardview_shadow_start_color = 0x7f060029; - public static final int design_bottom_navigation_shadow_color = 0x7f06002d; - public static final int design_default_color_primary = 0x7f06002e; - public static final int design_default_color_primary_dark = 0x7f06002f; - public static final int design_error = 0x7f060030; - public static final int design_fab_shadow_end_color = 0x7f060031; - public static final int design_fab_shadow_mid_color = 0x7f060032; - public static final int design_fab_shadow_start_color = 0x7f060033; - public static final int design_fab_stroke_end_inner_color = 0x7f060034; - public static final int design_fab_stroke_end_outer_color = 0x7f060035; - public static final int design_fab_stroke_top_inner_color = 0x7f060036; - public static final int design_fab_stroke_top_outer_color = 0x7f060037; - public static final int design_snackbar_background_color = 0x7f060038; - public static final int design_tint_password_toggle = 0x7f060039; - public static final int dim_foreground_disabled_material_dark = 0x7f06003a; - public static final int dim_foreground_disabled_material_light = 0x7f06003b; - public static final int dim_foreground_material_dark = 0x7f06003c; - public static final int dim_foreground_material_light = 0x7f06003d; - public static final int error_color_material_dark = 0x7f06003e; - public static final int error_color_material_light = 0x7f06003f; - public static final int foreground_material_dark = 0x7f060040; - public static final int foreground_material_light = 0x7f060041; - public static final int highlighted_text_material_dark = 0x7f060042; - public static final int highlighted_text_material_light = 0x7f060043; - public static final int material_blue_grey_800 = 0x7f060044; - public static final int material_blue_grey_900 = 0x7f060045; - public static final int material_blue_grey_950 = 0x7f060046; - public static final int material_deep_teal_200 = 0x7f060047; - public static final int material_deep_teal_500 = 0x7f060048; - public static final int material_grey_100 = 0x7f060049; - public static final int material_grey_300 = 0x7f06004a; - public static final int material_grey_50 = 0x7f06004b; - public static final int material_grey_600 = 0x7f06004c; - public static final int material_grey_800 = 0x7f06004d; - public static final int material_grey_850 = 0x7f06004e; - public static final int material_grey_900 = 0x7f06004f; - public static final int mtrl_bottom_nav_colored_item_tint = 0x7f060050; - public static final int mtrl_bottom_nav_item_tint = 0x7f060051; - public static final int mtrl_btn_bg_color_disabled = 0x7f060052; - public static final int mtrl_btn_bg_color_selector = 0x7f060053; - public static final int mtrl_btn_ripple_color = 0x7f060054; - public static final int mtrl_btn_stroke_color_selector = 0x7f060055; - public static final int mtrl_btn_text_btn_ripple_color = 0x7f060056; - public static final int mtrl_btn_text_color_disabled = 0x7f060057; - public static final int mtrl_btn_text_color_selector = 0x7f060058; - public static final int mtrl_btn_transparent_bg_color = 0x7f060059; - public static final int mtrl_chip_background_color = 0x7f06005a; - public static final int mtrl_chip_close_icon_tint = 0x7f06005b; - public static final int mtrl_chip_ripple_color = 0x7f06005c; - public static final int mtrl_chip_text_color = 0x7f06005d; - public static final int mtrl_fab_ripple_color = 0x7f06005e; - public static final int mtrl_scrim_color = 0x7f06005f; - public static final int mtrl_tabs_colored_ripple_color = 0x7f060060; - public static final int mtrl_tabs_icon_color_selector = 0x7f060061; - public static final int mtrl_tabs_icon_color_selector_colored = 0x7f060062; - public static final int mtrl_tabs_legacy_text_color_selector = 0x7f060063; - public static final int mtrl_tabs_ripple_color = 0x7f060064; - public static final int mtrl_text_btn_text_color_selector = 0x7f060065; - public static final int mtrl_textinput_default_box_stroke_color = 0x7f060066; - public static final int mtrl_textinput_disabled_color = 0x7f060067; - public static final int mtrl_textinput_filled_box_default_background_color = 0x7f060068; - public static final int mtrl_textinput_hovered_box_stroke_color = 0x7f060069; - public static final int notification_action_color_filter = 0x7f06006a; - public static final int notification_icon_bg_color = 0x7f06006b; - public static final int primary_dark_material_dark = 0x7f06006c; - public static final int primary_dark_material_light = 0x7f06006d; - public static final int primary_material_dark = 0x7f06006e; - public static final int primary_material_light = 0x7f06006f; - public static final int primary_text_default_material_dark = 0x7f060070; - public static final int primary_text_default_material_light = 0x7f060071; - public static final int primary_text_disabled_material_dark = 0x7f060072; - public static final int primary_text_disabled_material_light = 0x7f060073; - public static final int ripple_material_dark = 0x7f060074; - public static final int ripple_material_light = 0x7f060075; - public static final int secondary_text_default_material_dark = 0x7f060076; - public static final int secondary_text_default_material_light = 0x7f060077; - public static final int secondary_text_disabled_material_dark = 0x7f060078; - public static final int secondary_text_disabled_material_light = 0x7f060079; - public static final int switch_thumb_disabled_material_dark = 0x7f06007a; - public static final int switch_thumb_disabled_material_light = 0x7f06007b; - public static final int switch_thumb_material_dark = 0x7f06007c; - public static final int switch_thumb_material_light = 0x7f06007d; - public static final int switch_thumb_normal_material_dark = 0x7f06007e; - public static final int switch_thumb_normal_material_light = 0x7f06007f; - public static final int tooltip_background_dark = 0x7f060080; - public static final int tooltip_background_light = 0x7f060081; - } - public static final class dimen { - private dimen() {} - - public static final int abc_action_bar_content_inset_material = 0x7f070000; - public static final int abc_action_bar_content_inset_with_nav = 0x7f070001; - public static final int abc_action_bar_default_height_material = 0x7f070002; - public static final int abc_action_bar_default_padding_end_material = 0x7f070003; - public static final int abc_action_bar_default_padding_start_material = 0x7f070004; - public static final int abc_action_bar_elevation_material = 0x7f070005; - public static final int abc_action_bar_icon_vertical_padding_material = 0x7f070006; - public static final int abc_action_bar_overflow_padding_end_material = 0x7f070007; - public static final int abc_action_bar_overflow_padding_start_material = 0x7f070008; - public static final int abc_action_bar_stacked_max_height = 0x7f070009; - public static final int abc_action_bar_stacked_tab_max_width = 0x7f07000a; - public static final int abc_action_bar_subtitle_bottom_margin_material = 0x7f07000b; - public static final int abc_action_bar_subtitle_top_margin_material = 0x7f07000c; - public static final int abc_action_button_min_height_material = 0x7f07000d; - public static final int abc_action_button_min_width_material = 0x7f07000e; - public static final int abc_action_button_min_width_overflow_material = 0x7f07000f; - public static final int abc_alert_dialog_button_bar_height = 0x7f070010; - public static final int abc_alert_dialog_button_dimen = 0x7f070011; - public static final int abc_button_inset_horizontal_material = 0x7f070012; - public static final int abc_button_inset_vertical_material = 0x7f070013; - public static final int abc_button_padding_horizontal_material = 0x7f070014; - public static final int abc_button_padding_vertical_material = 0x7f070015; - public static final int abc_cascading_menus_min_smallest_width = 0x7f070016; - public static final int abc_config_prefDialogWidth = 0x7f070017; - public static final int abc_control_corner_material = 0x7f070018; - public static final int abc_control_inset_material = 0x7f070019; - public static final int abc_control_padding_material = 0x7f07001a; - public static final int abc_dialog_corner_radius_material = 0x7f07001b; - public static final int abc_dialog_fixed_height_major = 0x7f07001c; - public static final int abc_dialog_fixed_height_minor = 0x7f07001d; - public static final int abc_dialog_fixed_width_major = 0x7f07001e; - public static final int abc_dialog_fixed_width_minor = 0x7f07001f; - public static final int abc_dialog_list_padding_bottom_no_buttons = 0x7f070020; - public static final int abc_dialog_list_padding_top_no_title = 0x7f070021; - public static final int abc_dialog_min_width_major = 0x7f070022; - public static final int abc_dialog_min_width_minor = 0x7f070023; - public static final int abc_dialog_padding_material = 0x7f070024; - public static final int abc_dialog_padding_top_material = 0x7f070025; - public static final int abc_dialog_title_divider_material = 0x7f070026; - public static final int abc_disabled_alpha_material_dark = 0x7f070027; - public static final int abc_disabled_alpha_material_light = 0x7f070028; - public static final int abc_dropdownitem_icon_width = 0x7f070029; - public static final int abc_dropdownitem_text_padding_left = 0x7f07002a; - public static final int abc_dropdownitem_text_padding_right = 0x7f07002b; - public static final int abc_edit_text_inset_bottom_material = 0x7f07002c; - public static final int abc_edit_text_inset_horizontal_material = 0x7f07002d; - public static final int abc_edit_text_inset_top_material = 0x7f07002e; - public static final int abc_floating_window_z = 0x7f07002f; - public static final int abc_list_item_padding_horizontal_material = 0x7f070030; - public static final int abc_panel_menu_list_width = 0x7f070031; - public static final int abc_progress_bar_height_material = 0x7f070032; - public static final int abc_search_view_preferred_height = 0x7f070033; - public static final int abc_search_view_preferred_width = 0x7f070034; - public static final int abc_seekbar_track_background_height_material = 0x7f070035; - public static final int abc_seekbar_track_progress_height_material = 0x7f070036; - public static final int abc_select_dialog_padding_start_material = 0x7f070037; - public static final int abc_switch_padding = 0x7f070038; - public static final int abc_text_size_body_1_material = 0x7f070039; - public static final int abc_text_size_body_2_material = 0x7f07003a; - public static final int abc_text_size_button_material = 0x7f07003b; - public static final int abc_text_size_caption_material = 0x7f07003c; - public static final int abc_text_size_display_1_material = 0x7f07003d; - public static final int abc_text_size_display_2_material = 0x7f07003e; - public static final int abc_text_size_display_3_material = 0x7f07003f; - public static final int abc_text_size_display_4_material = 0x7f070040; - public static final int abc_text_size_headline_material = 0x7f070041; - public static final int abc_text_size_large_material = 0x7f070042; - public static final int abc_text_size_medium_material = 0x7f070043; - public static final int abc_text_size_menu_header_material = 0x7f070044; - public static final int abc_text_size_menu_material = 0x7f070045; - public static final int abc_text_size_small_material = 0x7f070046; - public static final int abc_text_size_subhead_material = 0x7f070047; - public static final int abc_text_size_subtitle_material_toolbar = 0x7f070048; - public static final int abc_text_size_title_material = 0x7f070049; - public static final int abc_text_size_title_material_toolbar = 0x7f07004a; - public static final int cardview_compat_inset_shadow = 0x7f07004b; - public static final int cardview_default_elevation = 0x7f07004c; - public static final int cardview_default_radius = 0x7f07004d; - public static final int compat_button_inset_horizontal_material = 0x7f07004e; - public static final int compat_button_inset_vertical_material = 0x7f07004f; - public static final int compat_button_padding_horizontal_material = 0x7f070050; - public static final int compat_button_padding_vertical_material = 0x7f070051; - public static final int compat_control_corner_material = 0x7f070052; - public static final int compat_notification_large_icon_max_height = 0x7f070053; - public static final int compat_notification_large_icon_max_width = 0x7f070054; - public static final int design_appbar_elevation = 0x7f070055; - public static final int design_bottom_navigation_active_item_max_width = 0x7f070056; - public static final int design_bottom_navigation_active_item_min_width = 0x7f070057; - public static final int design_bottom_navigation_active_text_size = 0x7f070058; - public static final int design_bottom_navigation_elevation = 0x7f070059; - public static final int design_bottom_navigation_height = 0x7f07005a; - public static final int design_bottom_navigation_icon_size = 0x7f07005b; - public static final int design_bottom_navigation_item_max_width = 0x7f07005c; - public static final int design_bottom_navigation_item_min_width = 0x7f07005d; - public static final int design_bottom_navigation_margin = 0x7f07005e; - public static final int design_bottom_navigation_shadow_height = 0x7f07005f; - public static final int design_bottom_navigation_text_size = 0x7f070060; - public static final int design_bottom_sheet_modal_elevation = 0x7f070061; - public static final int design_bottom_sheet_peek_height_min = 0x7f070062; - public static final int design_fab_border_width = 0x7f070063; - public static final int design_fab_elevation = 0x7f070064; - public static final int design_fab_image_size = 0x7f070065; - public static final int design_fab_size_mini = 0x7f070066; - public static final int design_fab_size_normal = 0x7f070067; - public static final int design_fab_translation_z_hovered_focused = 0x7f070068; - public static final int design_fab_translation_z_pressed = 0x7f070069; - public static final int design_navigation_elevation = 0x7f07006a; - public static final int design_navigation_icon_padding = 0x7f07006b; - public static final int design_navigation_icon_size = 0x7f07006c; - public static final int design_navigation_item_horizontal_padding = 0x7f07006d; - public static final int design_navigation_item_icon_padding = 0x7f07006e; - public static final int design_navigation_max_width = 0x7f07006f; - public static final int design_navigation_padding_bottom = 0x7f070070; - public static final int design_navigation_separator_vertical_padding = 0x7f070071; - public static final int design_snackbar_action_inline_max_width = 0x7f070072; - public static final int design_snackbar_background_corner_radius = 0x7f070073; - public static final int design_snackbar_elevation = 0x7f070074; - public static final int design_snackbar_extra_spacing_horizontal = 0x7f070075; - public static final int design_snackbar_max_width = 0x7f070076; - public static final int design_snackbar_min_width = 0x7f070077; - public static final int design_snackbar_padding_horizontal = 0x7f070078; - public static final int design_snackbar_padding_vertical = 0x7f070079; - public static final int design_snackbar_padding_vertical_2lines = 0x7f07007a; - public static final int design_snackbar_text_size = 0x7f07007b; - public static final int design_tab_max_width = 0x7f07007c; - public static final int design_tab_scrollable_min_width = 0x7f07007d; - public static final int design_tab_text_size = 0x7f07007e; - public static final int design_tab_text_size_2line = 0x7f07007f; - public static final int design_textinput_caption_translate_y = 0x7f070080; - public static final int disabled_alpha_material_dark = 0x7f070081; - public static final int disabled_alpha_material_light = 0x7f070082; - public static final int fastscroll_default_thickness = 0x7f070084; - public static final int fastscroll_margin = 0x7f070085; - public static final int fastscroll_minimum_range = 0x7f070086; - public static final int highlight_alpha_material_colored = 0x7f07008b; - public static final int highlight_alpha_material_dark = 0x7f07008c; - public static final int highlight_alpha_material_light = 0x7f07008d; - public static final int hint_alpha_material_dark = 0x7f07008e; - public static final int hint_alpha_material_light = 0x7f07008f; - public static final int hint_pressed_alpha_material_dark = 0x7f070090; - public static final int hint_pressed_alpha_material_light = 0x7f070091; - public static final int item_touch_helper_max_drag_scroll_per_frame = 0x7f070092; - public static final int item_touch_helper_swipe_escape_max_velocity = 0x7f070093; - public static final int item_touch_helper_swipe_escape_velocity = 0x7f070094; - public static final int mtrl_bottomappbar_fabOffsetEndMode = 0x7f070095; - public static final int mtrl_bottomappbar_fab_cradle_margin = 0x7f070096; - public static final int mtrl_bottomappbar_fab_cradle_rounded_corner_radius = 0x7f070097; - public static final int mtrl_bottomappbar_fab_cradle_vertical_offset = 0x7f070098; - public static final int mtrl_bottomappbar_height = 0x7f070099; - public static final int mtrl_btn_corner_radius = 0x7f07009a; - public static final int mtrl_btn_dialog_btn_min_width = 0x7f07009b; - public static final int mtrl_btn_disabled_elevation = 0x7f07009c; - public static final int mtrl_btn_disabled_z = 0x7f07009d; - public static final int mtrl_btn_elevation = 0x7f07009e; - public static final int mtrl_btn_focused_z = 0x7f07009f; - public static final int mtrl_btn_hovered_z = 0x7f0700a0; - public static final int mtrl_btn_icon_btn_padding_left = 0x7f0700a1; - public static final int mtrl_btn_icon_padding = 0x7f0700a2; - public static final int mtrl_btn_inset = 0x7f0700a3; - public static final int mtrl_btn_letter_spacing = 0x7f0700a4; - public static final int mtrl_btn_padding_bottom = 0x7f0700a5; - public static final int mtrl_btn_padding_left = 0x7f0700a6; - public static final int mtrl_btn_padding_right = 0x7f0700a7; - public static final int mtrl_btn_padding_top = 0x7f0700a8; - public static final int mtrl_btn_pressed_z = 0x7f0700a9; - public static final int mtrl_btn_stroke_size = 0x7f0700aa; - public static final int mtrl_btn_text_btn_icon_padding = 0x7f0700ab; - public static final int mtrl_btn_text_btn_padding_left = 0x7f0700ac; - public static final int mtrl_btn_text_btn_padding_right = 0x7f0700ad; - public static final int mtrl_btn_text_size = 0x7f0700ae; - public static final int mtrl_btn_z = 0x7f0700af; - public static final int mtrl_card_elevation = 0x7f0700b0; - public static final int mtrl_card_spacing = 0x7f0700b1; - public static final int mtrl_chip_pressed_translation_z = 0x7f0700b2; - public static final int mtrl_chip_text_size = 0x7f0700b3; - public static final int mtrl_fab_elevation = 0x7f0700b4; - public static final int mtrl_fab_translation_z_hovered_focused = 0x7f0700b5; - public static final int mtrl_fab_translation_z_pressed = 0x7f0700b6; - public static final int mtrl_navigation_elevation = 0x7f0700b7; - public static final int mtrl_navigation_item_horizontal_padding = 0x7f0700b8; - public static final int mtrl_navigation_item_icon_padding = 0x7f0700b9; - public static final int mtrl_snackbar_background_corner_radius = 0x7f0700ba; - public static final int mtrl_snackbar_margin = 0x7f0700bb; - public static final int mtrl_textinput_box_bottom_offset = 0x7f0700bc; - public static final int mtrl_textinput_box_corner_radius_medium = 0x7f0700bd; - public static final int mtrl_textinput_box_corner_radius_small = 0x7f0700be; - public static final int mtrl_textinput_box_label_cutout_padding = 0x7f0700bf; - public static final int mtrl_textinput_box_padding_end = 0x7f0700c0; - public static final int mtrl_textinput_box_stroke_width_default = 0x7f0700c1; - public static final int mtrl_textinput_box_stroke_width_focused = 0x7f0700c2; - public static final int mtrl_textinput_outline_box_expanded_padding = 0x7f0700c3; - public static final int mtrl_toolbar_default_height = 0x7f0700c4; - public static final int notification_action_icon_size = 0x7f0700c5; - public static final int notification_action_text_size = 0x7f0700c6; - public static final int notification_big_circle_margin = 0x7f0700c7; - public static final int notification_content_margin_start = 0x7f0700c8; - public static final int notification_large_icon_height = 0x7f0700c9; - public static final int notification_large_icon_width = 0x7f0700ca; - public static final int notification_main_column_padding_top = 0x7f0700cb; - public static final int notification_media_narrow_margin = 0x7f0700cc; - public static final int notification_right_icon_size = 0x7f0700cd; - public static final int notification_right_side_padding_top = 0x7f0700ce; - public static final int notification_small_icon_background_padding = 0x7f0700cf; - public static final int notification_small_icon_size_as_large = 0x7f0700d0; - public static final int notification_subtext_size = 0x7f0700d1; - public static final int notification_top_pad = 0x7f0700d2; - public static final int notification_top_pad_large_text = 0x7f0700d3; - public static final int tooltip_corner_radius = 0x7f0700d4; - public static final int tooltip_horizontal_padding = 0x7f0700d5; - public static final int tooltip_margin = 0x7f0700d6; - public static final int tooltip_precise_anchor_extra_offset = 0x7f0700d7; - public static final int tooltip_precise_anchor_threshold = 0x7f0700d8; - public static final int tooltip_vertical_padding = 0x7f0700d9; - public static final int tooltip_y_offset_non_touch = 0x7f0700da; - public static final int tooltip_y_offset_touch = 0x7f0700db; - } - public static final class drawable { - private drawable() {} - - public static final int abc_ab_share_pack_mtrl_alpha = 0x7f080007; - public static final int abc_action_bar_item_background_material = 0x7f080008; - public static final int abc_btn_borderless_material = 0x7f080009; - public static final int abc_btn_check_material = 0x7f08000a; - public static final int abc_btn_check_to_on_mtrl_000 = 0x7f08000b; - public static final int abc_btn_check_to_on_mtrl_015 = 0x7f08000c; - public static final int abc_btn_colored_material = 0x7f08000d; - public static final int abc_btn_default_mtrl_shape = 0x7f08000e; - public static final int abc_btn_radio_material = 0x7f08000f; - public static final int abc_btn_radio_to_on_mtrl_000 = 0x7f080010; - public static final int abc_btn_radio_to_on_mtrl_015 = 0x7f080011; - public static final int abc_btn_switch_to_on_mtrl_00001 = 0x7f080012; - public static final int abc_btn_switch_to_on_mtrl_00012 = 0x7f080013; - public static final int abc_cab_background_internal_bg = 0x7f080014; - public static final int abc_cab_background_top_material = 0x7f080015; - public static final int abc_cab_background_top_mtrl_alpha = 0x7f080016; - public static final int abc_control_background_material = 0x7f080017; - public static final int abc_dialog_material_background = 0x7f080018; - public static final int abc_edit_text_material = 0x7f080019; - public static final int abc_ic_ab_back_material = 0x7f08001a; - public static final int abc_ic_arrow_drop_right_black_24dp = 0x7f08001b; - public static final int abc_ic_clear_material = 0x7f08001c; - public static final int abc_ic_commit_search_api_mtrl_alpha = 0x7f08001d; - public static final int abc_ic_go_search_api_material = 0x7f08001e; - public static final int abc_ic_menu_copy_mtrl_am_alpha = 0x7f08001f; - public static final int abc_ic_menu_cut_mtrl_alpha = 0x7f080020; - public static final int abc_ic_menu_overflow_material = 0x7f080021; - public static final int abc_ic_menu_paste_mtrl_am_alpha = 0x7f080022; - public static final int abc_ic_menu_selectall_mtrl_alpha = 0x7f080023; - public static final int abc_ic_menu_share_mtrl_alpha = 0x7f080024; - public static final int abc_ic_search_api_material = 0x7f080025; - public static final int abc_ic_star_black_16dp = 0x7f080026; - public static final int abc_ic_star_black_36dp = 0x7f080027; - public static final int abc_ic_star_black_48dp = 0x7f080028; - public static final int abc_ic_star_half_black_16dp = 0x7f080029; - public static final int abc_ic_star_half_black_36dp = 0x7f08002a; - public static final int abc_ic_star_half_black_48dp = 0x7f08002b; - public static final int abc_ic_voice_search_api_material = 0x7f08002c; - public static final int abc_item_background_holo_dark = 0x7f08002d; - public static final int abc_item_background_holo_light = 0x7f08002e; - public static final int abc_list_divider_material = 0x7f08002f; - public static final int abc_list_divider_mtrl_alpha = 0x7f080030; - public static final int abc_list_focused_holo = 0x7f080031; - public static final int abc_list_longpressed_holo = 0x7f080032; - public static final int abc_list_pressed_holo_dark = 0x7f080033; - public static final int abc_list_pressed_holo_light = 0x7f080034; - public static final int abc_list_selector_background_transition_holo_dark = 0x7f080035; - public static final int abc_list_selector_background_transition_holo_light = 0x7f080036; - public static final int abc_list_selector_disabled_holo_dark = 0x7f080037; - public static final int abc_list_selector_disabled_holo_light = 0x7f080038; - public static final int abc_list_selector_holo_dark = 0x7f080039; - public static final int abc_list_selector_holo_light = 0x7f08003a; - public static final int abc_menu_hardkey_panel_mtrl_mult = 0x7f08003b; - public static final int abc_popup_background_mtrl_mult = 0x7f08003c; - public static final int abc_ratingbar_indicator_material = 0x7f08003d; - public static final int abc_ratingbar_material = 0x7f08003e; - public static final int abc_ratingbar_small_material = 0x7f08003f; - public static final int abc_scrubber_control_off_mtrl_alpha = 0x7f080040; - public static final int abc_scrubber_control_to_pressed_mtrl_000 = 0x7f080041; - public static final int abc_scrubber_control_to_pressed_mtrl_005 = 0x7f080042; - public static final int abc_scrubber_primary_mtrl_alpha = 0x7f080043; - public static final int abc_scrubber_track_mtrl_alpha = 0x7f080044; - public static final int abc_seekbar_thumb_material = 0x7f080045; - public static final int abc_seekbar_tick_mark_material = 0x7f080046; - public static final int abc_seekbar_track_material = 0x7f080047; - public static final int abc_spinner_mtrl_am_alpha = 0x7f080048; - public static final int abc_spinner_textfield_background_material = 0x7f080049; - public static final int abc_switch_thumb_material = 0x7f08004a; - public static final int abc_switch_track_mtrl_alpha = 0x7f08004b; - public static final int abc_tab_indicator_material = 0x7f08004c; - public static final int abc_tab_indicator_mtrl_alpha = 0x7f08004d; - public static final int abc_text_cursor_material = 0x7f08004e; - public static final int abc_text_select_handle_left_mtrl_dark = 0x7f08004f; - public static final int abc_text_select_handle_left_mtrl_light = 0x7f080050; - public static final int abc_text_select_handle_middle_mtrl_dark = 0x7f080051; - public static final int abc_text_select_handle_middle_mtrl_light = 0x7f080052; - public static final int abc_text_select_handle_right_mtrl_dark = 0x7f080053; - public static final int abc_text_select_handle_right_mtrl_light = 0x7f080054; - public static final int abc_textfield_activated_mtrl_alpha = 0x7f080055; - public static final int abc_textfield_default_mtrl_alpha = 0x7f080056; - public static final int abc_textfield_search_activated_mtrl_alpha = 0x7f080057; - public static final int abc_textfield_search_default_mtrl_alpha = 0x7f080058; - public static final int abc_textfield_search_material = 0x7f080059; - public static final int abc_vector_test = 0x7f08005a; - public static final int avd_hide_password = 0x7f08005b; - public static final int avd_show_password = 0x7f08005c; - public static final int design_bottom_navigation_item_background = 0x7f08005d; - public static final int design_fab_background = 0x7f08005e; - public static final int design_ic_visibility = 0x7f08005f; - public static final int design_ic_visibility_off = 0x7f080060; - public static final int design_password_eye = 0x7f080061; - public static final int design_snackbar_background = 0x7f080062; - public static final int ic_mtrl_chip_checked_black = 0x7f080065; - public static final int ic_mtrl_chip_checked_circle = 0x7f080066; - public static final int ic_mtrl_chip_close_circle = 0x7f080067; - public static final int mtrl_snackbar_background = 0x7f080068; - public static final int mtrl_tabs_default_indicator = 0x7f080069; - public static final int navigation_empty_icon = 0x7f08006a; - public static final int notification_action_background = 0x7f08006b; - public static final int notification_bg = 0x7f08006c; - public static final int notification_bg_low = 0x7f08006d; - public static final int notification_bg_low_normal = 0x7f08006e; - public static final int notification_bg_low_pressed = 0x7f08006f; - public static final int notification_bg_normal = 0x7f080070; - public static final int notification_bg_normal_pressed = 0x7f080071; - public static final int notification_icon_background = 0x7f080072; - public static final int notification_template_icon_bg = 0x7f080073; - public static final int notification_template_icon_low_bg = 0x7f080074; - public static final int notification_tile_bg = 0x7f080075; - public static final int notify_panel_notification_icon_bg = 0x7f080076; - public static final int tooltip_frame_dark = 0x7f080077; - public static final int tooltip_frame_light = 0x7f080078; - } - public static final class id { - private id() {} - - public static final int action_bar = 0x7f090006; - public static final int action_bar_activity_content = 0x7f090007; - public static final int action_bar_container = 0x7f090008; - public static final int action_bar_root = 0x7f090009; - public static final int action_bar_spinner = 0x7f09000a; - public static final int action_bar_subtitle = 0x7f09000b; - public static final int action_bar_title = 0x7f09000c; - public static final int action_container = 0x7f09000d; - public static final int action_context_bar = 0x7f09000e; - public static final int action_divider = 0x7f09000f; - public static final int action_image = 0x7f090010; - public static final int action_menu_divider = 0x7f090011; - public static final int action_menu_presenter = 0x7f090012; - public static final int action_mode_bar = 0x7f090013; - public static final int action_mode_bar_stub = 0x7f090014; - public static final int action_mode_close_button = 0x7f090015; - public static final int action_text = 0x7f090017; - public static final int actions = 0x7f090018; - public static final int activity_chooser_view_content = 0x7f090019; - public static final int add = 0x7f09001a; - public static final int alertTitle = 0x7f09001b; - public static final int async = 0x7f09001e; - public static final int auto = 0x7f09001f; - public static final int blocking = 0x7f090022; - public static final int bottom = 0x7f090023; - public static final int buttonPanel = 0x7f090025; - public static final int center = 0x7f090026; - public static final int checkbox = 0x7f09002a; - public static final int chronometer = 0x7f09002b; - public static final int container = 0x7f090032; - public static final int content = 0x7f090033; - public static final int contentPanel = 0x7f090034; - public static final int coordinator = 0x7f090035; - public static final int custom = 0x7f090036; - public static final int customPanel = 0x7f090037; - public static final int decor_content_parent = 0x7f090038; - public static final int default_activity_button = 0x7f090039; - public static final int design_bottom_sheet = 0x7f09003a; - public static final int design_menu_item_action_area = 0x7f09003b; - public static final int design_menu_item_action_area_stub = 0x7f09003c; - public static final int design_menu_item_text = 0x7f09003d; - public static final int design_navigation_view = 0x7f09003e; - public static final int edit_query = 0x7f090042; - public static final int end = 0x7f090043; - public static final int expand_activities_button = 0x7f090047; - public static final int expanded_menu = 0x7f090048; - public static final int fill = 0x7f090049; - public static final int filled = 0x7f09004c; - public static final int fixed = 0x7f09004d; - public static final int forever = 0x7f09004f; - public static final int ghost_view = 0x7f090050; - public static final int group_divider = 0x7f090052; - public static final int home = 0x7f090054; - public static final int icon = 0x7f090056; - public static final int icon_group = 0x7f090057; - public static final int image = 0x7f090059; - public static final int info = 0x7f09005a; - public static final int italic = 0x7f09005c; - public static final int item_touch_helper_previous_elevation = 0x7f09005d; - public static final int labeled = 0x7f09005e; - public static final int largeLabel = 0x7f09005f; - public static final int left = 0x7f090061; - public static final int line1 = 0x7f090062; - public static final int line3 = 0x7f090063; - public static final int listMode = 0x7f090064; - public static final int list_item = 0x7f090065; - public static final int masked = 0x7f090066; - public static final int message = 0x7f090068; - public static final int mini = 0x7f09006a; - public static final int mtrl_child_content_container = 0x7f09006b; - public static final int mtrl_internal_children_alpha_tag = 0x7f09006c; - public static final int multiply = 0x7f09006d; - public static final int navigation_header_container = 0x7f09006e; - public static final int none = 0x7f090070; - public static final int normal = 0x7f090071; - public static final int notification_background = 0x7f090073; - public static final int notification_main_column = 0x7f090074; - public static final int notification_main_column_container = 0x7f090075; - public static final int outline = 0x7f090076; - public static final int parallax = 0x7f090078; - public static final int parentPanel = 0x7f09007a; - public static final int parent_matrix = 0x7f09007b; - public static final int pin = 0x7f09007d; - public static final int progress_circular = 0x7f09007e; - public static final int progress_horizontal = 0x7f09007f; - public static final int radio = 0x7f090080; - public static final int right = 0x7f090081; - public static final int right_icon = 0x7f090082; - public static final int right_side = 0x7f090083; - public static final int save_image_matrix = 0x7f090084; - public static final int save_non_transition_alpha = 0x7f090085; - public static final int save_scale_type = 0x7f090086; - public static final int screen = 0x7f090087; - public static final int scrollIndicatorDown = 0x7f09008a; - public static final int scrollIndicatorUp = 0x7f09008b; - public static final int scrollView = 0x7f09008c; - public static final int scrollable = 0x7f09008d; - public static final int search_badge = 0x7f09008e; - public static final int search_bar = 0x7f09008f; - public static final int search_button = 0x7f090090; - public static final int search_close_btn = 0x7f090091; - public static final int search_edit_frame = 0x7f090092; - public static final int search_go_btn = 0x7f090093; - public static final int search_mag_icon = 0x7f090094; - public static final int search_plate = 0x7f090095; - public static final int search_src_text = 0x7f090096; - public static final int search_voice_btn = 0x7f090097; - public static final int select_dialog_listview = 0x7f090098; - public static final int selected = 0x7f090099; - public static final int shortcut = 0x7f09009a; - public static final int smallLabel = 0x7f09009e; - public static final int snackbar_action = 0x7f0900a0; - public static final int snackbar_text = 0x7f0900a1; - public static final int spacer = 0x7f0900a4; - public static final int split_action_bar = 0x7f0900a5; - public static final int src_atop = 0x7f0900a8; - public static final int src_in = 0x7f0900a9; - public static final int src_over = 0x7f0900aa; - public static final int start = 0x7f0900ac; - public static final int stretch = 0x7f0900ad; - public static final int submenuarrow = 0x7f0900ae; - public static final int submit_area = 0x7f0900af; - public static final int tabMode = 0x7f0900b0; - public static final int tag_transition_group = 0x7f0900b1; - public static final int tag_unhandled_key_event_manager = 0x7f0900b2; - public static final int tag_unhandled_key_listeners = 0x7f0900b3; - public static final int text = 0x7f0900b4; - public static final int text2 = 0x7f0900b5; - public static final int textSpacerNoButtons = 0x7f0900b6; - public static final int textSpacerNoTitle = 0x7f0900b7; - public static final int text_input_password_toggle = 0x7f0900b9; - public static final int textinput_counter = 0x7f0900ba; - public static final int textinput_error = 0x7f0900bb; - public static final int textinput_helper_text = 0x7f0900bc; - public static final int time = 0x7f0900bd; - public static final int title = 0x7f0900be; - public static final int titleDividerNoCustom = 0x7f0900bf; - public static final int title_template = 0x7f0900c0; - public static final int top = 0x7f0900c2; - public static final int topPanel = 0x7f0900c3; - public static final int touch_outside = 0x7f0900c4; - public static final int transition_current_scene = 0x7f0900c5; - public static final int transition_layout_save = 0x7f0900c6; - public static final int transition_position = 0x7f0900c7; - public static final int transition_scene_layoutid_cache = 0x7f0900c8; - public static final int transition_transform = 0x7f0900c9; - public static final int uniform = 0x7f0900ca; - public static final int unlabeled = 0x7f0900cb; - public static final int up = 0x7f0900cc; - public static final int view_offset_helper = 0x7f0900ce; - public static final int visible = 0x7f0900cf; - public static final int wrap_content = 0x7f0900d2; - } - public static final class integer { - private integer() {} - - public static final int abc_config_activityDefaultDur = 0x7f0a0000; - public static final int abc_config_activityShortDur = 0x7f0a0001; - public static final int app_bar_elevation_anim_duration = 0x7f0a0002; - public static final int bottom_sheet_slide_duration = 0x7f0a0003; - public static final int cancel_button_image_alpha = 0x7f0a0004; - public static final int config_tooltipAnimTime = 0x7f0a0005; - public static final int design_snackbar_text_max_lines = 0x7f0a0006; - public static final int design_tab_indicator_anim_duration_ms = 0x7f0a0007; - public static final int hide_password_duration = 0x7f0a0008; - public static final int mtrl_btn_anim_delay_ms = 0x7f0a0009; - public static final int mtrl_btn_anim_duration_ms = 0x7f0a000a; - public static final int mtrl_chip_anim_duration = 0x7f0a000b; - public static final int mtrl_tab_indicator_anim_duration_ms = 0x7f0a000c; - public static final int show_password_duration = 0x7f0a000d; - public static final int status_bar_notification_info_maxnum = 0x7f0a000e; - } - public static final class interpolator { - private interpolator() {} - - public static final int mtrl_fast_out_linear_in = 0x7f0b0000; - public static final int mtrl_fast_out_slow_in = 0x7f0b0001; - public static final int mtrl_linear = 0x7f0b0002; - public static final int mtrl_linear_out_slow_in = 0x7f0b0003; - } - public static final class layout { - private layout() {} - - public static final int abc_action_bar_title_item = 0x7f0c0000; - public static final int abc_action_bar_up_container = 0x7f0c0001; - public static final int abc_action_menu_item_layout = 0x7f0c0002; - public static final int abc_action_menu_layout = 0x7f0c0003; - public static final int abc_action_mode_bar = 0x7f0c0004; - public static final int abc_action_mode_close_item_material = 0x7f0c0005; - public static final int abc_activity_chooser_view = 0x7f0c0006; - public static final int abc_activity_chooser_view_list_item = 0x7f0c0007; - public static final int abc_alert_dialog_button_bar_material = 0x7f0c0008; - public static final int abc_alert_dialog_material = 0x7f0c0009; - public static final int abc_alert_dialog_title_material = 0x7f0c000a; - public static final int abc_cascading_menu_item_layout = 0x7f0c000b; - public static final int abc_dialog_title_material = 0x7f0c000c; - public static final int abc_expanded_menu_layout = 0x7f0c000d; - public static final int abc_list_menu_item_checkbox = 0x7f0c000e; - public static final int abc_list_menu_item_icon = 0x7f0c000f; - public static final int abc_list_menu_item_layout = 0x7f0c0010; - public static final int abc_list_menu_item_radio = 0x7f0c0011; - public static final int abc_popup_menu_header_item_layout = 0x7f0c0012; - public static final int abc_popup_menu_item_layout = 0x7f0c0013; - public static final int abc_screen_content_include = 0x7f0c0014; - public static final int abc_screen_simple = 0x7f0c0015; - public static final int abc_screen_simple_overlay_action_mode = 0x7f0c0016; - public static final int abc_screen_toolbar = 0x7f0c0017; - public static final int abc_search_dropdown_item_icons_2line = 0x7f0c0018; - public static final int abc_search_view = 0x7f0c0019; - public static final int abc_select_dialog_material = 0x7f0c001a; - public static final int abc_tooltip = 0x7f0c001b; - public static final int design_bottom_navigation_item = 0x7f0c0020; - public static final int design_bottom_sheet_dialog = 0x7f0c0021; - public static final int design_layout_snackbar = 0x7f0c0022; - public static final int design_layout_snackbar_include = 0x7f0c0023; - public static final int design_layout_tab_icon = 0x7f0c0024; - public static final int design_layout_tab_text = 0x7f0c0025; - public static final int design_menu_item_action_area = 0x7f0c0026; - public static final int design_navigation_item = 0x7f0c0027; - public static final int design_navigation_item_header = 0x7f0c0028; - public static final int design_navigation_item_separator = 0x7f0c0029; - public static final int design_navigation_item_subheader = 0x7f0c002a; - public static final int design_navigation_menu = 0x7f0c002b; - public static final int design_navigation_menu_item = 0x7f0c002c; - public static final int design_text_input_password_icon = 0x7f0c002d; - public static final int mtrl_layout_snackbar = 0x7f0c002e; - public static final int mtrl_layout_snackbar_include = 0x7f0c002f; - public static final int notification_action = 0x7f0c0030; - public static final int notification_action_tombstone = 0x7f0c0031; - public static final int notification_template_custom_big = 0x7f0c0032; - public static final int notification_template_icon_group = 0x7f0c0033; - public static final int notification_template_part_chronometer = 0x7f0c0034; - public static final int notification_template_part_time = 0x7f0c0035; - public static final int select_dialog_item_material = 0x7f0c0036; - public static final int select_dialog_multichoice_material = 0x7f0c0037; - public static final int select_dialog_singlechoice_material = 0x7f0c0038; - public static final int support_simple_spinner_dropdown_item = 0x7f0c0039; - } - public static final class string { - private string() {} - - public static final int abc_action_bar_home_description = 0x7f0f0000; - public static final int abc_action_bar_up_description = 0x7f0f0001; - public static final int abc_action_menu_overflow_description = 0x7f0f0002; - public static final int abc_action_mode_done = 0x7f0f0003; - public static final int abc_activity_chooser_view_see_all = 0x7f0f0004; - public static final int abc_activitychooserview_choose_application = 0x7f0f0005; - public static final int abc_capital_off = 0x7f0f0006; - public static final int abc_capital_on = 0x7f0f0007; - public static final int abc_font_family_body_1_material = 0x7f0f0008; - public static final int abc_font_family_body_2_material = 0x7f0f0009; - public static final int abc_font_family_button_material = 0x7f0f000a; - public static final int abc_font_family_caption_material = 0x7f0f000b; - public static final int abc_font_family_display_1_material = 0x7f0f000c; - public static final int abc_font_family_display_2_material = 0x7f0f000d; - public static final int abc_font_family_display_3_material = 0x7f0f000e; - public static final int abc_font_family_display_4_material = 0x7f0f000f; - public static final int abc_font_family_headline_material = 0x7f0f0010; - public static final int abc_font_family_menu_material = 0x7f0f0011; - public static final int abc_font_family_subhead_material = 0x7f0f0012; - public static final int abc_font_family_title_material = 0x7f0f0013; - public static final int abc_menu_alt_shortcut_label = 0x7f0f0014; - public static final int abc_menu_ctrl_shortcut_label = 0x7f0f0015; - public static final int abc_menu_delete_shortcut_label = 0x7f0f0016; - public static final int abc_menu_enter_shortcut_label = 0x7f0f0017; - public static final int abc_menu_function_shortcut_label = 0x7f0f0018; - public static final int abc_menu_meta_shortcut_label = 0x7f0f0019; - public static final int abc_menu_shift_shortcut_label = 0x7f0f001a; - public static final int abc_menu_space_shortcut_label = 0x7f0f001b; - public static final int abc_menu_sym_shortcut_label = 0x7f0f001c; - public static final int abc_prepend_shortcut_label = 0x7f0f001d; - public static final int abc_search_hint = 0x7f0f001e; - public static final int abc_searchview_description_clear = 0x7f0f001f; - public static final int abc_searchview_description_query = 0x7f0f0020; - public static final int abc_searchview_description_search = 0x7f0f0021; - public static final int abc_searchview_description_submit = 0x7f0f0022; - public static final int abc_searchview_description_voice = 0x7f0f0023; - public static final int abc_shareactionprovider_share_with = 0x7f0f0024; - public static final int abc_shareactionprovider_share_with_application = 0x7f0f0025; - public static final int abc_toolbar_collapse_description = 0x7f0f0026; - public static final int appbar_scrolling_view_behavior = 0x7f0f0029; - public static final int bottom_sheet_behavior = 0x7f0f002a; - public static final int character_counter_content_description = 0x7f0f002b; - public static final int character_counter_pattern = 0x7f0f002c; - public static final int fab_transformation_scrim_behavior = 0x7f0f002d; - public static final int fab_transformation_sheet_behavior = 0x7f0f002e; - public static final int hide_bottom_view_on_scroll_behavior = 0x7f0f002f; - public static final int mtrl_chip_close_icon_content_description = 0x7f0f0030; - public static final int password_toggle_content_description = 0x7f0f0031; - public static final int path_password_eye = 0x7f0f0032; - public static final int path_password_eye_mask_strike_through = 0x7f0f0033; - public static final int path_password_eye_mask_visible = 0x7f0f0034; - public static final int path_password_strike_through = 0x7f0f0035; - public static final int search_menu_title = 0x7f0f0036; - public static final int status_bar_notification_info_overflow = 0x7f0f0037; - } - public static final class style { - private style() {} - - public static final int AlertDialog_AppCompat = 0x7f100000; - public static final int AlertDialog_AppCompat_Light = 0x7f100001; - public static final int Animation_AppCompat_Dialog = 0x7f100002; - public static final int Animation_AppCompat_DropDownUp = 0x7f100003; - public static final int Animation_AppCompat_Tooltip = 0x7f100004; - public static final int Animation_Design_BottomSheetDialog = 0x7f100005; - public static final int Base_AlertDialog_AppCompat = 0x7f10000a; - public static final int Base_AlertDialog_AppCompat_Light = 0x7f10000b; - public static final int Base_Animation_AppCompat_Dialog = 0x7f10000c; - public static final int Base_Animation_AppCompat_DropDownUp = 0x7f10000d; - public static final int Base_Animation_AppCompat_Tooltip = 0x7f10000e; - public static final int Base_CardView = 0x7f10000f; - public static final int Base_DialogWindowTitleBackground_AppCompat = 0x7f100011; - public static final int Base_DialogWindowTitle_AppCompat = 0x7f100010; - public static final int Base_TextAppearance_AppCompat = 0x7f100012; - public static final int Base_TextAppearance_AppCompat_Body1 = 0x7f100013; - public static final int Base_TextAppearance_AppCompat_Body2 = 0x7f100014; - public static final int Base_TextAppearance_AppCompat_Button = 0x7f100015; - public static final int Base_TextAppearance_AppCompat_Caption = 0x7f100016; - public static final int Base_TextAppearance_AppCompat_Display1 = 0x7f100017; - public static final int Base_TextAppearance_AppCompat_Display2 = 0x7f100018; - public static final int Base_TextAppearance_AppCompat_Display3 = 0x7f100019; - public static final int Base_TextAppearance_AppCompat_Display4 = 0x7f10001a; - public static final int Base_TextAppearance_AppCompat_Headline = 0x7f10001b; - public static final int Base_TextAppearance_AppCompat_Inverse = 0x7f10001c; - public static final int Base_TextAppearance_AppCompat_Large = 0x7f10001d; - public static final int Base_TextAppearance_AppCompat_Large_Inverse = 0x7f10001e; - public static final int Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large = 0x7f10001f; - public static final int Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small = 0x7f100020; - public static final int Base_TextAppearance_AppCompat_Medium = 0x7f100021; - public static final int Base_TextAppearance_AppCompat_Medium_Inverse = 0x7f100022; - public static final int Base_TextAppearance_AppCompat_Menu = 0x7f100023; - public static final int Base_TextAppearance_AppCompat_SearchResult = 0x7f100024; - public static final int Base_TextAppearance_AppCompat_SearchResult_Subtitle = 0x7f100025; - public static final int Base_TextAppearance_AppCompat_SearchResult_Title = 0x7f100026; - public static final int Base_TextAppearance_AppCompat_Small = 0x7f100027; - public static final int Base_TextAppearance_AppCompat_Small_Inverse = 0x7f100028; - public static final int Base_TextAppearance_AppCompat_Subhead = 0x7f100029; - public static final int Base_TextAppearance_AppCompat_Subhead_Inverse = 0x7f10002a; - public static final int Base_TextAppearance_AppCompat_Title = 0x7f10002b; - public static final int Base_TextAppearance_AppCompat_Title_Inverse = 0x7f10002c; - public static final int Base_TextAppearance_AppCompat_Tooltip = 0x7f10002d; - public static final int Base_TextAppearance_AppCompat_Widget_ActionBar_Menu = 0x7f10002e; - public static final int Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle = 0x7f10002f; - public static final int Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse = 0x7f100030; - public static final int Base_TextAppearance_AppCompat_Widget_ActionBar_Title = 0x7f100031; - public static final int Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse = 0x7f100032; - public static final int Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle = 0x7f100033; - public static final int Base_TextAppearance_AppCompat_Widget_ActionMode_Title = 0x7f100034; - public static final int Base_TextAppearance_AppCompat_Widget_Button = 0x7f100035; - public static final int Base_TextAppearance_AppCompat_Widget_Button_Borderless_Colored = 0x7f100036; - public static final int Base_TextAppearance_AppCompat_Widget_Button_Colored = 0x7f100037; - public static final int Base_TextAppearance_AppCompat_Widget_Button_Inverse = 0x7f100038; - public static final int Base_TextAppearance_AppCompat_Widget_DropDownItem = 0x7f100039; - public static final int Base_TextAppearance_AppCompat_Widget_PopupMenu_Header = 0x7f10003a; - public static final int Base_TextAppearance_AppCompat_Widget_PopupMenu_Large = 0x7f10003b; - public static final int Base_TextAppearance_AppCompat_Widget_PopupMenu_Small = 0x7f10003c; - public static final int Base_TextAppearance_AppCompat_Widget_Switch = 0x7f10003d; - public static final int Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem = 0x7f10003e; - public static final int Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item = 0x7f10003f; - public static final int Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle = 0x7f100040; - public static final int Base_TextAppearance_Widget_AppCompat_Toolbar_Title = 0x7f100041; - public static final int Base_ThemeOverlay_AppCompat = 0x7f100061; - public static final int Base_ThemeOverlay_AppCompat_ActionBar = 0x7f100062; - public static final int Base_ThemeOverlay_AppCompat_Dark = 0x7f100063; - public static final int Base_ThemeOverlay_AppCompat_Dark_ActionBar = 0x7f100064; - public static final int Base_ThemeOverlay_AppCompat_Dialog = 0x7f100065; - public static final int Base_ThemeOverlay_AppCompat_Dialog_Alert = 0x7f100066; - public static final int Base_ThemeOverlay_AppCompat_Light = 0x7f100067; - public static final int Base_ThemeOverlay_MaterialComponents_Dialog = 0x7f100068; - public static final int Base_ThemeOverlay_MaterialComponents_Dialog_Alert = 0x7f100069; - public static final int Base_Theme_AppCompat = 0x7f100042; - public static final int Base_Theme_AppCompat_CompactMenu = 0x7f100043; - public static final int Base_Theme_AppCompat_Dialog = 0x7f100044; - public static final int Base_Theme_AppCompat_DialogWhenLarge = 0x7f100048; - public static final int Base_Theme_AppCompat_Dialog_Alert = 0x7f100045; - public static final int Base_Theme_AppCompat_Dialog_FixedSize = 0x7f100046; - public static final int Base_Theme_AppCompat_Dialog_MinWidth = 0x7f100047; - public static final int Base_Theme_AppCompat_Light = 0x7f100049; - public static final int Base_Theme_AppCompat_Light_DarkActionBar = 0x7f10004a; - public static final int Base_Theme_AppCompat_Light_Dialog = 0x7f10004b; - public static final int Base_Theme_AppCompat_Light_DialogWhenLarge = 0x7f10004f; - public static final int Base_Theme_AppCompat_Light_Dialog_Alert = 0x7f10004c; - public static final int Base_Theme_AppCompat_Light_Dialog_FixedSize = 0x7f10004d; - public static final int Base_Theme_AppCompat_Light_Dialog_MinWidth = 0x7f10004e; - public static final int Base_Theme_MaterialComponents = 0x7f100050; - public static final int Base_Theme_MaterialComponents_Bridge = 0x7f100051; - public static final int Base_Theme_MaterialComponents_CompactMenu = 0x7f100052; - public static final int Base_Theme_MaterialComponents_Dialog = 0x7f100053; - public static final int Base_Theme_MaterialComponents_DialogWhenLarge = 0x7f100057; - public static final int Base_Theme_MaterialComponents_Dialog_Alert = 0x7f100054; - public static final int Base_Theme_MaterialComponents_Dialog_FixedSize = 0x7f100055; - public static final int Base_Theme_MaterialComponents_Dialog_MinWidth = 0x7f100056; - public static final int Base_Theme_MaterialComponents_Light = 0x7f100058; - public static final int Base_Theme_MaterialComponents_Light_Bridge = 0x7f100059; - public static final int Base_Theme_MaterialComponents_Light_DarkActionBar = 0x7f10005a; - public static final int Base_Theme_MaterialComponents_Light_DarkActionBar_Bridge = 0x7f10005b; - public static final int Base_Theme_MaterialComponents_Light_Dialog = 0x7f10005c; - public static final int Base_Theme_MaterialComponents_Light_DialogWhenLarge = 0x7f100060; - public static final int Base_Theme_MaterialComponents_Light_Dialog_Alert = 0x7f10005d; - public static final int Base_Theme_MaterialComponents_Light_Dialog_FixedSize = 0x7f10005e; - public static final int Base_Theme_MaterialComponents_Light_Dialog_MinWidth = 0x7f10005f; - public static final int Base_V14_ThemeOverlay_MaterialComponents_Dialog = 0x7f100071; - public static final int Base_V14_ThemeOverlay_MaterialComponents_Dialog_Alert = 0x7f100072; - public static final int Base_V14_Theme_MaterialComponents = 0x7f10006a; - public static final int Base_V14_Theme_MaterialComponents_Bridge = 0x7f10006b; - public static final int Base_V14_Theme_MaterialComponents_Dialog = 0x7f10006c; - public static final int Base_V14_Theme_MaterialComponents_Light = 0x7f10006d; - public static final int Base_V14_Theme_MaterialComponents_Light_Bridge = 0x7f10006e; - public static final int Base_V14_Theme_MaterialComponents_Light_DarkActionBar_Bridge = 0x7f10006f; - public static final int Base_V14_Theme_MaterialComponents_Light_Dialog = 0x7f100070; - public static final int Base_V21_ThemeOverlay_AppCompat_Dialog = 0x7f100077; - public static final int Base_V21_Theme_AppCompat = 0x7f100073; - public static final int Base_V21_Theme_AppCompat_Dialog = 0x7f100074; - public static final int Base_V21_Theme_AppCompat_Light = 0x7f100075; - public static final int Base_V21_Theme_AppCompat_Light_Dialog = 0x7f100076; - public static final int Base_V22_Theme_AppCompat = 0x7f100078; - public static final int Base_V22_Theme_AppCompat_Light = 0x7f100079; - public static final int Base_V23_Theme_AppCompat = 0x7f10007a; - public static final int Base_V23_Theme_AppCompat_Light = 0x7f10007b; - public static final int Base_V26_Theme_AppCompat = 0x7f10007c; - public static final int Base_V26_Theme_AppCompat_Light = 0x7f10007d; - public static final int Base_V26_Widget_AppCompat_Toolbar = 0x7f10007e; - public static final int Base_V28_Theme_AppCompat = 0x7f10007f; - public static final int Base_V28_Theme_AppCompat_Light = 0x7f100080; - public static final int Base_V7_ThemeOverlay_AppCompat_Dialog = 0x7f100085; - public static final int Base_V7_Theme_AppCompat = 0x7f100081; - public static final int Base_V7_Theme_AppCompat_Dialog = 0x7f100082; - public static final int Base_V7_Theme_AppCompat_Light = 0x7f100083; - public static final int Base_V7_Theme_AppCompat_Light_Dialog = 0x7f100084; - public static final int Base_V7_Widget_AppCompat_AutoCompleteTextView = 0x7f100086; - public static final int Base_V7_Widget_AppCompat_EditText = 0x7f100087; - public static final int Base_V7_Widget_AppCompat_Toolbar = 0x7f100088; - public static final int Base_Widget_AppCompat_ActionBar = 0x7f100089; - public static final int Base_Widget_AppCompat_ActionBar_Solid = 0x7f10008a; - public static final int Base_Widget_AppCompat_ActionBar_TabBar = 0x7f10008b; - public static final int Base_Widget_AppCompat_ActionBar_TabText = 0x7f10008c; - public static final int Base_Widget_AppCompat_ActionBar_TabView = 0x7f10008d; - public static final int Base_Widget_AppCompat_ActionButton = 0x7f10008e; - public static final int Base_Widget_AppCompat_ActionButton_CloseMode = 0x7f10008f; - public static final int Base_Widget_AppCompat_ActionButton_Overflow = 0x7f100090; - public static final int Base_Widget_AppCompat_ActionMode = 0x7f100091; - public static final int Base_Widget_AppCompat_ActivityChooserView = 0x7f100092; - public static final int Base_Widget_AppCompat_AutoCompleteTextView = 0x7f100093; - public static final int Base_Widget_AppCompat_Button = 0x7f100094; - public static final int Base_Widget_AppCompat_ButtonBar = 0x7f10009a; - public static final int Base_Widget_AppCompat_ButtonBar_AlertDialog = 0x7f10009b; - public static final int Base_Widget_AppCompat_Button_Borderless = 0x7f100095; - public static final int Base_Widget_AppCompat_Button_Borderless_Colored = 0x7f100096; - public static final int Base_Widget_AppCompat_Button_ButtonBar_AlertDialog = 0x7f100097; - public static final int Base_Widget_AppCompat_Button_Colored = 0x7f100098; - public static final int Base_Widget_AppCompat_Button_Small = 0x7f100099; - public static final int Base_Widget_AppCompat_CompoundButton_CheckBox = 0x7f10009c; - public static final int Base_Widget_AppCompat_CompoundButton_RadioButton = 0x7f10009d; - public static final int Base_Widget_AppCompat_CompoundButton_Switch = 0x7f10009e; - public static final int Base_Widget_AppCompat_DrawerArrowToggle = 0x7f10009f; - public static final int Base_Widget_AppCompat_DrawerArrowToggle_Common = 0x7f1000a0; - public static final int Base_Widget_AppCompat_DropDownItem_Spinner = 0x7f1000a1; - public static final int Base_Widget_AppCompat_EditText = 0x7f1000a2; - public static final int Base_Widget_AppCompat_ImageButton = 0x7f1000a3; - public static final int Base_Widget_AppCompat_Light_ActionBar = 0x7f1000a4; - public static final int Base_Widget_AppCompat_Light_ActionBar_Solid = 0x7f1000a5; - public static final int Base_Widget_AppCompat_Light_ActionBar_TabBar = 0x7f1000a6; - public static final int Base_Widget_AppCompat_Light_ActionBar_TabText = 0x7f1000a7; - public static final int Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse = 0x7f1000a8; - public static final int Base_Widget_AppCompat_Light_ActionBar_TabView = 0x7f1000a9; - public static final int Base_Widget_AppCompat_Light_PopupMenu = 0x7f1000aa; - public static final int Base_Widget_AppCompat_Light_PopupMenu_Overflow = 0x7f1000ab; - public static final int Base_Widget_AppCompat_ListMenuView = 0x7f1000ac; - public static final int Base_Widget_AppCompat_ListPopupWindow = 0x7f1000ad; - public static final int Base_Widget_AppCompat_ListView = 0x7f1000ae; - public static final int Base_Widget_AppCompat_ListView_DropDown = 0x7f1000af; - public static final int Base_Widget_AppCompat_ListView_Menu = 0x7f1000b0; - public static final int Base_Widget_AppCompat_PopupMenu = 0x7f1000b1; - public static final int Base_Widget_AppCompat_PopupMenu_Overflow = 0x7f1000b2; - public static final int Base_Widget_AppCompat_PopupWindow = 0x7f1000b3; - public static final int Base_Widget_AppCompat_ProgressBar = 0x7f1000b4; - public static final int Base_Widget_AppCompat_ProgressBar_Horizontal = 0x7f1000b5; - public static final int Base_Widget_AppCompat_RatingBar = 0x7f1000b6; - public static final int Base_Widget_AppCompat_RatingBar_Indicator = 0x7f1000b7; - public static final int Base_Widget_AppCompat_RatingBar_Small = 0x7f1000b8; - public static final int Base_Widget_AppCompat_SearchView = 0x7f1000b9; - public static final int Base_Widget_AppCompat_SearchView_ActionBar = 0x7f1000ba; - public static final int Base_Widget_AppCompat_SeekBar = 0x7f1000bb; - public static final int Base_Widget_AppCompat_SeekBar_Discrete = 0x7f1000bc; - public static final int Base_Widget_AppCompat_Spinner = 0x7f1000bd; - public static final int Base_Widget_AppCompat_Spinner_Underlined = 0x7f1000be; - public static final int Base_Widget_AppCompat_TextView_SpinnerItem = 0x7f1000bf; - public static final int Base_Widget_AppCompat_Toolbar = 0x7f1000c0; - public static final int Base_Widget_AppCompat_Toolbar_Button_Navigation = 0x7f1000c1; - public static final int Base_Widget_Design_TabLayout = 0x7f1000c2; - public static final int Base_Widget_MaterialComponents_Chip = 0x7f1000c3; - public static final int Base_Widget_MaterialComponents_TextInputEditText = 0x7f1000c4; - public static final int Base_Widget_MaterialComponents_TextInputLayout = 0x7f1000c5; - public static final int CardView = 0x7f1000c6; - public static final int CardView_Dark = 0x7f1000c7; - public static final int CardView_Light = 0x7f1000c8; - public static final int Platform_AppCompat = 0x7f1000cc; - public static final int Platform_AppCompat_Light = 0x7f1000cd; - public static final int Platform_MaterialComponents = 0x7f1000ce; - public static final int Platform_MaterialComponents_Dialog = 0x7f1000cf; - public static final int Platform_MaterialComponents_Light = 0x7f1000d0; - public static final int Platform_MaterialComponents_Light_Dialog = 0x7f1000d1; - public static final int Platform_ThemeOverlay_AppCompat = 0x7f1000d2; - public static final int Platform_ThemeOverlay_AppCompat_Dark = 0x7f1000d3; - public static final int Platform_ThemeOverlay_AppCompat_Light = 0x7f1000d4; - public static final int Platform_V21_AppCompat = 0x7f1000d5; - public static final int Platform_V21_AppCompat_Light = 0x7f1000d6; - public static final int Platform_V25_AppCompat = 0x7f1000d7; - public static final int Platform_V25_AppCompat_Light = 0x7f1000d8; - public static final int Platform_Widget_AppCompat_Spinner = 0x7f1000d9; - public static final int RtlOverlay_DialogWindowTitle_AppCompat = 0x7f1000da; - public static final int RtlOverlay_Widget_AppCompat_ActionBar_TitleItem = 0x7f1000db; - public static final int RtlOverlay_Widget_AppCompat_DialogTitle_Icon = 0x7f1000dc; - public static final int RtlOverlay_Widget_AppCompat_PopupMenuItem = 0x7f1000dd; - public static final int RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup = 0x7f1000de; - public static final int RtlOverlay_Widget_AppCompat_PopupMenuItem_Shortcut = 0x7f1000df; - public static final int RtlOverlay_Widget_AppCompat_PopupMenuItem_SubmenuArrow = 0x7f1000e0; - public static final int RtlOverlay_Widget_AppCompat_PopupMenuItem_Text = 0x7f1000e1; - public static final int RtlOverlay_Widget_AppCompat_PopupMenuItem_Title = 0x7f1000e2; - public static final int RtlOverlay_Widget_AppCompat_SearchView_MagIcon = 0x7f1000e8; - public static final int RtlOverlay_Widget_AppCompat_Search_DropDown = 0x7f1000e3; - public static final int RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1 = 0x7f1000e4; - public static final int RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2 = 0x7f1000e5; - public static final int RtlOverlay_Widget_AppCompat_Search_DropDown_Query = 0x7f1000e6; - public static final int RtlOverlay_Widget_AppCompat_Search_DropDown_Text = 0x7f1000e7; - public static final int RtlUnderlay_Widget_AppCompat_ActionButton = 0x7f1000e9; - public static final int RtlUnderlay_Widget_AppCompat_ActionButton_Overflow = 0x7f1000ea; - public static final int TextAppearance_AppCompat = 0x7f1000ec; - public static final int TextAppearance_AppCompat_Body1 = 0x7f1000ed; - public static final int TextAppearance_AppCompat_Body2 = 0x7f1000ee; - public static final int TextAppearance_AppCompat_Button = 0x7f1000ef; - public static final int TextAppearance_AppCompat_Caption = 0x7f1000f0; - public static final int TextAppearance_AppCompat_Display1 = 0x7f1000f1; - public static final int TextAppearance_AppCompat_Display2 = 0x7f1000f2; - public static final int TextAppearance_AppCompat_Display3 = 0x7f1000f3; - public static final int TextAppearance_AppCompat_Display4 = 0x7f1000f4; - public static final int TextAppearance_AppCompat_Headline = 0x7f1000f5; - public static final int TextAppearance_AppCompat_Inverse = 0x7f1000f6; - public static final int TextAppearance_AppCompat_Large = 0x7f1000f7; - public static final int TextAppearance_AppCompat_Large_Inverse = 0x7f1000f8; - public static final int TextAppearance_AppCompat_Light_SearchResult_Subtitle = 0x7f1000f9; - public static final int TextAppearance_AppCompat_Light_SearchResult_Title = 0x7f1000fa; - public static final int TextAppearance_AppCompat_Light_Widget_PopupMenu_Large = 0x7f1000fb; - public static final int TextAppearance_AppCompat_Light_Widget_PopupMenu_Small = 0x7f1000fc; - public static final int TextAppearance_AppCompat_Medium = 0x7f1000fd; - public static final int TextAppearance_AppCompat_Medium_Inverse = 0x7f1000fe; - public static final int TextAppearance_AppCompat_Menu = 0x7f1000ff; - public static final int TextAppearance_AppCompat_SearchResult_Subtitle = 0x7f100100; - public static final int TextAppearance_AppCompat_SearchResult_Title = 0x7f100101; - public static final int TextAppearance_AppCompat_Small = 0x7f100102; - public static final int TextAppearance_AppCompat_Small_Inverse = 0x7f100103; - public static final int TextAppearance_AppCompat_Subhead = 0x7f100104; - public static final int TextAppearance_AppCompat_Subhead_Inverse = 0x7f100105; - public static final int TextAppearance_AppCompat_Title = 0x7f100106; - public static final int TextAppearance_AppCompat_Title_Inverse = 0x7f100107; - public static final int TextAppearance_AppCompat_Tooltip = 0x7f100108; - public static final int TextAppearance_AppCompat_Widget_ActionBar_Menu = 0x7f100109; - public static final int TextAppearance_AppCompat_Widget_ActionBar_Subtitle = 0x7f10010a; - public static final int TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse = 0x7f10010b; - public static final int TextAppearance_AppCompat_Widget_ActionBar_Title = 0x7f10010c; - public static final int TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse = 0x7f10010d; - public static final int TextAppearance_AppCompat_Widget_ActionMode_Subtitle = 0x7f10010e; - public static final int TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse = 0x7f10010f; - public static final int TextAppearance_AppCompat_Widget_ActionMode_Title = 0x7f100110; - public static final int TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse = 0x7f100111; - public static final int TextAppearance_AppCompat_Widget_Button = 0x7f100112; - public static final int TextAppearance_AppCompat_Widget_Button_Borderless_Colored = 0x7f100113; - public static final int TextAppearance_AppCompat_Widget_Button_Colored = 0x7f100114; - public static final int TextAppearance_AppCompat_Widget_Button_Inverse = 0x7f100115; - public static final int TextAppearance_AppCompat_Widget_DropDownItem = 0x7f100116; - public static final int TextAppearance_AppCompat_Widget_PopupMenu_Header = 0x7f100117; - public static final int TextAppearance_AppCompat_Widget_PopupMenu_Large = 0x7f100118; - public static final int TextAppearance_AppCompat_Widget_PopupMenu_Small = 0x7f100119; - public static final int TextAppearance_AppCompat_Widget_Switch = 0x7f10011a; - public static final int TextAppearance_AppCompat_Widget_TextView_SpinnerItem = 0x7f10011b; - public static final int TextAppearance_Compat_Notification = 0x7f10011c; - public static final int TextAppearance_Compat_Notification_Info = 0x7f10011d; - public static final int TextAppearance_Compat_Notification_Line2 = 0x7f10011e; - public static final int TextAppearance_Compat_Notification_Time = 0x7f10011f; - public static final int TextAppearance_Compat_Notification_Title = 0x7f100120; - public static final int TextAppearance_Design_CollapsingToolbar_Expanded = 0x7f100121; - public static final int TextAppearance_Design_Counter = 0x7f100122; - public static final int TextAppearance_Design_Counter_Overflow = 0x7f100123; - public static final int TextAppearance_Design_Error = 0x7f100124; - public static final int TextAppearance_Design_HelperText = 0x7f100125; - public static final int TextAppearance_Design_Hint = 0x7f100126; - public static final int TextAppearance_Design_Snackbar_Message = 0x7f100127; - public static final int TextAppearance_Design_Tab = 0x7f100128; - public static final int TextAppearance_MaterialComponents_Body1 = 0x7f100129; - public static final int TextAppearance_MaterialComponents_Body2 = 0x7f10012a; - public static final int TextAppearance_MaterialComponents_Button = 0x7f10012b; - public static final int TextAppearance_MaterialComponents_Caption = 0x7f10012c; - public static final int TextAppearance_MaterialComponents_Chip = 0x7f10012d; - public static final int TextAppearance_MaterialComponents_Headline1 = 0x7f10012e; - public static final int TextAppearance_MaterialComponents_Headline2 = 0x7f10012f; - public static final int TextAppearance_MaterialComponents_Headline3 = 0x7f100130; - public static final int TextAppearance_MaterialComponents_Headline4 = 0x7f100131; - public static final int TextAppearance_MaterialComponents_Headline5 = 0x7f100132; - public static final int TextAppearance_MaterialComponents_Headline6 = 0x7f100133; - public static final int TextAppearance_MaterialComponents_Overline = 0x7f100134; - public static final int TextAppearance_MaterialComponents_Subtitle1 = 0x7f100135; - public static final int TextAppearance_MaterialComponents_Subtitle2 = 0x7f100136; - public static final int TextAppearance_MaterialComponents_Tab = 0x7f100137; - public static final int TextAppearance_Widget_AppCompat_ExpandedMenu_Item = 0x7f100138; - public static final int TextAppearance_Widget_AppCompat_Toolbar_Subtitle = 0x7f100139; - public static final int TextAppearance_Widget_AppCompat_Toolbar_Title = 0x7f10013a; - public static final int ThemeOverlay_AppCompat = 0x7f10016b; - public static final int ThemeOverlay_AppCompat_ActionBar = 0x7f10016c; - public static final int ThemeOverlay_AppCompat_Dark = 0x7f10016d; - public static final int ThemeOverlay_AppCompat_Dark_ActionBar = 0x7f10016e; - public static final int ThemeOverlay_AppCompat_Dialog = 0x7f10016f; - public static final int ThemeOverlay_AppCompat_Dialog_Alert = 0x7f100170; - public static final int ThemeOverlay_AppCompat_Light = 0x7f100171; - public static final int ThemeOverlay_MaterialComponents = 0x7f100172; - public static final int ThemeOverlay_MaterialComponents_ActionBar = 0x7f100173; - public static final int ThemeOverlay_MaterialComponents_Dark = 0x7f100174; - public static final int ThemeOverlay_MaterialComponents_Dark_ActionBar = 0x7f100175; - public static final int ThemeOverlay_MaterialComponents_Dialog = 0x7f100176; - public static final int ThemeOverlay_MaterialComponents_Dialog_Alert = 0x7f100177; - public static final int ThemeOverlay_MaterialComponents_Light = 0x7f100178; - public static final int ThemeOverlay_MaterialComponents_TextInputEditText = 0x7f100179; - public static final int ThemeOverlay_MaterialComponents_TextInputEditText_FilledBox = 0x7f10017a; - public static final int ThemeOverlay_MaterialComponents_TextInputEditText_FilledBox_Dense = 0x7f10017b; - public static final int ThemeOverlay_MaterialComponents_TextInputEditText_OutlinedBox = 0x7f10017c; - public static final int ThemeOverlay_MaterialComponents_TextInputEditText_OutlinedBox_Dense = 0x7f10017d; - public static final int Theme_AppCompat = 0x7f10013b; - public static final int Theme_AppCompat_CompactMenu = 0x7f10013c; - public static final int Theme_AppCompat_DayNight = 0x7f10013d; - public static final int Theme_AppCompat_DayNight_DarkActionBar = 0x7f10013e; - public static final int Theme_AppCompat_DayNight_Dialog = 0x7f10013f; - public static final int Theme_AppCompat_DayNight_DialogWhenLarge = 0x7f100142; - public static final int Theme_AppCompat_DayNight_Dialog_Alert = 0x7f100140; - public static final int Theme_AppCompat_DayNight_Dialog_MinWidth = 0x7f100141; - public static final int Theme_AppCompat_DayNight_NoActionBar = 0x7f100143; - public static final int Theme_AppCompat_Dialog = 0x7f100144; - public static final int Theme_AppCompat_DialogWhenLarge = 0x7f100147; - public static final int Theme_AppCompat_Dialog_Alert = 0x7f100145; - public static final int Theme_AppCompat_Dialog_MinWidth = 0x7f100146; - public static final int Theme_AppCompat_Light = 0x7f100148; - public static final int Theme_AppCompat_Light_DarkActionBar = 0x7f100149; - public static final int Theme_AppCompat_Light_Dialog = 0x7f10014a; - public static final int Theme_AppCompat_Light_DialogWhenLarge = 0x7f10014d; - public static final int Theme_AppCompat_Light_Dialog_Alert = 0x7f10014b; - public static final int Theme_AppCompat_Light_Dialog_MinWidth = 0x7f10014c; - public static final int Theme_AppCompat_Light_NoActionBar = 0x7f10014e; - public static final int Theme_AppCompat_NoActionBar = 0x7f10014f; - public static final int Theme_Design = 0x7f100150; - public static final int Theme_Design_BottomSheetDialog = 0x7f100151; - public static final int Theme_Design_Light = 0x7f100152; - public static final int Theme_Design_Light_BottomSheetDialog = 0x7f100153; - public static final int Theme_Design_Light_NoActionBar = 0x7f100154; - public static final int Theme_Design_NoActionBar = 0x7f100155; - public static final int Theme_MaterialComponents = 0x7f100156; - public static final int Theme_MaterialComponents_BottomSheetDialog = 0x7f100157; - public static final int Theme_MaterialComponents_Bridge = 0x7f100158; - public static final int Theme_MaterialComponents_CompactMenu = 0x7f100159; - public static final int Theme_MaterialComponents_Dialog = 0x7f10015a; - public static final int Theme_MaterialComponents_DialogWhenLarge = 0x7f10015d; - public static final int Theme_MaterialComponents_Dialog_Alert = 0x7f10015b; - public static final int Theme_MaterialComponents_Dialog_MinWidth = 0x7f10015c; - public static final int Theme_MaterialComponents_Light = 0x7f10015e; - public static final int Theme_MaterialComponents_Light_BottomSheetDialog = 0x7f10015f; - public static final int Theme_MaterialComponents_Light_Bridge = 0x7f100160; - public static final int Theme_MaterialComponents_Light_DarkActionBar = 0x7f100161; - public static final int Theme_MaterialComponents_Light_DarkActionBar_Bridge = 0x7f100162; - public static final int Theme_MaterialComponents_Light_Dialog = 0x7f100163; - public static final int Theme_MaterialComponents_Light_DialogWhenLarge = 0x7f100166; - public static final int Theme_MaterialComponents_Light_Dialog_Alert = 0x7f100164; - public static final int Theme_MaterialComponents_Light_Dialog_MinWidth = 0x7f100165; - public static final int Theme_MaterialComponents_Light_NoActionBar = 0x7f100167; - public static final int Theme_MaterialComponents_Light_NoActionBar_Bridge = 0x7f100168; - public static final int Theme_MaterialComponents_NoActionBar = 0x7f100169; - public static final int Theme_MaterialComponents_NoActionBar_Bridge = 0x7f10016a; - public static final int Widget_AppCompat_ActionBar = 0x7f10017e; - public static final int Widget_AppCompat_ActionBar_Solid = 0x7f10017f; - public static final int Widget_AppCompat_ActionBar_TabBar = 0x7f100180; - public static final int Widget_AppCompat_ActionBar_TabText = 0x7f100181; - public static final int Widget_AppCompat_ActionBar_TabView = 0x7f100182; - public static final int Widget_AppCompat_ActionButton = 0x7f100183; - public static final int Widget_AppCompat_ActionButton_CloseMode = 0x7f100184; - public static final int Widget_AppCompat_ActionButton_Overflow = 0x7f100185; - public static final int Widget_AppCompat_ActionMode = 0x7f100186; - public static final int Widget_AppCompat_ActivityChooserView = 0x7f100187; - public static final int Widget_AppCompat_AutoCompleteTextView = 0x7f100188; - public static final int Widget_AppCompat_Button = 0x7f100189; - public static final int Widget_AppCompat_ButtonBar = 0x7f10018f; - public static final int Widget_AppCompat_ButtonBar_AlertDialog = 0x7f100190; - public static final int Widget_AppCompat_Button_Borderless = 0x7f10018a; - public static final int Widget_AppCompat_Button_Borderless_Colored = 0x7f10018b; - public static final int Widget_AppCompat_Button_ButtonBar_AlertDialog = 0x7f10018c; - public static final int Widget_AppCompat_Button_Colored = 0x7f10018d; - public static final int Widget_AppCompat_Button_Small = 0x7f10018e; - public static final int Widget_AppCompat_CompoundButton_CheckBox = 0x7f100191; - public static final int Widget_AppCompat_CompoundButton_RadioButton = 0x7f100192; - public static final int Widget_AppCompat_CompoundButton_Switch = 0x7f100193; - public static final int Widget_AppCompat_DrawerArrowToggle = 0x7f100194; - public static final int Widget_AppCompat_DropDownItem_Spinner = 0x7f100195; - public static final int Widget_AppCompat_EditText = 0x7f100196; - public static final int Widget_AppCompat_ImageButton = 0x7f100197; - public static final int Widget_AppCompat_Light_ActionBar = 0x7f100198; - public static final int Widget_AppCompat_Light_ActionBar_Solid = 0x7f100199; - public static final int Widget_AppCompat_Light_ActionBar_Solid_Inverse = 0x7f10019a; - public static final int Widget_AppCompat_Light_ActionBar_TabBar = 0x7f10019b; - public static final int Widget_AppCompat_Light_ActionBar_TabBar_Inverse = 0x7f10019c; - public static final int Widget_AppCompat_Light_ActionBar_TabText = 0x7f10019d; - public static final int Widget_AppCompat_Light_ActionBar_TabText_Inverse = 0x7f10019e; - public static final int Widget_AppCompat_Light_ActionBar_TabView = 0x7f10019f; - public static final int Widget_AppCompat_Light_ActionBar_TabView_Inverse = 0x7f1001a0; - public static final int Widget_AppCompat_Light_ActionButton = 0x7f1001a1; - public static final int Widget_AppCompat_Light_ActionButton_CloseMode = 0x7f1001a2; - public static final int Widget_AppCompat_Light_ActionButton_Overflow = 0x7f1001a3; - public static final int Widget_AppCompat_Light_ActionMode_Inverse = 0x7f1001a4; - public static final int Widget_AppCompat_Light_ActivityChooserView = 0x7f1001a5; - public static final int Widget_AppCompat_Light_AutoCompleteTextView = 0x7f1001a6; - public static final int Widget_AppCompat_Light_DropDownItem_Spinner = 0x7f1001a7; - public static final int Widget_AppCompat_Light_ListPopupWindow = 0x7f1001a8; - public static final int Widget_AppCompat_Light_ListView_DropDown = 0x7f1001a9; - public static final int Widget_AppCompat_Light_PopupMenu = 0x7f1001aa; - public static final int Widget_AppCompat_Light_PopupMenu_Overflow = 0x7f1001ab; - public static final int Widget_AppCompat_Light_SearchView = 0x7f1001ac; - public static final int Widget_AppCompat_Light_Spinner_DropDown_ActionBar = 0x7f1001ad; - public static final int Widget_AppCompat_ListMenuView = 0x7f1001ae; - public static final int Widget_AppCompat_ListPopupWindow = 0x7f1001af; - public static final int Widget_AppCompat_ListView = 0x7f1001b0; - public static final int Widget_AppCompat_ListView_DropDown = 0x7f1001b1; - public static final int Widget_AppCompat_ListView_Menu = 0x7f1001b2; - public static final int Widget_AppCompat_PopupMenu = 0x7f1001b3; - public static final int Widget_AppCompat_PopupMenu_Overflow = 0x7f1001b4; - public static final int Widget_AppCompat_PopupWindow = 0x7f1001b5; - public static final int Widget_AppCompat_ProgressBar = 0x7f1001b6; - public static final int Widget_AppCompat_ProgressBar_Horizontal = 0x7f1001b7; - public static final int Widget_AppCompat_RatingBar = 0x7f1001b8; - public static final int Widget_AppCompat_RatingBar_Indicator = 0x7f1001b9; - public static final int Widget_AppCompat_RatingBar_Small = 0x7f1001ba; - public static final int Widget_AppCompat_SearchView = 0x7f1001bb; - public static final int Widget_AppCompat_SearchView_ActionBar = 0x7f1001bc; - public static final int Widget_AppCompat_SeekBar = 0x7f1001bd; - public static final int Widget_AppCompat_SeekBar_Discrete = 0x7f1001be; - public static final int Widget_AppCompat_Spinner = 0x7f1001bf; - public static final int Widget_AppCompat_Spinner_DropDown = 0x7f1001c0; - public static final int Widget_AppCompat_Spinner_DropDown_ActionBar = 0x7f1001c1; - public static final int Widget_AppCompat_Spinner_Underlined = 0x7f1001c2; - public static final int Widget_AppCompat_TextView_SpinnerItem = 0x7f1001c3; - public static final int Widget_AppCompat_Toolbar = 0x7f1001c4; - public static final int Widget_AppCompat_Toolbar_Button_Navigation = 0x7f1001c5; - public static final int Widget_Compat_NotificationActionContainer = 0x7f1001c6; - public static final int Widget_Compat_NotificationActionText = 0x7f1001c7; - public static final int Widget_Design_AppBarLayout = 0x7f1001c8; - public static final int Widget_Design_BottomNavigationView = 0x7f1001c9; - public static final int Widget_Design_BottomSheet_Modal = 0x7f1001ca; - public static final int Widget_Design_CollapsingToolbar = 0x7f1001cb; - public static final int Widget_Design_FloatingActionButton = 0x7f1001cc; - public static final int Widget_Design_NavigationView = 0x7f1001cd; - public static final int Widget_Design_ScrimInsetsFrameLayout = 0x7f1001ce; - public static final int Widget_Design_Snackbar = 0x7f1001cf; - public static final int Widget_Design_TabLayout = 0x7f1001d0; - public static final int Widget_Design_TextInputLayout = 0x7f1001d1; - public static final int Widget_MaterialComponents_BottomAppBar = 0x7f1001d2; - public static final int Widget_MaterialComponents_BottomAppBar_Colored = 0x7f1001d3; - public static final int Widget_MaterialComponents_BottomNavigationView = 0x7f1001d4; - public static final int Widget_MaterialComponents_BottomNavigationView_Colored = 0x7f1001d5; - public static final int Widget_MaterialComponents_BottomSheet_Modal = 0x7f1001d6; - public static final int Widget_MaterialComponents_Button = 0x7f1001d7; - public static final int Widget_MaterialComponents_Button_Icon = 0x7f1001d8; - public static final int Widget_MaterialComponents_Button_OutlinedButton = 0x7f1001d9; - public static final int Widget_MaterialComponents_Button_OutlinedButton_Icon = 0x7f1001da; - public static final int Widget_MaterialComponents_Button_TextButton = 0x7f1001db; - public static final int Widget_MaterialComponents_Button_TextButton_Dialog = 0x7f1001dc; - public static final int Widget_MaterialComponents_Button_TextButton_Dialog_Icon = 0x7f1001dd; - public static final int Widget_MaterialComponents_Button_TextButton_Icon = 0x7f1001de; - public static final int Widget_MaterialComponents_Button_UnelevatedButton = 0x7f1001df; - public static final int Widget_MaterialComponents_Button_UnelevatedButton_Icon = 0x7f1001e0; - public static final int Widget_MaterialComponents_CardView = 0x7f1001e1; - public static final int Widget_MaterialComponents_ChipGroup = 0x7f1001e6; - public static final int Widget_MaterialComponents_Chip_Action = 0x7f1001e2; - public static final int Widget_MaterialComponents_Chip_Choice = 0x7f1001e3; - public static final int Widget_MaterialComponents_Chip_Entry = 0x7f1001e4; - public static final int Widget_MaterialComponents_Chip_Filter = 0x7f1001e5; - public static final int Widget_MaterialComponents_FloatingActionButton = 0x7f1001e7; - public static final int Widget_MaterialComponents_NavigationView = 0x7f1001e8; - public static final int Widget_MaterialComponents_Snackbar = 0x7f1001e9; - public static final int Widget_MaterialComponents_Snackbar_FullWidth = 0x7f1001ea; - public static final int Widget_MaterialComponents_TabLayout = 0x7f1001eb; - public static final int Widget_MaterialComponents_TabLayout_Colored = 0x7f1001ec; - public static final int Widget_MaterialComponents_TextInputEditText_FilledBox = 0x7f1001ed; - public static final int Widget_MaterialComponents_TextInputEditText_FilledBox_Dense = 0x7f1001ee; - public static final int Widget_MaterialComponents_TextInputEditText_OutlinedBox = 0x7f1001ef; - public static final int Widget_MaterialComponents_TextInputEditText_OutlinedBox_Dense = 0x7f1001f0; - public static final int Widget_MaterialComponents_TextInputLayout_FilledBox = 0x7f1001f1; - public static final int Widget_MaterialComponents_TextInputLayout_FilledBox_Dense = 0x7f1001f2; - public static final int Widget_MaterialComponents_TextInputLayout_OutlinedBox = 0x7f1001f3; - public static final int Widget_MaterialComponents_TextInputLayout_OutlinedBox_Dense = 0x7f1001f4; - public static final int Widget_MaterialComponents_Toolbar = 0x7f1001f5; - public static final int Widget_Support_CoordinatorLayout = 0x7f1001f6; - } - public static final class styleable { - private styleable() {} - - public static final int[] ActionBar = { 0x7f040031, 0x7f040032, 0x7f040033, 0x7f040097, 0x7f040098, 0x7f040099, 0x7f04009a, 0x7f04009b, 0x7f04009c, 0x7f0400aa, 0x7f0400af, 0x7f0400b0, 0x7f0400bb, 0x7f0400e6, 0x7f0400eb, 0x7f0400f0, 0x7f0400f1, 0x7f0400f3, 0x7f0400fd, 0x7f040107, 0x7f04015c, 0x7f040168, 0x7f040179, 0x7f04017d, 0x7f04017e, 0x7f0401ac, 0x7f0401af, 0x7f0401f4, 0x7f0401fe }; - public static final int ActionBar_background = 0; - public static final int ActionBar_backgroundSplit = 1; - public static final int ActionBar_backgroundStacked = 2; - public static final int ActionBar_contentInsetEnd = 3; - public static final int ActionBar_contentInsetEndWithActions = 4; - public static final int ActionBar_contentInsetLeft = 5; - public static final int ActionBar_contentInsetRight = 6; - public static final int ActionBar_contentInsetStart = 7; - public static final int ActionBar_contentInsetStartWithNavigation = 8; - public static final int ActionBar_customNavigationLayout = 9; - public static final int ActionBar_displayOptions = 10; - public static final int ActionBar_divider = 11; - public static final int ActionBar_elevation = 12; - public static final int ActionBar_height = 13; - public static final int ActionBar_hideOnContentScroll = 14; - public static final int ActionBar_homeAsUpIndicator = 15; - public static final int ActionBar_homeLayout = 16; - public static final int ActionBar_icon = 17; - public static final int ActionBar_indeterminateProgressStyle = 18; - public static final int ActionBar_itemPadding = 19; - public static final int ActionBar_logo = 20; - public static final int ActionBar_navigationMode = 21; - public static final int ActionBar_popupTheme = 22; - public static final int ActionBar_progressBarPadding = 23; - public static final int ActionBar_progressBarStyle = 24; - public static final int ActionBar_subtitle = 25; - public static final int ActionBar_subtitleTextStyle = 26; - public static final int ActionBar_title = 27; - public static final int ActionBar_titleTextStyle = 28; - public static final int[] ActionBarLayout = { 0x10100b3 }; - public static final int ActionBarLayout_android_layout_gravity = 0; - public static final int[] ActionMenuItemView = { 0x101013f }; - public static final int ActionMenuItemView_android_minWidth = 0; - public static final int[] ActionMode = { 0x7f040031, 0x7f040032, 0x7f040081, 0x7f0400e6, 0x7f0401af, 0x7f0401fe }; - public static final int ActionMode_background = 0; - public static final int ActionMode_backgroundSplit = 1; - public static final int ActionMode_closeItemLayout = 2; - public static final int ActionMode_height = 3; - public static final int ActionMode_subtitleTextStyle = 4; - public static final int ActionMode_titleTextStyle = 5; - public static final int[] ActivityChooserView = { 0x7f0400c1, 0x7f0400fe }; - public static final int ActivityChooserView_expandActivityOverflowButtonDrawable = 0; - public static final int ActivityChooserView_initialActivityCount = 1; - public static final int[] AlertDialog = { 0x10100f2, 0x7f040054, 0x7f040055, 0x7f040153, 0x7f040154, 0x7f040165, 0x7f040194, 0x7f040195 }; - public static final int AlertDialog_android_layout = 0; - public static final int AlertDialog_buttonIconDimen = 1; - public static final int AlertDialog_buttonPanelSideLayout = 2; - public static final int AlertDialog_listItemLayout = 3; - public static final int AlertDialog_listLayout = 4; - public static final int AlertDialog_multiChoiceItemLayout = 5; - public static final int AlertDialog_showTitle = 6; - public static final int AlertDialog_singleChoiceItemLayout = 7; - public static final int[] AppBarLayout = { 0x10100d4, 0x101048f, 0x1010540, 0x7f0400bb, 0x7f0400c2, 0x7f04014e }; - public static final int AppBarLayout_android_background = 0; - public static final int AppBarLayout_android_touchscreenBlocksFocus = 1; - public static final int AppBarLayout_android_keyboardNavigationCluster = 2; - public static final int AppBarLayout_elevation = 3; - public static final int AppBarLayout_expanded = 4; - public static final int AppBarLayout_liftOnScroll = 5; - public static final int[] AppBarLayoutStates = { 0x7f0401a2, 0x7f0401a3, 0x7f0401a4, 0x7f0401a5 }; - public static final int AppBarLayoutStates_state_collapsed = 0; - public static final int AppBarLayoutStates_state_collapsible = 1; - public static final int AppBarLayoutStates_state_liftable = 2; - public static final int AppBarLayoutStates_state_lifted = 3; - public static final int[] AppBarLayout_Layout = { 0x7f04014c, 0x7f04014d }; - public static final int AppBarLayout_Layout_layout_scrollFlags = 0; - public static final int AppBarLayout_Layout_layout_scrollInterpolator = 1; - public static final int[] AppCompatImageView = { 0x1010119, 0x7f04019f, 0x7f0401f2, 0x7f0401f3 }; - public static final int AppCompatImageView_android_src = 0; - public static final int AppCompatImageView_srcCompat = 1; - public static final int AppCompatImageView_tint = 2; - public static final int AppCompatImageView_tintMode = 3; - public static final int[] AppCompatSeekBar = { 0x1010142, 0x7f0401ef, 0x7f0401f0, 0x7f0401f1 }; - public static final int AppCompatSeekBar_android_thumb = 0; - public static final int AppCompatSeekBar_tickMark = 1; - public static final int AppCompatSeekBar_tickMarkTint = 2; - public static final int AppCompatSeekBar_tickMarkTintMode = 3; - public static final int[] AppCompatTextHelper = { 0x1010034, 0x101016d, 0x101016e, 0x101016f, 0x1010170, 0x1010392, 0x1010393 }; - public static final int AppCompatTextHelper_android_textAppearance = 0; - public static final int AppCompatTextHelper_android_drawableTop = 1; - public static final int AppCompatTextHelper_android_drawableBottom = 2; - public static final int AppCompatTextHelper_android_drawableLeft = 3; - public static final int AppCompatTextHelper_android_drawableRight = 4; - public static final int AppCompatTextHelper_android_drawableStart = 5; - public static final int AppCompatTextHelper_android_drawableEnd = 6; - public static final int[] AppCompatTextView = { 0x1010034, 0x7f04002c, 0x7f04002d, 0x7f04002e, 0x7f04002f, 0x7f040030, 0x7f0400d5, 0x7f0400d8, 0x7f04010f, 0x7f04014f, 0x7f0401cf }; - public static final int AppCompatTextView_android_textAppearance = 0; - public static final int AppCompatTextView_autoSizeMaxTextSize = 1; - public static final int AppCompatTextView_autoSizeMinTextSize = 2; - public static final int AppCompatTextView_autoSizePresetSizes = 3; - public static final int AppCompatTextView_autoSizeStepGranularity = 4; - public static final int AppCompatTextView_autoSizeTextType = 5; - public static final int AppCompatTextView_firstBaselineToTopHeight = 6; - public static final int AppCompatTextView_fontFamily = 7; - public static final int AppCompatTextView_lastBaselineToBottomHeight = 8; - public static final int AppCompatTextView_lineHeight = 9; - public static final int AppCompatTextView_textAllCaps = 10; - public static final int[] AppCompatTheme = { 0x1010057, 0x10100ae, 0x7f040000, 0x7f040001, 0x7f040002, 0x7f040003, 0x7f040004, 0x7f040005, 0x7f040006, 0x7f040007, 0x7f040008, 0x7f040009, 0x7f04000a, 0x7f04000b, 0x7f04000c, 0x7f04000e, 0x7f04000f, 0x7f040010, 0x7f040011, 0x7f040012, 0x7f040013, 0x7f040014, 0x7f040015, 0x7f040016, 0x7f040017, 0x7f040018, 0x7f040019, 0x7f04001a, 0x7f04001b, 0x7f04001c, 0x7f04001d, 0x7f04001e, 0x7f040021, 0x7f040022, 0x7f040023, 0x7f040024, 0x7f040025, 0x7f04002b, 0x7f040040, 0x7f04004e, 0x7f04004f, 0x7f040050, 0x7f040051, 0x7f040052, 0x7f040056, 0x7f040057, 0x7f040062, 0x7f040067, 0x7f040087, 0x7f040088, 0x7f040089, 0x7f04008a, 0x7f04008b, 0x7f04008c, 0x7f04008d, 0x7f04008e, 0x7f04008f, 0x7f040091, 0x7f0400a3, 0x7f0400ac, 0x7f0400ad, 0x7f0400ae, 0x7f0400b1, 0x7f0400b3, 0x7f0400b6, 0x7f0400b7, 0x7f0400b8, 0x7f0400b9, 0x7f0400ba, 0x7f0400f0, 0x7f0400fc, 0x7f040151, 0x7f040152, 0x7f040155, 0x7f040156, 0x7f040157, 0x7f040158, 0x7f040159, 0x7f04015a, 0x7f04015b, 0x7f040170, 0x7f040171, 0x7f040172, 0x7f040178, 0x7f04017a, 0x7f040181, 0x7f040182, 0x7f040183, 0x7f040184, 0x7f04018c, 0x7f04018d, 0x7f04018e, 0x7f04018f, 0x7f04019c, 0x7f04019d, 0x7f0401b3, 0x7f0401da, 0x7f0401db, 0x7f0401dc, 0x7f0401dd, 0x7f0401df, 0x7f0401e0, 0x7f0401e1, 0x7f0401e2, 0x7f0401e5, 0x7f0401e6, 0x7f040200, 0x7f040201, 0x7f040202, 0x7f040203, 0x7f04020a, 0x7f04020c, 0x7f04020d, 0x7f04020e, 0x7f04020f, 0x7f040210, 0x7f040211, 0x7f040212, 0x7f040213, 0x7f040214, 0x7f040215 }; - public static final int AppCompatTheme_android_windowIsFloating = 0; - public static final int AppCompatTheme_android_windowAnimationStyle = 1; - public static final int AppCompatTheme_actionBarDivider = 2; - public static final int AppCompatTheme_actionBarItemBackground = 3; - public static final int AppCompatTheme_actionBarPopupTheme = 4; - public static final int AppCompatTheme_actionBarSize = 5; - public static final int AppCompatTheme_actionBarSplitStyle = 6; - public static final int AppCompatTheme_actionBarStyle = 7; - public static final int AppCompatTheme_actionBarTabBarStyle = 8; - public static final int AppCompatTheme_actionBarTabStyle = 9; - public static final int AppCompatTheme_actionBarTabTextStyle = 10; - public static final int AppCompatTheme_actionBarTheme = 11; - public static final int AppCompatTheme_actionBarWidgetTheme = 12; - public static final int AppCompatTheme_actionButtonStyle = 13; - public static final int AppCompatTheme_actionDropDownStyle = 14; - public static final int AppCompatTheme_actionMenuTextAppearance = 15; - public static final int AppCompatTheme_actionMenuTextColor = 16; - public static final int AppCompatTheme_actionModeBackground = 17; - public static final int AppCompatTheme_actionModeCloseButtonStyle = 18; - public static final int AppCompatTheme_actionModeCloseDrawable = 19; - public static final int AppCompatTheme_actionModeCopyDrawable = 20; - public static final int AppCompatTheme_actionModeCutDrawable = 21; - public static final int AppCompatTheme_actionModeFindDrawable = 22; - public static final int AppCompatTheme_actionModePasteDrawable = 23; - public static final int AppCompatTheme_actionModePopupWindowStyle = 24; - public static final int AppCompatTheme_actionModeSelectAllDrawable = 25; - public static final int AppCompatTheme_actionModeShareDrawable = 26; - public static final int AppCompatTheme_actionModeSplitBackground = 27; - public static final int AppCompatTheme_actionModeStyle = 28; - public static final int AppCompatTheme_actionModeWebSearchDrawable = 29; - public static final int AppCompatTheme_actionOverflowButtonStyle = 30; - public static final int AppCompatTheme_actionOverflowMenuStyle = 31; - public static final int AppCompatTheme_activityChooserViewStyle = 32; - public static final int AppCompatTheme_alertDialogButtonGroupStyle = 33; - public static final int AppCompatTheme_alertDialogCenterButtons = 34; - public static final int AppCompatTheme_alertDialogStyle = 35; - public static final int AppCompatTheme_alertDialogTheme = 36; - public static final int AppCompatTheme_autoCompleteTextViewStyle = 37; - public static final int AppCompatTheme_borderlessButtonStyle = 38; - public static final int AppCompatTheme_buttonBarButtonStyle = 39; - public static final int AppCompatTheme_buttonBarNegativeButtonStyle = 40; - public static final int AppCompatTheme_buttonBarNeutralButtonStyle = 41; - public static final int AppCompatTheme_buttonBarPositiveButtonStyle = 42; - public static final int AppCompatTheme_buttonBarStyle = 43; - public static final int AppCompatTheme_buttonStyle = 44; - public static final int AppCompatTheme_buttonStyleSmall = 45; - public static final int AppCompatTheme_checkboxStyle = 46; - public static final int AppCompatTheme_checkedTextViewStyle = 47; - public static final int AppCompatTheme_colorAccent = 48; - public static final int AppCompatTheme_colorBackgroundFloating = 49; - public static final int AppCompatTheme_colorButtonNormal = 50; - public static final int AppCompatTheme_colorControlActivated = 51; - public static final int AppCompatTheme_colorControlHighlight = 52; - public static final int AppCompatTheme_colorControlNormal = 53; - public static final int AppCompatTheme_colorError = 54; - public static final int AppCompatTheme_colorPrimary = 55; - public static final int AppCompatTheme_colorPrimaryDark = 56; - public static final int AppCompatTheme_colorSwitchThumbNormal = 57; - public static final int AppCompatTheme_controlBackground = 58; - public static final int AppCompatTheme_dialogCornerRadius = 59; - public static final int AppCompatTheme_dialogPreferredPadding = 60; - public static final int AppCompatTheme_dialogTheme = 61; - public static final int AppCompatTheme_dividerHorizontal = 62; - public static final int AppCompatTheme_dividerVertical = 63; - public static final int AppCompatTheme_dropDownListViewStyle = 64; - public static final int AppCompatTheme_dropdownListPreferredItemHeight = 65; - public static final int AppCompatTheme_editTextBackground = 66; - public static final int AppCompatTheme_editTextColor = 67; - public static final int AppCompatTheme_editTextStyle = 68; - public static final int AppCompatTheme_homeAsUpIndicator = 69; - public static final int AppCompatTheme_imageButtonStyle = 70; - public static final int AppCompatTheme_listChoiceBackgroundIndicator = 71; - public static final int AppCompatTheme_listDividerAlertDialog = 72; - public static final int AppCompatTheme_listMenuViewStyle = 73; - public static final int AppCompatTheme_listPopupWindowStyle = 74; - public static final int AppCompatTheme_listPreferredItemHeight = 75; - public static final int AppCompatTheme_listPreferredItemHeightLarge = 76; - public static final int AppCompatTheme_listPreferredItemHeightSmall = 77; - public static final int AppCompatTheme_listPreferredItemPaddingLeft = 78; - public static final int AppCompatTheme_listPreferredItemPaddingRight = 79; - public static final int AppCompatTheme_panelBackground = 80; - public static final int AppCompatTheme_panelMenuListTheme = 81; - public static final int AppCompatTheme_panelMenuListWidth = 82; - public static final int AppCompatTheme_popupMenuStyle = 83; - public static final int AppCompatTheme_popupWindowStyle = 84; - public static final int AppCompatTheme_radioButtonStyle = 85; - public static final int AppCompatTheme_ratingBarStyle = 86; - public static final int AppCompatTheme_ratingBarStyleIndicator = 87; - public static final int AppCompatTheme_ratingBarStyleSmall = 88; - public static final int AppCompatTheme_searchViewStyle = 89; - public static final int AppCompatTheme_seekBarStyle = 90; - public static final int AppCompatTheme_selectableItemBackground = 91; - public static final int AppCompatTheme_selectableItemBackgroundBorderless = 92; - public static final int AppCompatTheme_spinnerDropDownItemStyle = 93; - public static final int AppCompatTheme_spinnerStyle = 94; - public static final int AppCompatTheme_switchStyle = 95; - public static final int AppCompatTheme_textAppearanceLargePopupMenu = 96; - public static final int AppCompatTheme_textAppearanceListItem = 97; - public static final int AppCompatTheme_textAppearanceListItemSecondary = 98; - public static final int AppCompatTheme_textAppearanceListItemSmall = 99; - public static final int AppCompatTheme_textAppearancePopupMenuHeader = 100; - public static final int AppCompatTheme_textAppearanceSearchResultSubtitle = 101; - public static final int AppCompatTheme_textAppearanceSearchResultTitle = 102; - public static final int AppCompatTheme_textAppearanceSmallPopupMenu = 103; - public static final int AppCompatTheme_textColorAlertDialogListItem = 104; - public static final int AppCompatTheme_textColorSearchUrl = 105; - public static final int AppCompatTheme_toolbarNavigationButtonStyle = 106; - public static final int AppCompatTheme_toolbarStyle = 107; - public static final int AppCompatTheme_tooltipForegroundColor = 108; - public static final int AppCompatTheme_tooltipFrameBackground = 109; - public static final int AppCompatTheme_viewInflaterClass = 110; - public static final int AppCompatTheme_windowActionBar = 111; - public static final int AppCompatTheme_windowActionBarOverlay = 112; - public static final int AppCompatTheme_windowActionModeOverlay = 113; - public static final int AppCompatTheme_windowFixedHeightMajor = 114; - public static final int AppCompatTheme_windowFixedHeightMinor = 115; - public static final int AppCompatTheme_windowFixedWidthMajor = 116; - public static final int AppCompatTheme_windowFixedWidthMinor = 117; - public static final int AppCompatTheme_windowMinWidthMajor = 118; - public static final int AppCompatTheme_windowMinWidthMinor = 119; - public static final int AppCompatTheme_windowNoTitle = 120; - public static final int[] BottomAppBar = { 0x7f040034, 0x7f0400ca, 0x7f0400cb, 0x7f0400cc, 0x7f0400cd, 0x7f0400ec }; - public static final int BottomAppBar_backgroundTint = 0; - public static final int BottomAppBar_fabAlignmentMode = 1; - public static final int BottomAppBar_fabCradleMargin = 2; - public static final int BottomAppBar_fabCradleRoundedCornerRadius = 3; - public static final int BottomAppBar_fabCradleVerticalOffset = 4; - public static final int BottomAppBar_hideOnScroll = 5; - public static final int[] BottomNavigationView = { 0x7f0400bb, 0x7f040101, 0x7f040103, 0x7f040105, 0x7f040106, 0x7f04010a, 0x7f04010b, 0x7f04010c, 0x7f04010e, 0x7f040164 }; - public static final int BottomNavigationView_elevation = 0; - public static final int BottomNavigationView_itemBackground = 1; - public static final int BottomNavigationView_itemHorizontalTranslationEnabled = 2; - public static final int BottomNavigationView_itemIconSize = 3; - public static final int BottomNavigationView_itemIconTint = 4; - public static final int BottomNavigationView_itemTextAppearanceActive = 5; - public static final int BottomNavigationView_itemTextAppearanceInactive = 6; - public static final int BottomNavigationView_itemTextColor = 7; - public static final int BottomNavigationView_labelVisibilityMode = 8; - public static final int BottomNavigationView_menu = 9; - public static final int[] BottomSheetBehavior_Layout = { 0x7f04003a, 0x7f04003b, 0x7f04003d, 0x7f04003e }; - public static final int BottomSheetBehavior_Layout_behavior_fitToContents = 0; - public static final int BottomSheetBehavior_Layout_behavior_hideable = 1; - public static final int BottomSheetBehavior_Layout_behavior_peekHeight = 2; - public static final int BottomSheetBehavior_Layout_behavior_skipCollapsed = 3; - public static final int[] ButtonBarLayout = { 0x7f040026 }; - public static final int ButtonBarLayout_allowStacking = 0; - public static final int[] CardView = { 0x101013f, 0x1010140, 0x7f04005a, 0x7f04005b, 0x7f04005c, 0x7f04005d, 0x7f04005e, 0x7f04005f, 0x7f04009d, 0x7f04009e, 0x7f04009f, 0x7f0400a0, 0x7f0400a1 }; - public static final int CardView_android_minWidth = 0; - public static final int CardView_android_minHeight = 1; - public static final int CardView_cardBackgroundColor = 2; - public static final int CardView_cardCornerRadius = 3; - public static final int CardView_cardElevation = 4; - public static final int CardView_cardMaxElevation = 5; - public static final int CardView_cardPreventCornerOverlap = 6; - public static final int CardView_cardUseCompatPadding = 7; - public static final int CardView_contentPadding = 8; - public static final int CardView_contentPaddingBottom = 9; - public static final int CardView_contentPaddingLeft = 10; - public static final int CardView_contentPaddingRight = 11; - public static final int CardView_contentPaddingTop = 12; - public static final int[] Chip = { 0x1010034, 0x10100ab, 0x101011f, 0x101014f, 0x10101e5, 0x7f040064, 0x7f040065, 0x7f040066, 0x7f040068, 0x7f040069, 0x7f04006a, 0x7f04006c, 0x7f04006d, 0x7f04006e, 0x7f04006f, 0x7f040070, 0x7f040071, 0x7f040076, 0x7f040077, 0x7f040078, 0x7f04007a, 0x7f04007b, 0x7f04007c, 0x7f04007d, 0x7f04007e, 0x7f04007f, 0x7f040080, 0x7f0400ea, 0x7f0400f4, 0x7f0400f8, 0x7f040186, 0x7f040192, 0x7f0401e7, 0x7f0401e9 }; - public static final int Chip_android_textAppearance = 0; - public static final int Chip_android_ellipsize = 1; - public static final int Chip_android_maxWidth = 2; - public static final int Chip_android_text = 3; - public static final int Chip_android_checkable = 4; - public static final int Chip_checkedIcon = 5; - public static final int Chip_checkedIconEnabled = 6; - public static final int Chip_checkedIconVisible = 7; - public static final int Chip_chipBackgroundColor = 8; - public static final int Chip_chipCornerRadius = 9; - public static final int Chip_chipEndPadding = 10; - public static final int Chip_chipIcon = 11; - public static final int Chip_chipIconEnabled = 12; - public static final int Chip_chipIconSize = 13; - public static final int Chip_chipIconTint = 14; - public static final int Chip_chipIconVisible = 15; - public static final int Chip_chipMinHeight = 16; - public static final int Chip_chipStartPadding = 17; - public static final int Chip_chipStrokeColor = 18; - public static final int Chip_chipStrokeWidth = 19; - public static final int Chip_closeIcon = 20; - public static final int Chip_closeIconEnabled = 21; - public static final int Chip_closeIconEndPadding = 22; - public static final int Chip_closeIconSize = 23; - public static final int Chip_closeIconStartPadding = 24; - public static final int Chip_closeIconTint = 25; - public static final int Chip_closeIconVisible = 26; - public static final int Chip_hideMotionSpec = 27; - public static final int Chip_iconEndPadding = 28; - public static final int Chip_iconStartPadding = 29; - public static final int Chip_rippleColor = 30; - public static final int Chip_showMotionSpec = 31; - public static final int Chip_textEndPadding = 32; - public static final int Chip_textStartPadding = 33; - public static final int[] ChipGroup = { 0x7f040063, 0x7f040072, 0x7f040073, 0x7f040074, 0x7f040196, 0x7f040197 }; - public static final int ChipGroup_checkedChip = 0; - public static final int ChipGroup_chipSpacing = 1; - public static final int ChipGroup_chipSpacingHorizontal = 2; - public static final int ChipGroup_chipSpacingVertical = 3; - public static final int ChipGroup_singleLine = 4; - public static final int ChipGroup_singleSelection = 5; - public static final int[] CollapsingToolbarLayout = { 0x7f040084, 0x7f040085, 0x7f0400a2, 0x7f0400c3, 0x7f0400c4, 0x7f0400c5, 0x7f0400c6, 0x7f0400c7, 0x7f0400c8, 0x7f0400c9, 0x7f040187, 0x7f040189, 0x7f0401a7, 0x7f0401f4, 0x7f0401f5, 0x7f0401ff }; - public static final int CollapsingToolbarLayout_collapsedTitleGravity = 0; - public static final int CollapsingToolbarLayout_collapsedTitleTextAppearance = 1; - public static final int CollapsingToolbarLayout_contentScrim = 2; - public static final int CollapsingToolbarLayout_expandedTitleGravity = 3; - public static final int CollapsingToolbarLayout_expandedTitleMargin = 4; - public static final int CollapsingToolbarLayout_expandedTitleMarginBottom = 5; - public static final int CollapsingToolbarLayout_expandedTitleMarginEnd = 6; - public static final int CollapsingToolbarLayout_expandedTitleMarginStart = 7; - public static final int CollapsingToolbarLayout_expandedTitleMarginTop = 8; - public static final int CollapsingToolbarLayout_expandedTitleTextAppearance = 9; - public static final int CollapsingToolbarLayout_scrimAnimationDuration = 10; - public static final int CollapsingToolbarLayout_scrimVisibleHeightTrigger = 11; - public static final int CollapsingToolbarLayout_statusBarScrim = 12; - public static final int CollapsingToolbarLayout_title = 13; - public static final int CollapsingToolbarLayout_titleEnabled = 14; - public static final int CollapsingToolbarLayout_toolbarId = 15; - public static final int[] CollapsingToolbarLayout_Layout = { 0x7f040115, 0x7f040116 }; - public static final int CollapsingToolbarLayout_Layout_layout_collapseMode = 0; - public static final int CollapsingToolbarLayout_Layout_layout_collapseParallaxMultiplier = 1; - public static final int[] ColorStateListItem = { 0x10101a5, 0x101031f, 0x7f040027 }; - public static final int ColorStateListItem_android_color = 0; - public static final int ColorStateListItem_android_alpha = 1; - public static final int ColorStateListItem_alpha = 2; - public static final int[] CompoundButton = { 0x1010107, 0x7f040058, 0x7f040059 }; - public static final int CompoundButton_android_button = 0; - public static final int CompoundButton_buttonTint = 1; - public static final int CompoundButton_buttonTintMode = 2; - public static final int[] CoordinatorLayout = { 0x7f04010d, 0x7f0401a6 }; - public static final int CoordinatorLayout_keylines = 0; - public static final int CoordinatorLayout_statusBarBackground = 1; - public static final int[] CoordinatorLayout_Layout = { 0x10100b3, 0x7f040112, 0x7f040113, 0x7f040114, 0x7f040140, 0x7f040149, 0x7f04014a }; - public static final int CoordinatorLayout_Layout_android_layout_gravity = 0; - public static final int CoordinatorLayout_Layout_layout_anchor = 1; - public static final int CoordinatorLayout_Layout_layout_anchorGravity = 2; - public static final int CoordinatorLayout_Layout_layout_behavior = 3; - public static final int CoordinatorLayout_Layout_layout_dodgeInsetEdges = 4; - public static final int CoordinatorLayout_Layout_layout_insetEdge = 5; - public static final int CoordinatorLayout_Layout_layout_keyline = 6; - public static final int[] DesignTheme = { 0x7f040043, 0x7f040044 }; - public static final int DesignTheme_bottomSheetDialogTheme = 0; - public static final int DesignTheme_bottomSheetStyle = 1; - public static final int[] DrawerArrowToggle = { 0x7f040029, 0x7f04002a, 0x7f040036, 0x7f040086, 0x7f0400b4, 0x7f0400e3, 0x7f04019b, 0x7f0401eb }; - public static final int DrawerArrowToggle_arrowHeadLength = 0; - public static final int DrawerArrowToggle_arrowShaftLength = 1; - public static final int DrawerArrowToggle_barLength = 2; - public static final int DrawerArrowToggle_color = 3; - public static final int DrawerArrowToggle_drawableSize = 4; - public static final int DrawerArrowToggle_gapBetweenBars = 5; - public static final int DrawerArrowToggle_spinBars = 6; - public static final int DrawerArrowToggle_thickness = 7; - public static final int[] FloatingActionButton = { 0x7f040034, 0x7f040035, 0x7f04003f, 0x7f0400bb, 0x7f0400ce, 0x7f0400cf, 0x7f0400ea, 0x7f0400f2, 0x7f040162, 0x7f04017c, 0x7f040186, 0x7f040192, 0x7f040209 }; - public static final int FloatingActionButton_backgroundTint = 0; - public static final int FloatingActionButton_backgroundTintMode = 1; - public static final int FloatingActionButton_borderWidth = 2; - public static final int FloatingActionButton_elevation = 3; - public static final int FloatingActionButton_fabCustomSize = 4; - public static final int FloatingActionButton_fabSize = 5; - public static final int FloatingActionButton_hideMotionSpec = 6; - public static final int FloatingActionButton_hoveredFocusedTranslationZ = 7; - public static final int FloatingActionButton_maxImageSize = 8; - public static final int FloatingActionButton_pressedTranslationZ = 9; - public static final int FloatingActionButton_rippleColor = 10; - public static final int FloatingActionButton_showMotionSpec = 11; - public static final int FloatingActionButton_useCompatPadding = 12; - public static final int[] FloatingActionButton_Behavior_Layout = { 0x7f040039 }; - public static final int FloatingActionButton_Behavior_Layout_behavior_autoHide = 0; - public static final int[] FlowLayout = { 0x7f040108, 0x7f040150 }; - public static final int FlowLayout_itemSpacing = 0; - public static final int FlowLayout_lineSpacing = 1; - public static final int[] FontFamily = { 0x7f0400d9, 0x7f0400da, 0x7f0400db, 0x7f0400dc, 0x7f0400dd, 0x7f0400de }; - public static final int FontFamily_fontProviderAuthority = 0; - public static final int FontFamily_fontProviderCerts = 1; - public static final int FontFamily_fontProviderFetchStrategy = 2; - public static final int FontFamily_fontProviderFetchTimeout = 3; - public static final int FontFamily_fontProviderPackage = 4; - public static final int FontFamily_fontProviderQuery = 5; - public static final int[] FontFamilyFont = { 0x1010532, 0x1010533, 0x101053f, 0x101056f, 0x1010570, 0x7f0400d7, 0x7f0400df, 0x7f0400e0, 0x7f0400e1, 0x7f040208 }; - public static final int FontFamilyFont_android_font = 0; - public static final int FontFamilyFont_android_fontWeight = 1; - public static final int FontFamilyFont_android_fontStyle = 2; - public static final int FontFamilyFont_android_ttcIndex = 3; - public static final int FontFamilyFont_android_fontVariationSettings = 4; - public static final int FontFamilyFont_font = 5; - public static final int FontFamilyFont_fontStyle = 6; - public static final int FontFamilyFont_fontVariationSettings = 7; - public static final int FontFamilyFont_fontWeight = 8; - public static final int FontFamilyFont_ttcIndex = 9; - public static final int[] ForegroundLinearLayout = { 0x1010109, 0x1010200, 0x7f0400e2 }; - public static final int ForegroundLinearLayout_android_foreground = 0; - public static final int ForegroundLinearLayout_android_foregroundGravity = 1; - public static final int ForegroundLinearLayout_foregroundInsidePadding = 2; - public static final int[] LinearLayoutCompat = { 0x10100af, 0x10100c4, 0x1010126, 0x1010127, 0x1010128, 0x7f0400b0, 0x7f0400b2, 0x7f040163, 0x7f040191 }; - public static final int LinearLayoutCompat_android_gravity = 0; - public static final int LinearLayoutCompat_android_orientation = 1; - public static final int LinearLayoutCompat_android_baselineAligned = 2; - public static final int LinearLayoutCompat_android_baselineAlignedChildIndex = 3; - public static final int LinearLayoutCompat_android_weightSum = 4; - public static final int LinearLayoutCompat_divider = 5; - public static final int LinearLayoutCompat_dividerPadding = 6; - public static final int LinearLayoutCompat_measureWithLargestChild = 7; - public static final int LinearLayoutCompat_showDividers = 8; - public static final int[] LinearLayoutCompat_Layout = { 0x10100b3, 0x10100f4, 0x10100f5, 0x1010181 }; - public static final int LinearLayoutCompat_Layout_android_layout_gravity = 0; - public static final int LinearLayoutCompat_Layout_android_layout_width = 1; - public static final int LinearLayoutCompat_Layout_android_layout_height = 2; - public static final int LinearLayoutCompat_Layout_android_layout_weight = 3; - public static final int[] ListPopupWindow = { 0x10102ac, 0x10102ad }; - public static final int ListPopupWindow_android_dropDownHorizontalOffset = 0; - public static final int ListPopupWindow_android_dropDownVerticalOffset = 1; - public static final int[] MaterialButton = { 0x10101b7, 0x10101b8, 0x10101b9, 0x10101ba, 0x7f040034, 0x7f040035, 0x7f0400a5, 0x7f0400f3, 0x7f0400f5, 0x7f0400f6, 0x7f0400f7, 0x7f0400f9, 0x7f0400fa, 0x7f040186, 0x7f0401a8, 0x7f0401a9 }; - public static final int MaterialButton_android_insetLeft = 0; - public static final int MaterialButton_android_insetRight = 1; - public static final int MaterialButton_android_insetTop = 2; - public static final int MaterialButton_android_insetBottom = 3; - public static final int MaterialButton_backgroundTint = 4; - public static final int MaterialButton_backgroundTintMode = 5; - public static final int MaterialButton_cornerRadius = 6; - public static final int MaterialButton_icon = 7; - public static final int MaterialButton_iconGravity = 8; - public static final int MaterialButton_iconPadding = 9; - public static final int MaterialButton_iconSize = 10; - public static final int MaterialButton_iconTint = 11; - public static final int MaterialButton_iconTintMode = 12; - public static final int MaterialButton_rippleColor = 13; - public static final int MaterialButton_strokeColor = 14; - public static final int MaterialButton_strokeWidth = 15; - public static final int[] MaterialCardView = { 0x7f0401a8, 0x7f0401a9 }; - public static final int MaterialCardView_strokeColor = 0; - public static final int MaterialCardView_strokeWidth = 1; - public static final int[] MaterialComponentsTheme = { 0x7f040043, 0x7f040044, 0x7f04006b, 0x7f040075, 0x7f040079, 0x7f040087, 0x7f040088, 0x7f04008e, 0x7f04008f, 0x7f040090, 0x7f0400ba, 0x7f0400d6, 0x7f04015e, 0x7f04015f, 0x7f040169, 0x7f040188, 0x7f040198, 0x7f0401cb, 0x7f0401d0, 0x7f0401d1, 0x7f0401d2, 0x7f0401d3, 0x7f0401d4, 0x7f0401d5, 0x7f0401d6, 0x7f0401d7, 0x7f0401d8, 0x7f0401d9, 0x7f0401de, 0x7f0401e3, 0x7f0401e4, 0x7f0401e8 }; - public static final int MaterialComponentsTheme_bottomSheetDialogTheme = 0; - public static final int MaterialComponentsTheme_bottomSheetStyle = 1; - public static final int MaterialComponentsTheme_chipGroupStyle = 2; - public static final int MaterialComponentsTheme_chipStandaloneStyle = 3; - public static final int MaterialComponentsTheme_chipStyle = 4; - public static final int MaterialComponentsTheme_colorAccent = 5; - public static final int MaterialComponentsTheme_colorBackgroundFloating = 6; - public static final int MaterialComponentsTheme_colorPrimary = 7; - public static final int MaterialComponentsTheme_colorPrimaryDark = 8; - public static final int MaterialComponentsTheme_colorSecondary = 9; - public static final int MaterialComponentsTheme_editTextStyle = 10; - public static final int MaterialComponentsTheme_floatingActionButtonStyle = 11; - public static final int MaterialComponentsTheme_materialButtonStyle = 12; - public static final int MaterialComponentsTheme_materialCardViewStyle = 13; - public static final int MaterialComponentsTheme_navigationViewStyle = 14; - public static final int MaterialComponentsTheme_scrimBackground = 15; - public static final int MaterialComponentsTheme_snackbarButtonStyle = 16; - public static final int MaterialComponentsTheme_tabStyle = 17; - public static final int MaterialComponentsTheme_textAppearanceBody1 = 18; - public static final int MaterialComponentsTheme_textAppearanceBody2 = 19; - public static final int MaterialComponentsTheme_textAppearanceButton = 20; - public static final int MaterialComponentsTheme_textAppearanceCaption = 21; - public static final int MaterialComponentsTheme_textAppearanceHeadline1 = 22; - public static final int MaterialComponentsTheme_textAppearanceHeadline2 = 23; - public static final int MaterialComponentsTheme_textAppearanceHeadline3 = 24; - public static final int MaterialComponentsTheme_textAppearanceHeadline4 = 25; - public static final int MaterialComponentsTheme_textAppearanceHeadline5 = 26; - public static final int MaterialComponentsTheme_textAppearanceHeadline6 = 27; - public static final int MaterialComponentsTheme_textAppearanceOverline = 28; - public static final int MaterialComponentsTheme_textAppearanceSubtitle1 = 29; - public static final int MaterialComponentsTheme_textAppearanceSubtitle2 = 30; - public static final int MaterialComponentsTheme_textInputStyle = 31; - public static final int[] MenuGroup = { 0x101000e, 0x10100d0, 0x1010194, 0x10101de, 0x10101df, 0x10101e0 }; - public static final int MenuGroup_android_enabled = 0; - public static final int MenuGroup_android_id = 1; - public static final int MenuGroup_android_visible = 2; - public static final int MenuGroup_android_menuCategory = 3; - public static final int MenuGroup_android_orderInCategory = 4; - public static final int MenuGroup_android_checkableBehavior = 5; - public static final int[] MenuItem = { 0x1010002, 0x101000e, 0x10100d0, 0x1010106, 0x1010194, 0x10101de, 0x10101df, 0x10101e1, 0x10101e2, 0x10101e3, 0x10101e4, 0x10101e5, 0x101026f, 0x7f04000d, 0x7f04001f, 0x7f040020, 0x7f040028, 0x7f040096, 0x7f0400f9, 0x7f0400fa, 0x7f04016a, 0x7f040190, 0x7f040204 }; - public static final int MenuItem_android_icon = 0; - public static final int MenuItem_android_enabled = 1; - public static final int MenuItem_android_id = 2; - public static final int MenuItem_android_checked = 3; - public static final int MenuItem_android_visible = 4; - public static final int MenuItem_android_menuCategory = 5; - public static final int MenuItem_android_orderInCategory = 6; - public static final int MenuItem_android_title = 7; - public static final int MenuItem_android_titleCondensed = 8; - public static final int MenuItem_android_alphabeticShortcut = 9; - public static final int MenuItem_android_numericShortcut = 10; - public static final int MenuItem_android_checkable = 11; - public static final int MenuItem_android_onClick = 12; - public static final int MenuItem_actionLayout = 13; - public static final int MenuItem_actionProviderClass = 14; - public static final int MenuItem_actionViewClass = 15; - public static final int MenuItem_alphabeticModifiers = 16; - public static final int MenuItem_contentDescription = 17; - public static final int MenuItem_iconTint = 18; - public static final int MenuItem_iconTintMode = 19; - public static final int MenuItem_numericModifiers = 20; - public static final int MenuItem_showAsAction = 21; - public static final int MenuItem_tooltipText = 22; - public static final int[] MenuView = { 0x10100ae, 0x101012c, 0x101012d, 0x101012e, 0x101012f, 0x1010130, 0x1010131, 0x7f04017b, 0x7f0401aa }; - public static final int MenuView_android_windowAnimationStyle = 0; - public static final int MenuView_android_itemTextAppearance = 1; - public static final int MenuView_android_horizontalDivider = 2; - public static final int MenuView_android_verticalDivider = 3; - public static final int MenuView_android_headerBackground = 4; - public static final int MenuView_android_itemBackground = 5; - public static final int MenuView_android_itemIconDisabledAlpha = 6; - public static final int MenuView_preserveIconSpacing = 7; - public static final int MenuView_subMenuArrow = 8; - public static final int[] NavigationView = { 0x10100d4, 0x10100dd, 0x101011f, 0x7f0400bb, 0x7f0400e5, 0x7f040101, 0x7f040102, 0x7f040104, 0x7f040106, 0x7f040109, 0x7f04010c, 0x7f040164 }; - public static final int NavigationView_android_background = 0; - public static final int NavigationView_android_fitsSystemWindows = 1; - public static final int NavigationView_android_maxWidth = 2; - public static final int NavigationView_elevation = 3; - public static final int NavigationView_headerLayout = 4; - public static final int NavigationView_itemBackground = 5; - public static final int NavigationView_itemHorizontalPadding = 6; - public static final int NavigationView_itemIconPadding = 7; - public static final int NavigationView_itemIconTint = 8; - public static final int NavigationView_itemTextAppearance = 9; - public static final int NavigationView_itemTextColor = 10; - public static final int NavigationView_menu = 11; - public static final int[] PopupWindow = { 0x1010176, 0x10102c9, 0x7f04016b }; - public static final int PopupWindow_android_popupBackground = 0; - public static final int PopupWindow_android_popupAnimationStyle = 1; - public static final int PopupWindow_overlapAnchor = 2; - public static final int[] PopupWindowBackgroundState = { 0x7f0401a1 }; - public static final int PopupWindowBackgroundState_state_above_anchor = 0; - public static final int[] RecycleListView = { 0x7f04016c, 0x7f04016f }; - public static final int RecycleListView_paddingBottomNoButtons = 0; - public static final int RecycleListView_paddingTopNoTitle = 1; - public static final int[] RecyclerView = { 0x10100c4, 0x10100f1, 0x7f0400d0, 0x7f0400d1, 0x7f0400d2, 0x7f0400d3, 0x7f0400d4, 0x7f040111, 0x7f040185, 0x7f04019a, 0x7f0401a0 }; - public static final int RecyclerView_android_orientation = 0; - public static final int RecyclerView_android_descendantFocusability = 1; - public static final int RecyclerView_fastScrollEnabled = 2; - public static final int RecyclerView_fastScrollHorizontalThumbDrawable = 3; - public static final int RecyclerView_fastScrollHorizontalTrackDrawable = 4; - public static final int RecyclerView_fastScrollVerticalThumbDrawable = 5; - public static final int RecyclerView_fastScrollVerticalTrackDrawable = 6; - public static final int RecyclerView_layoutManager = 7; - public static final int RecyclerView_reverseLayout = 8; - public static final int RecyclerView_spanCount = 9; - public static final int RecyclerView_stackFromEnd = 10; - public static final int[] ScrimInsetsFrameLayout = { 0x7f0400ff }; - public static final int ScrimInsetsFrameLayout_insetForeground = 0; - public static final int[] ScrollingViewBehavior_Layout = { 0x7f04003c }; - public static final int ScrollingViewBehavior_Layout_behavior_overlapTop = 0; - public static final int[] SearchView = { 0x10100da, 0x101011f, 0x1010220, 0x1010264, 0x7f04007a, 0x7f040092, 0x7f0400ab, 0x7f0400e4, 0x7f0400fb, 0x7f040110, 0x7f04017f, 0x7f040180, 0x7f04018a, 0x7f04018b, 0x7f0401ab, 0x7f0401b0, 0x7f04020b }; - public static final int SearchView_android_focusable = 0; - public static final int SearchView_android_maxWidth = 1; - public static final int SearchView_android_inputType = 2; - public static final int SearchView_android_imeOptions = 3; - public static final int SearchView_closeIcon = 4; - public static final int SearchView_commitIcon = 5; - public static final int SearchView_defaultQueryHint = 6; - public static final int SearchView_goIcon = 7; - public static final int SearchView_iconifiedByDefault = 8; - public static final int SearchView_layout = 9; - public static final int SearchView_queryBackground = 10; - public static final int SearchView_queryHint = 11; - public static final int SearchView_searchHintIcon = 12; - public static final int SearchView_searchIcon = 13; - public static final int SearchView_submitBackground = 14; - public static final int SearchView_suggestionRowLayout = 15; - public static final int SearchView_voiceIcon = 16; - public static final int[] Snackbar = { 0x7f040198, 0x7f040199 }; - public static final int Snackbar_snackbarButtonStyle = 0; - public static final int Snackbar_snackbarStyle = 1; - public static final int[] SnackbarLayout = { 0x101011f, 0x7f0400bb, 0x7f040160 }; - public static final int SnackbarLayout_android_maxWidth = 0; - public static final int SnackbarLayout_elevation = 1; - public static final int SnackbarLayout_maxActionInlineWidth = 2; - public static final int[] Spinner = { 0x10100b2, 0x1010176, 0x101017b, 0x1010262, 0x7f040179 }; - public static final int Spinner_android_entries = 0; - public static final int Spinner_android_popupBackground = 1; - public static final int Spinner_android_prompt = 2; - public static final int Spinner_android_dropDownWidth = 3; - public static final int Spinner_popupTheme = 4; - public static final int[] SwitchCompat = { 0x1010124, 0x1010125, 0x1010142, 0x7f040193, 0x7f04019e, 0x7f0401b1, 0x7f0401b2, 0x7f0401b4, 0x7f0401ec, 0x7f0401ed, 0x7f0401ee, 0x7f040205, 0x7f040206, 0x7f040207 }; - public static final int SwitchCompat_android_textOn = 0; - public static final int SwitchCompat_android_textOff = 1; - public static final int SwitchCompat_android_thumb = 2; - public static final int SwitchCompat_showText = 3; - public static final int SwitchCompat_splitTrack = 4; - public static final int SwitchCompat_switchMinWidth = 5; - public static final int SwitchCompat_switchPadding = 6; - public static final int SwitchCompat_switchTextAppearance = 7; - public static final int SwitchCompat_thumbTextPadding = 8; - public static final int SwitchCompat_thumbTint = 9; - public static final int SwitchCompat_thumbTintMode = 10; - public static final int SwitchCompat_track = 11; - public static final int SwitchCompat_trackTint = 12; - public static final int SwitchCompat_trackTintMode = 13; - public static final int[] TabItem = { 0x1010002, 0x10100f2, 0x101014f }; - public static final int TabItem_android_icon = 0; - public static final int TabItem_android_layout = 1; - public static final int TabItem_android_text = 2; - public static final int[] TabLayout = { 0x7f0401b5, 0x7f0401b6, 0x7f0401b7, 0x7f0401b8, 0x7f0401b9, 0x7f0401ba, 0x7f0401bb, 0x7f0401bc, 0x7f0401bd, 0x7f0401be, 0x7f0401bf, 0x7f0401c0, 0x7f0401c1, 0x7f0401c2, 0x7f0401c3, 0x7f0401c4, 0x7f0401c5, 0x7f0401c6, 0x7f0401c7, 0x7f0401c8, 0x7f0401c9, 0x7f0401ca, 0x7f0401cc, 0x7f0401cd, 0x7f0401ce }; - public static final int TabLayout_tabBackground = 0; - public static final int TabLayout_tabContentStart = 1; - public static final int TabLayout_tabGravity = 2; - public static final int TabLayout_tabIconTint = 3; - public static final int TabLayout_tabIconTintMode = 4; - public static final int TabLayout_tabIndicator = 5; - public static final int TabLayout_tabIndicatorAnimationDuration = 6; - public static final int TabLayout_tabIndicatorColor = 7; - public static final int TabLayout_tabIndicatorFullWidth = 8; - public static final int TabLayout_tabIndicatorGravity = 9; - public static final int TabLayout_tabIndicatorHeight = 10; - public static final int TabLayout_tabInlineLabel = 11; - public static final int TabLayout_tabMaxWidth = 12; - public static final int TabLayout_tabMinWidth = 13; - public static final int TabLayout_tabMode = 14; - public static final int TabLayout_tabPadding = 15; - public static final int TabLayout_tabPaddingBottom = 16; - public static final int TabLayout_tabPaddingEnd = 17; - public static final int TabLayout_tabPaddingStart = 18; - public static final int TabLayout_tabPaddingTop = 19; - public static final int TabLayout_tabRippleColor = 20; - public static final int TabLayout_tabSelectedTextColor = 21; - public static final int TabLayout_tabTextAppearance = 22; - public static final int TabLayout_tabTextColor = 23; - public static final int TabLayout_tabUnboundedRipple = 24; - public static final int[] TextAppearance = { 0x1010095, 0x1010096, 0x1010097, 0x1010098, 0x101009a, 0x101009b, 0x1010161, 0x1010162, 0x1010163, 0x1010164, 0x10103ac, 0x7f0400d8, 0x7f0401cf }; - public static final int TextAppearance_android_textSize = 0; - public static final int TextAppearance_android_typeface = 1; - public static final int TextAppearance_android_textStyle = 2; - public static final int TextAppearance_android_textColor = 3; - public static final int TextAppearance_android_textColorHint = 4; - public static final int TextAppearance_android_textColorLink = 5; - public static final int TextAppearance_android_shadowColor = 6; - public static final int TextAppearance_android_shadowDx = 7; - public static final int TextAppearance_android_shadowDy = 8; - public static final int TextAppearance_android_shadowRadius = 9; - public static final int TextAppearance_android_fontFamily = 10; - public static final int TextAppearance_fontFamily = 11; - public static final int TextAppearance_textAllCaps = 12; - public static final int[] TextInputLayout = { 0x101009a, 0x1010150, 0x7f040045, 0x7f040046, 0x7f040047, 0x7f040048, 0x7f040049, 0x7f04004a, 0x7f04004b, 0x7f04004c, 0x7f04004d, 0x7f0400a6, 0x7f0400a7, 0x7f0400a8, 0x7f0400a9, 0x7f0400bf, 0x7f0400c0, 0x7f0400e7, 0x7f0400e8, 0x7f0400e9, 0x7f0400ed, 0x7f0400ee, 0x7f0400ef, 0x7f040173, 0x7f040174, 0x7f040175, 0x7f040176, 0x7f040177 }; - public static final int TextInputLayout_android_textColorHint = 0; - public static final int TextInputLayout_android_hint = 1; - public static final int TextInputLayout_boxBackgroundColor = 2; - public static final int TextInputLayout_boxBackgroundMode = 3; - public static final int TextInputLayout_boxCollapsedPaddingTop = 4; - public static final int TextInputLayout_boxCornerRadiusBottomEnd = 5; - public static final int TextInputLayout_boxCornerRadiusBottomStart = 6; - public static final int TextInputLayout_boxCornerRadiusTopEnd = 7; - public static final int TextInputLayout_boxCornerRadiusTopStart = 8; - public static final int TextInputLayout_boxStrokeColor = 9; - public static final int TextInputLayout_boxStrokeWidth = 10; - public static final int TextInputLayout_counterEnabled = 11; - public static final int TextInputLayout_counterMaxLength = 12; - public static final int TextInputLayout_counterOverflowTextAppearance = 13; - public static final int TextInputLayout_counterTextAppearance = 14; - public static final int TextInputLayout_errorEnabled = 15; - public static final int TextInputLayout_errorTextAppearance = 16; - public static final int TextInputLayout_helperText = 17; - public static final int TextInputLayout_helperTextEnabled = 18; - public static final int TextInputLayout_helperTextTextAppearance = 19; - public static final int TextInputLayout_hintAnimationEnabled = 20; - public static final int TextInputLayout_hintEnabled = 21; - public static final int TextInputLayout_hintTextAppearance = 22; - public static final int TextInputLayout_passwordToggleContentDescription = 23; - public static final int TextInputLayout_passwordToggleDrawable = 24; - public static final int TextInputLayout_passwordToggleEnabled = 25; - public static final int TextInputLayout_passwordToggleTint = 26; - public static final int TextInputLayout_passwordToggleTintMode = 27; - public static final int[] ThemeEnforcement = { 0x1010034, 0x7f0400bd, 0x7f0400be }; - public static final int ThemeEnforcement_android_textAppearance = 0; - public static final int ThemeEnforcement_enforceMaterialTheme = 1; - public static final int ThemeEnforcement_enforceTextAppearance = 2; - public static final int[] Toolbar = { 0x10100af, 0x1010140, 0x7f040053, 0x7f040082, 0x7f040083, 0x7f040097, 0x7f040098, 0x7f040099, 0x7f04009a, 0x7f04009b, 0x7f04009c, 0x7f04015c, 0x7f04015d, 0x7f040161, 0x7f040166, 0x7f040167, 0x7f040179, 0x7f0401ac, 0x7f0401ad, 0x7f0401ae, 0x7f0401f4, 0x7f0401f6, 0x7f0401f7, 0x7f0401f8, 0x7f0401f9, 0x7f0401fa, 0x7f0401fb, 0x7f0401fc, 0x7f0401fd }; - public static final int Toolbar_android_gravity = 0; - public static final int Toolbar_android_minHeight = 1; - public static final int Toolbar_buttonGravity = 2; - public static final int Toolbar_collapseContentDescription = 3; - public static final int Toolbar_collapseIcon = 4; - public static final int Toolbar_contentInsetEnd = 5; - public static final int Toolbar_contentInsetEndWithActions = 6; - public static final int Toolbar_contentInsetLeft = 7; - public static final int Toolbar_contentInsetRight = 8; - public static final int Toolbar_contentInsetStart = 9; - public static final int Toolbar_contentInsetStartWithNavigation = 10; - public static final int Toolbar_logo = 11; - public static final int Toolbar_logoDescription = 12; - public static final int Toolbar_maxButtonHeight = 13; - public static final int Toolbar_navigationContentDescription = 14; - public static final int Toolbar_navigationIcon = 15; - public static final int Toolbar_popupTheme = 16; - public static final int Toolbar_subtitle = 17; - public static final int Toolbar_subtitleTextAppearance = 18; - public static final int Toolbar_subtitleTextColor = 19; - public static final int Toolbar_title = 20; - public static final int Toolbar_titleMargin = 21; - public static final int Toolbar_titleMarginBottom = 22; - public static final int Toolbar_titleMarginEnd = 23; - public static final int Toolbar_titleMarginStart = 24; - public static final int Toolbar_titleMarginTop = 25; - public static final int Toolbar_titleMargins = 26; - public static final int Toolbar_titleTextAppearance = 27; - public static final int Toolbar_titleTextColor = 28; - public static final int[] View = { 0x1010000, 0x10100da, 0x7f04016d, 0x7f04016e, 0x7f0401ea }; - public static final int View_android_theme = 0; - public static final int View_android_focusable = 1; - public static final int View_paddingEnd = 2; - public static final int View_paddingStart = 3; - public static final int View_theme = 4; - public static final int[] ViewBackgroundHelper = { 0x10100d4, 0x7f040034, 0x7f040035 }; - public static final int ViewBackgroundHelper_android_background = 0; - public static final int ViewBackgroundHelper_backgroundTint = 1; - public static final int ViewBackgroundHelper_backgroundTintMode = 2; - public static final int[] ViewStubCompat = { 0x10100d0, 0x10100f2, 0x10100f3 }; - public static final int ViewStubCompat_android_id = 0; - public static final int ViewStubCompat_android_layout = 1; - public static final int ViewStubCompat_android_inflatedId = 2; - } -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/documentfile/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/documentfile/R.java deleted file mode 100755 index 34e950a..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/documentfile/R.java +++ /dev/null @@ -1,12 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.support.documentfile; - -public final class R { - private R() {} - -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/drawerlayout/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/drawerlayout/R.java deleted file mode 100755 index b18f96a..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/drawerlayout/R.java +++ /dev/null @@ -1,183 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.support.drawerlayout; - -public final class R { - private R() {} - - public static final class attr { - private attr() {} - - public static final int alpha = 0x7f040027; - public static final int font = 0x7f0400d7; - public static final int fontProviderAuthority = 0x7f0400d9; - public static final int fontProviderCerts = 0x7f0400da; - public static final int fontProviderFetchStrategy = 0x7f0400db; - public static final int fontProviderFetchTimeout = 0x7f0400dc; - public static final int fontProviderPackage = 0x7f0400dd; - public static final int fontProviderQuery = 0x7f0400de; - public static final int fontStyle = 0x7f0400df; - public static final int fontVariationSettings = 0x7f0400e0; - public static final int fontWeight = 0x7f0400e1; - public static final int ttcIndex = 0x7f040208; - } - public static final class color { - private color() {} - - public static final int notification_action_color_filter = 0x7f06006a; - public static final int notification_icon_bg_color = 0x7f06006b; - public static final int ripple_material_light = 0x7f060075; - public static final int secondary_text_default_material_light = 0x7f060077; - } - public static final class dimen { - private dimen() {} - - public static final int compat_button_inset_horizontal_material = 0x7f07004e; - public static final int compat_button_inset_vertical_material = 0x7f07004f; - public static final int compat_button_padding_horizontal_material = 0x7f070050; - public static final int compat_button_padding_vertical_material = 0x7f070051; - public static final int compat_control_corner_material = 0x7f070052; - public static final int compat_notification_large_icon_max_height = 0x7f070053; - public static final int compat_notification_large_icon_max_width = 0x7f070054; - public static final int notification_action_icon_size = 0x7f0700c5; - public static final int notification_action_text_size = 0x7f0700c6; - public static final int notification_big_circle_margin = 0x7f0700c7; - public static final int notification_content_margin_start = 0x7f0700c8; - public static final int notification_large_icon_height = 0x7f0700c9; - public static final int notification_large_icon_width = 0x7f0700ca; - public static final int notification_main_column_padding_top = 0x7f0700cb; - public static final int notification_media_narrow_margin = 0x7f0700cc; - public static final int notification_right_icon_size = 0x7f0700cd; - public static final int notification_right_side_padding_top = 0x7f0700ce; - public static final int notification_small_icon_background_padding = 0x7f0700cf; - public static final int notification_small_icon_size_as_large = 0x7f0700d0; - public static final int notification_subtext_size = 0x7f0700d1; - public static final int notification_top_pad = 0x7f0700d2; - public static final int notification_top_pad_large_text = 0x7f0700d3; - } - public static final class drawable { - private drawable() {} - - public static final int notification_action_background = 0x7f08006b; - public static final int notification_bg = 0x7f08006c; - public static final int notification_bg_low = 0x7f08006d; - public static final int notification_bg_low_normal = 0x7f08006e; - public static final int notification_bg_low_pressed = 0x7f08006f; - public static final int notification_bg_normal = 0x7f080070; - public static final int notification_bg_normal_pressed = 0x7f080071; - public static final int notification_icon_background = 0x7f080072; - public static final int notification_template_icon_bg = 0x7f080073; - public static final int notification_template_icon_low_bg = 0x7f080074; - public static final int notification_tile_bg = 0x7f080075; - public static final int notify_panel_notification_icon_bg = 0x7f080076; - } - public static final class id { - private id() {} - - public static final int action_container = 0x7f09000d; - public static final int action_divider = 0x7f09000f; - public static final int action_image = 0x7f090010; - public static final int action_text = 0x7f090017; - public static final int actions = 0x7f090018; - public static final int async = 0x7f09001e; - public static final int blocking = 0x7f090022; - public static final int chronometer = 0x7f09002b; - public static final int forever = 0x7f09004f; - public static final int icon = 0x7f090056; - public static final int icon_group = 0x7f090057; - public static final int info = 0x7f09005a; - public static final int italic = 0x7f09005c; - public static final int line1 = 0x7f090062; - public static final int line3 = 0x7f090063; - public static final int normal = 0x7f090071; - public static final int notification_background = 0x7f090073; - public static final int notification_main_column = 0x7f090074; - public static final int notification_main_column_container = 0x7f090075; - public static final int right_icon = 0x7f090082; - public static final int right_side = 0x7f090083; - public static final int tag_transition_group = 0x7f0900b1; - public static final int tag_unhandled_key_event_manager = 0x7f0900b2; - public static final int tag_unhandled_key_listeners = 0x7f0900b3; - public static final int text = 0x7f0900b4; - public static final int text2 = 0x7f0900b5; - public static final int time = 0x7f0900bd; - public static final int title = 0x7f0900be; - } - public static final class integer { - private integer() {} - - public static final int status_bar_notification_info_maxnum = 0x7f0a000e; - } - public static final class layout { - private layout() {} - - public static final int notification_action = 0x7f0c0030; - public static final int notification_action_tombstone = 0x7f0c0031; - public static final int notification_template_custom_big = 0x7f0c0032; - public static final int notification_template_icon_group = 0x7f0c0033; - public static final int notification_template_part_chronometer = 0x7f0c0034; - public static final int notification_template_part_time = 0x7f0c0035; - } - public static final class string { - private string() {} - - public static final int status_bar_notification_info_overflow = 0x7f0f0037; - } - public static final class style { - private style() {} - - public static final int TextAppearance_Compat_Notification = 0x7f10011c; - public static final int TextAppearance_Compat_Notification_Info = 0x7f10011d; - public static final int TextAppearance_Compat_Notification_Line2 = 0x7f10011e; - public static final int TextAppearance_Compat_Notification_Time = 0x7f10011f; - public static final int TextAppearance_Compat_Notification_Title = 0x7f100120; - public static final int Widget_Compat_NotificationActionContainer = 0x7f1001c6; - public static final int Widget_Compat_NotificationActionText = 0x7f1001c7; - } - public static final class styleable { - private styleable() {} - - public static final int[] ColorStateListItem = { 0x10101a5, 0x101031f, 0x7f040027 }; - public static final int ColorStateListItem_android_color = 0; - public static final int ColorStateListItem_android_alpha = 1; - public static final int ColorStateListItem_alpha = 2; - public static final int[] FontFamily = { 0x7f0400d9, 0x7f0400da, 0x7f0400db, 0x7f0400dc, 0x7f0400dd, 0x7f0400de }; - public static final int FontFamily_fontProviderAuthority = 0; - public static final int FontFamily_fontProviderCerts = 1; - public static final int FontFamily_fontProviderFetchStrategy = 2; - public static final int FontFamily_fontProviderFetchTimeout = 3; - public static final int FontFamily_fontProviderPackage = 4; - public static final int FontFamily_fontProviderQuery = 5; - public static final int[] FontFamilyFont = { 0x1010532, 0x1010533, 0x101053f, 0x101056f, 0x1010570, 0x7f0400d7, 0x7f0400df, 0x7f0400e0, 0x7f0400e1, 0x7f040208 }; - public static final int FontFamilyFont_android_font = 0; - public static final int FontFamilyFont_android_fontWeight = 1; - public static final int FontFamilyFont_android_fontStyle = 2; - public static final int FontFamilyFont_android_ttcIndex = 3; - public static final int FontFamilyFont_android_fontVariationSettings = 4; - public static final int FontFamilyFont_font = 5; - public static final int FontFamilyFont_fontStyle = 6; - public static final int FontFamilyFont_fontVariationSettings = 7; - public static final int FontFamilyFont_fontWeight = 8; - public static final int FontFamilyFont_ttcIndex = 9; - public static final int[] GradientColor = { 0x101019d, 0x101019e, 0x10101a1, 0x10101a2, 0x10101a3, 0x10101a4, 0x1010201, 0x101020b, 0x1010510, 0x1010511, 0x1010512, 0x1010513 }; - public static final int GradientColor_android_startColor = 0; - public static final int GradientColor_android_endColor = 1; - public static final int GradientColor_android_type = 2; - public static final int GradientColor_android_centerX = 3; - public static final int GradientColor_android_centerY = 4; - public static final int GradientColor_android_gradientRadius = 5; - public static final int GradientColor_android_tileMode = 6; - public static final int GradientColor_android_centerColor = 7; - public static final int GradientColor_android_startX = 8; - public static final int GradientColor_android_startY = 9; - public static final int GradientColor_android_endX = 10; - public static final int GradientColor_android_endY = 11; - public static final int[] GradientColorItem = { 0x10101a5, 0x1010514 }; - public static final int GradientColorItem_android_color = 0; - public static final int GradientColorItem_android_offset = 1; - } -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/fragment/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/fragment/R.java deleted file mode 100755 index 36abf4c..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/fragment/R.java +++ /dev/null @@ -1,211 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.support.fragment; - -public final class R { - private R() {} - - public static final class attr { - private attr() {} - - public static final int alpha = 0x7f040027; - public static final int coordinatorLayoutStyle = 0x7f0400a4; - public static final int font = 0x7f0400d7; - public static final int fontProviderAuthority = 0x7f0400d9; - public static final int fontProviderCerts = 0x7f0400da; - public static final int fontProviderFetchStrategy = 0x7f0400db; - public static final int fontProviderFetchTimeout = 0x7f0400dc; - public static final int fontProviderPackage = 0x7f0400dd; - public static final int fontProviderQuery = 0x7f0400de; - public static final int fontStyle = 0x7f0400df; - public static final int fontVariationSettings = 0x7f0400e0; - public static final int fontWeight = 0x7f0400e1; - public static final int keylines = 0x7f04010d; - public static final int layout_anchor = 0x7f040112; - public static final int layout_anchorGravity = 0x7f040113; - public static final int layout_behavior = 0x7f040114; - public static final int layout_dodgeInsetEdges = 0x7f040140; - public static final int layout_insetEdge = 0x7f040149; - public static final int layout_keyline = 0x7f04014a; - public static final int statusBarBackground = 0x7f0401a6; - public static final int ttcIndex = 0x7f040208; - } - public static final class color { - private color() {} - - public static final int notification_action_color_filter = 0x7f06006a; - public static final int notification_icon_bg_color = 0x7f06006b; - public static final int ripple_material_light = 0x7f060075; - public static final int secondary_text_default_material_light = 0x7f060077; - } - public static final class dimen { - private dimen() {} - - public static final int compat_button_inset_horizontal_material = 0x7f07004e; - public static final int compat_button_inset_vertical_material = 0x7f07004f; - public static final int compat_button_padding_horizontal_material = 0x7f070050; - public static final int compat_button_padding_vertical_material = 0x7f070051; - public static final int compat_control_corner_material = 0x7f070052; - public static final int compat_notification_large_icon_max_height = 0x7f070053; - public static final int compat_notification_large_icon_max_width = 0x7f070054; - public static final int notification_action_icon_size = 0x7f0700c5; - public static final int notification_action_text_size = 0x7f0700c6; - public static final int notification_big_circle_margin = 0x7f0700c7; - public static final int notification_content_margin_start = 0x7f0700c8; - public static final int notification_large_icon_height = 0x7f0700c9; - public static final int notification_large_icon_width = 0x7f0700ca; - public static final int notification_main_column_padding_top = 0x7f0700cb; - public static final int notification_media_narrow_margin = 0x7f0700cc; - public static final int notification_right_icon_size = 0x7f0700cd; - public static final int notification_right_side_padding_top = 0x7f0700ce; - public static final int notification_small_icon_background_padding = 0x7f0700cf; - public static final int notification_small_icon_size_as_large = 0x7f0700d0; - public static final int notification_subtext_size = 0x7f0700d1; - public static final int notification_top_pad = 0x7f0700d2; - public static final int notification_top_pad_large_text = 0x7f0700d3; - } - public static final class drawable { - private drawable() {} - - public static final int notification_action_background = 0x7f08006b; - public static final int notification_bg = 0x7f08006c; - public static final int notification_bg_low = 0x7f08006d; - public static final int notification_bg_low_normal = 0x7f08006e; - public static final int notification_bg_low_pressed = 0x7f08006f; - public static final int notification_bg_normal = 0x7f080070; - public static final int notification_bg_normal_pressed = 0x7f080071; - public static final int notification_icon_background = 0x7f080072; - public static final int notification_template_icon_bg = 0x7f080073; - public static final int notification_template_icon_low_bg = 0x7f080074; - public static final int notification_tile_bg = 0x7f080075; - public static final int notify_panel_notification_icon_bg = 0x7f080076; - } - public static final class id { - private id() {} - - public static final int action_container = 0x7f09000d; - public static final int action_divider = 0x7f09000f; - public static final int action_image = 0x7f090010; - public static final int action_text = 0x7f090017; - public static final int actions = 0x7f090018; - public static final int async = 0x7f09001e; - public static final int blocking = 0x7f090022; - public static final int bottom = 0x7f090023; - public static final int chronometer = 0x7f09002b; - public static final int end = 0x7f090043; - public static final int forever = 0x7f09004f; - public static final int icon = 0x7f090056; - public static final int icon_group = 0x7f090057; - public static final int info = 0x7f09005a; - public static final int italic = 0x7f09005c; - public static final int left = 0x7f090061; - public static final int line1 = 0x7f090062; - public static final int line3 = 0x7f090063; - public static final int none = 0x7f090070; - public static final int normal = 0x7f090071; - public static final int notification_background = 0x7f090073; - public static final int notification_main_column = 0x7f090074; - public static final int notification_main_column_container = 0x7f090075; - public static final int right = 0x7f090081; - public static final int right_icon = 0x7f090082; - public static final int right_side = 0x7f090083; - public static final int start = 0x7f0900ac; - public static final int tag_transition_group = 0x7f0900b1; - public static final int tag_unhandled_key_event_manager = 0x7f0900b2; - public static final int tag_unhandled_key_listeners = 0x7f0900b3; - public static final int text = 0x7f0900b4; - public static final int text2 = 0x7f0900b5; - public static final int time = 0x7f0900bd; - public static final int title = 0x7f0900be; - public static final int top = 0x7f0900c2; - } - public static final class integer { - private integer() {} - - public static final int status_bar_notification_info_maxnum = 0x7f0a000e; - } - public static final class layout { - private layout() {} - - public static final int notification_action = 0x7f0c0030; - public static final int notification_action_tombstone = 0x7f0c0031; - public static final int notification_template_custom_big = 0x7f0c0032; - public static final int notification_template_icon_group = 0x7f0c0033; - public static final int notification_template_part_chronometer = 0x7f0c0034; - public static final int notification_template_part_time = 0x7f0c0035; - } - public static final class string { - private string() {} - - public static final int status_bar_notification_info_overflow = 0x7f0f0037; - } - public static final class style { - private style() {} - - public static final int TextAppearance_Compat_Notification = 0x7f10011c; - public static final int TextAppearance_Compat_Notification_Info = 0x7f10011d; - public static final int TextAppearance_Compat_Notification_Line2 = 0x7f10011e; - public static final int TextAppearance_Compat_Notification_Time = 0x7f10011f; - public static final int TextAppearance_Compat_Notification_Title = 0x7f100120; - public static final int Widget_Compat_NotificationActionContainer = 0x7f1001c6; - public static final int Widget_Compat_NotificationActionText = 0x7f1001c7; - public static final int Widget_Support_CoordinatorLayout = 0x7f1001f6; - } - public static final class styleable { - private styleable() {} - - public static final int[] ColorStateListItem = { 0x10101a5, 0x101031f, 0x7f040027 }; - public static final int ColorStateListItem_android_color = 0; - public static final int ColorStateListItem_android_alpha = 1; - public static final int ColorStateListItem_alpha = 2; - public static final int[] CoordinatorLayout = { 0x7f04010d, 0x7f0401a6 }; - public static final int CoordinatorLayout_keylines = 0; - public static final int CoordinatorLayout_statusBarBackground = 1; - public static final int[] CoordinatorLayout_Layout = { 0x10100b3, 0x7f040112, 0x7f040113, 0x7f040114, 0x7f040140, 0x7f040149, 0x7f04014a }; - public static final int CoordinatorLayout_Layout_android_layout_gravity = 0; - public static final int CoordinatorLayout_Layout_layout_anchor = 1; - public static final int CoordinatorLayout_Layout_layout_anchorGravity = 2; - public static final int CoordinatorLayout_Layout_layout_behavior = 3; - public static final int CoordinatorLayout_Layout_layout_dodgeInsetEdges = 4; - public static final int CoordinatorLayout_Layout_layout_insetEdge = 5; - public static final int CoordinatorLayout_Layout_layout_keyline = 6; - public static final int[] FontFamily = { 0x7f0400d9, 0x7f0400da, 0x7f0400db, 0x7f0400dc, 0x7f0400dd, 0x7f0400de }; - public static final int FontFamily_fontProviderAuthority = 0; - public static final int FontFamily_fontProviderCerts = 1; - public static final int FontFamily_fontProviderFetchStrategy = 2; - public static final int FontFamily_fontProviderFetchTimeout = 3; - public static final int FontFamily_fontProviderPackage = 4; - public static final int FontFamily_fontProviderQuery = 5; - public static final int[] FontFamilyFont = { 0x1010532, 0x1010533, 0x101053f, 0x101056f, 0x1010570, 0x7f0400d7, 0x7f0400df, 0x7f0400e0, 0x7f0400e1, 0x7f040208 }; - public static final int FontFamilyFont_android_font = 0; - public static final int FontFamilyFont_android_fontWeight = 1; - public static final int FontFamilyFont_android_fontStyle = 2; - public static final int FontFamilyFont_android_ttcIndex = 3; - public static final int FontFamilyFont_android_fontVariationSettings = 4; - public static final int FontFamilyFont_font = 5; - public static final int FontFamilyFont_fontStyle = 6; - public static final int FontFamilyFont_fontVariationSettings = 7; - public static final int FontFamilyFont_fontWeight = 8; - public static final int FontFamilyFont_ttcIndex = 9; - public static final int[] GradientColor = { 0x101019d, 0x101019e, 0x10101a1, 0x10101a2, 0x10101a3, 0x10101a4, 0x1010201, 0x101020b, 0x1010510, 0x1010511, 0x1010512, 0x1010513 }; - public static final int GradientColor_android_startColor = 0; - public static final int GradientColor_android_endColor = 1; - public static final int GradientColor_android_type = 2; - public static final int GradientColor_android_centerX = 3; - public static final int GradientColor_android_centerY = 4; - public static final int GradientColor_android_gradientRadius = 5; - public static final int GradientColor_android_tileMode = 6; - public static final int GradientColor_android_centerColor = 7; - public static final int GradientColor_android_startX = 8; - public static final int GradientColor_android_startY = 9; - public static final int GradientColor_android_endX = 10; - public static final int GradientColor_android_endY = 11; - public static final int[] GradientColorItem = { 0x10101a5, 0x1010514 }; - public static final int GradientColorItem_android_color = 0; - public static final int GradientColorItem_android_offset = 1; - } -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/graphics/drawable/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/graphics/drawable/R.java deleted file mode 100755 index 30ca157..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/graphics/drawable/R.java +++ /dev/null @@ -1,211 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.support.graphics.drawable; - -public final class R { - private R() {} - - public static final class attr { - private attr() {} - - public static final int alpha = 0x7f040027; - public static final int coordinatorLayoutStyle = 0x7f0400a4; - public static final int font = 0x7f0400d7; - public static final int fontProviderAuthority = 0x7f0400d9; - public static final int fontProviderCerts = 0x7f0400da; - public static final int fontProviderFetchStrategy = 0x7f0400db; - public static final int fontProviderFetchTimeout = 0x7f0400dc; - public static final int fontProviderPackage = 0x7f0400dd; - public static final int fontProviderQuery = 0x7f0400de; - public static final int fontStyle = 0x7f0400df; - public static final int fontVariationSettings = 0x7f0400e0; - public static final int fontWeight = 0x7f0400e1; - public static final int keylines = 0x7f04010d; - public static final int layout_anchor = 0x7f040112; - public static final int layout_anchorGravity = 0x7f040113; - public static final int layout_behavior = 0x7f040114; - public static final int layout_dodgeInsetEdges = 0x7f040140; - public static final int layout_insetEdge = 0x7f040149; - public static final int layout_keyline = 0x7f04014a; - public static final int statusBarBackground = 0x7f0401a6; - public static final int ttcIndex = 0x7f040208; - } - public static final class color { - private color() {} - - public static final int notification_action_color_filter = 0x7f06006a; - public static final int notification_icon_bg_color = 0x7f06006b; - public static final int ripple_material_light = 0x7f060075; - public static final int secondary_text_default_material_light = 0x7f060077; - } - public static final class dimen { - private dimen() {} - - public static final int compat_button_inset_horizontal_material = 0x7f07004e; - public static final int compat_button_inset_vertical_material = 0x7f07004f; - public static final int compat_button_padding_horizontal_material = 0x7f070050; - public static final int compat_button_padding_vertical_material = 0x7f070051; - public static final int compat_control_corner_material = 0x7f070052; - public static final int compat_notification_large_icon_max_height = 0x7f070053; - public static final int compat_notification_large_icon_max_width = 0x7f070054; - public static final int notification_action_icon_size = 0x7f0700c5; - public static final int notification_action_text_size = 0x7f0700c6; - public static final int notification_big_circle_margin = 0x7f0700c7; - public static final int notification_content_margin_start = 0x7f0700c8; - public static final int notification_large_icon_height = 0x7f0700c9; - public static final int notification_large_icon_width = 0x7f0700ca; - public static final int notification_main_column_padding_top = 0x7f0700cb; - public static final int notification_media_narrow_margin = 0x7f0700cc; - public static final int notification_right_icon_size = 0x7f0700cd; - public static final int notification_right_side_padding_top = 0x7f0700ce; - public static final int notification_small_icon_background_padding = 0x7f0700cf; - public static final int notification_small_icon_size_as_large = 0x7f0700d0; - public static final int notification_subtext_size = 0x7f0700d1; - public static final int notification_top_pad = 0x7f0700d2; - public static final int notification_top_pad_large_text = 0x7f0700d3; - } - public static final class drawable { - private drawable() {} - - public static final int notification_action_background = 0x7f08006b; - public static final int notification_bg = 0x7f08006c; - public static final int notification_bg_low = 0x7f08006d; - public static final int notification_bg_low_normal = 0x7f08006e; - public static final int notification_bg_low_pressed = 0x7f08006f; - public static final int notification_bg_normal = 0x7f080070; - public static final int notification_bg_normal_pressed = 0x7f080071; - public static final int notification_icon_background = 0x7f080072; - public static final int notification_template_icon_bg = 0x7f080073; - public static final int notification_template_icon_low_bg = 0x7f080074; - public static final int notification_tile_bg = 0x7f080075; - public static final int notify_panel_notification_icon_bg = 0x7f080076; - } - public static final class id { - private id() {} - - public static final int action_container = 0x7f09000d; - public static final int action_divider = 0x7f09000f; - public static final int action_image = 0x7f090010; - public static final int action_text = 0x7f090017; - public static final int actions = 0x7f090018; - public static final int async = 0x7f09001e; - public static final int blocking = 0x7f090022; - public static final int bottom = 0x7f090023; - public static final int chronometer = 0x7f09002b; - public static final int end = 0x7f090043; - public static final int forever = 0x7f09004f; - public static final int icon = 0x7f090056; - public static final int icon_group = 0x7f090057; - public static final int info = 0x7f09005a; - public static final int italic = 0x7f09005c; - public static final int left = 0x7f090061; - public static final int line1 = 0x7f090062; - public static final int line3 = 0x7f090063; - public static final int none = 0x7f090070; - public static final int normal = 0x7f090071; - public static final int notification_background = 0x7f090073; - public static final int notification_main_column = 0x7f090074; - public static final int notification_main_column_container = 0x7f090075; - public static final int right = 0x7f090081; - public static final int right_icon = 0x7f090082; - public static final int right_side = 0x7f090083; - public static final int start = 0x7f0900ac; - public static final int tag_transition_group = 0x7f0900b1; - public static final int tag_unhandled_key_event_manager = 0x7f0900b2; - public static final int tag_unhandled_key_listeners = 0x7f0900b3; - public static final int text = 0x7f0900b4; - public static final int text2 = 0x7f0900b5; - public static final int time = 0x7f0900bd; - public static final int title = 0x7f0900be; - public static final int top = 0x7f0900c2; - } - public static final class integer { - private integer() {} - - public static final int status_bar_notification_info_maxnum = 0x7f0a000e; - } - public static final class layout { - private layout() {} - - public static final int notification_action = 0x7f0c0030; - public static final int notification_action_tombstone = 0x7f0c0031; - public static final int notification_template_custom_big = 0x7f0c0032; - public static final int notification_template_icon_group = 0x7f0c0033; - public static final int notification_template_part_chronometer = 0x7f0c0034; - public static final int notification_template_part_time = 0x7f0c0035; - } - public static final class string { - private string() {} - - public static final int status_bar_notification_info_overflow = 0x7f0f0037; - } - public static final class style { - private style() {} - - public static final int TextAppearance_Compat_Notification = 0x7f10011c; - public static final int TextAppearance_Compat_Notification_Info = 0x7f10011d; - public static final int TextAppearance_Compat_Notification_Line2 = 0x7f10011e; - public static final int TextAppearance_Compat_Notification_Time = 0x7f10011f; - public static final int TextAppearance_Compat_Notification_Title = 0x7f100120; - public static final int Widget_Compat_NotificationActionContainer = 0x7f1001c6; - public static final int Widget_Compat_NotificationActionText = 0x7f1001c7; - public static final int Widget_Support_CoordinatorLayout = 0x7f1001f6; - } - public static final class styleable { - private styleable() {} - - public static final int[] ColorStateListItem = { 0x10101a5, 0x101031f, 0x7f040027 }; - public static final int ColorStateListItem_android_color = 0; - public static final int ColorStateListItem_android_alpha = 1; - public static final int ColorStateListItem_alpha = 2; - public static final int[] CoordinatorLayout = { 0x7f04010d, 0x7f0401a6 }; - public static final int CoordinatorLayout_keylines = 0; - public static final int CoordinatorLayout_statusBarBackground = 1; - public static final int[] CoordinatorLayout_Layout = { 0x10100b3, 0x7f040112, 0x7f040113, 0x7f040114, 0x7f040140, 0x7f040149, 0x7f04014a }; - public static final int CoordinatorLayout_Layout_android_layout_gravity = 0; - public static final int CoordinatorLayout_Layout_layout_anchor = 1; - public static final int CoordinatorLayout_Layout_layout_anchorGravity = 2; - public static final int CoordinatorLayout_Layout_layout_behavior = 3; - public static final int CoordinatorLayout_Layout_layout_dodgeInsetEdges = 4; - public static final int CoordinatorLayout_Layout_layout_insetEdge = 5; - public static final int CoordinatorLayout_Layout_layout_keyline = 6; - public static final int[] FontFamily = { 0x7f0400d9, 0x7f0400da, 0x7f0400db, 0x7f0400dc, 0x7f0400dd, 0x7f0400de }; - public static final int FontFamily_fontProviderAuthority = 0; - public static final int FontFamily_fontProviderCerts = 1; - public static final int FontFamily_fontProviderFetchStrategy = 2; - public static final int FontFamily_fontProviderFetchTimeout = 3; - public static final int FontFamily_fontProviderPackage = 4; - public static final int FontFamily_fontProviderQuery = 5; - public static final int[] FontFamilyFont = { 0x1010532, 0x1010533, 0x101053f, 0x101056f, 0x1010570, 0x7f0400d7, 0x7f0400df, 0x7f0400e0, 0x7f0400e1, 0x7f040208 }; - public static final int FontFamilyFont_android_font = 0; - public static final int FontFamilyFont_android_fontWeight = 1; - public static final int FontFamilyFont_android_fontStyle = 2; - public static final int FontFamilyFont_android_ttcIndex = 3; - public static final int FontFamilyFont_android_fontVariationSettings = 4; - public static final int FontFamilyFont_font = 5; - public static final int FontFamilyFont_fontStyle = 6; - public static final int FontFamilyFont_fontVariationSettings = 7; - public static final int FontFamilyFont_fontWeight = 8; - public static final int FontFamilyFont_ttcIndex = 9; - public static final int[] GradientColor = { 0x101019d, 0x101019e, 0x10101a1, 0x10101a2, 0x10101a3, 0x10101a4, 0x1010201, 0x101020b, 0x1010510, 0x1010511, 0x1010512, 0x1010513 }; - public static final int GradientColor_android_startColor = 0; - public static final int GradientColor_android_endColor = 1; - public static final int GradientColor_android_type = 2; - public static final int GradientColor_android_centerX = 3; - public static final int GradientColor_android_centerY = 4; - public static final int GradientColor_android_gradientRadius = 5; - public static final int GradientColor_android_tileMode = 6; - public static final int GradientColor_android_centerColor = 7; - public static final int GradientColor_android_startX = 8; - public static final int GradientColor_android_startY = 9; - public static final int GradientColor_android_endX = 10; - public static final int GradientColor_android_endY = 11; - public static final int[] GradientColorItem = { 0x10101a5, 0x1010514 }; - public static final int GradientColorItem_android_color = 0; - public static final int GradientColorItem_android_offset = 1; - } -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/interpolator/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/interpolator/R.java deleted file mode 100755 index f5aa823..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/interpolator/R.java +++ /dev/null @@ -1,12 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.support.interpolator; - -public final class R { - private R() {} - -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/loader/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/loader/R.java deleted file mode 100755 index 4f8c540..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/loader/R.java +++ /dev/null @@ -1,183 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.support.loader; - -public final class R { - private R() {} - - public static final class attr { - private attr() {} - - public static final int alpha = 0x7f040027; - public static final int font = 0x7f0400d7; - public static final int fontProviderAuthority = 0x7f0400d9; - public static final int fontProviderCerts = 0x7f0400da; - public static final int fontProviderFetchStrategy = 0x7f0400db; - public static final int fontProviderFetchTimeout = 0x7f0400dc; - public static final int fontProviderPackage = 0x7f0400dd; - public static final int fontProviderQuery = 0x7f0400de; - public static final int fontStyle = 0x7f0400df; - public static final int fontVariationSettings = 0x7f0400e0; - public static final int fontWeight = 0x7f0400e1; - public static final int ttcIndex = 0x7f040208; - } - public static final class color { - private color() {} - - public static final int notification_action_color_filter = 0x7f06006a; - public static final int notification_icon_bg_color = 0x7f06006b; - public static final int ripple_material_light = 0x7f060075; - public static final int secondary_text_default_material_light = 0x7f060077; - } - public static final class dimen { - private dimen() {} - - public static final int compat_button_inset_horizontal_material = 0x7f07004e; - public static final int compat_button_inset_vertical_material = 0x7f07004f; - public static final int compat_button_padding_horizontal_material = 0x7f070050; - public static final int compat_button_padding_vertical_material = 0x7f070051; - public static final int compat_control_corner_material = 0x7f070052; - public static final int compat_notification_large_icon_max_height = 0x7f070053; - public static final int compat_notification_large_icon_max_width = 0x7f070054; - public static final int notification_action_icon_size = 0x7f0700c5; - public static final int notification_action_text_size = 0x7f0700c6; - public static final int notification_big_circle_margin = 0x7f0700c7; - public static final int notification_content_margin_start = 0x7f0700c8; - public static final int notification_large_icon_height = 0x7f0700c9; - public static final int notification_large_icon_width = 0x7f0700ca; - public static final int notification_main_column_padding_top = 0x7f0700cb; - public static final int notification_media_narrow_margin = 0x7f0700cc; - public static final int notification_right_icon_size = 0x7f0700cd; - public static final int notification_right_side_padding_top = 0x7f0700ce; - public static final int notification_small_icon_background_padding = 0x7f0700cf; - public static final int notification_small_icon_size_as_large = 0x7f0700d0; - public static final int notification_subtext_size = 0x7f0700d1; - public static final int notification_top_pad = 0x7f0700d2; - public static final int notification_top_pad_large_text = 0x7f0700d3; - } - public static final class drawable { - private drawable() {} - - public static final int notification_action_background = 0x7f08006b; - public static final int notification_bg = 0x7f08006c; - public static final int notification_bg_low = 0x7f08006d; - public static final int notification_bg_low_normal = 0x7f08006e; - public static final int notification_bg_low_pressed = 0x7f08006f; - public static final int notification_bg_normal = 0x7f080070; - public static final int notification_bg_normal_pressed = 0x7f080071; - public static final int notification_icon_background = 0x7f080072; - public static final int notification_template_icon_bg = 0x7f080073; - public static final int notification_template_icon_low_bg = 0x7f080074; - public static final int notification_tile_bg = 0x7f080075; - public static final int notify_panel_notification_icon_bg = 0x7f080076; - } - public static final class id { - private id() {} - - public static final int action_container = 0x7f09000d; - public static final int action_divider = 0x7f09000f; - public static final int action_image = 0x7f090010; - public static final int action_text = 0x7f090017; - public static final int actions = 0x7f090018; - public static final int async = 0x7f09001e; - public static final int blocking = 0x7f090022; - public static final int chronometer = 0x7f09002b; - public static final int forever = 0x7f09004f; - public static final int icon = 0x7f090056; - public static final int icon_group = 0x7f090057; - public static final int info = 0x7f09005a; - public static final int italic = 0x7f09005c; - public static final int line1 = 0x7f090062; - public static final int line3 = 0x7f090063; - public static final int normal = 0x7f090071; - public static final int notification_background = 0x7f090073; - public static final int notification_main_column = 0x7f090074; - public static final int notification_main_column_container = 0x7f090075; - public static final int right_icon = 0x7f090082; - public static final int right_side = 0x7f090083; - public static final int tag_transition_group = 0x7f0900b1; - public static final int tag_unhandled_key_event_manager = 0x7f0900b2; - public static final int tag_unhandled_key_listeners = 0x7f0900b3; - public static final int text = 0x7f0900b4; - public static final int text2 = 0x7f0900b5; - public static final int time = 0x7f0900bd; - public static final int title = 0x7f0900be; - } - public static final class integer { - private integer() {} - - public static final int status_bar_notification_info_maxnum = 0x7f0a000e; - } - public static final class layout { - private layout() {} - - public static final int notification_action = 0x7f0c0030; - public static final int notification_action_tombstone = 0x7f0c0031; - public static final int notification_template_custom_big = 0x7f0c0032; - public static final int notification_template_icon_group = 0x7f0c0033; - public static final int notification_template_part_chronometer = 0x7f0c0034; - public static final int notification_template_part_time = 0x7f0c0035; - } - public static final class string { - private string() {} - - public static final int status_bar_notification_info_overflow = 0x7f0f0037; - } - public static final class style { - private style() {} - - public static final int TextAppearance_Compat_Notification = 0x7f10011c; - public static final int TextAppearance_Compat_Notification_Info = 0x7f10011d; - public static final int TextAppearance_Compat_Notification_Line2 = 0x7f10011e; - public static final int TextAppearance_Compat_Notification_Time = 0x7f10011f; - public static final int TextAppearance_Compat_Notification_Title = 0x7f100120; - public static final int Widget_Compat_NotificationActionContainer = 0x7f1001c6; - public static final int Widget_Compat_NotificationActionText = 0x7f1001c7; - } - public static final class styleable { - private styleable() {} - - public static final int[] ColorStateListItem = { 0x10101a5, 0x101031f, 0x7f040027 }; - public static final int ColorStateListItem_android_color = 0; - public static final int ColorStateListItem_android_alpha = 1; - public static final int ColorStateListItem_alpha = 2; - public static final int[] FontFamily = { 0x7f0400d9, 0x7f0400da, 0x7f0400db, 0x7f0400dc, 0x7f0400dd, 0x7f0400de }; - public static final int FontFamily_fontProviderAuthority = 0; - public static final int FontFamily_fontProviderCerts = 1; - public static final int FontFamily_fontProviderFetchStrategy = 2; - public static final int FontFamily_fontProviderFetchTimeout = 3; - public static final int FontFamily_fontProviderPackage = 4; - public static final int FontFamily_fontProviderQuery = 5; - public static final int[] FontFamilyFont = { 0x1010532, 0x1010533, 0x101053f, 0x101056f, 0x1010570, 0x7f0400d7, 0x7f0400df, 0x7f0400e0, 0x7f0400e1, 0x7f040208 }; - public static final int FontFamilyFont_android_font = 0; - public static final int FontFamilyFont_android_fontWeight = 1; - public static final int FontFamilyFont_android_fontStyle = 2; - public static final int FontFamilyFont_android_ttcIndex = 3; - public static final int FontFamilyFont_android_fontVariationSettings = 4; - public static final int FontFamilyFont_font = 5; - public static final int FontFamilyFont_fontStyle = 6; - public static final int FontFamilyFont_fontVariationSettings = 7; - public static final int FontFamilyFont_fontWeight = 8; - public static final int FontFamilyFont_ttcIndex = 9; - public static final int[] GradientColor = { 0x101019d, 0x101019e, 0x10101a1, 0x10101a2, 0x10101a3, 0x10101a4, 0x1010201, 0x101020b, 0x1010510, 0x1010511, 0x1010512, 0x1010513 }; - public static final int GradientColor_android_startColor = 0; - public static final int GradientColor_android_endColor = 1; - public static final int GradientColor_android_type = 2; - public static final int GradientColor_android_centerX = 3; - public static final int GradientColor_android_centerY = 4; - public static final int GradientColor_android_gradientRadius = 5; - public static final int GradientColor_android_tileMode = 6; - public static final int GradientColor_android_centerColor = 7; - public static final int GradientColor_android_startX = 8; - public static final int GradientColor_android_startY = 9; - public static final int GradientColor_android_endX = 10; - public static final int GradientColor_android_endY = 11; - public static final int[] GradientColorItem = { 0x10101a5, 0x1010514 }; - public static final int GradientColorItem_android_color = 0; - public static final int GradientColorItem_android_offset = 1; - } -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/localbroadcastmanager/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/localbroadcastmanager/R.java deleted file mode 100755 index 2be6d6f..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/localbroadcastmanager/R.java +++ /dev/null @@ -1,12 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.support.localbroadcastmanager; - -public final class R { - private R() {} - -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/print/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/print/R.java deleted file mode 100755 index 9be88dd..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/print/R.java +++ /dev/null @@ -1,12 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.support.print; - -public final class R { - private R() {} - -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/slidingpanelayout/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/slidingpanelayout/R.java deleted file mode 100755 index c5514fe..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/slidingpanelayout/R.java +++ /dev/null @@ -1,183 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.support.slidingpanelayout; - -public final class R { - private R() {} - - public static final class attr { - private attr() {} - - public static final int alpha = 0x7f040027; - public static final int font = 0x7f0400d7; - public static final int fontProviderAuthority = 0x7f0400d9; - public static final int fontProviderCerts = 0x7f0400da; - public static final int fontProviderFetchStrategy = 0x7f0400db; - public static final int fontProviderFetchTimeout = 0x7f0400dc; - public static final int fontProviderPackage = 0x7f0400dd; - public static final int fontProviderQuery = 0x7f0400de; - public static final int fontStyle = 0x7f0400df; - public static final int fontVariationSettings = 0x7f0400e0; - public static final int fontWeight = 0x7f0400e1; - public static final int ttcIndex = 0x7f040208; - } - public static final class color { - private color() {} - - public static final int notification_action_color_filter = 0x7f06006a; - public static final int notification_icon_bg_color = 0x7f06006b; - public static final int ripple_material_light = 0x7f060075; - public static final int secondary_text_default_material_light = 0x7f060077; - } - public static final class dimen { - private dimen() {} - - public static final int compat_button_inset_horizontal_material = 0x7f07004e; - public static final int compat_button_inset_vertical_material = 0x7f07004f; - public static final int compat_button_padding_horizontal_material = 0x7f070050; - public static final int compat_button_padding_vertical_material = 0x7f070051; - public static final int compat_control_corner_material = 0x7f070052; - public static final int compat_notification_large_icon_max_height = 0x7f070053; - public static final int compat_notification_large_icon_max_width = 0x7f070054; - public static final int notification_action_icon_size = 0x7f0700c5; - public static final int notification_action_text_size = 0x7f0700c6; - public static final int notification_big_circle_margin = 0x7f0700c7; - public static final int notification_content_margin_start = 0x7f0700c8; - public static final int notification_large_icon_height = 0x7f0700c9; - public static final int notification_large_icon_width = 0x7f0700ca; - public static final int notification_main_column_padding_top = 0x7f0700cb; - public static final int notification_media_narrow_margin = 0x7f0700cc; - public static final int notification_right_icon_size = 0x7f0700cd; - public static final int notification_right_side_padding_top = 0x7f0700ce; - public static final int notification_small_icon_background_padding = 0x7f0700cf; - public static final int notification_small_icon_size_as_large = 0x7f0700d0; - public static final int notification_subtext_size = 0x7f0700d1; - public static final int notification_top_pad = 0x7f0700d2; - public static final int notification_top_pad_large_text = 0x7f0700d3; - } - public static final class drawable { - private drawable() {} - - public static final int notification_action_background = 0x7f08006b; - public static final int notification_bg = 0x7f08006c; - public static final int notification_bg_low = 0x7f08006d; - public static final int notification_bg_low_normal = 0x7f08006e; - public static final int notification_bg_low_pressed = 0x7f08006f; - public static final int notification_bg_normal = 0x7f080070; - public static final int notification_bg_normal_pressed = 0x7f080071; - public static final int notification_icon_background = 0x7f080072; - public static final int notification_template_icon_bg = 0x7f080073; - public static final int notification_template_icon_low_bg = 0x7f080074; - public static final int notification_tile_bg = 0x7f080075; - public static final int notify_panel_notification_icon_bg = 0x7f080076; - } - public static final class id { - private id() {} - - public static final int action_container = 0x7f09000d; - public static final int action_divider = 0x7f09000f; - public static final int action_image = 0x7f090010; - public static final int action_text = 0x7f090017; - public static final int actions = 0x7f090018; - public static final int async = 0x7f09001e; - public static final int blocking = 0x7f090022; - public static final int chronometer = 0x7f09002b; - public static final int forever = 0x7f09004f; - public static final int icon = 0x7f090056; - public static final int icon_group = 0x7f090057; - public static final int info = 0x7f09005a; - public static final int italic = 0x7f09005c; - public static final int line1 = 0x7f090062; - public static final int line3 = 0x7f090063; - public static final int normal = 0x7f090071; - public static final int notification_background = 0x7f090073; - public static final int notification_main_column = 0x7f090074; - public static final int notification_main_column_container = 0x7f090075; - public static final int right_icon = 0x7f090082; - public static final int right_side = 0x7f090083; - public static final int tag_transition_group = 0x7f0900b1; - public static final int tag_unhandled_key_event_manager = 0x7f0900b2; - public static final int tag_unhandled_key_listeners = 0x7f0900b3; - public static final int text = 0x7f0900b4; - public static final int text2 = 0x7f0900b5; - public static final int time = 0x7f0900bd; - public static final int title = 0x7f0900be; - } - public static final class integer { - private integer() {} - - public static final int status_bar_notification_info_maxnum = 0x7f0a000e; - } - public static final class layout { - private layout() {} - - public static final int notification_action = 0x7f0c0030; - public static final int notification_action_tombstone = 0x7f0c0031; - public static final int notification_template_custom_big = 0x7f0c0032; - public static final int notification_template_icon_group = 0x7f0c0033; - public static final int notification_template_part_chronometer = 0x7f0c0034; - public static final int notification_template_part_time = 0x7f0c0035; - } - public static final class string { - private string() {} - - public static final int status_bar_notification_info_overflow = 0x7f0f0037; - } - public static final class style { - private style() {} - - public static final int TextAppearance_Compat_Notification = 0x7f10011c; - public static final int TextAppearance_Compat_Notification_Info = 0x7f10011d; - public static final int TextAppearance_Compat_Notification_Line2 = 0x7f10011e; - public static final int TextAppearance_Compat_Notification_Time = 0x7f10011f; - public static final int TextAppearance_Compat_Notification_Title = 0x7f100120; - public static final int Widget_Compat_NotificationActionContainer = 0x7f1001c6; - public static final int Widget_Compat_NotificationActionText = 0x7f1001c7; - } - public static final class styleable { - private styleable() {} - - public static final int[] ColorStateListItem = { 0x10101a5, 0x101031f, 0x7f040027 }; - public static final int ColorStateListItem_android_color = 0; - public static final int ColorStateListItem_android_alpha = 1; - public static final int ColorStateListItem_alpha = 2; - public static final int[] FontFamily = { 0x7f0400d9, 0x7f0400da, 0x7f0400db, 0x7f0400dc, 0x7f0400dd, 0x7f0400de }; - public static final int FontFamily_fontProviderAuthority = 0; - public static final int FontFamily_fontProviderCerts = 1; - public static final int FontFamily_fontProviderFetchStrategy = 2; - public static final int FontFamily_fontProviderFetchTimeout = 3; - public static final int FontFamily_fontProviderPackage = 4; - public static final int FontFamily_fontProviderQuery = 5; - public static final int[] FontFamilyFont = { 0x1010532, 0x1010533, 0x101053f, 0x101056f, 0x1010570, 0x7f0400d7, 0x7f0400df, 0x7f0400e0, 0x7f0400e1, 0x7f040208 }; - public static final int FontFamilyFont_android_font = 0; - public static final int FontFamilyFont_android_fontWeight = 1; - public static final int FontFamilyFont_android_fontStyle = 2; - public static final int FontFamilyFont_android_ttcIndex = 3; - public static final int FontFamilyFont_android_fontVariationSettings = 4; - public static final int FontFamilyFont_font = 5; - public static final int FontFamilyFont_fontStyle = 6; - public static final int FontFamilyFont_fontVariationSettings = 7; - public static final int FontFamilyFont_fontWeight = 8; - public static final int FontFamilyFont_ttcIndex = 9; - public static final int[] GradientColor = { 0x101019d, 0x101019e, 0x10101a1, 0x10101a2, 0x10101a3, 0x10101a4, 0x1010201, 0x101020b, 0x1010510, 0x1010511, 0x1010512, 0x1010513 }; - public static final int GradientColor_android_startColor = 0; - public static final int GradientColor_android_endColor = 1; - public static final int GradientColor_android_type = 2; - public static final int GradientColor_android_centerX = 3; - public static final int GradientColor_android_centerY = 4; - public static final int GradientColor_android_gradientRadius = 5; - public static final int GradientColor_android_tileMode = 6; - public static final int GradientColor_android_centerColor = 7; - public static final int GradientColor_android_startX = 8; - public static final int GradientColor_android_startY = 9; - public static final int GradientColor_android_endX = 10; - public static final int GradientColor_android_endY = 11; - public static final int[] GradientColorItem = { 0x10101a5, 0x1010514 }; - public static final int GradientColorItem_android_color = 0; - public static final int GradientColorItem_android_offset = 1; - } -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/swiperefreshlayout/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/swiperefreshlayout/R.java deleted file mode 100755 index 024eacc..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/swiperefreshlayout/R.java +++ /dev/null @@ -1,183 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.support.swiperefreshlayout; - -public final class R { - private R() {} - - public static final class attr { - private attr() {} - - public static final int alpha = 0x7f040027; - public static final int font = 0x7f0400d7; - public static final int fontProviderAuthority = 0x7f0400d9; - public static final int fontProviderCerts = 0x7f0400da; - public static final int fontProviderFetchStrategy = 0x7f0400db; - public static final int fontProviderFetchTimeout = 0x7f0400dc; - public static final int fontProviderPackage = 0x7f0400dd; - public static final int fontProviderQuery = 0x7f0400de; - public static final int fontStyle = 0x7f0400df; - public static final int fontVariationSettings = 0x7f0400e0; - public static final int fontWeight = 0x7f0400e1; - public static final int ttcIndex = 0x7f040208; - } - public static final class color { - private color() {} - - public static final int notification_action_color_filter = 0x7f06006a; - public static final int notification_icon_bg_color = 0x7f06006b; - public static final int ripple_material_light = 0x7f060075; - public static final int secondary_text_default_material_light = 0x7f060077; - } - public static final class dimen { - private dimen() {} - - public static final int compat_button_inset_horizontal_material = 0x7f07004e; - public static final int compat_button_inset_vertical_material = 0x7f07004f; - public static final int compat_button_padding_horizontal_material = 0x7f070050; - public static final int compat_button_padding_vertical_material = 0x7f070051; - public static final int compat_control_corner_material = 0x7f070052; - public static final int compat_notification_large_icon_max_height = 0x7f070053; - public static final int compat_notification_large_icon_max_width = 0x7f070054; - public static final int notification_action_icon_size = 0x7f0700c5; - public static final int notification_action_text_size = 0x7f0700c6; - public static final int notification_big_circle_margin = 0x7f0700c7; - public static final int notification_content_margin_start = 0x7f0700c8; - public static final int notification_large_icon_height = 0x7f0700c9; - public static final int notification_large_icon_width = 0x7f0700ca; - public static final int notification_main_column_padding_top = 0x7f0700cb; - public static final int notification_media_narrow_margin = 0x7f0700cc; - public static final int notification_right_icon_size = 0x7f0700cd; - public static final int notification_right_side_padding_top = 0x7f0700ce; - public static final int notification_small_icon_background_padding = 0x7f0700cf; - public static final int notification_small_icon_size_as_large = 0x7f0700d0; - public static final int notification_subtext_size = 0x7f0700d1; - public static final int notification_top_pad = 0x7f0700d2; - public static final int notification_top_pad_large_text = 0x7f0700d3; - } - public static final class drawable { - private drawable() {} - - public static final int notification_action_background = 0x7f08006b; - public static final int notification_bg = 0x7f08006c; - public static final int notification_bg_low = 0x7f08006d; - public static final int notification_bg_low_normal = 0x7f08006e; - public static final int notification_bg_low_pressed = 0x7f08006f; - public static final int notification_bg_normal = 0x7f080070; - public static final int notification_bg_normal_pressed = 0x7f080071; - public static final int notification_icon_background = 0x7f080072; - public static final int notification_template_icon_bg = 0x7f080073; - public static final int notification_template_icon_low_bg = 0x7f080074; - public static final int notification_tile_bg = 0x7f080075; - public static final int notify_panel_notification_icon_bg = 0x7f080076; - } - public static final class id { - private id() {} - - public static final int action_container = 0x7f09000d; - public static final int action_divider = 0x7f09000f; - public static final int action_image = 0x7f090010; - public static final int action_text = 0x7f090017; - public static final int actions = 0x7f090018; - public static final int async = 0x7f09001e; - public static final int blocking = 0x7f090022; - public static final int chronometer = 0x7f09002b; - public static final int forever = 0x7f09004f; - public static final int icon = 0x7f090056; - public static final int icon_group = 0x7f090057; - public static final int info = 0x7f09005a; - public static final int italic = 0x7f09005c; - public static final int line1 = 0x7f090062; - public static final int line3 = 0x7f090063; - public static final int normal = 0x7f090071; - public static final int notification_background = 0x7f090073; - public static final int notification_main_column = 0x7f090074; - public static final int notification_main_column_container = 0x7f090075; - public static final int right_icon = 0x7f090082; - public static final int right_side = 0x7f090083; - public static final int tag_transition_group = 0x7f0900b1; - public static final int tag_unhandled_key_event_manager = 0x7f0900b2; - public static final int tag_unhandled_key_listeners = 0x7f0900b3; - public static final int text = 0x7f0900b4; - public static final int text2 = 0x7f0900b5; - public static final int time = 0x7f0900bd; - public static final int title = 0x7f0900be; - } - public static final class integer { - private integer() {} - - public static final int status_bar_notification_info_maxnum = 0x7f0a000e; - } - public static final class layout { - private layout() {} - - public static final int notification_action = 0x7f0c0030; - public static final int notification_action_tombstone = 0x7f0c0031; - public static final int notification_template_custom_big = 0x7f0c0032; - public static final int notification_template_icon_group = 0x7f0c0033; - public static final int notification_template_part_chronometer = 0x7f0c0034; - public static final int notification_template_part_time = 0x7f0c0035; - } - public static final class string { - private string() {} - - public static final int status_bar_notification_info_overflow = 0x7f0f0037; - } - public static final class style { - private style() {} - - public static final int TextAppearance_Compat_Notification = 0x7f10011c; - public static final int TextAppearance_Compat_Notification_Info = 0x7f10011d; - public static final int TextAppearance_Compat_Notification_Line2 = 0x7f10011e; - public static final int TextAppearance_Compat_Notification_Time = 0x7f10011f; - public static final int TextAppearance_Compat_Notification_Title = 0x7f100120; - public static final int Widget_Compat_NotificationActionContainer = 0x7f1001c6; - public static final int Widget_Compat_NotificationActionText = 0x7f1001c7; - } - public static final class styleable { - private styleable() {} - - public static final int[] ColorStateListItem = { 0x10101a5, 0x101031f, 0x7f040027 }; - public static final int ColorStateListItem_android_color = 0; - public static final int ColorStateListItem_android_alpha = 1; - public static final int ColorStateListItem_alpha = 2; - public static final int[] FontFamily = { 0x7f0400d9, 0x7f0400da, 0x7f0400db, 0x7f0400dc, 0x7f0400dd, 0x7f0400de }; - public static final int FontFamily_fontProviderAuthority = 0; - public static final int FontFamily_fontProviderCerts = 1; - public static final int FontFamily_fontProviderFetchStrategy = 2; - public static final int FontFamily_fontProviderFetchTimeout = 3; - public static final int FontFamily_fontProviderPackage = 4; - public static final int FontFamily_fontProviderQuery = 5; - public static final int[] FontFamilyFont = { 0x1010532, 0x1010533, 0x101053f, 0x101056f, 0x1010570, 0x7f0400d7, 0x7f0400df, 0x7f0400e0, 0x7f0400e1, 0x7f040208 }; - public static final int FontFamilyFont_android_font = 0; - public static final int FontFamilyFont_android_fontWeight = 1; - public static final int FontFamilyFont_android_fontStyle = 2; - public static final int FontFamilyFont_android_ttcIndex = 3; - public static final int FontFamilyFont_android_fontVariationSettings = 4; - public static final int FontFamilyFont_font = 5; - public static final int FontFamilyFont_fontStyle = 6; - public static final int FontFamilyFont_fontVariationSettings = 7; - public static final int FontFamilyFont_fontWeight = 8; - public static final int FontFamilyFont_ttcIndex = 9; - public static final int[] GradientColor = { 0x101019d, 0x101019e, 0x10101a1, 0x10101a2, 0x10101a3, 0x10101a4, 0x1010201, 0x101020b, 0x1010510, 0x1010511, 0x1010512, 0x1010513 }; - public static final int GradientColor_android_startColor = 0; - public static final int GradientColor_android_endColor = 1; - public static final int GradientColor_android_type = 2; - public static final int GradientColor_android_centerX = 3; - public static final int GradientColor_android_centerY = 4; - public static final int GradientColor_android_gradientRadius = 5; - public static final int GradientColor_android_tileMode = 6; - public static final int GradientColor_android_centerColor = 7; - public static final int GradientColor_android_startX = 8; - public static final int GradientColor_android_startY = 9; - public static final int GradientColor_android_endX = 10; - public static final int GradientColor_android_endY = 11; - public static final int[] GradientColorItem = { 0x10101a5, 0x1010514 }; - public static final int GradientColorItem_android_color = 0; - public static final int GradientColorItem_android_offset = 1; - } -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/transition/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/transition/R.java deleted file mode 100755 index a2a16f9..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/transition/R.java +++ /dev/null @@ -1,193 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.support.transition; - -public final class R { - private R() {} - - public static final class attr { - private attr() {} - - public static final int alpha = 0x7f040027; - public static final int font = 0x7f0400d7; - public static final int fontProviderAuthority = 0x7f0400d9; - public static final int fontProviderCerts = 0x7f0400da; - public static final int fontProviderFetchStrategy = 0x7f0400db; - public static final int fontProviderFetchTimeout = 0x7f0400dc; - public static final int fontProviderPackage = 0x7f0400dd; - public static final int fontProviderQuery = 0x7f0400de; - public static final int fontStyle = 0x7f0400df; - public static final int fontVariationSettings = 0x7f0400e0; - public static final int fontWeight = 0x7f0400e1; - public static final int ttcIndex = 0x7f040208; - } - public static final class color { - private color() {} - - public static final int notification_action_color_filter = 0x7f06006a; - public static final int notification_icon_bg_color = 0x7f06006b; - public static final int ripple_material_light = 0x7f060075; - public static final int secondary_text_default_material_light = 0x7f060077; - } - public static final class dimen { - private dimen() {} - - public static final int compat_button_inset_horizontal_material = 0x7f07004e; - public static final int compat_button_inset_vertical_material = 0x7f07004f; - public static final int compat_button_padding_horizontal_material = 0x7f070050; - public static final int compat_button_padding_vertical_material = 0x7f070051; - public static final int compat_control_corner_material = 0x7f070052; - public static final int compat_notification_large_icon_max_height = 0x7f070053; - public static final int compat_notification_large_icon_max_width = 0x7f070054; - public static final int notification_action_icon_size = 0x7f0700c5; - public static final int notification_action_text_size = 0x7f0700c6; - public static final int notification_big_circle_margin = 0x7f0700c7; - public static final int notification_content_margin_start = 0x7f0700c8; - public static final int notification_large_icon_height = 0x7f0700c9; - public static final int notification_large_icon_width = 0x7f0700ca; - public static final int notification_main_column_padding_top = 0x7f0700cb; - public static final int notification_media_narrow_margin = 0x7f0700cc; - public static final int notification_right_icon_size = 0x7f0700cd; - public static final int notification_right_side_padding_top = 0x7f0700ce; - public static final int notification_small_icon_background_padding = 0x7f0700cf; - public static final int notification_small_icon_size_as_large = 0x7f0700d0; - public static final int notification_subtext_size = 0x7f0700d1; - public static final int notification_top_pad = 0x7f0700d2; - public static final int notification_top_pad_large_text = 0x7f0700d3; - } - public static final class drawable { - private drawable() {} - - public static final int notification_action_background = 0x7f08006b; - public static final int notification_bg = 0x7f08006c; - public static final int notification_bg_low = 0x7f08006d; - public static final int notification_bg_low_normal = 0x7f08006e; - public static final int notification_bg_low_pressed = 0x7f08006f; - public static final int notification_bg_normal = 0x7f080070; - public static final int notification_bg_normal_pressed = 0x7f080071; - public static final int notification_icon_background = 0x7f080072; - public static final int notification_template_icon_bg = 0x7f080073; - public static final int notification_template_icon_low_bg = 0x7f080074; - public static final int notification_tile_bg = 0x7f080075; - public static final int notify_panel_notification_icon_bg = 0x7f080076; - } - public static final class id { - private id() {} - - public static final int action_container = 0x7f09000d; - public static final int action_divider = 0x7f09000f; - public static final int action_image = 0x7f090010; - public static final int action_text = 0x7f090017; - public static final int actions = 0x7f090018; - public static final int async = 0x7f09001e; - public static final int blocking = 0x7f090022; - public static final int chronometer = 0x7f09002b; - public static final int forever = 0x7f09004f; - public static final int ghost_view = 0x7f090050; - public static final int icon = 0x7f090056; - public static final int icon_group = 0x7f090057; - public static final int info = 0x7f09005a; - public static final int italic = 0x7f09005c; - public static final int line1 = 0x7f090062; - public static final int line3 = 0x7f090063; - public static final int normal = 0x7f090071; - public static final int notification_background = 0x7f090073; - public static final int notification_main_column = 0x7f090074; - public static final int notification_main_column_container = 0x7f090075; - public static final int parent_matrix = 0x7f09007b; - public static final int right_icon = 0x7f090082; - public static final int right_side = 0x7f090083; - public static final int save_image_matrix = 0x7f090084; - public static final int save_non_transition_alpha = 0x7f090085; - public static final int save_scale_type = 0x7f090086; - public static final int tag_transition_group = 0x7f0900b1; - public static final int tag_unhandled_key_event_manager = 0x7f0900b2; - public static final int tag_unhandled_key_listeners = 0x7f0900b3; - public static final int text = 0x7f0900b4; - public static final int text2 = 0x7f0900b5; - public static final int time = 0x7f0900bd; - public static final int title = 0x7f0900be; - public static final int transition_current_scene = 0x7f0900c5; - public static final int transition_layout_save = 0x7f0900c6; - public static final int transition_position = 0x7f0900c7; - public static final int transition_scene_layoutid_cache = 0x7f0900c8; - public static final int transition_transform = 0x7f0900c9; - } - public static final class integer { - private integer() {} - - public static final int status_bar_notification_info_maxnum = 0x7f0a000e; - } - public static final class layout { - private layout() {} - - public static final int notification_action = 0x7f0c0030; - public static final int notification_action_tombstone = 0x7f0c0031; - public static final int notification_template_custom_big = 0x7f0c0032; - public static final int notification_template_icon_group = 0x7f0c0033; - public static final int notification_template_part_chronometer = 0x7f0c0034; - public static final int notification_template_part_time = 0x7f0c0035; - } - public static final class string { - private string() {} - - public static final int status_bar_notification_info_overflow = 0x7f0f0037; - } - public static final class style { - private style() {} - - public static final int TextAppearance_Compat_Notification = 0x7f10011c; - public static final int TextAppearance_Compat_Notification_Info = 0x7f10011d; - public static final int TextAppearance_Compat_Notification_Line2 = 0x7f10011e; - public static final int TextAppearance_Compat_Notification_Time = 0x7f10011f; - public static final int TextAppearance_Compat_Notification_Title = 0x7f100120; - public static final int Widget_Compat_NotificationActionContainer = 0x7f1001c6; - public static final int Widget_Compat_NotificationActionText = 0x7f1001c7; - } - public static final class styleable { - private styleable() {} - - public static final int[] ColorStateListItem = { 0x10101a5, 0x101031f, 0x7f040027 }; - public static final int ColorStateListItem_android_color = 0; - public static final int ColorStateListItem_android_alpha = 1; - public static final int ColorStateListItem_alpha = 2; - public static final int[] FontFamily = { 0x7f0400d9, 0x7f0400da, 0x7f0400db, 0x7f0400dc, 0x7f0400dd, 0x7f0400de }; - public static final int FontFamily_fontProviderAuthority = 0; - public static final int FontFamily_fontProviderCerts = 1; - public static final int FontFamily_fontProviderFetchStrategy = 2; - public static final int FontFamily_fontProviderFetchTimeout = 3; - public static final int FontFamily_fontProviderPackage = 4; - public static final int FontFamily_fontProviderQuery = 5; - public static final int[] FontFamilyFont = { 0x1010532, 0x1010533, 0x101053f, 0x101056f, 0x1010570, 0x7f0400d7, 0x7f0400df, 0x7f0400e0, 0x7f0400e1, 0x7f040208 }; - public static final int FontFamilyFont_android_font = 0; - public static final int FontFamilyFont_android_fontWeight = 1; - public static final int FontFamilyFont_android_fontStyle = 2; - public static final int FontFamilyFont_android_ttcIndex = 3; - public static final int FontFamilyFont_android_fontVariationSettings = 4; - public static final int FontFamilyFont_font = 5; - public static final int FontFamilyFont_fontStyle = 6; - public static final int FontFamilyFont_fontVariationSettings = 7; - public static final int FontFamilyFont_fontWeight = 8; - public static final int FontFamilyFont_ttcIndex = 9; - public static final int[] GradientColor = { 0x101019d, 0x101019e, 0x10101a1, 0x10101a2, 0x10101a3, 0x10101a4, 0x1010201, 0x101020b, 0x1010510, 0x1010511, 0x1010512, 0x1010513 }; - public static final int GradientColor_android_startColor = 0; - public static final int GradientColor_android_endColor = 1; - public static final int GradientColor_android_type = 2; - public static final int GradientColor_android_centerX = 3; - public static final int GradientColor_android_centerY = 4; - public static final int GradientColor_android_gradientRadius = 5; - public static final int GradientColor_android_tileMode = 6; - public static final int GradientColor_android_centerColor = 7; - public static final int GradientColor_android_startX = 8; - public static final int GradientColor_android_startY = 9; - public static final int GradientColor_android_endX = 10; - public static final int GradientColor_android_endY = 11; - public static final int[] GradientColorItem = { 0x10101a5, 0x1010514 }; - public static final int GradientColorItem_android_color = 0; - public static final int GradientColorItem_android_offset = 1; - } -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/v7/appcompat/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/v7/appcompat/R.java deleted file mode 100755 index 748352d..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/v7/appcompat/R.java +++ /dev/null @@ -1,1637 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.support.v7.appcompat; - -public final class R { - private R() {} - - public static final class anim { - private anim() {} - - public static final int abc_fade_in = 0x7f010000; - public static final int abc_fade_out = 0x7f010001; - public static final int abc_grow_fade_in_from_bottom = 0x7f010002; - public static final int abc_popup_enter = 0x7f010003; - public static final int abc_popup_exit = 0x7f010004; - public static final int abc_shrink_fade_out_from_bottom = 0x7f010005; - public static final int abc_slide_in_bottom = 0x7f010006; - public static final int abc_slide_in_top = 0x7f010007; - public static final int abc_slide_out_bottom = 0x7f010008; - public static final int abc_slide_out_top = 0x7f010009; - public static final int abc_tooltip_enter = 0x7f01000a; - public static final int abc_tooltip_exit = 0x7f01000b; - } - public static final class attr { - private attr() {} - - public static final int actionBarDivider = 0x7f040000; - public static final int actionBarItemBackground = 0x7f040001; - public static final int actionBarPopupTheme = 0x7f040002; - public static final int actionBarSize = 0x7f040003; - public static final int actionBarSplitStyle = 0x7f040004; - public static final int actionBarStyle = 0x7f040005; - public static final int actionBarTabBarStyle = 0x7f040006; - public static final int actionBarTabStyle = 0x7f040007; - public static final int actionBarTabTextStyle = 0x7f040008; - public static final int actionBarTheme = 0x7f040009; - public static final int actionBarWidgetTheme = 0x7f04000a; - public static final int actionButtonStyle = 0x7f04000b; - public static final int actionDropDownStyle = 0x7f04000c; - public static final int actionLayout = 0x7f04000d; - public static final int actionMenuTextAppearance = 0x7f04000e; - public static final int actionMenuTextColor = 0x7f04000f; - public static final int actionModeBackground = 0x7f040010; - public static final int actionModeCloseButtonStyle = 0x7f040011; - public static final int actionModeCloseDrawable = 0x7f040012; - public static final int actionModeCopyDrawable = 0x7f040013; - public static final int actionModeCutDrawable = 0x7f040014; - public static final int actionModeFindDrawable = 0x7f040015; - public static final int actionModePasteDrawable = 0x7f040016; - public static final int actionModePopupWindowStyle = 0x7f040017; - public static final int actionModeSelectAllDrawable = 0x7f040018; - public static final int actionModeShareDrawable = 0x7f040019; - public static final int actionModeSplitBackground = 0x7f04001a; - public static final int actionModeStyle = 0x7f04001b; - public static final int actionModeWebSearchDrawable = 0x7f04001c; - public static final int actionOverflowButtonStyle = 0x7f04001d; - public static final int actionOverflowMenuStyle = 0x7f04001e; - public static final int actionProviderClass = 0x7f04001f; - public static final int actionViewClass = 0x7f040020; - public static final int activityChooserViewStyle = 0x7f040021; - public static final int alertDialogButtonGroupStyle = 0x7f040022; - public static final int alertDialogCenterButtons = 0x7f040023; - public static final int alertDialogStyle = 0x7f040024; - public static final int alertDialogTheme = 0x7f040025; - public static final int allowStacking = 0x7f040026; - public static final int alpha = 0x7f040027; - public static final int alphabeticModifiers = 0x7f040028; - public static final int arrowHeadLength = 0x7f040029; - public static final int arrowShaftLength = 0x7f04002a; - public static final int autoCompleteTextViewStyle = 0x7f04002b; - public static final int autoSizeMaxTextSize = 0x7f04002c; - public static final int autoSizeMinTextSize = 0x7f04002d; - public static final int autoSizePresetSizes = 0x7f04002e; - public static final int autoSizeStepGranularity = 0x7f04002f; - public static final int autoSizeTextType = 0x7f040030; - public static final int background = 0x7f040031; - public static final int backgroundSplit = 0x7f040032; - public static final int backgroundStacked = 0x7f040033; - public static final int backgroundTint = 0x7f040034; - public static final int backgroundTintMode = 0x7f040035; - public static final int barLength = 0x7f040036; - public static final int borderlessButtonStyle = 0x7f040040; - public static final int buttonBarButtonStyle = 0x7f04004e; - public static final int buttonBarNegativeButtonStyle = 0x7f04004f; - public static final int buttonBarNeutralButtonStyle = 0x7f040050; - public static final int buttonBarPositiveButtonStyle = 0x7f040051; - public static final int buttonBarStyle = 0x7f040052; - public static final int buttonGravity = 0x7f040053; - public static final int buttonIconDimen = 0x7f040054; - public static final int buttonPanelSideLayout = 0x7f040055; - public static final int buttonStyle = 0x7f040056; - public static final int buttonStyleSmall = 0x7f040057; - public static final int buttonTint = 0x7f040058; - public static final int buttonTintMode = 0x7f040059; - public static final int checkboxStyle = 0x7f040062; - public static final int checkedTextViewStyle = 0x7f040067; - public static final int closeIcon = 0x7f04007a; - public static final int closeItemLayout = 0x7f040081; - public static final int collapseContentDescription = 0x7f040082; - public static final int collapseIcon = 0x7f040083; - public static final int color = 0x7f040086; - public static final int colorAccent = 0x7f040087; - public static final int colorBackgroundFloating = 0x7f040088; - public static final int colorButtonNormal = 0x7f040089; - public static final int colorControlActivated = 0x7f04008a; - public static final int colorControlHighlight = 0x7f04008b; - public static final int colorControlNormal = 0x7f04008c; - public static final int colorError = 0x7f04008d; - public static final int colorPrimary = 0x7f04008e; - public static final int colorPrimaryDark = 0x7f04008f; - public static final int colorSwitchThumbNormal = 0x7f040091; - public static final int commitIcon = 0x7f040092; - public static final int contentDescription = 0x7f040096; - public static final int contentInsetEnd = 0x7f040097; - public static final int contentInsetEndWithActions = 0x7f040098; - public static final int contentInsetLeft = 0x7f040099; - public static final int contentInsetRight = 0x7f04009a; - public static final int contentInsetStart = 0x7f04009b; - public static final int contentInsetStartWithNavigation = 0x7f04009c; - public static final int controlBackground = 0x7f0400a3; - public static final int coordinatorLayoutStyle = 0x7f0400a4; - public static final int customNavigationLayout = 0x7f0400aa; - public static final int defaultQueryHint = 0x7f0400ab; - public static final int dialogCornerRadius = 0x7f0400ac; - public static final int dialogPreferredPadding = 0x7f0400ad; - public static final int dialogTheme = 0x7f0400ae; - public static final int displayOptions = 0x7f0400af; - public static final int divider = 0x7f0400b0; - public static final int dividerHorizontal = 0x7f0400b1; - public static final int dividerPadding = 0x7f0400b2; - public static final int dividerVertical = 0x7f0400b3; - public static final int drawableSize = 0x7f0400b4; - public static final int drawerArrowStyle = 0x7f0400b5; - public static final int dropDownListViewStyle = 0x7f0400b6; - public static final int dropdownListPreferredItemHeight = 0x7f0400b7; - public static final int editTextBackground = 0x7f0400b8; - public static final int editTextColor = 0x7f0400b9; - public static final int editTextStyle = 0x7f0400ba; - public static final int elevation = 0x7f0400bb; - public static final int expandActivityOverflowButtonDrawable = 0x7f0400c1; - public static final int firstBaselineToTopHeight = 0x7f0400d5; - public static final int font = 0x7f0400d7; - public static final int fontFamily = 0x7f0400d8; - public static final int fontProviderAuthority = 0x7f0400d9; - public static final int fontProviderCerts = 0x7f0400da; - public static final int fontProviderFetchStrategy = 0x7f0400db; - public static final int fontProviderFetchTimeout = 0x7f0400dc; - public static final int fontProviderPackage = 0x7f0400dd; - public static final int fontProviderQuery = 0x7f0400de; - public static final int fontStyle = 0x7f0400df; - public static final int fontVariationSettings = 0x7f0400e0; - public static final int fontWeight = 0x7f0400e1; - public static final int gapBetweenBars = 0x7f0400e3; - public static final int goIcon = 0x7f0400e4; - public static final int height = 0x7f0400e6; - public static final int hideOnContentScroll = 0x7f0400eb; - public static final int homeAsUpIndicator = 0x7f0400f0; - public static final int homeLayout = 0x7f0400f1; - public static final int icon = 0x7f0400f3; - public static final int iconTint = 0x7f0400f9; - public static final int iconTintMode = 0x7f0400fa; - public static final int iconifiedByDefault = 0x7f0400fb; - public static final int imageButtonStyle = 0x7f0400fc; - public static final int indeterminateProgressStyle = 0x7f0400fd; - public static final int initialActivityCount = 0x7f0400fe; - public static final int isLightTheme = 0x7f040100; - public static final int itemPadding = 0x7f040107; - public static final int keylines = 0x7f04010d; - public static final int lastBaselineToBottomHeight = 0x7f04010f; - public static final int layout = 0x7f040110; - public static final int layout_anchor = 0x7f040112; - public static final int layout_anchorGravity = 0x7f040113; - public static final int layout_behavior = 0x7f040114; - public static final int layout_dodgeInsetEdges = 0x7f040140; - public static final int layout_insetEdge = 0x7f040149; - public static final int layout_keyline = 0x7f04014a; - public static final int lineHeight = 0x7f04014f; - public static final int listChoiceBackgroundIndicator = 0x7f040151; - public static final int listDividerAlertDialog = 0x7f040152; - public static final int listItemLayout = 0x7f040153; - public static final int listLayout = 0x7f040154; - public static final int listMenuViewStyle = 0x7f040155; - public static final int listPopupWindowStyle = 0x7f040156; - public static final int listPreferredItemHeight = 0x7f040157; - public static final int listPreferredItemHeightLarge = 0x7f040158; - public static final int listPreferredItemHeightSmall = 0x7f040159; - public static final int listPreferredItemPaddingLeft = 0x7f04015a; - public static final int listPreferredItemPaddingRight = 0x7f04015b; - public static final int logo = 0x7f04015c; - public static final int logoDescription = 0x7f04015d; - public static final int maxButtonHeight = 0x7f040161; - public static final int measureWithLargestChild = 0x7f040163; - public static final int multiChoiceItemLayout = 0x7f040165; - public static final int navigationContentDescription = 0x7f040166; - public static final int navigationIcon = 0x7f040167; - public static final int navigationMode = 0x7f040168; - public static final int numericModifiers = 0x7f04016a; - public static final int overlapAnchor = 0x7f04016b; - public static final int paddingBottomNoButtons = 0x7f04016c; - public static final int paddingEnd = 0x7f04016d; - public static final int paddingStart = 0x7f04016e; - public static final int paddingTopNoTitle = 0x7f04016f; - public static final int panelBackground = 0x7f040170; - public static final int panelMenuListTheme = 0x7f040171; - public static final int panelMenuListWidth = 0x7f040172; - public static final int popupMenuStyle = 0x7f040178; - public static final int popupTheme = 0x7f040179; - public static final int popupWindowStyle = 0x7f04017a; - public static final int preserveIconSpacing = 0x7f04017b; - public static final int progressBarPadding = 0x7f04017d; - public static final int progressBarStyle = 0x7f04017e; - public static final int queryBackground = 0x7f04017f; - public static final int queryHint = 0x7f040180; - public static final int radioButtonStyle = 0x7f040181; - public static final int ratingBarStyle = 0x7f040182; - public static final int ratingBarStyleIndicator = 0x7f040183; - public static final int ratingBarStyleSmall = 0x7f040184; - public static final int searchHintIcon = 0x7f04018a; - public static final int searchIcon = 0x7f04018b; - public static final int searchViewStyle = 0x7f04018c; - public static final int seekBarStyle = 0x7f04018d; - public static final int selectableItemBackground = 0x7f04018e; - public static final int selectableItemBackgroundBorderless = 0x7f04018f; - public static final int showAsAction = 0x7f040190; - public static final int showDividers = 0x7f040191; - public static final int showText = 0x7f040193; - public static final int showTitle = 0x7f040194; - public static final int singleChoiceItemLayout = 0x7f040195; - public static final int spinBars = 0x7f04019b; - public static final int spinnerDropDownItemStyle = 0x7f04019c; - public static final int spinnerStyle = 0x7f04019d; - public static final int splitTrack = 0x7f04019e; - public static final int srcCompat = 0x7f04019f; - public static final int state_above_anchor = 0x7f0401a1; - public static final int statusBarBackground = 0x7f0401a6; - public static final int subMenuArrow = 0x7f0401aa; - public static final int submitBackground = 0x7f0401ab; - public static final int subtitle = 0x7f0401ac; - public static final int subtitleTextAppearance = 0x7f0401ad; - public static final int subtitleTextColor = 0x7f0401ae; - public static final int subtitleTextStyle = 0x7f0401af; - public static final int suggestionRowLayout = 0x7f0401b0; - public static final int switchMinWidth = 0x7f0401b1; - public static final int switchPadding = 0x7f0401b2; - public static final int switchStyle = 0x7f0401b3; - public static final int switchTextAppearance = 0x7f0401b4; - public static final int textAllCaps = 0x7f0401cf; - public static final int textAppearanceLargePopupMenu = 0x7f0401da; - public static final int textAppearanceListItem = 0x7f0401db; - public static final int textAppearanceListItemSecondary = 0x7f0401dc; - public static final int textAppearanceListItemSmall = 0x7f0401dd; - public static final int textAppearancePopupMenuHeader = 0x7f0401df; - public static final int textAppearanceSearchResultSubtitle = 0x7f0401e0; - public static final int textAppearanceSearchResultTitle = 0x7f0401e1; - public static final int textAppearanceSmallPopupMenu = 0x7f0401e2; - public static final int textColorAlertDialogListItem = 0x7f0401e5; - public static final int textColorSearchUrl = 0x7f0401e6; - public static final int theme = 0x7f0401ea; - public static final int thickness = 0x7f0401eb; - public static final int thumbTextPadding = 0x7f0401ec; - public static final int thumbTint = 0x7f0401ed; - public static final int thumbTintMode = 0x7f0401ee; - public static final int tickMark = 0x7f0401ef; - public static final int tickMarkTint = 0x7f0401f0; - public static final int tickMarkTintMode = 0x7f0401f1; - public static final int tint = 0x7f0401f2; - public static final int tintMode = 0x7f0401f3; - public static final int title = 0x7f0401f4; - public static final int titleMargin = 0x7f0401f6; - public static final int titleMarginBottom = 0x7f0401f7; - public static final int titleMarginEnd = 0x7f0401f8; - public static final int titleMarginStart = 0x7f0401f9; - public static final int titleMarginTop = 0x7f0401fa; - public static final int titleMargins = 0x7f0401fb; - public static final int titleTextAppearance = 0x7f0401fc; - public static final int titleTextColor = 0x7f0401fd; - public static final int titleTextStyle = 0x7f0401fe; - public static final int toolbarNavigationButtonStyle = 0x7f040200; - public static final int toolbarStyle = 0x7f040201; - public static final int tooltipForegroundColor = 0x7f040202; - public static final int tooltipFrameBackground = 0x7f040203; - public static final int tooltipText = 0x7f040204; - public static final int track = 0x7f040205; - public static final int trackTint = 0x7f040206; - public static final int trackTintMode = 0x7f040207; - public static final int ttcIndex = 0x7f040208; - public static final int viewInflaterClass = 0x7f04020a; - public static final int voiceIcon = 0x7f04020b; - public static final int windowActionBar = 0x7f04020c; - public static final int windowActionBarOverlay = 0x7f04020d; - public static final int windowActionModeOverlay = 0x7f04020e; - public static final int windowFixedHeightMajor = 0x7f04020f; - public static final int windowFixedHeightMinor = 0x7f040210; - public static final int windowFixedWidthMajor = 0x7f040211; - public static final int windowFixedWidthMinor = 0x7f040212; - public static final int windowMinWidthMajor = 0x7f040213; - public static final int windowMinWidthMinor = 0x7f040214; - public static final int windowNoTitle = 0x7f040215; - } - public static final class bool { - private bool() {} - - public static final int abc_action_bar_embed_tabs = 0x7f050000; - public static final int abc_allow_stacked_button_bar = 0x7f050001; - public static final int abc_config_actionMenuItemAllCaps = 0x7f050002; - } - public static final class color { - private color() {} - - public static final int abc_background_cache_hint_selector_material_dark = 0x7f060000; - public static final int abc_background_cache_hint_selector_material_light = 0x7f060001; - public static final int abc_btn_colored_borderless_text_material = 0x7f060002; - public static final int abc_btn_colored_text_material = 0x7f060003; - public static final int abc_color_highlight_material = 0x7f060004; - public static final int abc_hint_foreground_material_dark = 0x7f060005; - public static final int abc_hint_foreground_material_light = 0x7f060006; - public static final int abc_input_method_navigation_guard = 0x7f060007; - public static final int abc_primary_text_disable_only_material_dark = 0x7f060008; - public static final int abc_primary_text_disable_only_material_light = 0x7f060009; - public static final int abc_primary_text_material_dark = 0x7f06000a; - public static final int abc_primary_text_material_light = 0x7f06000b; - public static final int abc_search_url_text = 0x7f06000c; - public static final int abc_search_url_text_normal = 0x7f06000d; - public static final int abc_search_url_text_pressed = 0x7f06000e; - public static final int abc_search_url_text_selected = 0x7f06000f; - public static final int abc_secondary_text_material_dark = 0x7f060010; - public static final int abc_secondary_text_material_light = 0x7f060011; - public static final int abc_tint_btn_checkable = 0x7f060012; - public static final int abc_tint_default = 0x7f060013; - public static final int abc_tint_edittext = 0x7f060014; - public static final int abc_tint_seek_thumb = 0x7f060015; - public static final int abc_tint_spinner = 0x7f060016; - public static final int abc_tint_switch_track = 0x7f060017; - public static final int accent_material_dark = 0x7f060018; - public static final int accent_material_light = 0x7f060019; - public static final int background_floating_material_dark = 0x7f06001a; - public static final int background_floating_material_light = 0x7f06001b; - public static final int background_material_dark = 0x7f06001c; - public static final int background_material_light = 0x7f06001d; - public static final int bright_foreground_disabled_material_dark = 0x7f06001e; - public static final int bright_foreground_disabled_material_light = 0x7f06001f; - public static final int bright_foreground_inverse_material_dark = 0x7f060020; - public static final int bright_foreground_inverse_material_light = 0x7f060021; - public static final int bright_foreground_material_dark = 0x7f060022; - public static final int bright_foreground_material_light = 0x7f060023; - public static final int button_material_dark = 0x7f060024; - public static final int button_material_light = 0x7f060025; - public static final int dim_foreground_disabled_material_dark = 0x7f06003a; - public static final int dim_foreground_disabled_material_light = 0x7f06003b; - public static final int dim_foreground_material_dark = 0x7f06003c; - public static final int dim_foreground_material_light = 0x7f06003d; - public static final int error_color_material_dark = 0x7f06003e; - public static final int error_color_material_light = 0x7f06003f; - public static final int foreground_material_dark = 0x7f060040; - public static final int foreground_material_light = 0x7f060041; - public static final int highlighted_text_material_dark = 0x7f060042; - public static final int highlighted_text_material_light = 0x7f060043; - public static final int material_blue_grey_800 = 0x7f060044; - public static final int material_blue_grey_900 = 0x7f060045; - public static final int material_blue_grey_950 = 0x7f060046; - public static final int material_deep_teal_200 = 0x7f060047; - public static final int material_deep_teal_500 = 0x7f060048; - public static final int material_grey_100 = 0x7f060049; - public static final int material_grey_300 = 0x7f06004a; - public static final int material_grey_50 = 0x7f06004b; - public static final int material_grey_600 = 0x7f06004c; - public static final int material_grey_800 = 0x7f06004d; - public static final int material_grey_850 = 0x7f06004e; - public static final int material_grey_900 = 0x7f06004f; - public static final int notification_action_color_filter = 0x7f06006a; - public static final int notification_icon_bg_color = 0x7f06006b; - public static final int primary_dark_material_dark = 0x7f06006c; - public static final int primary_dark_material_light = 0x7f06006d; - public static final int primary_material_dark = 0x7f06006e; - public static final int primary_material_light = 0x7f06006f; - public static final int primary_text_default_material_dark = 0x7f060070; - public static final int primary_text_default_material_light = 0x7f060071; - public static final int primary_text_disabled_material_dark = 0x7f060072; - public static final int primary_text_disabled_material_light = 0x7f060073; - public static final int ripple_material_dark = 0x7f060074; - public static final int ripple_material_light = 0x7f060075; - public static final int secondary_text_default_material_dark = 0x7f060076; - public static final int secondary_text_default_material_light = 0x7f060077; - public static final int secondary_text_disabled_material_dark = 0x7f060078; - public static final int secondary_text_disabled_material_light = 0x7f060079; - public static final int switch_thumb_disabled_material_dark = 0x7f06007a; - public static final int switch_thumb_disabled_material_light = 0x7f06007b; - public static final int switch_thumb_material_dark = 0x7f06007c; - public static final int switch_thumb_material_light = 0x7f06007d; - public static final int switch_thumb_normal_material_dark = 0x7f06007e; - public static final int switch_thumb_normal_material_light = 0x7f06007f; - public static final int tooltip_background_dark = 0x7f060080; - public static final int tooltip_background_light = 0x7f060081; - } - public static final class dimen { - private dimen() {} - - public static final int abc_action_bar_content_inset_material = 0x7f070000; - public static final int abc_action_bar_content_inset_with_nav = 0x7f070001; - public static final int abc_action_bar_default_height_material = 0x7f070002; - public static final int abc_action_bar_default_padding_end_material = 0x7f070003; - public static final int abc_action_bar_default_padding_start_material = 0x7f070004; - public static final int abc_action_bar_elevation_material = 0x7f070005; - public static final int abc_action_bar_icon_vertical_padding_material = 0x7f070006; - public static final int abc_action_bar_overflow_padding_end_material = 0x7f070007; - public static final int abc_action_bar_overflow_padding_start_material = 0x7f070008; - public static final int abc_action_bar_stacked_max_height = 0x7f070009; - public static final int abc_action_bar_stacked_tab_max_width = 0x7f07000a; - public static final int abc_action_bar_subtitle_bottom_margin_material = 0x7f07000b; - public static final int abc_action_bar_subtitle_top_margin_material = 0x7f07000c; - public static final int abc_action_button_min_height_material = 0x7f07000d; - public static final int abc_action_button_min_width_material = 0x7f07000e; - public static final int abc_action_button_min_width_overflow_material = 0x7f07000f; - public static final int abc_alert_dialog_button_bar_height = 0x7f070010; - public static final int abc_alert_dialog_button_dimen = 0x7f070011; - public static final int abc_button_inset_horizontal_material = 0x7f070012; - public static final int abc_button_inset_vertical_material = 0x7f070013; - public static final int abc_button_padding_horizontal_material = 0x7f070014; - public static final int abc_button_padding_vertical_material = 0x7f070015; - public static final int abc_cascading_menus_min_smallest_width = 0x7f070016; - public static final int abc_config_prefDialogWidth = 0x7f070017; - public static final int abc_control_corner_material = 0x7f070018; - public static final int abc_control_inset_material = 0x7f070019; - public static final int abc_control_padding_material = 0x7f07001a; - public static final int abc_dialog_corner_radius_material = 0x7f07001b; - public static final int abc_dialog_fixed_height_major = 0x7f07001c; - public static final int abc_dialog_fixed_height_minor = 0x7f07001d; - public static final int abc_dialog_fixed_width_major = 0x7f07001e; - public static final int abc_dialog_fixed_width_minor = 0x7f07001f; - public static final int abc_dialog_list_padding_bottom_no_buttons = 0x7f070020; - public static final int abc_dialog_list_padding_top_no_title = 0x7f070021; - public static final int abc_dialog_min_width_major = 0x7f070022; - public static final int abc_dialog_min_width_minor = 0x7f070023; - public static final int abc_dialog_padding_material = 0x7f070024; - public static final int abc_dialog_padding_top_material = 0x7f070025; - public static final int abc_dialog_title_divider_material = 0x7f070026; - public static final int abc_disabled_alpha_material_dark = 0x7f070027; - public static final int abc_disabled_alpha_material_light = 0x7f070028; - public static final int abc_dropdownitem_icon_width = 0x7f070029; - public static final int abc_dropdownitem_text_padding_left = 0x7f07002a; - public static final int abc_dropdownitem_text_padding_right = 0x7f07002b; - public static final int abc_edit_text_inset_bottom_material = 0x7f07002c; - public static final int abc_edit_text_inset_horizontal_material = 0x7f07002d; - public static final int abc_edit_text_inset_top_material = 0x7f07002e; - public static final int abc_floating_window_z = 0x7f07002f; - public static final int abc_list_item_padding_horizontal_material = 0x7f070030; - public static final int abc_panel_menu_list_width = 0x7f070031; - public static final int abc_progress_bar_height_material = 0x7f070032; - public static final int abc_search_view_preferred_height = 0x7f070033; - public static final int abc_search_view_preferred_width = 0x7f070034; - public static final int abc_seekbar_track_background_height_material = 0x7f070035; - public static final int abc_seekbar_track_progress_height_material = 0x7f070036; - public static final int abc_select_dialog_padding_start_material = 0x7f070037; - public static final int abc_switch_padding = 0x7f070038; - public static final int abc_text_size_body_1_material = 0x7f070039; - public static final int abc_text_size_body_2_material = 0x7f07003a; - public static final int abc_text_size_button_material = 0x7f07003b; - public static final int abc_text_size_caption_material = 0x7f07003c; - public static final int abc_text_size_display_1_material = 0x7f07003d; - public static final int abc_text_size_display_2_material = 0x7f07003e; - public static final int abc_text_size_display_3_material = 0x7f07003f; - public static final int abc_text_size_display_4_material = 0x7f070040; - public static final int abc_text_size_headline_material = 0x7f070041; - public static final int abc_text_size_large_material = 0x7f070042; - public static final int abc_text_size_medium_material = 0x7f070043; - public static final int abc_text_size_menu_header_material = 0x7f070044; - public static final int abc_text_size_menu_material = 0x7f070045; - public static final int abc_text_size_small_material = 0x7f070046; - public static final int abc_text_size_subhead_material = 0x7f070047; - public static final int abc_text_size_subtitle_material_toolbar = 0x7f070048; - public static final int abc_text_size_title_material = 0x7f070049; - public static final int abc_text_size_title_material_toolbar = 0x7f07004a; - public static final int compat_button_inset_horizontal_material = 0x7f07004e; - public static final int compat_button_inset_vertical_material = 0x7f07004f; - public static final int compat_button_padding_horizontal_material = 0x7f070050; - public static final int compat_button_padding_vertical_material = 0x7f070051; - public static final int compat_control_corner_material = 0x7f070052; - public static final int compat_notification_large_icon_max_height = 0x7f070053; - public static final int compat_notification_large_icon_max_width = 0x7f070054; - public static final int disabled_alpha_material_dark = 0x7f070081; - public static final int disabled_alpha_material_light = 0x7f070082; - public static final int highlight_alpha_material_colored = 0x7f07008b; - public static final int highlight_alpha_material_dark = 0x7f07008c; - public static final int highlight_alpha_material_light = 0x7f07008d; - public static final int hint_alpha_material_dark = 0x7f07008e; - public static final int hint_alpha_material_light = 0x7f07008f; - public static final int hint_pressed_alpha_material_dark = 0x7f070090; - public static final int hint_pressed_alpha_material_light = 0x7f070091; - public static final int notification_action_icon_size = 0x7f0700c5; - public static final int notification_action_text_size = 0x7f0700c6; - public static final int notification_big_circle_margin = 0x7f0700c7; - public static final int notification_content_margin_start = 0x7f0700c8; - public static final int notification_large_icon_height = 0x7f0700c9; - public static final int notification_large_icon_width = 0x7f0700ca; - public static final int notification_main_column_padding_top = 0x7f0700cb; - public static final int notification_media_narrow_margin = 0x7f0700cc; - public static final int notification_right_icon_size = 0x7f0700cd; - public static final int notification_right_side_padding_top = 0x7f0700ce; - public static final int notification_small_icon_background_padding = 0x7f0700cf; - public static final int notification_small_icon_size_as_large = 0x7f0700d0; - public static final int notification_subtext_size = 0x7f0700d1; - public static final int notification_top_pad = 0x7f0700d2; - public static final int notification_top_pad_large_text = 0x7f0700d3; - public static final int tooltip_corner_radius = 0x7f0700d4; - public static final int tooltip_horizontal_padding = 0x7f0700d5; - public static final int tooltip_margin = 0x7f0700d6; - public static final int tooltip_precise_anchor_extra_offset = 0x7f0700d7; - public static final int tooltip_precise_anchor_threshold = 0x7f0700d8; - public static final int tooltip_vertical_padding = 0x7f0700d9; - public static final int tooltip_y_offset_non_touch = 0x7f0700da; - public static final int tooltip_y_offset_touch = 0x7f0700db; - } - public static final class drawable { - private drawable() {} - - public static final int abc_ab_share_pack_mtrl_alpha = 0x7f080007; - public static final int abc_action_bar_item_background_material = 0x7f080008; - public static final int abc_btn_borderless_material = 0x7f080009; - public static final int abc_btn_check_material = 0x7f08000a; - public static final int abc_btn_check_to_on_mtrl_000 = 0x7f08000b; - public static final int abc_btn_check_to_on_mtrl_015 = 0x7f08000c; - public static final int abc_btn_colored_material = 0x7f08000d; - public static final int abc_btn_default_mtrl_shape = 0x7f08000e; - public static final int abc_btn_radio_material = 0x7f08000f; - public static final int abc_btn_radio_to_on_mtrl_000 = 0x7f080010; - public static final int abc_btn_radio_to_on_mtrl_015 = 0x7f080011; - public static final int abc_btn_switch_to_on_mtrl_00001 = 0x7f080012; - public static final int abc_btn_switch_to_on_mtrl_00012 = 0x7f080013; - public static final int abc_cab_background_internal_bg = 0x7f080014; - public static final int abc_cab_background_top_material = 0x7f080015; - public static final int abc_cab_background_top_mtrl_alpha = 0x7f080016; - public static final int abc_control_background_material = 0x7f080017; - public static final int abc_dialog_material_background = 0x7f080018; - public static final int abc_edit_text_material = 0x7f080019; - public static final int abc_ic_ab_back_material = 0x7f08001a; - public static final int abc_ic_arrow_drop_right_black_24dp = 0x7f08001b; - public static final int abc_ic_clear_material = 0x7f08001c; - public static final int abc_ic_commit_search_api_mtrl_alpha = 0x7f08001d; - public static final int abc_ic_go_search_api_material = 0x7f08001e; - public static final int abc_ic_menu_copy_mtrl_am_alpha = 0x7f08001f; - public static final int abc_ic_menu_cut_mtrl_alpha = 0x7f080020; - public static final int abc_ic_menu_overflow_material = 0x7f080021; - public static final int abc_ic_menu_paste_mtrl_am_alpha = 0x7f080022; - public static final int abc_ic_menu_selectall_mtrl_alpha = 0x7f080023; - public static final int abc_ic_menu_share_mtrl_alpha = 0x7f080024; - public static final int abc_ic_search_api_material = 0x7f080025; - public static final int abc_ic_star_black_16dp = 0x7f080026; - public static final int abc_ic_star_black_36dp = 0x7f080027; - public static final int abc_ic_star_black_48dp = 0x7f080028; - public static final int abc_ic_star_half_black_16dp = 0x7f080029; - public static final int abc_ic_star_half_black_36dp = 0x7f08002a; - public static final int abc_ic_star_half_black_48dp = 0x7f08002b; - public static final int abc_ic_voice_search_api_material = 0x7f08002c; - public static final int abc_item_background_holo_dark = 0x7f08002d; - public static final int abc_item_background_holo_light = 0x7f08002e; - public static final int abc_list_divider_material = 0x7f08002f; - public static final int abc_list_divider_mtrl_alpha = 0x7f080030; - public static final int abc_list_focused_holo = 0x7f080031; - public static final int abc_list_longpressed_holo = 0x7f080032; - public static final int abc_list_pressed_holo_dark = 0x7f080033; - public static final int abc_list_pressed_holo_light = 0x7f080034; - public static final int abc_list_selector_background_transition_holo_dark = 0x7f080035; - public static final int abc_list_selector_background_transition_holo_light = 0x7f080036; - public static final int abc_list_selector_disabled_holo_dark = 0x7f080037; - public static final int abc_list_selector_disabled_holo_light = 0x7f080038; - public static final int abc_list_selector_holo_dark = 0x7f080039; - public static final int abc_list_selector_holo_light = 0x7f08003a; - public static final int abc_menu_hardkey_panel_mtrl_mult = 0x7f08003b; - public static final int abc_popup_background_mtrl_mult = 0x7f08003c; - public static final int abc_ratingbar_indicator_material = 0x7f08003d; - public static final int abc_ratingbar_material = 0x7f08003e; - public static final int abc_ratingbar_small_material = 0x7f08003f; - public static final int abc_scrubber_control_off_mtrl_alpha = 0x7f080040; - public static final int abc_scrubber_control_to_pressed_mtrl_000 = 0x7f080041; - public static final int abc_scrubber_control_to_pressed_mtrl_005 = 0x7f080042; - public static final int abc_scrubber_primary_mtrl_alpha = 0x7f080043; - public static final int abc_scrubber_track_mtrl_alpha = 0x7f080044; - public static final int abc_seekbar_thumb_material = 0x7f080045; - public static final int abc_seekbar_tick_mark_material = 0x7f080046; - public static final int abc_seekbar_track_material = 0x7f080047; - public static final int abc_spinner_mtrl_am_alpha = 0x7f080048; - public static final int abc_spinner_textfield_background_material = 0x7f080049; - public static final int abc_switch_thumb_material = 0x7f08004a; - public static final int abc_switch_track_mtrl_alpha = 0x7f08004b; - public static final int abc_tab_indicator_material = 0x7f08004c; - public static final int abc_tab_indicator_mtrl_alpha = 0x7f08004d; - public static final int abc_text_cursor_material = 0x7f08004e; - public static final int abc_text_select_handle_left_mtrl_dark = 0x7f08004f; - public static final int abc_text_select_handle_left_mtrl_light = 0x7f080050; - public static final int abc_text_select_handle_middle_mtrl_dark = 0x7f080051; - public static final int abc_text_select_handle_middle_mtrl_light = 0x7f080052; - public static final int abc_text_select_handle_right_mtrl_dark = 0x7f080053; - public static final int abc_text_select_handle_right_mtrl_light = 0x7f080054; - public static final int abc_textfield_activated_mtrl_alpha = 0x7f080055; - public static final int abc_textfield_default_mtrl_alpha = 0x7f080056; - public static final int abc_textfield_search_activated_mtrl_alpha = 0x7f080057; - public static final int abc_textfield_search_default_mtrl_alpha = 0x7f080058; - public static final int abc_textfield_search_material = 0x7f080059; - public static final int abc_vector_test = 0x7f08005a; - public static final int notification_action_background = 0x7f08006b; - public static final int notification_bg = 0x7f08006c; - public static final int notification_bg_low = 0x7f08006d; - public static final int notification_bg_low_normal = 0x7f08006e; - public static final int notification_bg_low_pressed = 0x7f08006f; - public static final int notification_bg_normal = 0x7f080070; - public static final int notification_bg_normal_pressed = 0x7f080071; - public static final int notification_icon_background = 0x7f080072; - public static final int notification_template_icon_bg = 0x7f080073; - public static final int notification_template_icon_low_bg = 0x7f080074; - public static final int notification_tile_bg = 0x7f080075; - public static final int notify_panel_notification_icon_bg = 0x7f080076; - public static final int tooltip_frame_dark = 0x7f080077; - public static final int tooltip_frame_light = 0x7f080078; - } - public static final class id { - private id() {} - - public static final int action_bar = 0x7f090006; - public static final int action_bar_activity_content = 0x7f090007; - public static final int action_bar_container = 0x7f090008; - public static final int action_bar_root = 0x7f090009; - public static final int action_bar_spinner = 0x7f09000a; - public static final int action_bar_subtitle = 0x7f09000b; - public static final int action_bar_title = 0x7f09000c; - public static final int action_container = 0x7f09000d; - public static final int action_context_bar = 0x7f09000e; - public static final int action_divider = 0x7f09000f; - public static final int action_image = 0x7f090010; - public static final int action_menu_divider = 0x7f090011; - public static final int action_menu_presenter = 0x7f090012; - public static final int action_mode_bar = 0x7f090013; - public static final int action_mode_bar_stub = 0x7f090014; - public static final int action_mode_close_button = 0x7f090015; - public static final int action_text = 0x7f090017; - public static final int actions = 0x7f090018; - public static final int activity_chooser_view_content = 0x7f090019; - public static final int add = 0x7f09001a; - public static final int alertTitle = 0x7f09001b; - public static final int async = 0x7f09001e; - public static final int blocking = 0x7f090022; - public static final int bottom = 0x7f090023; - public static final int buttonPanel = 0x7f090025; - public static final int checkbox = 0x7f09002a; - public static final int chronometer = 0x7f09002b; - public static final int content = 0x7f090033; - public static final int contentPanel = 0x7f090034; - public static final int custom = 0x7f090036; - public static final int customPanel = 0x7f090037; - public static final int decor_content_parent = 0x7f090038; - public static final int default_activity_button = 0x7f090039; - public static final int edit_query = 0x7f090042; - public static final int end = 0x7f090043; - public static final int expand_activities_button = 0x7f090047; - public static final int expanded_menu = 0x7f090048; - public static final int forever = 0x7f09004f; - public static final int group_divider = 0x7f090052; - public static final int home = 0x7f090054; - public static final int icon = 0x7f090056; - public static final int icon_group = 0x7f090057; - public static final int image = 0x7f090059; - public static final int info = 0x7f09005a; - public static final int italic = 0x7f09005c; - public static final int left = 0x7f090061; - public static final int line1 = 0x7f090062; - public static final int line3 = 0x7f090063; - public static final int listMode = 0x7f090064; - public static final int list_item = 0x7f090065; - public static final int message = 0x7f090068; - public static final int multiply = 0x7f09006d; - public static final int none = 0x7f090070; - public static final int normal = 0x7f090071; - public static final int notification_background = 0x7f090073; - public static final int notification_main_column = 0x7f090074; - public static final int notification_main_column_container = 0x7f090075; - public static final int parentPanel = 0x7f09007a; - public static final int progress_circular = 0x7f09007e; - public static final int progress_horizontal = 0x7f09007f; - public static final int radio = 0x7f090080; - public static final int right = 0x7f090081; - public static final int right_icon = 0x7f090082; - public static final int right_side = 0x7f090083; - public static final int screen = 0x7f090087; - public static final int scrollIndicatorDown = 0x7f09008a; - public static final int scrollIndicatorUp = 0x7f09008b; - public static final int scrollView = 0x7f09008c; - public static final int search_badge = 0x7f09008e; - public static final int search_bar = 0x7f09008f; - public static final int search_button = 0x7f090090; - public static final int search_close_btn = 0x7f090091; - public static final int search_edit_frame = 0x7f090092; - public static final int search_go_btn = 0x7f090093; - public static final int search_mag_icon = 0x7f090094; - public static final int search_plate = 0x7f090095; - public static final int search_src_text = 0x7f090096; - public static final int search_voice_btn = 0x7f090097; - public static final int select_dialog_listview = 0x7f090098; - public static final int shortcut = 0x7f09009a; - public static final int spacer = 0x7f0900a4; - public static final int split_action_bar = 0x7f0900a5; - public static final int src_atop = 0x7f0900a8; - public static final int src_in = 0x7f0900a9; - public static final int src_over = 0x7f0900aa; - public static final int start = 0x7f0900ac; - public static final int submenuarrow = 0x7f0900ae; - public static final int submit_area = 0x7f0900af; - public static final int tabMode = 0x7f0900b0; - public static final int tag_transition_group = 0x7f0900b1; - public static final int tag_unhandled_key_event_manager = 0x7f0900b2; - public static final int tag_unhandled_key_listeners = 0x7f0900b3; - public static final int text = 0x7f0900b4; - public static final int text2 = 0x7f0900b5; - public static final int textSpacerNoButtons = 0x7f0900b6; - public static final int textSpacerNoTitle = 0x7f0900b7; - public static final int time = 0x7f0900bd; - public static final int title = 0x7f0900be; - public static final int titleDividerNoCustom = 0x7f0900bf; - public static final int title_template = 0x7f0900c0; - public static final int top = 0x7f0900c2; - public static final int topPanel = 0x7f0900c3; - public static final int uniform = 0x7f0900ca; - public static final int up = 0x7f0900cc; - public static final int wrap_content = 0x7f0900d2; - } - public static final class integer { - private integer() {} - - public static final int abc_config_activityDefaultDur = 0x7f0a0000; - public static final int abc_config_activityShortDur = 0x7f0a0001; - public static final int cancel_button_image_alpha = 0x7f0a0004; - public static final int config_tooltipAnimTime = 0x7f0a0005; - public static final int status_bar_notification_info_maxnum = 0x7f0a000e; - } - public static final class layout { - private layout() {} - - public static final int abc_action_bar_title_item = 0x7f0c0000; - public static final int abc_action_bar_up_container = 0x7f0c0001; - public static final int abc_action_menu_item_layout = 0x7f0c0002; - public static final int abc_action_menu_layout = 0x7f0c0003; - public static final int abc_action_mode_bar = 0x7f0c0004; - public static final int abc_action_mode_close_item_material = 0x7f0c0005; - public static final int abc_activity_chooser_view = 0x7f0c0006; - public static final int abc_activity_chooser_view_list_item = 0x7f0c0007; - public static final int abc_alert_dialog_button_bar_material = 0x7f0c0008; - public static final int abc_alert_dialog_material = 0x7f0c0009; - public static final int abc_alert_dialog_title_material = 0x7f0c000a; - public static final int abc_cascading_menu_item_layout = 0x7f0c000b; - public static final int abc_dialog_title_material = 0x7f0c000c; - public static final int abc_expanded_menu_layout = 0x7f0c000d; - public static final int abc_list_menu_item_checkbox = 0x7f0c000e; - public static final int abc_list_menu_item_icon = 0x7f0c000f; - public static final int abc_list_menu_item_layout = 0x7f0c0010; - public static final int abc_list_menu_item_radio = 0x7f0c0011; - public static final int abc_popup_menu_header_item_layout = 0x7f0c0012; - public static final int abc_popup_menu_item_layout = 0x7f0c0013; - public static final int abc_screen_content_include = 0x7f0c0014; - public static final int abc_screen_simple = 0x7f0c0015; - public static final int abc_screen_simple_overlay_action_mode = 0x7f0c0016; - public static final int abc_screen_toolbar = 0x7f0c0017; - public static final int abc_search_dropdown_item_icons_2line = 0x7f0c0018; - public static final int abc_search_view = 0x7f0c0019; - public static final int abc_select_dialog_material = 0x7f0c001a; - public static final int abc_tooltip = 0x7f0c001b; - public static final int notification_action = 0x7f0c0030; - public static final int notification_action_tombstone = 0x7f0c0031; - public static final int notification_template_custom_big = 0x7f0c0032; - public static final int notification_template_icon_group = 0x7f0c0033; - public static final int notification_template_part_chronometer = 0x7f0c0034; - public static final int notification_template_part_time = 0x7f0c0035; - public static final int select_dialog_item_material = 0x7f0c0036; - public static final int select_dialog_multichoice_material = 0x7f0c0037; - public static final int select_dialog_singlechoice_material = 0x7f0c0038; - public static final int support_simple_spinner_dropdown_item = 0x7f0c0039; - } - public static final class string { - private string() {} - - public static final int abc_action_bar_home_description = 0x7f0f0000; - public static final int abc_action_bar_up_description = 0x7f0f0001; - public static final int abc_action_menu_overflow_description = 0x7f0f0002; - public static final int abc_action_mode_done = 0x7f0f0003; - public static final int abc_activity_chooser_view_see_all = 0x7f0f0004; - public static final int abc_activitychooserview_choose_application = 0x7f0f0005; - public static final int abc_capital_off = 0x7f0f0006; - public static final int abc_capital_on = 0x7f0f0007; - public static final int abc_font_family_body_1_material = 0x7f0f0008; - public static final int abc_font_family_body_2_material = 0x7f0f0009; - public static final int abc_font_family_button_material = 0x7f0f000a; - public static final int abc_font_family_caption_material = 0x7f0f000b; - public static final int abc_font_family_display_1_material = 0x7f0f000c; - public static final int abc_font_family_display_2_material = 0x7f0f000d; - public static final int abc_font_family_display_3_material = 0x7f0f000e; - public static final int abc_font_family_display_4_material = 0x7f0f000f; - public static final int abc_font_family_headline_material = 0x7f0f0010; - public static final int abc_font_family_menu_material = 0x7f0f0011; - public static final int abc_font_family_subhead_material = 0x7f0f0012; - public static final int abc_font_family_title_material = 0x7f0f0013; - public static final int abc_menu_alt_shortcut_label = 0x7f0f0014; - public static final int abc_menu_ctrl_shortcut_label = 0x7f0f0015; - public static final int abc_menu_delete_shortcut_label = 0x7f0f0016; - public static final int abc_menu_enter_shortcut_label = 0x7f0f0017; - public static final int abc_menu_function_shortcut_label = 0x7f0f0018; - public static final int abc_menu_meta_shortcut_label = 0x7f0f0019; - public static final int abc_menu_shift_shortcut_label = 0x7f0f001a; - public static final int abc_menu_space_shortcut_label = 0x7f0f001b; - public static final int abc_menu_sym_shortcut_label = 0x7f0f001c; - public static final int abc_prepend_shortcut_label = 0x7f0f001d; - public static final int abc_search_hint = 0x7f0f001e; - public static final int abc_searchview_description_clear = 0x7f0f001f; - public static final int abc_searchview_description_query = 0x7f0f0020; - public static final int abc_searchview_description_search = 0x7f0f0021; - public static final int abc_searchview_description_submit = 0x7f0f0022; - public static final int abc_searchview_description_voice = 0x7f0f0023; - public static final int abc_shareactionprovider_share_with = 0x7f0f0024; - public static final int abc_shareactionprovider_share_with_application = 0x7f0f0025; - public static final int abc_toolbar_collapse_description = 0x7f0f0026; - public static final int search_menu_title = 0x7f0f0036; - public static final int status_bar_notification_info_overflow = 0x7f0f0037; - } - public static final class style { - private style() {} - - public static final int AlertDialog_AppCompat = 0x7f100000; - public static final int AlertDialog_AppCompat_Light = 0x7f100001; - public static final int Animation_AppCompat_Dialog = 0x7f100002; - public static final int Animation_AppCompat_DropDownUp = 0x7f100003; - public static final int Animation_AppCompat_Tooltip = 0x7f100004; - public static final int Base_AlertDialog_AppCompat = 0x7f10000a; - public static final int Base_AlertDialog_AppCompat_Light = 0x7f10000b; - public static final int Base_Animation_AppCompat_Dialog = 0x7f10000c; - public static final int Base_Animation_AppCompat_DropDownUp = 0x7f10000d; - public static final int Base_Animation_AppCompat_Tooltip = 0x7f10000e; - public static final int Base_DialogWindowTitleBackground_AppCompat = 0x7f100011; - public static final int Base_DialogWindowTitle_AppCompat = 0x7f100010; - public static final int Base_TextAppearance_AppCompat = 0x7f100012; - public static final int Base_TextAppearance_AppCompat_Body1 = 0x7f100013; - public static final int Base_TextAppearance_AppCompat_Body2 = 0x7f100014; - public static final int Base_TextAppearance_AppCompat_Button = 0x7f100015; - public static final int Base_TextAppearance_AppCompat_Caption = 0x7f100016; - public static final int Base_TextAppearance_AppCompat_Display1 = 0x7f100017; - public static final int Base_TextAppearance_AppCompat_Display2 = 0x7f100018; - public static final int Base_TextAppearance_AppCompat_Display3 = 0x7f100019; - public static final int Base_TextAppearance_AppCompat_Display4 = 0x7f10001a; - public static final int Base_TextAppearance_AppCompat_Headline = 0x7f10001b; - public static final int Base_TextAppearance_AppCompat_Inverse = 0x7f10001c; - public static final int Base_TextAppearance_AppCompat_Large = 0x7f10001d; - public static final int Base_TextAppearance_AppCompat_Large_Inverse = 0x7f10001e; - public static final int Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large = 0x7f10001f; - public static final int Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small = 0x7f100020; - public static final int Base_TextAppearance_AppCompat_Medium = 0x7f100021; - public static final int Base_TextAppearance_AppCompat_Medium_Inverse = 0x7f100022; - public static final int Base_TextAppearance_AppCompat_Menu = 0x7f100023; - public static final int Base_TextAppearance_AppCompat_SearchResult = 0x7f100024; - public static final int Base_TextAppearance_AppCompat_SearchResult_Subtitle = 0x7f100025; - public static final int Base_TextAppearance_AppCompat_SearchResult_Title = 0x7f100026; - public static final int Base_TextAppearance_AppCompat_Small = 0x7f100027; - public static final int Base_TextAppearance_AppCompat_Small_Inverse = 0x7f100028; - public static final int Base_TextAppearance_AppCompat_Subhead = 0x7f100029; - public static final int Base_TextAppearance_AppCompat_Subhead_Inverse = 0x7f10002a; - public static final int Base_TextAppearance_AppCompat_Title = 0x7f10002b; - public static final int Base_TextAppearance_AppCompat_Title_Inverse = 0x7f10002c; - public static final int Base_TextAppearance_AppCompat_Tooltip = 0x7f10002d; - public static final int Base_TextAppearance_AppCompat_Widget_ActionBar_Menu = 0x7f10002e; - public static final int Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle = 0x7f10002f; - public static final int Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse = 0x7f100030; - public static final int Base_TextAppearance_AppCompat_Widget_ActionBar_Title = 0x7f100031; - public static final int Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse = 0x7f100032; - public static final int Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle = 0x7f100033; - public static final int Base_TextAppearance_AppCompat_Widget_ActionMode_Title = 0x7f100034; - public static final int Base_TextAppearance_AppCompat_Widget_Button = 0x7f100035; - public static final int Base_TextAppearance_AppCompat_Widget_Button_Borderless_Colored = 0x7f100036; - public static final int Base_TextAppearance_AppCompat_Widget_Button_Colored = 0x7f100037; - public static final int Base_TextAppearance_AppCompat_Widget_Button_Inverse = 0x7f100038; - public static final int Base_TextAppearance_AppCompat_Widget_DropDownItem = 0x7f100039; - public static final int Base_TextAppearance_AppCompat_Widget_PopupMenu_Header = 0x7f10003a; - public static final int Base_TextAppearance_AppCompat_Widget_PopupMenu_Large = 0x7f10003b; - public static final int Base_TextAppearance_AppCompat_Widget_PopupMenu_Small = 0x7f10003c; - public static final int Base_TextAppearance_AppCompat_Widget_Switch = 0x7f10003d; - public static final int Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem = 0x7f10003e; - public static final int Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item = 0x7f10003f; - public static final int Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle = 0x7f100040; - public static final int Base_TextAppearance_Widget_AppCompat_Toolbar_Title = 0x7f100041; - public static final int Base_ThemeOverlay_AppCompat = 0x7f100061; - public static final int Base_ThemeOverlay_AppCompat_ActionBar = 0x7f100062; - public static final int Base_ThemeOverlay_AppCompat_Dark = 0x7f100063; - public static final int Base_ThemeOverlay_AppCompat_Dark_ActionBar = 0x7f100064; - public static final int Base_ThemeOverlay_AppCompat_Dialog = 0x7f100065; - public static final int Base_ThemeOverlay_AppCompat_Dialog_Alert = 0x7f100066; - public static final int Base_ThemeOverlay_AppCompat_Light = 0x7f100067; - public static final int Base_Theme_AppCompat = 0x7f100042; - public static final int Base_Theme_AppCompat_CompactMenu = 0x7f100043; - public static final int Base_Theme_AppCompat_Dialog = 0x7f100044; - public static final int Base_Theme_AppCompat_DialogWhenLarge = 0x7f100048; - public static final int Base_Theme_AppCompat_Dialog_Alert = 0x7f100045; - public static final int Base_Theme_AppCompat_Dialog_FixedSize = 0x7f100046; - public static final int Base_Theme_AppCompat_Dialog_MinWidth = 0x7f100047; - public static final int Base_Theme_AppCompat_Light = 0x7f100049; - public static final int Base_Theme_AppCompat_Light_DarkActionBar = 0x7f10004a; - public static final int Base_Theme_AppCompat_Light_Dialog = 0x7f10004b; - public static final int Base_Theme_AppCompat_Light_DialogWhenLarge = 0x7f10004f; - public static final int Base_Theme_AppCompat_Light_Dialog_Alert = 0x7f10004c; - public static final int Base_Theme_AppCompat_Light_Dialog_FixedSize = 0x7f10004d; - public static final int Base_Theme_AppCompat_Light_Dialog_MinWidth = 0x7f10004e; - public static final int Base_V21_ThemeOverlay_AppCompat_Dialog = 0x7f100077; - public static final int Base_V21_Theme_AppCompat = 0x7f100073; - public static final int Base_V21_Theme_AppCompat_Dialog = 0x7f100074; - public static final int Base_V21_Theme_AppCompat_Light = 0x7f100075; - public static final int Base_V21_Theme_AppCompat_Light_Dialog = 0x7f100076; - public static final int Base_V22_Theme_AppCompat = 0x7f100078; - public static final int Base_V22_Theme_AppCompat_Light = 0x7f100079; - public static final int Base_V23_Theme_AppCompat = 0x7f10007a; - public static final int Base_V23_Theme_AppCompat_Light = 0x7f10007b; - public static final int Base_V26_Theme_AppCompat = 0x7f10007c; - public static final int Base_V26_Theme_AppCompat_Light = 0x7f10007d; - public static final int Base_V26_Widget_AppCompat_Toolbar = 0x7f10007e; - public static final int Base_V28_Theme_AppCompat = 0x7f10007f; - public static final int Base_V28_Theme_AppCompat_Light = 0x7f100080; - public static final int Base_V7_ThemeOverlay_AppCompat_Dialog = 0x7f100085; - public static final int Base_V7_Theme_AppCompat = 0x7f100081; - public static final int Base_V7_Theme_AppCompat_Dialog = 0x7f100082; - public static final int Base_V7_Theme_AppCompat_Light = 0x7f100083; - public static final int Base_V7_Theme_AppCompat_Light_Dialog = 0x7f100084; - public static final int Base_V7_Widget_AppCompat_AutoCompleteTextView = 0x7f100086; - public static final int Base_V7_Widget_AppCompat_EditText = 0x7f100087; - public static final int Base_V7_Widget_AppCompat_Toolbar = 0x7f100088; - public static final int Base_Widget_AppCompat_ActionBar = 0x7f100089; - public static final int Base_Widget_AppCompat_ActionBar_Solid = 0x7f10008a; - public static final int Base_Widget_AppCompat_ActionBar_TabBar = 0x7f10008b; - public static final int Base_Widget_AppCompat_ActionBar_TabText = 0x7f10008c; - public static final int Base_Widget_AppCompat_ActionBar_TabView = 0x7f10008d; - public static final int Base_Widget_AppCompat_ActionButton = 0x7f10008e; - public static final int Base_Widget_AppCompat_ActionButton_CloseMode = 0x7f10008f; - public static final int Base_Widget_AppCompat_ActionButton_Overflow = 0x7f100090; - public static final int Base_Widget_AppCompat_ActionMode = 0x7f100091; - public static final int Base_Widget_AppCompat_ActivityChooserView = 0x7f100092; - public static final int Base_Widget_AppCompat_AutoCompleteTextView = 0x7f100093; - public static final int Base_Widget_AppCompat_Button = 0x7f100094; - public static final int Base_Widget_AppCompat_ButtonBar = 0x7f10009a; - public static final int Base_Widget_AppCompat_ButtonBar_AlertDialog = 0x7f10009b; - public static final int Base_Widget_AppCompat_Button_Borderless = 0x7f100095; - public static final int Base_Widget_AppCompat_Button_Borderless_Colored = 0x7f100096; - public static final int Base_Widget_AppCompat_Button_ButtonBar_AlertDialog = 0x7f100097; - public static final int Base_Widget_AppCompat_Button_Colored = 0x7f100098; - public static final int Base_Widget_AppCompat_Button_Small = 0x7f100099; - public static final int Base_Widget_AppCompat_CompoundButton_CheckBox = 0x7f10009c; - public static final int Base_Widget_AppCompat_CompoundButton_RadioButton = 0x7f10009d; - public static final int Base_Widget_AppCompat_CompoundButton_Switch = 0x7f10009e; - public static final int Base_Widget_AppCompat_DrawerArrowToggle = 0x7f10009f; - public static final int Base_Widget_AppCompat_DrawerArrowToggle_Common = 0x7f1000a0; - public static final int Base_Widget_AppCompat_DropDownItem_Spinner = 0x7f1000a1; - public static final int Base_Widget_AppCompat_EditText = 0x7f1000a2; - public static final int Base_Widget_AppCompat_ImageButton = 0x7f1000a3; - public static final int Base_Widget_AppCompat_Light_ActionBar = 0x7f1000a4; - public static final int Base_Widget_AppCompat_Light_ActionBar_Solid = 0x7f1000a5; - public static final int Base_Widget_AppCompat_Light_ActionBar_TabBar = 0x7f1000a6; - public static final int Base_Widget_AppCompat_Light_ActionBar_TabText = 0x7f1000a7; - public static final int Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse = 0x7f1000a8; - public static final int Base_Widget_AppCompat_Light_ActionBar_TabView = 0x7f1000a9; - public static final int Base_Widget_AppCompat_Light_PopupMenu = 0x7f1000aa; - public static final int Base_Widget_AppCompat_Light_PopupMenu_Overflow = 0x7f1000ab; - public static final int Base_Widget_AppCompat_ListMenuView = 0x7f1000ac; - public static final int Base_Widget_AppCompat_ListPopupWindow = 0x7f1000ad; - public static final int Base_Widget_AppCompat_ListView = 0x7f1000ae; - public static final int Base_Widget_AppCompat_ListView_DropDown = 0x7f1000af; - public static final int Base_Widget_AppCompat_ListView_Menu = 0x7f1000b0; - public static final int Base_Widget_AppCompat_PopupMenu = 0x7f1000b1; - public static final int Base_Widget_AppCompat_PopupMenu_Overflow = 0x7f1000b2; - public static final int Base_Widget_AppCompat_PopupWindow = 0x7f1000b3; - public static final int Base_Widget_AppCompat_ProgressBar = 0x7f1000b4; - public static final int Base_Widget_AppCompat_ProgressBar_Horizontal = 0x7f1000b5; - public static final int Base_Widget_AppCompat_RatingBar = 0x7f1000b6; - public static final int Base_Widget_AppCompat_RatingBar_Indicator = 0x7f1000b7; - public static final int Base_Widget_AppCompat_RatingBar_Small = 0x7f1000b8; - public static final int Base_Widget_AppCompat_SearchView = 0x7f1000b9; - public static final int Base_Widget_AppCompat_SearchView_ActionBar = 0x7f1000ba; - public static final int Base_Widget_AppCompat_SeekBar = 0x7f1000bb; - public static final int Base_Widget_AppCompat_SeekBar_Discrete = 0x7f1000bc; - public static final int Base_Widget_AppCompat_Spinner = 0x7f1000bd; - public static final int Base_Widget_AppCompat_Spinner_Underlined = 0x7f1000be; - public static final int Base_Widget_AppCompat_TextView_SpinnerItem = 0x7f1000bf; - public static final int Base_Widget_AppCompat_Toolbar = 0x7f1000c0; - public static final int Base_Widget_AppCompat_Toolbar_Button_Navigation = 0x7f1000c1; - public static final int Platform_AppCompat = 0x7f1000cc; - public static final int Platform_AppCompat_Light = 0x7f1000cd; - public static final int Platform_ThemeOverlay_AppCompat = 0x7f1000d2; - public static final int Platform_ThemeOverlay_AppCompat_Dark = 0x7f1000d3; - public static final int Platform_ThemeOverlay_AppCompat_Light = 0x7f1000d4; - public static final int Platform_V21_AppCompat = 0x7f1000d5; - public static final int Platform_V21_AppCompat_Light = 0x7f1000d6; - public static final int Platform_V25_AppCompat = 0x7f1000d7; - public static final int Platform_V25_AppCompat_Light = 0x7f1000d8; - public static final int Platform_Widget_AppCompat_Spinner = 0x7f1000d9; - public static final int RtlOverlay_DialogWindowTitle_AppCompat = 0x7f1000da; - public static final int RtlOverlay_Widget_AppCompat_ActionBar_TitleItem = 0x7f1000db; - public static final int RtlOverlay_Widget_AppCompat_DialogTitle_Icon = 0x7f1000dc; - public static final int RtlOverlay_Widget_AppCompat_PopupMenuItem = 0x7f1000dd; - public static final int RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup = 0x7f1000de; - public static final int RtlOverlay_Widget_AppCompat_PopupMenuItem_Shortcut = 0x7f1000df; - public static final int RtlOverlay_Widget_AppCompat_PopupMenuItem_SubmenuArrow = 0x7f1000e0; - public static final int RtlOverlay_Widget_AppCompat_PopupMenuItem_Text = 0x7f1000e1; - public static final int RtlOverlay_Widget_AppCompat_PopupMenuItem_Title = 0x7f1000e2; - public static final int RtlOverlay_Widget_AppCompat_SearchView_MagIcon = 0x7f1000e8; - public static final int RtlOverlay_Widget_AppCompat_Search_DropDown = 0x7f1000e3; - public static final int RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1 = 0x7f1000e4; - public static final int RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2 = 0x7f1000e5; - public static final int RtlOverlay_Widget_AppCompat_Search_DropDown_Query = 0x7f1000e6; - public static final int RtlOverlay_Widget_AppCompat_Search_DropDown_Text = 0x7f1000e7; - public static final int RtlUnderlay_Widget_AppCompat_ActionButton = 0x7f1000e9; - public static final int RtlUnderlay_Widget_AppCompat_ActionButton_Overflow = 0x7f1000ea; - public static final int TextAppearance_AppCompat = 0x7f1000ec; - public static final int TextAppearance_AppCompat_Body1 = 0x7f1000ed; - public static final int TextAppearance_AppCompat_Body2 = 0x7f1000ee; - public static final int TextAppearance_AppCompat_Button = 0x7f1000ef; - public static final int TextAppearance_AppCompat_Caption = 0x7f1000f0; - public static final int TextAppearance_AppCompat_Display1 = 0x7f1000f1; - public static final int TextAppearance_AppCompat_Display2 = 0x7f1000f2; - public static final int TextAppearance_AppCompat_Display3 = 0x7f1000f3; - public static final int TextAppearance_AppCompat_Display4 = 0x7f1000f4; - public static final int TextAppearance_AppCompat_Headline = 0x7f1000f5; - public static final int TextAppearance_AppCompat_Inverse = 0x7f1000f6; - public static final int TextAppearance_AppCompat_Large = 0x7f1000f7; - public static final int TextAppearance_AppCompat_Large_Inverse = 0x7f1000f8; - public static final int TextAppearance_AppCompat_Light_SearchResult_Subtitle = 0x7f1000f9; - public static final int TextAppearance_AppCompat_Light_SearchResult_Title = 0x7f1000fa; - public static final int TextAppearance_AppCompat_Light_Widget_PopupMenu_Large = 0x7f1000fb; - public static final int TextAppearance_AppCompat_Light_Widget_PopupMenu_Small = 0x7f1000fc; - public static final int TextAppearance_AppCompat_Medium = 0x7f1000fd; - public static final int TextAppearance_AppCompat_Medium_Inverse = 0x7f1000fe; - public static final int TextAppearance_AppCompat_Menu = 0x7f1000ff; - public static final int TextAppearance_AppCompat_SearchResult_Subtitle = 0x7f100100; - public static final int TextAppearance_AppCompat_SearchResult_Title = 0x7f100101; - public static final int TextAppearance_AppCompat_Small = 0x7f100102; - public static final int TextAppearance_AppCompat_Small_Inverse = 0x7f100103; - public static final int TextAppearance_AppCompat_Subhead = 0x7f100104; - public static final int TextAppearance_AppCompat_Subhead_Inverse = 0x7f100105; - public static final int TextAppearance_AppCompat_Title = 0x7f100106; - public static final int TextAppearance_AppCompat_Title_Inverse = 0x7f100107; - public static final int TextAppearance_AppCompat_Tooltip = 0x7f100108; - public static final int TextAppearance_AppCompat_Widget_ActionBar_Menu = 0x7f100109; - public static final int TextAppearance_AppCompat_Widget_ActionBar_Subtitle = 0x7f10010a; - public static final int TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse = 0x7f10010b; - public static final int TextAppearance_AppCompat_Widget_ActionBar_Title = 0x7f10010c; - public static final int TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse = 0x7f10010d; - public static final int TextAppearance_AppCompat_Widget_ActionMode_Subtitle = 0x7f10010e; - public static final int TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse = 0x7f10010f; - public static final int TextAppearance_AppCompat_Widget_ActionMode_Title = 0x7f100110; - public static final int TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse = 0x7f100111; - public static final int TextAppearance_AppCompat_Widget_Button = 0x7f100112; - public static final int TextAppearance_AppCompat_Widget_Button_Borderless_Colored = 0x7f100113; - public static final int TextAppearance_AppCompat_Widget_Button_Colored = 0x7f100114; - public static final int TextAppearance_AppCompat_Widget_Button_Inverse = 0x7f100115; - public static final int TextAppearance_AppCompat_Widget_DropDownItem = 0x7f100116; - public static final int TextAppearance_AppCompat_Widget_PopupMenu_Header = 0x7f100117; - public static final int TextAppearance_AppCompat_Widget_PopupMenu_Large = 0x7f100118; - public static final int TextAppearance_AppCompat_Widget_PopupMenu_Small = 0x7f100119; - public static final int TextAppearance_AppCompat_Widget_Switch = 0x7f10011a; - public static final int TextAppearance_AppCompat_Widget_TextView_SpinnerItem = 0x7f10011b; - public static final int TextAppearance_Compat_Notification = 0x7f10011c; - public static final int TextAppearance_Compat_Notification_Info = 0x7f10011d; - public static final int TextAppearance_Compat_Notification_Line2 = 0x7f10011e; - public static final int TextAppearance_Compat_Notification_Time = 0x7f10011f; - public static final int TextAppearance_Compat_Notification_Title = 0x7f100120; - public static final int TextAppearance_Widget_AppCompat_ExpandedMenu_Item = 0x7f100138; - public static final int TextAppearance_Widget_AppCompat_Toolbar_Subtitle = 0x7f100139; - public static final int TextAppearance_Widget_AppCompat_Toolbar_Title = 0x7f10013a; - public static final int ThemeOverlay_AppCompat = 0x7f10016b; - public static final int ThemeOverlay_AppCompat_ActionBar = 0x7f10016c; - public static final int ThemeOverlay_AppCompat_Dark = 0x7f10016d; - public static final int ThemeOverlay_AppCompat_Dark_ActionBar = 0x7f10016e; - public static final int ThemeOverlay_AppCompat_Dialog = 0x7f10016f; - public static final int ThemeOverlay_AppCompat_Dialog_Alert = 0x7f100170; - public static final int ThemeOverlay_AppCompat_Light = 0x7f100171; - public static final int Theme_AppCompat = 0x7f10013b; - public static final int Theme_AppCompat_CompactMenu = 0x7f10013c; - public static final int Theme_AppCompat_DayNight = 0x7f10013d; - public static final int Theme_AppCompat_DayNight_DarkActionBar = 0x7f10013e; - public static final int Theme_AppCompat_DayNight_Dialog = 0x7f10013f; - public static final int Theme_AppCompat_DayNight_DialogWhenLarge = 0x7f100142; - public static final int Theme_AppCompat_DayNight_Dialog_Alert = 0x7f100140; - public static final int Theme_AppCompat_DayNight_Dialog_MinWidth = 0x7f100141; - public static final int Theme_AppCompat_DayNight_NoActionBar = 0x7f100143; - public static final int Theme_AppCompat_Dialog = 0x7f100144; - public static final int Theme_AppCompat_DialogWhenLarge = 0x7f100147; - public static final int Theme_AppCompat_Dialog_Alert = 0x7f100145; - public static final int Theme_AppCompat_Dialog_MinWidth = 0x7f100146; - public static final int Theme_AppCompat_Light = 0x7f100148; - public static final int Theme_AppCompat_Light_DarkActionBar = 0x7f100149; - public static final int Theme_AppCompat_Light_Dialog = 0x7f10014a; - public static final int Theme_AppCompat_Light_DialogWhenLarge = 0x7f10014d; - public static final int Theme_AppCompat_Light_Dialog_Alert = 0x7f10014b; - public static final int Theme_AppCompat_Light_Dialog_MinWidth = 0x7f10014c; - public static final int Theme_AppCompat_Light_NoActionBar = 0x7f10014e; - public static final int Theme_AppCompat_NoActionBar = 0x7f10014f; - public static final int Widget_AppCompat_ActionBar = 0x7f10017e; - public static final int Widget_AppCompat_ActionBar_Solid = 0x7f10017f; - public static final int Widget_AppCompat_ActionBar_TabBar = 0x7f100180; - public static final int Widget_AppCompat_ActionBar_TabText = 0x7f100181; - public static final int Widget_AppCompat_ActionBar_TabView = 0x7f100182; - public static final int Widget_AppCompat_ActionButton = 0x7f100183; - public static final int Widget_AppCompat_ActionButton_CloseMode = 0x7f100184; - public static final int Widget_AppCompat_ActionButton_Overflow = 0x7f100185; - public static final int Widget_AppCompat_ActionMode = 0x7f100186; - public static final int Widget_AppCompat_ActivityChooserView = 0x7f100187; - public static final int Widget_AppCompat_AutoCompleteTextView = 0x7f100188; - public static final int Widget_AppCompat_Button = 0x7f100189; - public static final int Widget_AppCompat_ButtonBar = 0x7f10018f; - public static final int Widget_AppCompat_ButtonBar_AlertDialog = 0x7f100190; - public static final int Widget_AppCompat_Button_Borderless = 0x7f10018a; - public static final int Widget_AppCompat_Button_Borderless_Colored = 0x7f10018b; - public static final int Widget_AppCompat_Button_ButtonBar_AlertDialog = 0x7f10018c; - public static final int Widget_AppCompat_Button_Colored = 0x7f10018d; - public static final int Widget_AppCompat_Button_Small = 0x7f10018e; - public static final int Widget_AppCompat_CompoundButton_CheckBox = 0x7f100191; - public static final int Widget_AppCompat_CompoundButton_RadioButton = 0x7f100192; - public static final int Widget_AppCompat_CompoundButton_Switch = 0x7f100193; - public static final int Widget_AppCompat_DrawerArrowToggle = 0x7f100194; - public static final int Widget_AppCompat_DropDownItem_Spinner = 0x7f100195; - public static final int Widget_AppCompat_EditText = 0x7f100196; - public static final int Widget_AppCompat_ImageButton = 0x7f100197; - public static final int Widget_AppCompat_Light_ActionBar = 0x7f100198; - public static final int Widget_AppCompat_Light_ActionBar_Solid = 0x7f100199; - public static final int Widget_AppCompat_Light_ActionBar_Solid_Inverse = 0x7f10019a; - public static final int Widget_AppCompat_Light_ActionBar_TabBar = 0x7f10019b; - public static final int Widget_AppCompat_Light_ActionBar_TabBar_Inverse = 0x7f10019c; - public static final int Widget_AppCompat_Light_ActionBar_TabText = 0x7f10019d; - public static final int Widget_AppCompat_Light_ActionBar_TabText_Inverse = 0x7f10019e; - public static final int Widget_AppCompat_Light_ActionBar_TabView = 0x7f10019f; - public static final int Widget_AppCompat_Light_ActionBar_TabView_Inverse = 0x7f1001a0; - public static final int Widget_AppCompat_Light_ActionButton = 0x7f1001a1; - public static final int Widget_AppCompat_Light_ActionButton_CloseMode = 0x7f1001a2; - public static final int Widget_AppCompat_Light_ActionButton_Overflow = 0x7f1001a3; - public static final int Widget_AppCompat_Light_ActionMode_Inverse = 0x7f1001a4; - public static final int Widget_AppCompat_Light_ActivityChooserView = 0x7f1001a5; - public static final int Widget_AppCompat_Light_AutoCompleteTextView = 0x7f1001a6; - public static final int Widget_AppCompat_Light_DropDownItem_Spinner = 0x7f1001a7; - public static final int Widget_AppCompat_Light_ListPopupWindow = 0x7f1001a8; - public static final int Widget_AppCompat_Light_ListView_DropDown = 0x7f1001a9; - public static final int Widget_AppCompat_Light_PopupMenu = 0x7f1001aa; - public static final int Widget_AppCompat_Light_PopupMenu_Overflow = 0x7f1001ab; - public static final int Widget_AppCompat_Light_SearchView = 0x7f1001ac; - public static final int Widget_AppCompat_Light_Spinner_DropDown_ActionBar = 0x7f1001ad; - public static final int Widget_AppCompat_ListMenuView = 0x7f1001ae; - public static final int Widget_AppCompat_ListPopupWindow = 0x7f1001af; - public static final int Widget_AppCompat_ListView = 0x7f1001b0; - public static final int Widget_AppCompat_ListView_DropDown = 0x7f1001b1; - public static final int Widget_AppCompat_ListView_Menu = 0x7f1001b2; - public static final int Widget_AppCompat_PopupMenu = 0x7f1001b3; - public static final int Widget_AppCompat_PopupMenu_Overflow = 0x7f1001b4; - public static final int Widget_AppCompat_PopupWindow = 0x7f1001b5; - public static final int Widget_AppCompat_ProgressBar = 0x7f1001b6; - public static final int Widget_AppCompat_ProgressBar_Horizontal = 0x7f1001b7; - public static final int Widget_AppCompat_RatingBar = 0x7f1001b8; - public static final int Widget_AppCompat_RatingBar_Indicator = 0x7f1001b9; - public static final int Widget_AppCompat_RatingBar_Small = 0x7f1001ba; - public static final int Widget_AppCompat_SearchView = 0x7f1001bb; - public static final int Widget_AppCompat_SearchView_ActionBar = 0x7f1001bc; - public static final int Widget_AppCompat_SeekBar = 0x7f1001bd; - public static final int Widget_AppCompat_SeekBar_Discrete = 0x7f1001be; - public static final int Widget_AppCompat_Spinner = 0x7f1001bf; - public static final int Widget_AppCompat_Spinner_DropDown = 0x7f1001c0; - public static final int Widget_AppCompat_Spinner_DropDown_ActionBar = 0x7f1001c1; - public static final int Widget_AppCompat_Spinner_Underlined = 0x7f1001c2; - public static final int Widget_AppCompat_TextView_SpinnerItem = 0x7f1001c3; - public static final int Widget_AppCompat_Toolbar = 0x7f1001c4; - public static final int Widget_AppCompat_Toolbar_Button_Navigation = 0x7f1001c5; - public static final int Widget_Compat_NotificationActionContainer = 0x7f1001c6; - public static final int Widget_Compat_NotificationActionText = 0x7f1001c7; - public static final int Widget_Support_CoordinatorLayout = 0x7f1001f6; - } - public static final class styleable { - private styleable() {} - - public static final int[] ActionBar = { 0x7f040031, 0x7f040032, 0x7f040033, 0x7f040097, 0x7f040098, 0x7f040099, 0x7f04009a, 0x7f04009b, 0x7f04009c, 0x7f0400aa, 0x7f0400af, 0x7f0400b0, 0x7f0400bb, 0x7f0400e6, 0x7f0400eb, 0x7f0400f0, 0x7f0400f1, 0x7f0400f3, 0x7f0400fd, 0x7f040107, 0x7f04015c, 0x7f040168, 0x7f040179, 0x7f04017d, 0x7f04017e, 0x7f0401ac, 0x7f0401af, 0x7f0401f4, 0x7f0401fe }; - public static final int ActionBar_background = 0; - public static final int ActionBar_backgroundSplit = 1; - public static final int ActionBar_backgroundStacked = 2; - public static final int ActionBar_contentInsetEnd = 3; - public static final int ActionBar_contentInsetEndWithActions = 4; - public static final int ActionBar_contentInsetLeft = 5; - public static final int ActionBar_contentInsetRight = 6; - public static final int ActionBar_contentInsetStart = 7; - public static final int ActionBar_contentInsetStartWithNavigation = 8; - public static final int ActionBar_customNavigationLayout = 9; - public static final int ActionBar_displayOptions = 10; - public static final int ActionBar_divider = 11; - public static final int ActionBar_elevation = 12; - public static final int ActionBar_height = 13; - public static final int ActionBar_hideOnContentScroll = 14; - public static final int ActionBar_homeAsUpIndicator = 15; - public static final int ActionBar_homeLayout = 16; - public static final int ActionBar_icon = 17; - public static final int ActionBar_indeterminateProgressStyle = 18; - public static final int ActionBar_itemPadding = 19; - public static final int ActionBar_logo = 20; - public static final int ActionBar_navigationMode = 21; - public static final int ActionBar_popupTheme = 22; - public static final int ActionBar_progressBarPadding = 23; - public static final int ActionBar_progressBarStyle = 24; - public static final int ActionBar_subtitle = 25; - public static final int ActionBar_subtitleTextStyle = 26; - public static final int ActionBar_title = 27; - public static final int ActionBar_titleTextStyle = 28; - public static final int[] ActionBarLayout = { 0x10100b3 }; - public static final int ActionBarLayout_android_layout_gravity = 0; - public static final int[] ActionMenuItemView = { 0x101013f }; - public static final int ActionMenuItemView_android_minWidth = 0; - public static final int[] ActionMenuView = { }; - public static final int[] ActionMode = { 0x7f040031, 0x7f040032, 0x7f040081, 0x7f0400e6, 0x7f0401af, 0x7f0401fe }; - public static final int ActionMode_background = 0; - public static final int ActionMode_backgroundSplit = 1; - public static final int ActionMode_closeItemLayout = 2; - public static final int ActionMode_height = 3; - public static final int ActionMode_subtitleTextStyle = 4; - public static final int ActionMode_titleTextStyle = 5; - public static final int[] ActivityChooserView = { 0x7f0400c1, 0x7f0400fe }; - public static final int ActivityChooserView_expandActivityOverflowButtonDrawable = 0; - public static final int ActivityChooserView_initialActivityCount = 1; - public static final int[] AlertDialog = { 0x10100f2, 0x7f040054, 0x7f040055, 0x7f040153, 0x7f040154, 0x7f040165, 0x7f040194, 0x7f040195 }; - public static final int AlertDialog_android_layout = 0; - public static final int AlertDialog_buttonIconDimen = 1; - public static final int AlertDialog_buttonPanelSideLayout = 2; - public static final int AlertDialog_listItemLayout = 3; - public static final int AlertDialog_listLayout = 4; - public static final int AlertDialog_multiChoiceItemLayout = 5; - public static final int AlertDialog_showTitle = 6; - public static final int AlertDialog_singleChoiceItemLayout = 7; - public static final int[] AnimatedStateListDrawableCompat = { 0x101011c, 0x1010194, 0x1010195, 0x1010196, 0x101030c, 0x101030d }; - public static final int AnimatedStateListDrawableCompat_android_dither = 0; - public static final int AnimatedStateListDrawableCompat_android_visible = 1; - public static final int AnimatedStateListDrawableCompat_android_variablePadding = 2; - public static final int AnimatedStateListDrawableCompat_android_constantSize = 3; - public static final int AnimatedStateListDrawableCompat_android_enterFadeDuration = 4; - public static final int AnimatedStateListDrawableCompat_android_exitFadeDuration = 5; - public static final int[] AnimatedStateListDrawableItem = { 0x10100d0, 0x1010199 }; - public static final int AnimatedStateListDrawableItem_android_id = 0; - public static final int AnimatedStateListDrawableItem_android_drawable = 1; - public static final int[] AnimatedStateListDrawableTransition = { 0x1010199, 0x1010449, 0x101044a, 0x101044b }; - public static final int AnimatedStateListDrawableTransition_android_drawable = 0; - public static final int AnimatedStateListDrawableTransition_android_toId = 1; - public static final int AnimatedStateListDrawableTransition_android_fromId = 2; - public static final int AnimatedStateListDrawableTransition_android_reversible = 3; - public static final int[] AppCompatImageView = { 0x1010119, 0x7f04019f, 0x7f0401f2, 0x7f0401f3 }; - public static final int AppCompatImageView_android_src = 0; - public static final int AppCompatImageView_srcCompat = 1; - public static final int AppCompatImageView_tint = 2; - public static final int AppCompatImageView_tintMode = 3; - public static final int[] AppCompatSeekBar = { 0x1010142, 0x7f0401ef, 0x7f0401f0, 0x7f0401f1 }; - public static final int AppCompatSeekBar_android_thumb = 0; - public static final int AppCompatSeekBar_tickMark = 1; - public static final int AppCompatSeekBar_tickMarkTint = 2; - public static final int AppCompatSeekBar_tickMarkTintMode = 3; - public static final int[] AppCompatTextHelper = { 0x1010034, 0x101016d, 0x101016e, 0x101016f, 0x1010170, 0x1010392, 0x1010393 }; - public static final int AppCompatTextHelper_android_textAppearance = 0; - public static final int AppCompatTextHelper_android_drawableTop = 1; - public static final int AppCompatTextHelper_android_drawableBottom = 2; - public static final int AppCompatTextHelper_android_drawableLeft = 3; - public static final int AppCompatTextHelper_android_drawableRight = 4; - public static final int AppCompatTextHelper_android_drawableStart = 5; - public static final int AppCompatTextHelper_android_drawableEnd = 6; - public static final int[] AppCompatTextView = { 0x1010034, 0x7f04002c, 0x7f04002d, 0x7f04002e, 0x7f04002f, 0x7f040030, 0x7f0400d5, 0x7f0400d8, 0x7f04010f, 0x7f04014f, 0x7f0401cf }; - public static final int AppCompatTextView_android_textAppearance = 0; - public static final int AppCompatTextView_autoSizeMaxTextSize = 1; - public static final int AppCompatTextView_autoSizeMinTextSize = 2; - public static final int AppCompatTextView_autoSizePresetSizes = 3; - public static final int AppCompatTextView_autoSizeStepGranularity = 4; - public static final int AppCompatTextView_autoSizeTextType = 5; - public static final int AppCompatTextView_firstBaselineToTopHeight = 6; - public static final int AppCompatTextView_fontFamily = 7; - public static final int AppCompatTextView_lastBaselineToBottomHeight = 8; - public static final int AppCompatTextView_lineHeight = 9; - public static final int AppCompatTextView_textAllCaps = 10; - public static final int[] AppCompatTheme = { 0x1010057, 0x10100ae, 0x7f040000, 0x7f040001, 0x7f040002, 0x7f040003, 0x7f040004, 0x7f040005, 0x7f040006, 0x7f040007, 0x7f040008, 0x7f040009, 0x7f04000a, 0x7f04000b, 0x7f04000c, 0x7f04000e, 0x7f04000f, 0x7f040010, 0x7f040011, 0x7f040012, 0x7f040013, 0x7f040014, 0x7f040015, 0x7f040016, 0x7f040017, 0x7f040018, 0x7f040019, 0x7f04001a, 0x7f04001b, 0x7f04001c, 0x7f04001d, 0x7f04001e, 0x7f040021, 0x7f040022, 0x7f040023, 0x7f040024, 0x7f040025, 0x7f04002b, 0x7f040040, 0x7f04004e, 0x7f04004f, 0x7f040050, 0x7f040051, 0x7f040052, 0x7f040056, 0x7f040057, 0x7f040062, 0x7f040067, 0x7f040087, 0x7f040088, 0x7f040089, 0x7f04008a, 0x7f04008b, 0x7f04008c, 0x7f04008d, 0x7f04008e, 0x7f04008f, 0x7f040091, 0x7f0400a3, 0x7f0400ac, 0x7f0400ad, 0x7f0400ae, 0x7f0400b1, 0x7f0400b3, 0x7f0400b6, 0x7f0400b7, 0x7f0400b8, 0x7f0400b9, 0x7f0400ba, 0x7f0400f0, 0x7f0400fc, 0x7f040151, 0x7f040152, 0x7f040155, 0x7f040156, 0x7f040157, 0x7f040158, 0x7f040159, 0x7f04015a, 0x7f04015b, 0x7f040170, 0x7f040171, 0x7f040172, 0x7f040178, 0x7f04017a, 0x7f040181, 0x7f040182, 0x7f040183, 0x7f040184, 0x7f04018c, 0x7f04018d, 0x7f04018e, 0x7f04018f, 0x7f04019c, 0x7f04019d, 0x7f0401b3, 0x7f0401da, 0x7f0401db, 0x7f0401dc, 0x7f0401dd, 0x7f0401df, 0x7f0401e0, 0x7f0401e1, 0x7f0401e2, 0x7f0401e5, 0x7f0401e6, 0x7f040200, 0x7f040201, 0x7f040202, 0x7f040203, 0x7f04020a, 0x7f04020c, 0x7f04020d, 0x7f04020e, 0x7f04020f, 0x7f040210, 0x7f040211, 0x7f040212, 0x7f040213, 0x7f040214, 0x7f040215 }; - public static final int AppCompatTheme_android_windowIsFloating = 0; - public static final int AppCompatTheme_android_windowAnimationStyle = 1; - public static final int AppCompatTheme_actionBarDivider = 2; - public static final int AppCompatTheme_actionBarItemBackground = 3; - public static final int AppCompatTheme_actionBarPopupTheme = 4; - public static final int AppCompatTheme_actionBarSize = 5; - public static final int AppCompatTheme_actionBarSplitStyle = 6; - public static final int AppCompatTheme_actionBarStyle = 7; - public static final int AppCompatTheme_actionBarTabBarStyle = 8; - public static final int AppCompatTheme_actionBarTabStyle = 9; - public static final int AppCompatTheme_actionBarTabTextStyle = 10; - public static final int AppCompatTheme_actionBarTheme = 11; - public static final int AppCompatTheme_actionBarWidgetTheme = 12; - public static final int AppCompatTheme_actionButtonStyle = 13; - public static final int AppCompatTheme_actionDropDownStyle = 14; - public static final int AppCompatTheme_actionMenuTextAppearance = 15; - public static final int AppCompatTheme_actionMenuTextColor = 16; - public static final int AppCompatTheme_actionModeBackground = 17; - public static final int AppCompatTheme_actionModeCloseButtonStyle = 18; - public static final int AppCompatTheme_actionModeCloseDrawable = 19; - public static final int AppCompatTheme_actionModeCopyDrawable = 20; - public static final int AppCompatTheme_actionModeCutDrawable = 21; - public static final int AppCompatTheme_actionModeFindDrawable = 22; - public static final int AppCompatTheme_actionModePasteDrawable = 23; - public static final int AppCompatTheme_actionModePopupWindowStyle = 24; - public static final int AppCompatTheme_actionModeSelectAllDrawable = 25; - public static final int AppCompatTheme_actionModeShareDrawable = 26; - public static final int AppCompatTheme_actionModeSplitBackground = 27; - public static final int AppCompatTheme_actionModeStyle = 28; - public static final int AppCompatTheme_actionModeWebSearchDrawable = 29; - public static final int AppCompatTheme_actionOverflowButtonStyle = 30; - public static final int AppCompatTheme_actionOverflowMenuStyle = 31; - public static final int AppCompatTheme_activityChooserViewStyle = 32; - public static final int AppCompatTheme_alertDialogButtonGroupStyle = 33; - public static final int AppCompatTheme_alertDialogCenterButtons = 34; - public static final int AppCompatTheme_alertDialogStyle = 35; - public static final int AppCompatTheme_alertDialogTheme = 36; - public static final int AppCompatTheme_autoCompleteTextViewStyle = 37; - public static final int AppCompatTheme_borderlessButtonStyle = 38; - public static final int AppCompatTheme_buttonBarButtonStyle = 39; - public static final int AppCompatTheme_buttonBarNegativeButtonStyle = 40; - public static final int AppCompatTheme_buttonBarNeutralButtonStyle = 41; - public static final int AppCompatTheme_buttonBarPositiveButtonStyle = 42; - public static final int AppCompatTheme_buttonBarStyle = 43; - public static final int AppCompatTheme_buttonStyle = 44; - public static final int AppCompatTheme_buttonStyleSmall = 45; - public static final int AppCompatTheme_checkboxStyle = 46; - public static final int AppCompatTheme_checkedTextViewStyle = 47; - public static final int AppCompatTheme_colorAccent = 48; - public static final int AppCompatTheme_colorBackgroundFloating = 49; - public static final int AppCompatTheme_colorButtonNormal = 50; - public static final int AppCompatTheme_colorControlActivated = 51; - public static final int AppCompatTheme_colorControlHighlight = 52; - public static final int AppCompatTheme_colorControlNormal = 53; - public static final int AppCompatTheme_colorError = 54; - public static final int AppCompatTheme_colorPrimary = 55; - public static final int AppCompatTheme_colorPrimaryDark = 56; - public static final int AppCompatTheme_colorSwitchThumbNormal = 57; - public static final int AppCompatTheme_controlBackground = 58; - public static final int AppCompatTheme_dialogCornerRadius = 59; - public static final int AppCompatTheme_dialogPreferredPadding = 60; - public static final int AppCompatTheme_dialogTheme = 61; - public static final int AppCompatTheme_dividerHorizontal = 62; - public static final int AppCompatTheme_dividerVertical = 63; - public static final int AppCompatTheme_dropDownListViewStyle = 64; - public static final int AppCompatTheme_dropdownListPreferredItemHeight = 65; - public static final int AppCompatTheme_editTextBackground = 66; - public static final int AppCompatTheme_editTextColor = 67; - public static final int AppCompatTheme_editTextStyle = 68; - public static final int AppCompatTheme_homeAsUpIndicator = 69; - public static final int AppCompatTheme_imageButtonStyle = 70; - public static final int AppCompatTheme_listChoiceBackgroundIndicator = 71; - public static final int AppCompatTheme_listDividerAlertDialog = 72; - public static final int AppCompatTheme_listMenuViewStyle = 73; - public static final int AppCompatTheme_listPopupWindowStyle = 74; - public static final int AppCompatTheme_listPreferredItemHeight = 75; - public static final int AppCompatTheme_listPreferredItemHeightLarge = 76; - public static final int AppCompatTheme_listPreferredItemHeightSmall = 77; - public static final int AppCompatTheme_listPreferredItemPaddingLeft = 78; - public static final int AppCompatTheme_listPreferredItemPaddingRight = 79; - public static final int AppCompatTheme_panelBackground = 80; - public static final int AppCompatTheme_panelMenuListTheme = 81; - public static final int AppCompatTheme_panelMenuListWidth = 82; - public static final int AppCompatTheme_popupMenuStyle = 83; - public static final int AppCompatTheme_popupWindowStyle = 84; - public static final int AppCompatTheme_radioButtonStyle = 85; - public static final int AppCompatTheme_ratingBarStyle = 86; - public static final int AppCompatTheme_ratingBarStyleIndicator = 87; - public static final int AppCompatTheme_ratingBarStyleSmall = 88; - public static final int AppCompatTheme_searchViewStyle = 89; - public static final int AppCompatTheme_seekBarStyle = 90; - public static final int AppCompatTheme_selectableItemBackground = 91; - public static final int AppCompatTheme_selectableItemBackgroundBorderless = 92; - public static final int AppCompatTheme_spinnerDropDownItemStyle = 93; - public static final int AppCompatTheme_spinnerStyle = 94; - public static final int AppCompatTheme_switchStyle = 95; - public static final int AppCompatTheme_textAppearanceLargePopupMenu = 96; - public static final int AppCompatTheme_textAppearanceListItem = 97; - public static final int AppCompatTheme_textAppearanceListItemSecondary = 98; - public static final int AppCompatTheme_textAppearanceListItemSmall = 99; - public static final int AppCompatTheme_textAppearancePopupMenuHeader = 100; - public static final int AppCompatTheme_textAppearanceSearchResultSubtitle = 101; - public static final int AppCompatTheme_textAppearanceSearchResultTitle = 102; - public static final int AppCompatTheme_textAppearanceSmallPopupMenu = 103; - public static final int AppCompatTheme_textColorAlertDialogListItem = 104; - public static final int AppCompatTheme_textColorSearchUrl = 105; - public static final int AppCompatTheme_toolbarNavigationButtonStyle = 106; - public static final int AppCompatTheme_toolbarStyle = 107; - public static final int AppCompatTheme_tooltipForegroundColor = 108; - public static final int AppCompatTheme_tooltipFrameBackground = 109; - public static final int AppCompatTheme_viewInflaterClass = 110; - public static final int AppCompatTheme_windowActionBar = 111; - public static final int AppCompatTheme_windowActionBarOverlay = 112; - public static final int AppCompatTheme_windowActionModeOverlay = 113; - public static final int AppCompatTheme_windowFixedHeightMajor = 114; - public static final int AppCompatTheme_windowFixedHeightMinor = 115; - public static final int AppCompatTheme_windowFixedWidthMajor = 116; - public static final int AppCompatTheme_windowFixedWidthMinor = 117; - public static final int AppCompatTheme_windowMinWidthMajor = 118; - public static final int AppCompatTheme_windowMinWidthMinor = 119; - public static final int AppCompatTheme_windowNoTitle = 120; - public static final int[] ButtonBarLayout = { 0x7f040026 }; - public static final int ButtonBarLayout_allowStacking = 0; - public static final int[] ColorStateListItem = { 0x10101a5, 0x101031f, 0x7f040027 }; - public static final int ColorStateListItem_android_color = 0; - public static final int ColorStateListItem_android_alpha = 1; - public static final int ColorStateListItem_alpha = 2; - public static final int[] CompoundButton = { 0x1010107, 0x7f040058, 0x7f040059 }; - public static final int CompoundButton_android_button = 0; - public static final int CompoundButton_buttonTint = 1; - public static final int CompoundButton_buttonTintMode = 2; - public static final int[] CoordinatorLayout = { 0x7f04010d, 0x7f0401a6 }; - public static final int CoordinatorLayout_keylines = 0; - public static final int CoordinatorLayout_statusBarBackground = 1; - public static final int[] CoordinatorLayout_Layout = { 0x10100b3, 0x7f040112, 0x7f040113, 0x7f040114, 0x7f040140, 0x7f040149, 0x7f04014a }; - public static final int CoordinatorLayout_Layout_android_layout_gravity = 0; - public static final int CoordinatorLayout_Layout_layout_anchor = 1; - public static final int CoordinatorLayout_Layout_layout_anchorGravity = 2; - public static final int CoordinatorLayout_Layout_layout_behavior = 3; - public static final int CoordinatorLayout_Layout_layout_dodgeInsetEdges = 4; - public static final int CoordinatorLayout_Layout_layout_insetEdge = 5; - public static final int CoordinatorLayout_Layout_layout_keyline = 6; - public static final int[] DrawerArrowToggle = { 0x7f040029, 0x7f04002a, 0x7f040036, 0x7f040086, 0x7f0400b4, 0x7f0400e3, 0x7f04019b, 0x7f0401eb }; - public static final int DrawerArrowToggle_arrowHeadLength = 0; - public static final int DrawerArrowToggle_arrowShaftLength = 1; - public static final int DrawerArrowToggle_barLength = 2; - public static final int DrawerArrowToggle_color = 3; - public static final int DrawerArrowToggle_drawableSize = 4; - public static final int DrawerArrowToggle_gapBetweenBars = 5; - public static final int DrawerArrowToggle_spinBars = 6; - public static final int DrawerArrowToggle_thickness = 7; - public static final int[] FontFamily = { 0x7f0400d9, 0x7f0400da, 0x7f0400db, 0x7f0400dc, 0x7f0400dd, 0x7f0400de }; - public static final int FontFamily_fontProviderAuthority = 0; - public static final int FontFamily_fontProviderCerts = 1; - public static final int FontFamily_fontProviderFetchStrategy = 2; - public static final int FontFamily_fontProviderFetchTimeout = 3; - public static final int FontFamily_fontProviderPackage = 4; - public static final int FontFamily_fontProviderQuery = 5; - public static final int[] FontFamilyFont = { 0x1010532, 0x1010533, 0x101053f, 0x101056f, 0x1010570, 0x7f0400d7, 0x7f0400df, 0x7f0400e0, 0x7f0400e1, 0x7f040208 }; - public static final int FontFamilyFont_android_font = 0; - public static final int FontFamilyFont_android_fontWeight = 1; - public static final int FontFamilyFont_android_fontStyle = 2; - public static final int FontFamilyFont_android_ttcIndex = 3; - public static final int FontFamilyFont_android_fontVariationSettings = 4; - public static final int FontFamilyFont_font = 5; - public static final int FontFamilyFont_fontStyle = 6; - public static final int FontFamilyFont_fontVariationSettings = 7; - public static final int FontFamilyFont_fontWeight = 8; - public static final int FontFamilyFont_ttcIndex = 9; - public static final int[] GradientColor = { 0x101019d, 0x101019e, 0x10101a1, 0x10101a2, 0x10101a3, 0x10101a4, 0x1010201, 0x101020b, 0x1010510, 0x1010511, 0x1010512, 0x1010513 }; - public static final int GradientColor_android_startColor = 0; - public static final int GradientColor_android_endColor = 1; - public static final int GradientColor_android_type = 2; - public static final int GradientColor_android_centerX = 3; - public static final int GradientColor_android_centerY = 4; - public static final int GradientColor_android_gradientRadius = 5; - public static final int GradientColor_android_tileMode = 6; - public static final int GradientColor_android_centerColor = 7; - public static final int GradientColor_android_startX = 8; - public static final int GradientColor_android_startY = 9; - public static final int GradientColor_android_endX = 10; - public static final int GradientColor_android_endY = 11; - public static final int[] GradientColorItem = { 0x10101a5, 0x1010514 }; - public static final int GradientColorItem_android_color = 0; - public static final int GradientColorItem_android_offset = 1; - public static final int[] LinearLayoutCompat = { 0x10100af, 0x10100c4, 0x1010126, 0x1010127, 0x1010128, 0x7f0400b0, 0x7f0400b2, 0x7f040163, 0x7f040191 }; - public static final int LinearLayoutCompat_android_gravity = 0; - public static final int LinearLayoutCompat_android_orientation = 1; - public static final int LinearLayoutCompat_android_baselineAligned = 2; - public static final int LinearLayoutCompat_android_baselineAlignedChildIndex = 3; - public static final int LinearLayoutCompat_android_weightSum = 4; - public static final int LinearLayoutCompat_divider = 5; - public static final int LinearLayoutCompat_dividerPadding = 6; - public static final int LinearLayoutCompat_measureWithLargestChild = 7; - public static final int LinearLayoutCompat_showDividers = 8; - public static final int[] LinearLayoutCompat_Layout = { 0x10100b3, 0x10100f4, 0x10100f5, 0x1010181 }; - public static final int LinearLayoutCompat_Layout_android_layout_gravity = 0; - public static final int LinearLayoutCompat_Layout_android_layout_width = 1; - public static final int LinearLayoutCompat_Layout_android_layout_height = 2; - public static final int LinearLayoutCompat_Layout_android_layout_weight = 3; - public static final int[] ListPopupWindow = { 0x10102ac, 0x10102ad }; - public static final int ListPopupWindow_android_dropDownHorizontalOffset = 0; - public static final int ListPopupWindow_android_dropDownVerticalOffset = 1; - public static final int[] MenuGroup = { 0x101000e, 0x10100d0, 0x1010194, 0x10101de, 0x10101df, 0x10101e0 }; - public static final int MenuGroup_android_enabled = 0; - public static final int MenuGroup_android_id = 1; - public static final int MenuGroup_android_visible = 2; - public static final int MenuGroup_android_menuCategory = 3; - public static final int MenuGroup_android_orderInCategory = 4; - public static final int MenuGroup_android_checkableBehavior = 5; - public static final int[] MenuItem = { 0x1010002, 0x101000e, 0x10100d0, 0x1010106, 0x1010194, 0x10101de, 0x10101df, 0x10101e1, 0x10101e2, 0x10101e3, 0x10101e4, 0x10101e5, 0x101026f, 0x7f04000d, 0x7f04001f, 0x7f040020, 0x7f040028, 0x7f040096, 0x7f0400f9, 0x7f0400fa, 0x7f04016a, 0x7f040190, 0x7f040204 }; - public static final int MenuItem_android_icon = 0; - public static final int MenuItem_android_enabled = 1; - public static final int MenuItem_android_id = 2; - public static final int MenuItem_android_checked = 3; - public static final int MenuItem_android_visible = 4; - public static final int MenuItem_android_menuCategory = 5; - public static final int MenuItem_android_orderInCategory = 6; - public static final int MenuItem_android_title = 7; - public static final int MenuItem_android_titleCondensed = 8; - public static final int MenuItem_android_alphabeticShortcut = 9; - public static final int MenuItem_android_numericShortcut = 10; - public static final int MenuItem_android_checkable = 11; - public static final int MenuItem_android_onClick = 12; - public static final int MenuItem_actionLayout = 13; - public static final int MenuItem_actionProviderClass = 14; - public static final int MenuItem_actionViewClass = 15; - public static final int MenuItem_alphabeticModifiers = 16; - public static final int MenuItem_contentDescription = 17; - public static final int MenuItem_iconTint = 18; - public static final int MenuItem_iconTintMode = 19; - public static final int MenuItem_numericModifiers = 20; - public static final int MenuItem_showAsAction = 21; - public static final int MenuItem_tooltipText = 22; - public static final int[] MenuView = { 0x10100ae, 0x101012c, 0x101012d, 0x101012e, 0x101012f, 0x1010130, 0x1010131, 0x7f04017b, 0x7f0401aa }; - public static final int MenuView_android_windowAnimationStyle = 0; - public static final int MenuView_android_itemTextAppearance = 1; - public static final int MenuView_android_horizontalDivider = 2; - public static final int MenuView_android_verticalDivider = 3; - public static final int MenuView_android_headerBackground = 4; - public static final int MenuView_android_itemBackground = 5; - public static final int MenuView_android_itemIconDisabledAlpha = 6; - public static final int MenuView_preserveIconSpacing = 7; - public static final int MenuView_subMenuArrow = 8; - public static final int[] PopupWindow = { 0x1010176, 0x10102c9, 0x7f04016b }; - public static final int PopupWindow_android_popupBackground = 0; - public static final int PopupWindow_android_popupAnimationStyle = 1; - public static final int PopupWindow_overlapAnchor = 2; - public static final int[] PopupWindowBackgroundState = { 0x7f0401a1 }; - public static final int PopupWindowBackgroundState_state_above_anchor = 0; - public static final int[] RecycleListView = { 0x7f04016c, 0x7f04016f }; - public static final int RecycleListView_paddingBottomNoButtons = 0; - public static final int RecycleListView_paddingTopNoTitle = 1; - public static final int[] SearchView = { 0x10100da, 0x101011f, 0x1010220, 0x1010264, 0x7f04007a, 0x7f040092, 0x7f0400ab, 0x7f0400e4, 0x7f0400fb, 0x7f040110, 0x7f04017f, 0x7f040180, 0x7f04018a, 0x7f04018b, 0x7f0401ab, 0x7f0401b0, 0x7f04020b }; - public static final int SearchView_android_focusable = 0; - public static final int SearchView_android_maxWidth = 1; - public static final int SearchView_android_inputType = 2; - public static final int SearchView_android_imeOptions = 3; - public static final int SearchView_closeIcon = 4; - public static final int SearchView_commitIcon = 5; - public static final int SearchView_defaultQueryHint = 6; - public static final int SearchView_goIcon = 7; - public static final int SearchView_iconifiedByDefault = 8; - public static final int SearchView_layout = 9; - public static final int SearchView_queryBackground = 10; - public static final int SearchView_queryHint = 11; - public static final int SearchView_searchHintIcon = 12; - public static final int SearchView_searchIcon = 13; - public static final int SearchView_submitBackground = 14; - public static final int SearchView_suggestionRowLayout = 15; - public static final int SearchView_voiceIcon = 16; - public static final int[] Spinner = { 0x10100b2, 0x1010176, 0x101017b, 0x1010262, 0x7f040179 }; - public static final int Spinner_android_entries = 0; - public static final int Spinner_android_popupBackground = 1; - public static final int Spinner_android_prompt = 2; - public static final int Spinner_android_dropDownWidth = 3; - public static final int Spinner_popupTheme = 4; - public static final int[] StateListDrawable = { 0x101011c, 0x1010194, 0x1010195, 0x1010196, 0x101030c, 0x101030d }; - public static final int StateListDrawable_android_dither = 0; - public static final int StateListDrawable_android_visible = 1; - public static final int StateListDrawable_android_variablePadding = 2; - public static final int StateListDrawable_android_constantSize = 3; - public static final int StateListDrawable_android_enterFadeDuration = 4; - public static final int StateListDrawable_android_exitFadeDuration = 5; - public static final int[] StateListDrawableItem = { 0x1010199 }; - public static final int StateListDrawableItem_android_drawable = 0; - public static final int[] SwitchCompat = { 0x1010124, 0x1010125, 0x1010142, 0x7f040193, 0x7f04019e, 0x7f0401b1, 0x7f0401b2, 0x7f0401b4, 0x7f0401ec, 0x7f0401ed, 0x7f0401ee, 0x7f040205, 0x7f040206, 0x7f040207 }; - public static final int SwitchCompat_android_textOn = 0; - public static final int SwitchCompat_android_textOff = 1; - public static final int SwitchCompat_android_thumb = 2; - public static final int SwitchCompat_showText = 3; - public static final int SwitchCompat_splitTrack = 4; - public static final int SwitchCompat_switchMinWidth = 5; - public static final int SwitchCompat_switchPadding = 6; - public static final int SwitchCompat_switchTextAppearance = 7; - public static final int SwitchCompat_thumbTextPadding = 8; - public static final int SwitchCompat_thumbTint = 9; - public static final int SwitchCompat_thumbTintMode = 10; - public static final int SwitchCompat_track = 11; - public static final int SwitchCompat_trackTint = 12; - public static final int SwitchCompat_trackTintMode = 13; - public static final int[] TextAppearance = { 0x1010095, 0x1010096, 0x1010097, 0x1010098, 0x101009a, 0x101009b, 0x1010161, 0x1010162, 0x1010163, 0x1010164, 0x10103ac, 0x7f0400d8, 0x7f0401cf }; - public static final int TextAppearance_android_textSize = 0; - public static final int TextAppearance_android_typeface = 1; - public static final int TextAppearance_android_textStyle = 2; - public static final int TextAppearance_android_textColor = 3; - public static final int TextAppearance_android_textColorHint = 4; - public static final int TextAppearance_android_textColorLink = 5; - public static final int TextAppearance_android_shadowColor = 6; - public static final int TextAppearance_android_shadowDx = 7; - public static final int TextAppearance_android_shadowDy = 8; - public static final int TextAppearance_android_shadowRadius = 9; - public static final int TextAppearance_android_fontFamily = 10; - public static final int TextAppearance_fontFamily = 11; - public static final int TextAppearance_textAllCaps = 12; - public static final int[] Toolbar = { 0x10100af, 0x1010140, 0x7f040053, 0x7f040082, 0x7f040083, 0x7f040097, 0x7f040098, 0x7f040099, 0x7f04009a, 0x7f04009b, 0x7f04009c, 0x7f04015c, 0x7f04015d, 0x7f040161, 0x7f040166, 0x7f040167, 0x7f040179, 0x7f0401ac, 0x7f0401ad, 0x7f0401ae, 0x7f0401f4, 0x7f0401f6, 0x7f0401f7, 0x7f0401f8, 0x7f0401f9, 0x7f0401fa, 0x7f0401fb, 0x7f0401fc, 0x7f0401fd }; - public static final int Toolbar_android_gravity = 0; - public static final int Toolbar_android_minHeight = 1; - public static final int Toolbar_buttonGravity = 2; - public static final int Toolbar_collapseContentDescription = 3; - public static final int Toolbar_collapseIcon = 4; - public static final int Toolbar_contentInsetEnd = 5; - public static final int Toolbar_contentInsetEndWithActions = 6; - public static final int Toolbar_contentInsetLeft = 7; - public static final int Toolbar_contentInsetRight = 8; - public static final int Toolbar_contentInsetStart = 9; - public static final int Toolbar_contentInsetStartWithNavigation = 10; - public static final int Toolbar_logo = 11; - public static final int Toolbar_logoDescription = 12; - public static final int Toolbar_maxButtonHeight = 13; - public static final int Toolbar_navigationContentDescription = 14; - public static final int Toolbar_navigationIcon = 15; - public static final int Toolbar_popupTheme = 16; - public static final int Toolbar_subtitle = 17; - public static final int Toolbar_subtitleTextAppearance = 18; - public static final int Toolbar_subtitleTextColor = 19; - public static final int Toolbar_title = 20; - public static final int Toolbar_titleMargin = 21; - public static final int Toolbar_titleMarginBottom = 22; - public static final int Toolbar_titleMarginEnd = 23; - public static final int Toolbar_titleMarginStart = 24; - public static final int Toolbar_titleMarginTop = 25; - public static final int Toolbar_titleMargins = 26; - public static final int Toolbar_titleTextAppearance = 27; - public static final int Toolbar_titleTextColor = 28; - public static final int[] View = { 0x1010000, 0x10100da, 0x7f04016d, 0x7f04016e, 0x7f0401ea }; - public static final int View_android_theme = 0; - public static final int View_android_focusable = 1; - public static final int View_paddingEnd = 2; - public static final int View_paddingStart = 3; - public static final int View_theme = 4; - public static final int[] ViewBackgroundHelper = { 0x10100d4, 0x7f040034, 0x7f040035 }; - public static final int ViewBackgroundHelper_android_background = 0; - public static final int ViewBackgroundHelper_backgroundTint = 1; - public static final int ViewBackgroundHelper_backgroundTintMode = 2; - public static final int[] ViewStubCompat = { 0x10100d0, 0x10100f2, 0x10100f3 }; - public static final int ViewStubCompat_android_id = 0; - public static final int ViewStubCompat_android_layout = 1; - public static final int ViewStubCompat_android_inflatedId = 2; - } -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/v7/cardview/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/v7/cardview/R.java deleted file mode 100755 index 32822f4..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/v7/cardview/R.java +++ /dev/null @@ -1,69 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.support.v7.cardview; - -public final class R { - private R() {} - - public static final class attr { - private attr() {} - - public static final int cardBackgroundColor = 0x7f04005a; - public static final int cardCornerRadius = 0x7f04005b; - public static final int cardElevation = 0x7f04005c; - public static final int cardMaxElevation = 0x7f04005d; - public static final int cardPreventCornerOverlap = 0x7f04005e; - public static final int cardUseCompatPadding = 0x7f04005f; - public static final int cardViewStyle = 0x7f040060; - public static final int contentPadding = 0x7f04009d; - public static final int contentPaddingBottom = 0x7f04009e; - public static final int contentPaddingLeft = 0x7f04009f; - public static final int contentPaddingRight = 0x7f0400a0; - public static final int contentPaddingTop = 0x7f0400a1; - } - public static final class color { - private color() {} - - public static final int cardview_dark_background = 0x7f060026; - public static final int cardview_light_background = 0x7f060027; - public static final int cardview_shadow_end_color = 0x7f060028; - public static final int cardview_shadow_start_color = 0x7f060029; - } - public static final class dimen { - private dimen() {} - - public static final int cardview_compat_inset_shadow = 0x7f07004b; - public static final int cardview_default_elevation = 0x7f07004c; - public static final int cardview_default_radius = 0x7f07004d; - } - public static final class style { - private style() {} - - public static final int Base_CardView = 0x7f10000f; - public static final int CardView = 0x7f1000c6; - public static final int CardView_Dark = 0x7f1000c7; - public static final int CardView_Light = 0x7f1000c8; - } - public static final class styleable { - private styleable() {} - - public static final int[] CardView = { 0x101013f, 0x1010140, 0x7f04005a, 0x7f04005b, 0x7f04005c, 0x7f04005d, 0x7f04005e, 0x7f04005f, 0x7f04009d, 0x7f04009e, 0x7f04009f, 0x7f0400a0, 0x7f0400a1 }; - public static final int CardView_android_minWidth = 0; - public static final int CardView_android_minHeight = 1; - public static final int CardView_cardBackgroundColor = 2; - public static final int CardView_cardCornerRadius = 3; - public static final int CardView_cardElevation = 4; - public static final int CardView_cardMaxElevation = 5; - public static final int CardView_cardPreventCornerOverlap = 6; - public static final int CardView_cardUseCompatPadding = 7; - public static final int CardView_contentPadding = 8; - public static final int CardView_contentPaddingBottom = 9; - public static final int CardView_contentPaddingLeft = 10; - public static final int CardView_contentPaddingRight = 11; - public static final int CardView_contentPaddingTop = 12; - } -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/v7/recyclerview/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/v7/recyclerview/R.java deleted file mode 100755 index b068a4a..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/v7/recyclerview/R.java +++ /dev/null @@ -1,239 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.support.v7.recyclerview; - -public final class R { - private R() {} - - public static final class attr { - private attr() {} - - public static final int alpha = 0x7f040027; - public static final int coordinatorLayoutStyle = 0x7f0400a4; - public static final int fastScrollEnabled = 0x7f0400d0; - public static final int fastScrollHorizontalThumbDrawable = 0x7f0400d1; - public static final int fastScrollHorizontalTrackDrawable = 0x7f0400d2; - public static final int fastScrollVerticalThumbDrawable = 0x7f0400d3; - public static final int fastScrollVerticalTrackDrawable = 0x7f0400d4; - public static final int font = 0x7f0400d7; - public static final int fontProviderAuthority = 0x7f0400d9; - public static final int fontProviderCerts = 0x7f0400da; - public static final int fontProviderFetchStrategy = 0x7f0400db; - public static final int fontProviderFetchTimeout = 0x7f0400dc; - public static final int fontProviderPackage = 0x7f0400dd; - public static final int fontProviderQuery = 0x7f0400de; - public static final int fontStyle = 0x7f0400df; - public static final int fontVariationSettings = 0x7f0400e0; - public static final int fontWeight = 0x7f0400e1; - public static final int keylines = 0x7f04010d; - public static final int layoutManager = 0x7f040111; - public static final int layout_anchor = 0x7f040112; - public static final int layout_anchorGravity = 0x7f040113; - public static final int layout_behavior = 0x7f040114; - public static final int layout_dodgeInsetEdges = 0x7f040140; - public static final int layout_insetEdge = 0x7f040149; - public static final int layout_keyline = 0x7f04014a; - public static final int reverseLayout = 0x7f040185; - public static final int spanCount = 0x7f04019a; - public static final int stackFromEnd = 0x7f0401a0; - public static final int statusBarBackground = 0x7f0401a6; - public static final int ttcIndex = 0x7f040208; - } - public static final class color { - private color() {} - - public static final int notification_action_color_filter = 0x7f06006a; - public static final int notification_icon_bg_color = 0x7f06006b; - public static final int ripple_material_light = 0x7f060075; - public static final int secondary_text_default_material_light = 0x7f060077; - } - public static final class dimen { - private dimen() {} - - public static final int compat_button_inset_horizontal_material = 0x7f07004e; - public static final int compat_button_inset_vertical_material = 0x7f07004f; - public static final int compat_button_padding_horizontal_material = 0x7f070050; - public static final int compat_button_padding_vertical_material = 0x7f070051; - public static final int compat_control_corner_material = 0x7f070052; - public static final int compat_notification_large_icon_max_height = 0x7f070053; - public static final int compat_notification_large_icon_max_width = 0x7f070054; - public static final int fastscroll_default_thickness = 0x7f070084; - public static final int fastscroll_margin = 0x7f070085; - public static final int fastscroll_minimum_range = 0x7f070086; - public static final int item_touch_helper_max_drag_scroll_per_frame = 0x7f070092; - public static final int item_touch_helper_swipe_escape_max_velocity = 0x7f070093; - public static final int item_touch_helper_swipe_escape_velocity = 0x7f070094; - public static final int notification_action_icon_size = 0x7f0700c5; - public static final int notification_action_text_size = 0x7f0700c6; - public static final int notification_big_circle_margin = 0x7f0700c7; - public static final int notification_content_margin_start = 0x7f0700c8; - public static final int notification_large_icon_height = 0x7f0700c9; - public static final int notification_large_icon_width = 0x7f0700ca; - public static final int notification_main_column_padding_top = 0x7f0700cb; - public static final int notification_media_narrow_margin = 0x7f0700cc; - public static final int notification_right_icon_size = 0x7f0700cd; - public static final int notification_right_side_padding_top = 0x7f0700ce; - public static final int notification_small_icon_background_padding = 0x7f0700cf; - public static final int notification_small_icon_size_as_large = 0x7f0700d0; - public static final int notification_subtext_size = 0x7f0700d1; - public static final int notification_top_pad = 0x7f0700d2; - public static final int notification_top_pad_large_text = 0x7f0700d3; - } - public static final class drawable { - private drawable() {} - - public static final int notification_action_background = 0x7f08006b; - public static final int notification_bg = 0x7f08006c; - public static final int notification_bg_low = 0x7f08006d; - public static final int notification_bg_low_normal = 0x7f08006e; - public static final int notification_bg_low_pressed = 0x7f08006f; - public static final int notification_bg_normal = 0x7f080070; - public static final int notification_bg_normal_pressed = 0x7f080071; - public static final int notification_icon_background = 0x7f080072; - public static final int notification_template_icon_bg = 0x7f080073; - public static final int notification_template_icon_low_bg = 0x7f080074; - public static final int notification_tile_bg = 0x7f080075; - public static final int notify_panel_notification_icon_bg = 0x7f080076; - } - public static final class id { - private id() {} - - public static final int action_container = 0x7f09000d; - public static final int action_divider = 0x7f09000f; - public static final int action_image = 0x7f090010; - public static final int action_text = 0x7f090017; - public static final int actions = 0x7f090018; - public static final int async = 0x7f09001e; - public static final int blocking = 0x7f090022; - public static final int bottom = 0x7f090023; - public static final int chronometer = 0x7f09002b; - public static final int end = 0x7f090043; - public static final int forever = 0x7f09004f; - public static final int icon = 0x7f090056; - public static final int icon_group = 0x7f090057; - public static final int info = 0x7f09005a; - public static final int italic = 0x7f09005c; - public static final int item_touch_helper_previous_elevation = 0x7f09005d; - public static final int left = 0x7f090061; - public static final int line1 = 0x7f090062; - public static final int line3 = 0x7f090063; - public static final int none = 0x7f090070; - public static final int normal = 0x7f090071; - public static final int notification_background = 0x7f090073; - public static final int notification_main_column = 0x7f090074; - public static final int notification_main_column_container = 0x7f090075; - public static final int right = 0x7f090081; - public static final int right_icon = 0x7f090082; - public static final int right_side = 0x7f090083; - public static final int start = 0x7f0900ac; - public static final int tag_transition_group = 0x7f0900b1; - public static final int tag_unhandled_key_event_manager = 0x7f0900b2; - public static final int tag_unhandled_key_listeners = 0x7f0900b3; - public static final int text = 0x7f0900b4; - public static final int text2 = 0x7f0900b5; - public static final int time = 0x7f0900bd; - public static final int title = 0x7f0900be; - public static final int top = 0x7f0900c2; - } - public static final class integer { - private integer() {} - - public static final int status_bar_notification_info_maxnum = 0x7f0a000e; - } - public static final class layout { - private layout() {} - - public static final int notification_action = 0x7f0c0030; - public static final int notification_action_tombstone = 0x7f0c0031; - public static final int notification_template_custom_big = 0x7f0c0032; - public static final int notification_template_icon_group = 0x7f0c0033; - public static final int notification_template_part_chronometer = 0x7f0c0034; - public static final int notification_template_part_time = 0x7f0c0035; - } - public static final class string { - private string() {} - - public static final int status_bar_notification_info_overflow = 0x7f0f0037; - } - public static final class style { - private style() {} - - public static final int TextAppearance_Compat_Notification = 0x7f10011c; - public static final int TextAppearance_Compat_Notification_Info = 0x7f10011d; - public static final int TextAppearance_Compat_Notification_Line2 = 0x7f10011e; - public static final int TextAppearance_Compat_Notification_Time = 0x7f10011f; - public static final int TextAppearance_Compat_Notification_Title = 0x7f100120; - public static final int Widget_Compat_NotificationActionContainer = 0x7f1001c6; - public static final int Widget_Compat_NotificationActionText = 0x7f1001c7; - public static final int Widget_Support_CoordinatorLayout = 0x7f1001f6; - } - public static final class styleable { - private styleable() {} - - public static final int[] ColorStateListItem = { 0x10101a5, 0x101031f, 0x7f040027 }; - public static final int ColorStateListItem_android_color = 0; - public static final int ColorStateListItem_android_alpha = 1; - public static final int ColorStateListItem_alpha = 2; - public static final int[] CoordinatorLayout = { 0x7f04010d, 0x7f0401a6 }; - public static final int CoordinatorLayout_keylines = 0; - public static final int CoordinatorLayout_statusBarBackground = 1; - public static final int[] CoordinatorLayout_Layout = { 0x10100b3, 0x7f040112, 0x7f040113, 0x7f040114, 0x7f040140, 0x7f040149, 0x7f04014a }; - public static final int CoordinatorLayout_Layout_android_layout_gravity = 0; - public static final int CoordinatorLayout_Layout_layout_anchor = 1; - public static final int CoordinatorLayout_Layout_layout_anchorGravity = 2; - public static final int CoordinatorLayout_Layout_layout_behavior = 3; - public static final int CoordinatorLayout_Layout_layout_dodgeInsetEdges = 4; - public static final int CoordinatorLayout_Layout_layout_insetEdge = 5; - public static final int CoordinatorLayout_Layout_layout_keyline = 6; - public static final int[] FontFamily = { 0x7f0400d9, 0x7f0400da, 0x7f0400db, 0x7f0400dc, 0x7f0400dd, 0x7f0400de }; - public static final int FontFamily_fontProviderAuthority = 0; - public static final int FontFamily_fontProviderCerts = 1; - public static final int FontFamily_fontProviderFetchStrategy = 2; - public static final int FontFamily_fontProviderFetchTimeout = 3; - public static final int FontFamily_fontProviderPackage = 4; - public static final int FontFamily_fontProviderQuery = 5; - public static final int[] FontFamilyFont = { 0x1010532, 0x1010533, 0x101053f, 0x101056f, 0x1010570, 0x7f0400d7, 0x7f0400df, 0x7f0400e0, 0x7f0400e1, 0x7f040208 }; - public static final int FontFamilyFont_android_font = 0; - public static final int FontFamilyFont_android_fontWeight = 1; - public static final int FontFamilyFont_android_fontStyle = 2; - public static final int FontFamilyFont_android_ttcIndex = 3; - public static final int FontFamilyFont_android_fontVariationSettings = 4; - public static final int FontFamilyFont_font = 5; - public static final int FontFamilyFont_fontStyle = 6; - public static final int FontFamilyFont_fontVariationSettings = 7; - public static final int FontFamilyFont_fontWeight = 8; - public static final int FontFamilyFont_ttcIndex = 9; - public static final int[] GradientColor = { 0x101019d, 0x101019e, 0x10101a1, 0x10101a2, 0x10101a3, 0x10101a4, 0x1010201, 0x101020b, 0x1010510, 0x1010511, 0x1010512, 0x1010513 }; - public static final int GradientColor_android_startColor = 0; - public static final int GradientColor_android_endColor = 1; - public static final int GradientColor_android_type = 2; - public static final int GradientColor_android_centerX = 3; - public static final int GradientColor_android_centerY = 4; - public static final int GradientColor_android_gradientRadius = 5; - public static final int GradientColor_android_tileMode = 6; - public static final int GradientColor_android_centerColor = 7; - public static final int GradientColor_android_startX = 8; - public static final int GradientColor_android_startY = 9; - public static final int GradientColor_android_endX = 10; - public static final int GradientColor_android_endY = 11; - public static final int[] GradientColorItem = { 0x10101a5, 0x1010514 }; - public static final int GradientColorItem_android_color = 0; - public static final int GradientColorItem_android_offset = 1; - public static final int[] RecyclerView = { 0x10100c4, 0x10100f1, 0x7f0400d0, 0x7f0400d1, 0x7f0400d2, 0x7f0400d3, 0x7f0400d4, 0x7f040111, 0x7f040185, 0x7f04019a, 0x7f0401a0 }; - public static final int RecyclerView_android_orientation = 0; - public static final int RecyclerView_android_descendantFocusability = 1; - public static final int RecyclerView_fastScrollEnabled = 2; - public static final int RecyclerView_fastScrollHorizontalThumbDrawable = 3; - public static final int RecyclerView_fastScrollHorizontalTrackDrawable = 4; - public static final int RecyclerView_fastScrollVerticalThumbDrawable = 5; - public static final int RecyclerView_fastScrollVerticalTrackDrawable = 6; - public static final int RecyclerView_layoutManager = 7; - public static final int RecyclerView_reverseLayout = 8; - public static final int RecyclerView_spanCount = 9; - public static final int RecyclerView_stackFromEnd = 10; - } -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/v7/viewpager/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/v7/viewpager/R.java deleted file mode 100755 index 796d5c5..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/support/v7/viewpager/R.java +++ /dev/null @@ -1,183 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package android.support.v7.viewpager; - -public final class R { - private R() {} - - public static final class attr { - private attr() {} - - public static final int alpha = 0x7f040027; - public static final int font = 0x7f0400d7; - public static final int fontProviderAuthority = 0x7f0400d9; - public static final int fontProviderCerts = 0x7f0400da; - public static final int fontProviderFetchStrategy = 0x7f0400db; - public static final int fontProviderFetchTimeout = 0x7f0400dc; - public static final int fontProviderPackage = 0x7f0400dd; - public static final int fontProviderQuery = 0x7f0400de; - public static final int fontStyle = 0x7f0400df; - public static final int fontVariationSettings = 0x7f0400e0; - public static final int fontWeight = 0x7f0400e1; - public static final int ttcIndex = 0x7f040208; - } - public static final class color { - private color() {} - - public static final int notification_action_color_filter = 0x7f06006a; - public static final int notification_icon_bg_color = 0x7f06006b; - public static final int ripple_material_light = 0x7f060075; - public static final int secondary_text_default_material_light = 0x7f060077; - } - public static final class dimen { - private dimen() {} - - public static final int compat_button_inset_horizontal_material = 0x7f07004e; - public static final int compat_button_inset_vertical_material = 0x7f07004f; - public static final int compat_button_padding_horizontal_material = 0x7f070050; - public static final int compat_button_padding_vertical_material = 0x7f070051; - public static final int compat_control_corner_material = 0x7f070052; - public static final int compat_notification_large_icon_max_height = 0x7f070053; - public static final int compat_notification_large_icon_max_width = 0x7f070054; - public static final int notification_action_icon_size = 0x7f0700c5; - public static final int notification_action_text_size = 0x7f0700c6; - public static final int notification_big_circle_margin = 0x7f0700c7; - public static final int notification_content_margin_start = 0x7f0700c8; - public static final int notification_large_icon_height = 0x7f0700c9; - public static final int notification_large_icon_width = 0x7f0700ca; - public static final int notification_main_column_padding_top = 0x7f0700cb; - public static final int notification_media_narrow_margin = 0x7f0700cc; - public static final int notification_right_icon_size = 0x7f0700cd; - public static final int notification_right_side_padding_top = 0x7f0700ce; - public static final int notification_small_icon_background_padding = 0x7f0700cf; - public static final int notification_small_icon_size_as_large = 0x7f0700d0; - public static final int notification_subtext_size = 0x7f0700d1; - public static final int notification_top_pad = 0x7f0700d2; - public static final int notification_top_pad_large_text = 0x7f0700d3; - } - public static final class drawable { - private drawable() {} - - public static final int notification_action_background = 0x7f08006b; - public static final int notification_bg = 0x7f08006c; - public static final int notification_bg_low = 0x7f08006d; - public static final int notification_bg_low_normal = 0x7f08006e; - public static final int notification_bg_low_pressed = 0x7f08006f; - public static final int notification_bg_normal = 0x7f080070; - public static final int notification_bg_normal_pressed = 0x7f080071; - public static final int notification_icon_background = 0x7f080072; - public static final int notification_template_icon_bg = 0x7f080073; - public static final int notification_template_icon_low_bg = 0x7f080074; - public static final int notification_tile_bg = 0x7f080075; - public static final int notify_panel_notification_icon_bg = 0x7f080076; - } - public static final class id { - private id() {} - - public static final int action_container = 0x7f09000d; - public static final int action_divider = 0x7f09000f; - public static final int action_image = 0x7f090010; - public static final int action_text = 0x7f090017; - public static final int actions = 0x7f090018; - public static final int async = 0x7f09001e; - public static final int blocking = 0x7f090022; - public static final int chronometer = 0x7f09002b; - public static final int forever = 0x7f09004f; - public static final int icon = 0x7f090056; - public static final int icon_group = 0x7f090057; - public static final int info = 0x7f09005a; - public static final int italic = 0x7f09005c; - public static final int line1 = 0x7f090062; - public static final int line3 = 0x7f090063; - public static final int normal = 0x7f090071; - public static final int notification_background = 0x7f090073; - public static final int notification_main_column = 0x7f090074; - public static final int notification_main_column_container = 0x7f090075; - public static final int right_icon = 0x7f090082; - public static final int right_side = 0x7f090083; - public static final int tag_transition_group = 0x7f0900b1; - public static final int tag_unhandled_key_event_manager = 0x7f0900b2; - public static final int tag_unhandled_key_listeners = 0x7f0900b3; - public static final int text = 0x7f0900b4; - public static final int text2 = 0x7f0900b5; - public static final int time = 0x7f0900bd; - public static final int title = 0x7f0900be; - } - public static final class integer { - private integer() {} - - public static final int status_bar_notification_info_maxnum = 0x7f0a000e; - } - public static final class layout { - private layout() {} - - public static final int notification_action = 0x7f0c0030; - public static final int notification_action_tombstone = 0x7f0c0031; - public static final int notification_template_custom_big = 0x7f0c0032; - public static final int notification_template_icon_group = 0x7f0c0033; - public static final int notification_template_part_chronometer = 0x7f0c0034; - public static final int notification_template_part_time = 0x7f0c0035; - } - public static final class string { - private string() {} - - public static final int status_bar_notification_info_overflow = 0x7f0f0037; - } - public static final class style { - private style() {} - - public static final int TextAppearance_Compat_Notification = 0x7f10011c; - public static final int TextAppearance_Compat_Notification_Info = 0x7f10011d; - public static final int TextAppearance_Compat_Notification_Line2 = 0x7f10011e; - public static final int TextAppearance_Compat_Notification_Time = 0x7f10011f; - public static final int TextAppearance_Compat_Notification_Title = 0x7f100120; - public static final int Widget_Compat_NotificationActionContainer = 0x7f1001c6; - public static final int Widget_Compat_NotificationActionText = 0x7f1001c7; - } - public static final class styleable { - private styleable() {} - - public static final int[] ColorStateListItem = { 0x10101a5, 0x101031f, 0x7f040027 }; - public static final int ColorStateListItem_android_color = 0; - public static final int ColorStateListItem_android_alpha = 1; - public static final int ColorStateListItem_alpha = 2; - public static final int[] FontFamily = { 0x7f0400d9, 0x7f0400da, 0x7f0400db, 0x7f0400dc, 0x7f0400dd, 0x7f0400de }; - public static final int FontFamily_fontProviderAuthority = 0; - public static final int FontFamily_fontProviderCerts = 1; - public static final int FontFamily_fontProviderFetchStrategy = 2; - public static final int FontFamily_fontProviderFetchTimeout = 3; - public static final int FontFamily_fontProviderPackage = 4; - public static final int FontFamily_fontProviderQuery = 5; - public static final int[] FontFamilyFont = { 0x1010532, 0x1010533, 0x101053f, 0x101056f, 0x1010570, 0x7f0400d7, 0x7f0400df, 0x7f0400e0, 0x7f0400e1, 0x7f040208 }; - public static final int FontFamilyFont_android_font = 0; - public static final int FontFamilyFont_android_fontWeight = 1; - public static final int FontFamilyFont_android_fontStyle = 2; - public static final int FontFamilyFont_android_ttcIndex = 3; - public static final int FontFamilyFont_android_fontVariationSettings = 4; - public static final int FontFamilyFont_font = 5; - public static final int FontFamilyFont_fontStyle = 6; - public static final int FontFamilyFont_fontVariationSettings = 7; - public static final int FontFamilyFont_fontWeight = 8; - public static final int FontFamilyFont_ttcIndex = 9; - public static final int[] GradientColor = { 0x101019d, 0x101019e, 0x10101a1, 0x10101a2, 0x10101a3, 0x10101a4, 0x1010201, 0x101020b, 0x1010510, 0x1010511, 0x1010512, 0x1010513 }; - public static final int GradientColor_android_startColor = 0; - public static final int GradientColor_android_endColor = 1; - public static final int GradientColor_android_type = 2; - public static final int GradientColor_android_centerX = 3; - public static final int GradientColor_android_centerY = 4; - public static final int GradientColor_android_gradientRadius = 5; - public static final int GradientColor_android_tileMode = 6; - public static final int GradientColor_android_centerColor = 7; - public static final int GradientColor_android_startX = 8; - public static final int GradientColor_android_startY = 9; - public static final int GradientColor_android_endX = 10; - public static final int GradientColor_android_endY = 11; - public static final int[] GradientColorItem = { 0x10101a5, 0x1010514 }; - public static final int GradientColorItem_android_color = 0; - public static final int GradientColorItem_android_offset = 1; - } -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/androidx/versionedparcelable/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/androidx/versionedparcelable/R.java deleted file mode 100755 index 62aad6d..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/androidx/versionedparcelable/R.java +++ /dev/null @@ -1,12 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * gradle plugin from the resource data it found. It - * should not be modified by hand. - */ -package androidx.versionedparcelable; - -public final class R { - private R() {} - -} diff --git a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/com/scriptor/R.java b/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/com/scriptor/R.java deleted file mode 100755 index d5a42e0..0000000 --- a/code/Android App/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/com/scriptor/R.java +++ /dev/null @@ -1,20103 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * aapt tool from the resource data it found. It - * should not be modified by hand. - */ - -package com.scriptor; - -public final class R { - public static final class anim { - public static final int abc_fade_in=0x7f010000; - public static final int abc_fade_out=0x7f010001; - public static final int abc_grow_fade_in_from_bottom=0x7f010002; - public static final int abc_popup_enter=0x7f010003; - public static final int abc_popup_exit=0x7f010004; - public static final int abc_shrink_fade_out_from_bottom=0x7f010005; - public static final int abc_slide_in_bottom=0x7f010006; - public static final int abc_slide_in_top=0x7f010007; - public static final int abc_slide_out_bottom=0x7f010008; - public static final int abc_slide_out_top=0x7f010009; - public static final int abc_tooltip_enter=0x7f01000a; - public static final int abc_tooltip_exit=0x7f01000b; - public static final int design_bottom_sheet_slide_in=0x7f01000c; - public static final int design_bottom_sheet_slide_out=0x7f01000d; - public static final int design_snackbar_in=0x7f01000e; - public static final int design_snackbar_out=0x7f01000f; - } - public static final class animator { - public static final int design_appbar_state_list_animator=0x7f020000; - public static final int design_fab_hide_motion_spec=0x7f020001; - public static final int design_fab_show_motion_spec=0x7f020002; - public static final int mtrl_btn_state_list_anim=0x7f020003; - public static final int mtrl_btn_unelevated_state_list_anim=0x7f020004; - public static final int mtrl_chip_state_list_anim=0x7f020005; - public static final int mtrl_fab_hide_motion_spec=0x7f020006; - public static final int mtrl_fab_show_motion_spec=0x7f020007; - public static final int mtrl_fab_transformation_sheet_collapse_spec=0x7f020008; - public static final int mtrl_fab_transformation_sheet_expand_spec=0x7f020009; - } - public static final class array { - public static final int church_array=0x7f030000; - } - public static final class attr { - /** - * Custom divider drawable to use for elements in the action bar. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionBarDivider=0x7f040000; - /** - * Custom item state list drawable background for action bar items. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionBarItemBackground=0x7f040001; - /** - * Reference to a theme that should be used to inflate popups - * shown by widgets in the action bar. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionBarPopupTheme=0x7f040002; - /** - * Size of the Action Bar, including the contextual - * bar used to present Action Modes. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
wrap_content0
- */ - public static final int actionBarSize=0x7f040003; - /** - * Reference to a style for the split Action Bar. This style - * controls the split component that holds the menu/action - * buttons. actionBarStyle is still used for the primary - * bar. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionBarSplitStyle=0x7f040004; - /** - * Reference to a style for the Action Bar - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionBarStyle=0x7f040005; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionBarTabBarStyle=0x7f040006; - /** - * Default style for tabs within an action bar - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionBarTabStyle=0x7f040007; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionBarTabTextStyle=0x7f040008; - /** - * Reference to a theme that should be used to inflate the - * action bar. This will be inherited by any widget inflated - * into the action bar. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionBarTheme=0x7f040009; - /** - * Reference to a theme that should be used to inflate widgets - * and layouts destined for the action bar. Most of the time - * this will be a reference to the current theme, but when - * the action bar has a significantly different contrast - * profile than the rest of the activity the difference - * can become important. If this is set to @null the current - * theme will be used. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionBarWidgetTheme=0x7f04000a; - /** - * Default action button style. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionButtonStyle=0x7f04000b; - /** - * Default ActionBar dropdown style. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionDropDownStyle=0x7f04000c; - /** - * An optional layout to be used as an action view. - * See {@link android.view.MenuItem#setActionView(android.view.View)} - * for more info. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionLayout=0x7f04000d; - /** - * TextAppearance style that will be applied to text that - * appears within action menu items. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionMenuTextAppearance=0x7f04000e; - /** - * Color for text that appears within action menu items. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int actionMenuTextColor=0x7f04000f; - /** - * Background drawable to use for action mode UI - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionModeBackground=0x7f040010; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionModeCloseButtonStyle=0x7f040011; - /** - * Drawable to use for the close action mode button - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionModeCloseDrawable=0x7f040012; - /** - * Drawable to use for the Copy action button in Contextual Action Bar - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionModeCopyDrawable=0x7f040013; - /** - * Drawable to use for the Cut action button in Contextual Action Bar - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionModeCutDrawable=0x7f040014; - /** - * Drawable to use for the Find action button in WebView selection action modes - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionModeFindDrawable=0x7f040015; - /** - * Drawable to use for the Paste action button in Contextual Action Bar - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionModePasteDrawable=0x7f040016; - /** - * PopupWindow style to use for action modes when showing as a window overlay. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionModePopupWindowStyle=0x7f040017; - /** - * Drawable to use for the Select all action button in Contextual Action Bar - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionModeSelectAllDrawable=0x7f040018; - /** - * Drawable to use for the Share action button in WebView selection action modes - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionModeShareDrawable=0x7f040019; - /** - * Background drawable to use for action mode UI in the lower split bar - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionModeSplitBackground=0x7f04001a; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionModeStyle=0x7f04001b; - /** - * Drawable to use for the Web Search action button in WebView selection action modes - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionModeWebSearchDrawable=0x7f04001c; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionOverflowButtonStyle=0x7f04001d; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int actionOverflowMenuStyle=0x7f04001e; - /** - * The name of an optional ActionProvider class to instantiate an action view - * and perform operations such as default action for that menu item. - * See {@link android.view.MenuItem#setActionProvider(android.view.ActionProvider)} - * for more info. - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - */ - public static final int actionProviderClass=0x7f04001f; - /** - * The name of an optional View class to instantiate and use as an - * action view. See {@link android.view.MenuItem#setActionView(android.view.View)} - * for more info. - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - */ - public static final int actionViewClass=0x7f040020; - /** - * Default ActivityChooserView style. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int activityChooserViewStyle=0x7f040021; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int alertDialogButtonGroupStyle=0x7f040022; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int alertDialogCenterButtons=0x7f040023; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int alertDialogStyle=0x7f040024; - /** - * Theme to use for alert dialogs spawned from this theme. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int alertDialogTheme=0x7f040025; - /** - * Whether to automatically stack the buttons when there is not - * enough space to lay them out side-by-side. - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int allowStacking=0x7f040026; - /** - * Alpha multiplier applied to the base color. - *

May be a floating point value, such as "1.2". - */ - public static final int alpha=0x7f040027; - /** - * The alphabetic modifier key. This is the modifier when using a keyboard - * with alphabetic keys. The values should be kept in sync with KeyEvent - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
ALT2
CTRL1000
FUNCTION8
META10000
SHIFT1
SYM4
- */ - public static final int alphabeticModifiers=0x7f040028; - /** - * The length of the arrow head when formed to make an arrow - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int arrowHeadLength=0x7f040029; - /** - * The length of the shaft when formed to make an arrow - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int arrowShaftLength=0x7f04002a; - /** - * Default AutoCompleteTextView style. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int autoCompleteTextViewStyle=0x7f04002b; - /** - * The maximum text size constraint to be used when auto-sizing text. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int autoSizeMaxTextSize=0x7f04002c; - /** - * The minimum text size constraint to be used when auto-sizing text. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int autoSizeMinTextSize=0x7f04002d; - /** - * Resource array of dimensions to be used in conjunction with - * autoSizeTextType set to uniform. Overrides - * autoSizeStepGranularity if set. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int autoSizePresetSizes=0x7f04002e; - /** - * Specify the auto-size step size if autoSizeTextType is set to - * uniform. The default is 1px. Overwrites - * autoSizePresetSizes if set. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int autoSizeStepGranularity=0x7f04002f; - /** - * Specify the type of auto-size. Note that this feature is not supported by EditText, - * works only for TextView. - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - *
ConstantValueDescription
none0No auto-sizing (default).
uniform1Uniform horizontal and vertical text size scaling to fit within the - * container.
- */ - public static final int autoSizeTextType=0x7f040030; - /** - * Specifies a background drawable for the action bar. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int background=0x7f040031; - /** - * Specifies a background drawable for the bottom component of a split action bar. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int backgroundSplit=0x7f040032; - /** - * Specifies a background drawable for a second stacked row of the action bar. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int backgroundStacked=0x7f040033; - /** - * Tint to apply to the background. - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int backgroundTint=0x7f040034; - /** - * Blending mode used to apply the background tint. - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
add10Combines the tint and icon color and alpha channels, clamping the - * result to valid color values. Saturate(S + D)
multiplyeMultiplies the color and alpha channels of the drawable with those of - * the tint. [Sa * Da, Sc * Dc]
screenf[Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]
src_atop9The tint is drawn above the drawable, but with the drawable’s alpha - * channel masking the result. [Da, Sc * Da + (1 - Sa) * Dc]
src_in5The tint is masked by the alpha channel of the drawable. The drawable’s - * color channels are thrown out. [Sa * Da, Sc * Da]
src_over3The tint is drawn on top of the drawable. - * [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc]
- */ - public static final int backgroundTintMode=0x7f040035; - /** - * The length of the bars when they are parallel to each other - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int barLength=0x7f040036; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int barrierAllowsGoneWidgets=0x7f040037; - /** - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
bottom3
end6
left0
right1
start5
top2
- */ - public static final int barrierDirection=0x7f040038; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int behavior_autoHide=0x7f040039; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int behavior_fitToContents=0x7f04003a; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int behavior_hideable=0x7f04003b; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int behavior_overlapTop=0x7f04003c; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
autoffffffff
- */ - public static final int behavior_peekHeight=0x7f04003d; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int behavior_skipCollapsed=0x7f04003e; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int borderWidth=0x7f04003f; - /** - * Style for buttons without an explicit border, often used in groups. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int borderlessButtonStyle=0x7f040040; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int bottomAppBarStyle=0x7f040041; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int bottomNavigationStyle=0x7f040042; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int bottomSheetDialogTheme=0x7f040043; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int bottomSheetStyle=0x7f040044; - /** - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int boxBackgroundColor=0x7f040045; - /** - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
filled1
none0
outline2
- */ - public static final int boxBackgroundMode=0x7f040046; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int boxCollapsedPaddingTop=0x7f040047; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int boxCornerRadiusBottomEnd=0x7f040048; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int boxCornerRadiusBottomStart=0x7f040049; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int boxCornerRadiusTopEnd=0x7f04004a; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int boxCornerRadiusTopStart=0x7f04004b; - /** - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int boxStrokeColor=0x7f04004c; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int boxStrokeWidth=0x7f04004d; - /** - * Style for buttons within button bars - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int buttonBarButtonStyle=0x7f04004e; - /** - * Style for the "negative" buttons within button bars - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int buttonBarNegativeButtonStyle=0x7f04004f; - /** - * Style for the "neutral" buttons within button bars - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int buttonBarNeutralButtonStyle=0x7f040050; - /** - * Style for the "positive" buttons within button bars - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int buttonBarPositiveButtonStyle=0x7f040051; - /** - * Style for button bars - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int buttonBarStyle=0x7f040052; - /** - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - *
ConstantValueDescription
bottom50Push object to the bottom of its container, not changing its size.
top30Push object to the top of its container, not changing its size.
- */ - public static final int buttonGravity=0x7f040053; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int buttonIconDimen=0x7f040054; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int buttonPanelSideLayout=0x7f040055; - /** - * Normal Button style. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int buttonStyle=0x7f040056; - /** - * Small Button style. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int buttonStyleSmall=0x7f040057; - /** - * Tint to apply to the button drawable. - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int buttonTint=0x7f040058; - /** - * Blending mode used to apply the button tint. - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
add10Combines the tint and icon color and alpha channels, clamping the - * result to valid color values. Saturate(S + D)
multiplyeMultiplies the color and alpha channels of the drawable with those of - * the tint. [Sa * Da, Sc * Dc]
screenf[Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]
src_atop9The tint is drawn above the drawable, but with the drawable’s alpha - * channel masking the result. [Da, Sc * Da + (1 - Sa) * Dc]
src_in5The tint is masked by the alpha channel of the drawable. The drawable’s - * color channels are thrown out. [Sa * Da, Sc * Da]
src_over3The tint is drawn on top of the drawable. - * [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc]
- */ - public static final int buttonTintMode=0x7f040059; - /** - * Background color for CardView. - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int cardBackgroundColor=0x7f04005a; - /** - * Corner radius for CardView. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int cardCornerRadius=0x7f04005b; - /** - * Elevation for CardView. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int cardElevation=0x7f04005c; - /** - * Maximum Elevation for CardView. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int cardMaxElevation=0x7f04005d; - /** - * Add padding to CardView on v20 and before to prevent intersections between the Card content and rounded corners. - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int cardPreventCornerOverlap=0x7f04005e; - /** - * Add padding in API v21+ as well to have the same measurements with previous versions. - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int cardUseCompatPadding=0x7f04005f; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int cardViewStyle=0x7f040060; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int chainUseRtl=0x7f040061; - /** - * Default Checkbox style. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int checkboxStyle=0x7f040062; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int checkedChip=0x7f040063; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int checkedIcon=0x7f040064; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int checkedIconEnabled=0x7f040065; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int checkedIconVisible=0x7f040066; - /** - * Default CheckedTextView style. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int checkedTextViewStyle=0x7f040067; - /** - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int chipBackgroundColor=0x7f040068; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int chipCornerRadius=0x7f040069; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int chipEndPadding=0x7f04006a; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int chipGroupStyle=0x7f04006b; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int chipIcon=0x7f04006c; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int chipIconEnabled=0x7f04006d; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int chipIconSize=0x7f04006e; - /** - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int chipIconTint=0x7f04006f; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int chipIconVisible=0x7f040070; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int chipMinHeight=0x7f040071; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int chipSpacing=0x7f040072; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int chipSpacingHorizontal=0x7f040073; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int chipSpacingVertical=0x7f040074; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int chipStandaloneStyle=0x7f040075; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int chipStartPadding=0x7f040076; - /** - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int chipStrokeColor=0x7f040077; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int chipStrokeWidth=0x7f040078; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int chipStyle=0x7f040079; - /** - * Close button icon - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int closeIcon=0x7f04007a; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int closeIconEnabled=0x7f04007b; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int closeIconEndPadding=0x7f04007c; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int closeIconSize=0x7f04007d; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int closeIconStartPadding=0x7f04007e; - /** - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int closeIconTint=0x7f04007f; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int closeIconVisible=0x7f040080; - /** - * Specifies a layout to use for the "close" item at the starting edge. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int closeItemLayout=0x7f040081; - /** - * Text to set as the content description for the collapse button. - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - */ - public static final int collapseContentDescription=0x7f040082; - /** - * Icon drawable to use for the collapse button. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int collapseIcon=0x7f040083; - /** - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
bottom50
center11
center_horizontal1
center_vertical10
end800005
fill_vertical70
left3
right5
start800003
top30
- */ - public static final int collapsedTitleGravity=0x7f040084; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int collapsedTitleTextAppearance=0x7f040085; - /** - * The drawing color for the bars - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int color=0x7f040086; - /** - * Bright complement to the primary branding color. By default, this is the color applied - * to framework controls (via colorControlActivated). - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int colorAccent=0x7f040087; - /** - * Default color of background imagery for floating components, ex. dialogs, popups, and cards. - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int colorBackgroundFloating=0x7f040088; - /** - * The color applied to framework buttons in their normal state. - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int colorButtonNormal=0x7f040089; - /** - * The color applied to framework controls in their activated (ex. checked) state. - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int colorControlActivated=0x7f04008a; - /** - * The color applied to framework control highlights (ex. ripples, list selectors). - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int colorControlHighlight=0x7f04008b; - /** - * The color applied to framework controls in their normal state. - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int colorControlNormal=0x7f04008c; - /** - * Color used for error states and things that need to be drawn to - * the user's attention. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int colorError=0x7f04008d; - /** - * The primary branding color for the app. By default, this is the color applied to the - * action bar background. - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int colorPrimary=0x7f04008e; - /** - * Dark variant of the primary branding color. By default, this is the color applied to - * the status bar (via statusBarColor) and navigation bar (via navigationBarColor). - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int colorPrimaryDark=0x7f04008f; - /** - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int colorSecondary=0x7f040090; - /** - * The color applied to framework switch thumbs in their normal state. - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int colorSwitchThumbNormal=0x7f040091; - /** - * Commit icon shown in the query suggestion row - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int commitIcon=0x7f040092; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int constraintSet=0x7f040093; - /** - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - */ - public static final int constraint_referenced_ids=0x7f040094; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int content=0x7f040095; - /** - * The content description associated with the item. - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - */ - public static final int contentDescription=0x7f040096; - /** - * Minimum inset for content views within a bar. Navigation buttons and - * menu views are excepted. Only valid for some themes and configurations. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int contentInsetEnd=0x7f040097; - /** - * Minimum inset for content views within a bar when actions from a menu - * are present. Only valid for some themes and configurations. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int contentInsetEndWithActions=0x7f040098; - /** - * Minimum inset for content views within a bar. Navigation buttons and - * menu views are excepted. Only valid for some themes and configurations. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int contentInsetLeft=0x7f040099; - /** - * Minimum inset for content views within a bar. Navigation buttons and - * menu views are excepted. Only valid for some themes and configurations. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int contentInsetRight=0x7f04009a; - /** - * Minimum inset for content views within a bar. Navigation buttons and - * menu views are excepted. Only valid for some themes and configurations. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int contentInsetStart=0x7f04009b; - /** - * Minimum inset for content views within a bar when a navigation button - * is present, such as the Up button. Only valid for some themes and configurations. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int contentInsetStartWithNavigation=0x7f04009c; - /** - * Inner padding between the edges of the Card and children of the CardView. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int contentPadding=0x7f04009d; - /** - * Inner padding between the bottom edge of the Card and children of the CardView. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int contentPaddingBottom=0x7f04009e; - /** - * Inner padding between the left edge of the Card and children of the CardView. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int contentPaddingLeft=0x7f04009f; - /** - * Inner padding between the right edge of the Card and children of the CardView. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int contentPaddingRight=0x7f0400a0; - /** - * Inner padding between the top edge of the Card and children of the CardView. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int contentPaddingTop=0x7f0400a1; - /** - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int contentScrim=0x7f0400a2; - /** - * The background used by framework controls. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int controlBackground=0x7f0400a3; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int coordinatorLayoutStyle=0x7f0400a4; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int cornerRadius=0x7f0400a5; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int counterEnabled=0x7f0400a6; - /** - *

May be an integer value, such as "100". - */ - public static final int counterMaxLength=0x7f0400a7; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int counterOverflowTextAppearance=0x7f0400a8; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int counterTextAppearance=0x7f0400a9; - /** - * Specifies a layout for custom navigation. Overrides navigationMode. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int customNavigationLayout=0x7f0400aa; - /** - * Default query hint used when {@code queryHint} is undefined and - * the search view's {@code SearchableInfo} does not provide a hint. - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - */ - public static final int defaultQueryHint=0x7f0400ab; - /** - * Preferred corner radius of dialogs. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int dialogCornerRadius=0x7f0400ac; - /** - * Preferred padding for dialog content. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int dialogPreferredPadding=0x7f0400ad; - /** - * Theme to use for dialogs spawned from this theme. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int dialogTheme=0x7f0400ae; - /** - * Options affecting how the action bar is displayed. - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
disableHome20
homeAsUp4
none0
showCustom10
showHome2
showTitle8
useLogo1
- */ - public static final int displayOptions=0x7f0400af; - /** - * Specifies the drawable used for item dividers. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int divider=0x7f0400b0; - /** - * A drawable that may be used as a horizontal divider between visual elements. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int dividerHorizontal=0x7f0400b1; - /** - * Size of padding on either end of a divider. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int dividerPadding=0x7f0400b2; - /** - * A drawable that may be used as a vertical divider between visual elements. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int dividerVertical=0x7f0400b3; - /** - * The total size of the drawable - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int drawableSize=0x7f0400b4; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int drawerArrowStyle=0x7f0400b5; - /** - * ListPopupWindow compatibility - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int dropDownListViewStyle=0x7f0400b6; - /** - * The preferred item height for dropdown lists. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int dropdownListPreferredItemHeight=0x7f0400b7; - /** - * EditText background drawable. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int editTextBackground=0x7f0400b8; - /** - * EditText text foreground color. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int editTextColor=0x7f0400b9; - /** - * Default EditText style. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int editTextStyle=0x7f0400ba; - /** - * Elevation for the action bar itself - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int elevation=0x7f0400bb; - /** - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - *
ConstantValueDescription
gone0
invisible1
- */ - public static final int emptyVisibility=0x7f0400bc; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int enforceMaterialTheme=0x7f0400bd; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int enforceTextAppearance=0x7f0400be; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int errorEnabled=0x7f0400bf; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int errorTextAppearance=0x7f0400c0; - /** - * The drawable to show in the button for expanding the activities overflow popup. - * Note: Clients would like to set this drawable - * as a clue about the action the chosen activity will perform. For - * example, if share activity is to be chosen the drawable should - * give a clue that sharing is to be performed. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int expandActivityOverflowButtonDrawable=0x7f0400c1; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int expanded=0x7f0400c2; - /** - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
bottom50
center11
center_horizontal1
center_vertical10
end800005
fill_vertical70
left3
right5
start800003
top30
- */ - public static final int expandedTitleGravity=0x7f0400c3; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int expandedTitleMargin=0x7f0400c4; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int expandedTitleMarginBottom=0x7f0400c5; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int expandedTitleMarginEnd=0x7f0400c6; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int expandedTitleMarginStart=0x7f0400c7; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int expandedTitleMarginTop=0x7f0400c8; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int expandedTitleTextAppearance=0x7f0400c9; - /** - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - *
ConstantValueDescription
center0
end1
- */ - public static final int fabAlignmentMode=0x7f0400ca; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int fabCradleMargin=0x7f0400cb; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int fabCradleRoundedCornerRadius=0x7f0400cc; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int fabCradleVerticalOffset=0x7f0400cd; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int fabCustomSize=0x7f0400ce; - /** - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
autoffffffff
mini1
normal0
- */ - public static final int fabSize=0x7f0400cf; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int fastScrollEnabled=0x7f0400d0; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int fastScrollHorizontalThumbDrawable=0x7f0400d1; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int fastScrollHorizontalTrackDrawable=0x7f0400d2; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int fastScrollVerticalThumbDrawable=0x7f0400d3; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int fastScrollVerticalTrackDrawable=0x7f0400d4; - /** - * Distance from the top of the TextView to the first text baseline. If set, this - * overrides the value set for paddingTop. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int firstBaselineToTopHeight=0x7f0400d5; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - *

May be an integer value, such as "100". - *

May be a boolean value, such as "true" or - * "false". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - *

May be a floating point value, such as "1.2". - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

May be a fractional value, which is a floating point number appended with - * either % or %p, such as "14.5%". - * The % suffix always means a percentage of the base size; - * the optional %p suffix provides a size relative to some parent container. - */ - public static final int floatingActionButtonStyle=0x7f0400d6; - /** - * The reference to the font file to be used. This should be a file in the res/font folder - * and should therefore have an R reference value. E.g. @font/myfont - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int font=0x7f0400d7; - /** - * The attribute for the font family. - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - */ - public static final int fontFamily=0x7f0400d8; - /** - * The authority of the Font Provider to be used for the request. - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - */ - public static final int fontProviderAuthority=0x7f0400d9; - /** - * The sets of hashes for the certificates the provider should be signed with. This is - * used to verify the identity of the provider, and is only required if the provider is not - * part of the system image. This value may point to one list or a list of lists, where each - * individual list represents one collection of signature hashes. Refer to your font provider's - * documentation for these values. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int fontProviderCerts=0x7f0400da; - /** - * The strategy to be used when fetching font data from a font provider in XML layouts. - * This attribute is ignored when the resource is loaded from code, as it is equivalent to the - * choice of API between {@link - * androidx.core.content.res.ResourcesCompat#getFont(Context, int)} (blocking) and - * {@link - * androidx.core.content.res.ResourcesCompat#getFont(Context, int, FontCallback, Handler)} - * (async). - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - *
ConstantValueDescription
async1The async font fetch works as follows. - * First, check the local cache, then if the requeted font is not cached, trigger a - * request the font and continue with layout inflation. Once the font fetch succeeds, the - * target text view will be refreshed with the downloaded font data. The - * fontProviderFetchTimeout will be ignored if async loading is specified.
blocking0The blocking font fetch works as follows. - * First, check the local cache, then if the requested font is not cached, request the - * font from the provider and wait until it is finished. You can change the length of - * the timeout by modifying fontProviderFetchTimeout. If the timeout happens, the - * default typeface will be used instead.
- */ - public static final int fontProviderFetchStrategy=0x7f0400db; - /** - * The length of the timeout during fetching. - *

May be an integer value, such as "100". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
foreverffffffffA special value for the timeout. In this case, the blocking font fetching will not - * timeout and wait until a reply is received from the font provider.
- */ - public static final int fontProviderFetchTimeout=0x7f0400dc; - /** - * The package for the Font Provider to be used for the request. This is used to verify - * the identity of the provider. - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - */ - public static final int fontProviderPackage=0x7f0400dd; - /** - * The query to be sent over to the provider. Refer to your font provider's documentation - * on the format of this string. - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - */ - public static final int fontProviderQuery=0x7f0400de; - /** - * The style of the given font file. This will be used when the font is being loaded into - * the font stack and will override any style information in the font's header tables. If - * unspecified, the value in the font's header tables will be used. - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - *
ConstantValueDescription
italic1
normal0
- */ - public static final int fontStyle=0x7f0400df; - /** - * The variation settings to be applied to the font. The string should be in the following - * format: "'tag1' value1, 'tag2' value2, ...". If the default variation settings should be - * used, or the font used does not support variation settings, this attribute needs not be - * specified. - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - */ - public static final int fontVariationSettings=0x7f0400e0; - /** - * The weight of the given font file. This will be used when the font is being loaded into - * the font stack and will override any weight information in the font's header tables. Must - * be a positive number, a multiple of 100, and between 100 and 900, inclusive. The most - * common values are 400 for regular weight and 700 for bold weight. If unspecified, the value - * in the font's header tables will be used. - *

May be an integer value, such as "100". - */ - public static final int fontWeight=0x7f0400e1; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int foregroundInsidePadding=0x7f0400e2; - /** - * The max gap between the bars when they are parallel to each other - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int gapBetweenBars=0x7f0400e3; - /** - * Go button icon - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int goIcon=0x7f0400e4; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int headerLayout=0x7f0400e5; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int height=0x7f0400e6; - /** - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - */ - public static final int helperText=0x7f0400e7; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int helperTextEnabled=0x7f0400e8; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int helperTextTextAppearance=0x7f0400e9; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int hideMotionSpec=0x7f0400ea; - /** - * Set true to hide the action bar on a vertical nested scroll of content. - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int hideOnContentScroll=0x7f0400eb; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int hideOnScroll=0x7f0400ec; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int hintAnimationEnabled=0x7f0400ed; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int hintEnabled=0x7f0400ee; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int hintTextAppearance=0x7f0400ef; - /** - * Specifies a drawable to use for the 'home as up' indicator. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int homeAsUpIndicator=0x7f0400f0; - /** - * Specifies a layout to use for the "home" section of the action bar. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int homeLayout=0x7f0400f1; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int hoveredFocusedTranslationZ=0x7f0400f2; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int icon=0x7f0400f3; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int iconEndPadding=0x7f0400f4; - /** - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - *
ConstantValueDescription
start1
textStart2
- */ - public static final int iconGravity=0x7f0400f5; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int iconPadding=0x7f0400f6; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int iconSize=0x7f0400f7; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int iconStartPadding=0x7f0400f8; - /** - * Tint to apply to the icon. - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int iconTint=0x7f0400f9; - /** - * Blending mode used to apply the icon tint. - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
add10Combines the tint and icon color and alpha channels, clamping the - * result to valid color values. Saturate(S + D)
multiplyeMultiplies the color and alpha channels of the icon with those of - * the tint. [Sa * Da, Sc * Dc]
screenf[Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]
src_atop9The tint is drawn above the icon, but with the icon’s alpha - * channel masking the result. [Da, Sc * Da + (1 - Sa) * Dc]
src_in5The tint is masked by the alpha channel of the icon. The icon’s - * color channels are thrown out. [Sa * Da, Sc * Da]
src_over3The tint is drawn on top of the icon. - * [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc]
- */ - public static final int iconTintMode=0x7f0400fa; - /** - * The default state of the SearchView. If true, it will be iconified when not in - * use and expanded when clicked. - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int iconifiedByDefault=0x7f0400fb; - /** - * ImageButton background drawable. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int imageButtonStyle=0x7f0400fc; - /** - * Specifies a style resource to use for an indeterminate progress spinner. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int indeterminateProgressStyle=0x7f0400fd; - /** - * The maximal number of items initially shown in the activity list. - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - */ - public static final int initialActivityCount=0x7f0400fe; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int insetForeground=0x7f0400ff; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int isLightTheme=0x7f040100; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int itemBackground=0x7f040101; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int itemHorizontalPadding=0x7f040102; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int itemHorizontalTranslationEnabled=0x7f040103; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int itemIconPadding=0x7f040104; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int itemIconSize=0x7f040105; - /** - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int itemIconTint=0x7f040106; - /** - * Specifies padding that should be applied to the left and right sides of - * system-provided items in the bar. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int itemPadding=0x7f040107; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int itemSpacing=0x7f040108; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int itemTextAppearance=0x7f040109; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int itemTextAppearanceActive=0x7f04010a; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int itemTextAppearanceInactive=0x7f04010b; - /** - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int itemTextColor=0x7f04010c; - /** - * A reference to an array of integers representing the - * locations of horizontal keylines in dp from the starting edge. - * Child views can refer to these keylines for alignment using - * layout_keyline="index" where index is a 0-based index into - * this array. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int keylines=0x7f04010d; - /** - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
autoffffffff
labeled1
selected0
unlabeled2
- */ - public static final int labelVisibilityMode=0x7f04010e; - /** - * Distance from the bottom of the TextView to the last text baseline. If set, this - * overrides the value set for paddingBottom. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int lastBaselineToBottomHeight=0x7f04010f; - /** - * The layout to use for the search view. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int layout=0x7f040110; - /** - * Class name of the Layout Manager to be used. - *

- * The class must extandroidx.recyclerview.widget.RecyclerViewView$LayoutManager - * and have either a default constructor or constructor with the signature - * (android.content.Context, android.util.AttributeSet, int, int). - *

- * If the name starts with a '.', application package is prefixed. - * Else, if the name contains a '.', the classname is assumed to be a full class name. - * Else, the recycler view package naandroidx.appcompat.widgetdget) is prefixed. - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - */ - public static final int layoutManager=0x7f040111; - /** - * The id of an anchor view that this view should position relative to. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int layout_anchor=0x7f040112; - /** - * Specifies how an object should position relative to an anchor, on both the X and Y axes, - * within its parent's bounds. - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
bottom50Push object to the bottom of its container, not changing its size.
center11Place the object in the center of its container in both the vertical and horizontal axis, not changing its size.
center_horizontal1Place object in the horizontal center of its container, not changing its size.
center_vertical10Place object in the vertical center of its container, not changing its size.
clip_horizontal8Additional option that can be set to have the left and/or right edges of - * the child clipped to its container's bounds. - * The clip will be based on the horizontal gravity: a left gravity will clip the right - * edge, a right gravity will clip the left edge, and neither will clip both edges.
clip_vertical80Additional option that can be set to have the top and/or bottom edges of - * the child clipped to its container's bounds. - * The clip will be based on the vertical gravity: a top gravity will clip the bottom - * edge, a bottom gravity will clip the top edge, and neither will clip both edges.
end800005Push object to the end of its container, not changing its size.
fill77Grow the horizontal and vertical size of the object if needed so it completely fills its container.
fill_horizontal7Grow the horizontal size of the object if needed so it completely fills its container.
fill_vertical70Grow the vertical size of the object if needed so it completely fills its container.
left3Push object to the left of its container, not changing its size.
right5Push object to the right of its container, not changing its size.
start800003Push object to the beginning of its container, not changing its size.
top30Push object to the top of its container, not changing its size.
- */ - public static final int layout_anchorGravity=0x7f040113; - /** - * The class name of a Behavior class defining special runtime behavior - * for this child view. - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - */ - public static final int layout_behavior=0x7f040114; - /** - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
none0
parallax2
pin1
- */ - public static final int layout_collapseMode=0x7f040115; - /** - *

May be a floating point value, such as "1.2". - */ - public static final int layout_collapseParallaxMultiplier=0x7f040116; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int layout_constrainedHeight=0x7f040117; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int layout_constrainedWidth=0x7f040118; - /** - *

May be an integer value, such as "100". - */ - public static final int layout_constraintBaseline_creator=0x7f040119; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- */ - public static final int layout_constraintBaseline_toBaselineOf=0x7f04011a; - /** - *

May be an integer value, such as "100". - */ - public static final int layout_constraintBottom_creator=0x7f04011b; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- */ - public static final int layout_constraintBottom_toBottomOf=0x7f04011c; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- */ - public static final int layout_constraintBottom_toTopOf=0x7f04011d; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int layout_constraintCircle=0x7f04011e; - /** - *

May be an integer value, such as "100". - */ - public static final int layout_constraintCircleAngle=0x7f04011f; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int layout_constraintCircleRadius=0x7f040120; - /** - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - */ - public static final int layout_constraintDimensionRatio=0x7f040121; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- */ - public static final int layout_constraintEnd_toEndOf=0x7f040122; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- */ - public static final int layout_constraintEnd_toStartOf=0x7f040123; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int layout_constraintGuide_begin=0x7f040124; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int layout_constraintGuide_end=0x7f040125; - /** - *

May be a floating point value, such as "1.2". - */ - public static final int layout_constraintGuide_percent=0x7f040126; - /** - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
percent2
spread0
wrap1
- */ - public static final int layout_constraintHeight_default=0x7f040127; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
wrapfffffffe
- */ - public static final int layout_constraintHeight_max=0x7f040128; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
wrapfffffffe
- */ - public static final int layout_constraintHeight_min=0x7f040129; - /** - *

May be a floating point value, such as "1.2". - */ - public static final int layout_constraintHeight_percent=0x7f04012a; - /** - *

May be a floating point value, such as "1.2". - */ - public static final int layout_constraintHorizontal_bias=0x7f04012b; - /** - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
packed2
spread0
spread_inside1
- */ - public static final int layout_constraintHorizontal_chainStyle=0x7f04012c; - /** - *

May be a floating point value, such as "1.2". - */ - public static final int layout_constraintHorizontal_weight=0x7f04012d; - /** - *

May be an integer value, such as "100". - */ - public static final int layout_constraintLeft_creator=0x7f04012e; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- */ - public static final int layout_constraintLeft_toLeftOf=0x7f04012f; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- */ - public static final int layout_constraintLeft_toRightOf=0x7f040130; - /** - *

May be an integer value, such as "100". - */ - public static final int layout_constraintRight_creator=0x7f040131; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- */ - public static final int layout_constraintRight_toLeftOf=0x7f040132; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- */ - public static final int layout_constraintRight_toRightOf=0x7f040133; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- */ - public static final int layout_constraintStart_toEndOf=0x7f040134; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- */ - public static final int layout_constraintStart_toStartOf=0x7f040135; - /** - *

May be an integer value, such as "100". - */ - public static final int layout_constraintTop_creator=0x7f040136; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- */ - public static final int layout_constraintTop_toBottomOf=0x7f040137; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- */ - public static final int layout_constraintTop_toTopOf=0x7f040138; - /** - *

May be a floating point value, such as "1.2". - */ - public static final int layout_constraintVertical_bias=0x7f040139; - /** - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
packed2
spread0
spread_inside1
- */ - public static final int layout_constraintVertical_chainStyle=0x7f04013a; - /** - *

May be a floating point value, such as "1.2". - */ - public static final int layout_constraintVertical_weight=0x7f04013b; - /** - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
percent2
spread0
wrap1
- */ - public static final int layout_constraintWidth_default=0x7f04013c; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
wrapfffffffe
- */ - public static final int layout_constraintWidth_max=0x7f04013d; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
wrapfffffffe
- */ - public static final int layout_constraintWidth_min=0x7f04013e; - /** - *

May be a floating point value, such as "1.2". - */ - public static final int layout_constraintWidth_percent=0x7f04013f; - /** - * Specifies how this view dodges the inset edges of the CoordinatorLayout. - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
all77Dodge all the inset edges.
bottom50Dodge the bottom inset edge.
end800005Dodge the end inset edge.
left3Dodge the left inset edge.
none0Don't dodge any edges
right5Dodge the right inset edge.
start800003Dodge the start inset edge.
top30Dodge the top inset edge.
- */ - public static final int layout_dodgeInsetEdges=0x7f040140; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int layout_editor_absoluteX=0x7f040141; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int layout_editor_absoluteY=0x7f040142; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int layout_goneMarginBottom=0x7f040143; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int layout_goneMarginEnd=0x7f040144; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int layout_goneMarginLeft=0x7f040145; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int layout_goneMarginRight=0x7f040146; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int layout_goneMarginStart=0x7f040147; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int layout_goneMarginTop=0x7f040148; - /** - * Specifies how this view insets the CoordinatorLayout and make some other views - * dodge it. - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
bottom50Inset the bottom edge.
end800005Inset the end edge.
left3Inset the left edge.
none0Don't inset.
right5Inset the right edge.
start800003Inset the start edge.
top30Inset the top edge.
- */ - public static final int layout_insetEdge=0x7f040149; - /** - * The index of a keyline this view should position relative to. - * android:layout_gravity will affect how the view aligns to the - * specified keyline. - *

May be an integer value, such as "100". - */ - public static final int layout_keyline=0x7f04014a; - /** - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
barrier2
chains4
dimensions8
direct1direct, barriers, chains
groups20
none0
standard7
- */ - public static final int layout_optimizationLevel=0x7f04014b; - /** - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
enterAlways4
enterAlwaysCollapsed8
exitUntilCollapsed2
scroll1
snap10
snapMargins20
- */ - public static final int layout_scrollFlags=0x7f04014c; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int layout_scrollInterpolator=0x7f04014d; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int liftOnScroll=0x7f04014e; - /** - * Explicit height between lines of text. If set, this will override the values set - * for lineSpacingExtra and lineSpacingMultiplier. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int lineHeight=0x7f04014f; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int lineSpacing=0x7f040150; - /** - * Drawable used as a background for selected list items. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int listChoiceBackgroundIndicator=0x7f040151; - /** - * The list divider used in alert dialogs. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int listDividerAlertDialog=0x7f040152; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int listItemLayout=0x7f040153; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int listLayout=0x7f040154; - /** - * Default menu-style ListView style. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int listMenuViewStyle=0x7f040155; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int listPopupWindowStyle=0x7f040156; - /** - * The preferred list item height. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int listPreferredItemHeight=0x7f040157; - /** - * A larger, more robust list item height. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int listPreferredItemHeightLarge=0x7f040158; - /** - * A smaller, sleeker list item height. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int listPreferredItemHeightSmall=0x7f040159; - /** - * The preferred padding along the left edge of list items. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int listPreferredItemPaddingLeft=0x7f04015a; - /** - * The preferred padding along the right edge of list items. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int listPreferredItemPaddingRight=0x7f04015b; - /** - * Specifies the drawable used for the application logo. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int logo=0x7f04015c; - /** - * A content description string to describe the appearance of the - * associated logo image. - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - */ - public static final int logoDescription=0x7f04015d; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int materialButtonStyle=0x7f04015e; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int materialCardViewStyle=0x7f04015f; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int maxActionInlineWidth=0x7f040160; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int maxButtonHeight=0x7f040161; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int maxImageSize=0x7f040162; - /** - * When set to true, all children with a weight will be considered having - * the minimum size of the largest child. If false, all children are - * measured normally. - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int measureWithLargestChild=0x7f040163; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int menu=0x7f040164; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int multiChoiceItemLayout=0x7f040165; - /** - * Text to set as the content description for the navigation button - * located at the start of the toolbar. - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - */ - public static final int navigationContentDescription=0x7f040166; - /** - * Icon drawable to use for the navigation button located at - * the start of the toolbar. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int navigationIcon=0x7f040167; - /** - * The type of navigation to use. - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
listMode1The action bar will use a selection list for navigation.
normal0Normal static title text
tabMode2The action bar will use a series of horizontal tabs for navigation.
- */ - public static final int navigationMode=0x7f040168; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int navigationViewStyle=0x7f040169; - /** - * The numeric modifier key. This is the modifier when using a numeric (e.g., 12-key) - * keyboard. The values should be kept in sync with KeyEvent - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
ALT2
CTRL1000
FUNCTION8
META10000
SHIFT1
SYM4
- */ - public static final int numericModifiers=0x7f04016a; - /** - * Whether the popup window should overlap its anchor view. - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int overlapAnchor=0x7f04016b; - /** - * Bottom padding to use when no buttons are present. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int paddingBottomNoButtons=0x7f04016c; - /** - * Sets the padding, in pixels, of the end edge; see {@link android.R.attr#padding}. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int paddingEnd=0x7f04016d; - /** - * Sets the padding, in pixels, of the start edge; see {@link android.R.attr#padding}. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int paddingStart=0x7f04016e; - /** - * Top padding to use when no title is present. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int paddingTopNoTitle=0x7f04016f; - /** - * The background of a panel when it is inset from the left and right edges of the screen. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int panelBackground=0x7f040170; - /** - * Default Panel Menu style. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int panelMenuListTheme=0x7f040171; - /** - * Default Panel Menu width. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int panelMenuListWidth=0x7f040172; - /** - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - */ - public static final int passwordToggleContentDescription=0x7f040173; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int passwordToggleDrawable=0x7f040174; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int passwordToggleEnabled=0x7f040175; - /** - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int passwordToggleTint=0x7f040176; - /** - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
multiplye
screenf
src_atop9
src_in5
src_over3
- */ - public static final int passwordToggleTintMode=0x7f040177; - /** - * Default PopupMenu style. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int popupMenuStyle=0x7f040178; - /** - * Reference to a theme that should be used to inflate popups - * shown by widgets in the action bar. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int popupTheme=0x7f040179; - /** - * Default PopupWindow style. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int popupWindowStyle=0x7f04017a; - /** - * Whether space should be reserved in layout when an icon is missing. - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int preserveIconSpacing=0x7f04017b; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int pressedTranslationZ=0x7f04017c; - /** - * Specifies the horizontal padding on either end for an embedded progress bar. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int progressBarPadding=0x7f04017d; - /** - * Specifies a style resource to use for an embedded progress bar. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int progressBarStyle=0x7f04017e; - /** - * Background for the section containing the search query - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int queryBackground=0x7f04017f; - /** - * An optional user-defined query hint string to be displayed in the empty query field. - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - */ - public static final int queryHint=0x7f040180; - /** - * Default RadioButton style. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int radioButtonStyle=0x7f040181; - /** - * Default RatingBar style. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int ratingBarStyle=0x7f040182; - /** - * Indicator RatingBar style. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int ratingBarStyleIndicator=0x7f040183; - /** - * Small indicator RatingBar style. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int ratingBarStyleSmall=0x7f040184; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int reverseLayout=0x7f040185; - /** - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int rippleColor=0x7f040186; - /** - *

May be an integer value, such as "100". - */ - public static final int scrimAnimationDuration=0x7f040187; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int scrimBackground=0x7f040188; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int scrimVisibleHeightTrigger=0x7f040189; - /** - * Search icon displayed as a text field hint - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int searchHintIcon=0x7f04018a; - /** - * Search icon - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int searchIcon=0x7f04018b; - /** - * Style for the search query widget. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int searchViewStyle=0x7f04018c; - /** - * Default SeekBar style. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int seekBarStyle=0x7f04018d; - /** - * A style that may be applied to buttons or other selectable items - * that should react to pressed and focus states, but that do not - * have a clear visual border along the edges. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int selectableItemBackground=0x7f04018e; - /** - * Background drawable for borderless standalone items that need focus/pressed states. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int selectableItemBackgroundBorderless=0x7f04018f; - /** - * How this item should display in the Action Bar, if present. - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
always2Always show this item in an actionbar, even if it would override - * the system's limits of how much stuff to put there. This may make - * your action bar look bad on some screens. In most cases you should - * use "ifRoom" instead. Mutually exclusive with "ifRoom" and "never".
collapseActionView8This item's action view collapses to a normal menu - * item. When expanded, the action view takes over a - * larger segment of its container.
ifRoom1Show this item in an action bar if there is room for it as determined - * by the system. Favor this option over "always" where possible. - * Mutually exclusive with "never" and "always".
never0Never show this item in an action bar, show it in the overflow menu instead. - * Mutually exclusive with "ifRoom" and "always".
withText4When this item is shown as an action in the action bar, show a text - * label with it even if it has an icon representation.
- */ - public static final int showAsAction=0x7f040190; - /** - * Setting for which dividers to show. - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
beginning1
end4
middle2
none0
- */ - public static final int showDividers=0x7f040191; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int showMotionSpec=0x7f040192; - /** - * Whether to draw on/off text. - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int showText=0x7f040193; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int showTitle=0x7f040194; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int singleChoiceItemLayout=0x7f040195; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int singleLine=0x7f040196; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int singleSelection=0x7f040197; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int snackbarButtonStyle=0x7f040198; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int snackbarStyle=0x7f040199; - /** - *

May be an integer value, such as "100". - */ - public static final int spanCount=0x7f04019a; - /** - * Whether bars should rotate or not during transition - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int spinBars=0x7f04019b; - /** - * Default Spinner style. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int spinnerDropDownItemStyle=0x7f04019c; - /** - * Default Spinner style. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int spinnerStyle=0x7f04019d; - /** - * Whether to split the track and leave a gap for the thumb drawable. - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int splitTrack=0x7f04019e; - /** - * Sets a drawable as the content of this ImageView. Allows the use of vector drawable - * when running on older versions of the platform. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int srcCompat=0x7f04019f; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int stackFromEnd=0x7f0401a0; - /** - * State identifier indicating the popup will be above the anchor. - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int state_above_anchor=0x7f0401a1; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int state_collapsed=0x7f0401a2; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int state_collapsible=0x7f0401a3; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int state_liftable=0x7f0401a4; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int state_lifted=0x7f0401a5; - /** - * Drawable to display behind the status bar when the view is set to draw behind it. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int statusBarBackground=0x7f0401a6; - /** - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int statusBarScrim=0x7f0401a7; - /** - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int strokeColor=0x7f0401a8; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int strokeWidth=0x7f0401a9; - /** - * Drawable for the arrow icon indicating a particular item is a submenu. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int subMenuArrow=0x7f0401aa; - /** - * Background for the section containing the action (e.g. voice search) - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int submitBackground=0x7f0401ab; - /** - * Specifies subtitle text used for navigationMode="normal" - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - */ - public static final int subtitle=0x7f0401ac; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int subtitleTextAppearance=0x7f0401ad; - /** - * A color to apply to the subtitle string. - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int subtitleTextColor=0x7f0401ae; - /** - * Specifies a style to use for subtitle text. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int subtitleTextStyle=0x7f0401af; - /** - * Layout for query suggestion rows - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int suggestionRowLayout=0x7f0401b0; - /** - * Minimum width for the switch component - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int switchMinWidth=0x7f0401b1; - /** - * Minimum space between the switch and caption text - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int switchPadding=0x7f0401b2; - /** - * Default style for the Switch widget. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int switchStyle=0x7f0401b3; - /** - * TextAppearance style for text displayed on the switch thumb. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int switchTextAppearance=0x7f0401b4; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int tabBackground=0x7f0401b5; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int tabContentStart=0x7f0401b6; - /** - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - *
ConstantValueDescription
center1
fill0
- */ - public static final int tabGravity=0x7f0401b7; - /** - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int tabIconTint=0x7f0401b8; - /** - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
add10
multiplye
screenf
src_atop9
src_in5
src_over3
- */ - public static final int tabIconTintMode=0x7f0401b9; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int tabIndicator=0x7f0401ba; - /** - *

May be an integer value, such as "100". - */ - public static final int tabIndicatorAnimationDuration=0x7f0401bb; - /** - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int tabIndicatorColor=0x7f0401bc; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int tabIndicatorFullWidth=0x7f0401bd; - /** - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
bottom0
center1
stretch3
top2
- */ - public static final int tabIndicatorGravity=0x7f0401be; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int tabIndicatorHeight=0x7f0401bf; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int tabInlineLabel=0x7f0401c0; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int tabMaxWidth=0x7f0401c1; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int tabMinWidth=0x7f0401c2; - /** - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - *
ConstantValueDescription
fixed1
scrollable0
- */ - public static final int tabMode=0x7f0401c3; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int tabPadding=0x7f0401c4; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int tabPaddingBottom=0x7f0401c5; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int tabPaddingEnd=0x7f0401c6; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int tabPaddingStart=0x7f0401c7; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int tabPaddingTop=0x7f0401c8; - /** - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int tabRippleColor=0x7f0401c9; - /** - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int tabSelectedTextColor=0x7f0401ca; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int tabStyle=0x7f0401cb; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int tabTextAppearance=0x7f0401cc; - /** - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int tabTextColor=0x7f0401cd; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int tabUnboundedRipple=0x7f0401ce; - /** - * Present the text in ALL CAPS. This may use a small-caps form when available. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int textAllCaps=0x7f0401cf; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int textAppearanceBody1=0x7f0401d0; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int textAppearanceBody2=0x7f0401d1; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int textAppearanceButton=0x7f0401d2; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int textAppearanceCaption=0x7f0401d3; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int textAppearanceHeadline1=0x7f0401d4; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int textAppearanceHeadline2=0x7f0401d5; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int textAppearanceHeadline3=0x7f0401d6; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int textAppearanceHeadline4=0x7f0401d7; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int textAppearanceHeadline5=0x7f0401d8; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int textAppearanceHeadline6=0x7f0401d9; - /** - * Text color, typeface, size, and style for the text inside of a popup menu. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int textAppearanceLargePopupMenu=0x7f0401da; - /** - * The preferred TextAppearance for the primary text of list items. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int textAppearanceListItem=0x7f0401db; - /** - * The preferred TextAppearance for the secondary text of list items. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int textAppearanceListItemSecondary=0x7f0401dc; - /** - * The preferred TextAppearance for the primary text of small list items. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int textAppearanceListItemSmall=0x7f0401dd; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int textAppearanceOverline=0x7f0401de; - /** - * Text color, typeface, size, and style for header text inside of a popup menu. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int textAppearancePopupMenuHeader=0x7f0401df; - /** - * Text color, typeface, size, and style for system search result subtitle. Defaults to primary inverse text color. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int textAppearanceSearchResultSubtitle=0x7f0401e0; - /** - * Text color, typeface, size, and style for system search result title. Defaults to primary inverse text color. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int textAppearanceSearchResultTitle=0x7f0401e1; - /** - * Text color, typeface, size, and style for small text inside of a popup menu. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int textAppearanceSmallPopupMenu=0x7f0401e2; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int textAppearanceSubtitle1=0x7f0401e3; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int textAppearanceSubtitle2=0x7f0401e4; - /** - * Color of list item text in alert dialogs. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int textColorAlertDialogListItem=0x7f0401e5; - /** - * Text color for urls in search suggestions, used by things like global search - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int textColorSearchUrl=0x7f0401e6; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int textEndPadding=0x7f0401e7; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int textInputStyle=0x7f0401e8; - /** - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int textStartPadding=0x7f0401e9; - /** - * Deprecated. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int theme=0x7f0401ea; - /** - * The thickness (stroke size) for the bar paint - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int thickness=0x7f0401eb; - /** - * Amount of padding on either side of text within the switch thumb. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int thumbTextPadding=0x7f0401ec; - /** - * Tint to apply to the thumb drawable. - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int thumbTint=0x7f0401ed; - /** - * Blending mode used to apply the thumb tint. - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
add10Combines the tint and drawable color and alpha channels, clamping the - * result to valid color values. Saturate(S + D)
multiplyeMultiplies the color and alpha channels of the drawable with those of - * the tint. [Sa * Da, Sc * Dc]
screenf[Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]
src_atop9The tint is drawn above the drawable, but with the drawable’s alpha - * channel masking the result. [Da, Sc * Da + (1 - Sa) * Dc]
src_in5The tint is masked by the alpha channel of the drawable. The drawable’s - * color channels are thrown out. [Sa * Da, Sc * Da]
src_over3The tint is drawn on top of the drawable. - * [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc]
- */ - public static final int thumbTintMode=0x7f0401ee; - /** - * Drawable displayed at each progress position on a seekbar. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int tickMark=0x7f0401ef; - /** - * Tint to apply to the tick mark drawable. - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int tickMarkTint=0x7f0401f0; - /** - * Blending mode used to apply the tick mark tint. - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
add10Combines the tint and drawable color and alpha channels, clamping the - * result to valid color values. Saturate(S + D)
multiplyeMultiplies the color and alpha channels of the drawable with those of - * the tint. [Sa * Da, Sc * Dc]
screenf[Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]
src_atop9The tint is drawn above the drawable, but with the drawable’s alpha - * channel masking the result. [Da, Sc * Da + (1 - Sa) * Dc]
src_in5The tint is masked by the alpha channel of the drawable. The drawable’s - * color channels are thrown out. [Sa * Da, Sc * Da]
src_over3The tint is drawn on top of the drawable. - * [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc]
- */ - public static final int tickMarkTintMode=0x7f0401f1; - /** - * Tint to apply to the image source. - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int tint=0x7f0401f2; - /** - * Blending mode used to apply the image source tint. - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
add10Combines the tint and icon color and alpha channels, clamping the - * result to valid color values. Saturate(S + D)
multiplyeMultiplies the color and alpha channels of the drawable with those of - * the tint. [Sa * Da, Sc * Dc]
screenf[Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]
src_atop9The tint is drawn above the drawable, but with the drawable’s alpha - * channel masking the result. [Da, Sc * Da + (1 - Sa) * Dc]
src_in5The tint is masked by the alpha channel of the drawable. The drawable’s - * color channels are thrown out. [Sa * Da, Sc * Da]
src_over3The tint is drawn on top of the drawable. - * [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc]
- */ - public static final int tintMode=0x7f0401f3; - /** - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - */ - public static final int title=0x7f0401f4; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int titleEnabled=0x7f0401f5; - /** - * Specifies extra space on the left, start, right and end sides - * of the toolbar's title. Margin values should be positive. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int titleMargin=0x7f0401f6; - /** - * Specifies extra space on the bottom side of the toolbar's title. - * If both this attribute and titleMargin are specified, then this - * attribute takes precedence. Margin values should be positive. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int titleMarginBottom=0x7f0401f7; - /** - * Specifies extra space on the end side of the toolbar's title. - * If both this attribute and titleMargin are specified, then this - * attribute takes precedence. Margin values should be positive. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int titleMarginEnd=0x7f0401f8; - /** - * Specifies extra space on the start side of the toolbar's title. - * If both this attribute and titleMargin are specified, then this - * attribute takes precedence. Margin values should be positive. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int titleMarginStart=0x7f0401f9; - /** - * Specifies extra space on the top side of the toolbar's title. - * If both this attribute and titleMargin are specified, then this - * attribute takes precedence. Margin values should be positive. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - public static final int titleMarginTop=0x7f0401fa; - /** - * {@deprecated Use titleMargin} - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - */ - @Deprecated - public static final int titleMargins=0x7f0401fb; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int titleTextAppearance=0x7f0401fc; - /** - * A color to apply to the title string. - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int titleTextColor=0x7f0401fd; - /** - * Specifies a style to use for title text. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int titleTextStyle=0x7f0401fe; - /** - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int toolbarId=0x7f0401ff; - /** - * Default Toolar NavigationButtonStyle - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int toolbarNavigationButtonStyle=0x7f040200; - /** - * Default Toolbar style. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int toolbarStyle=0x7f040201; - /** - * Foreground color to use for tooltips - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int tooltipForegroundColor=0x7f040202; - /** - * Background to use for tooltips - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int tooltipFrameBackground=0x7f040203; - /** - * The tooltip text associated with the item. - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - */ - public static final int tooltipText=0x7f040204; - /** - * Drawable to use as the "track" that the switch thumb slides within. - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int track=0x7f040205; - /** - * Tint to apply to the track. - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - */ - public static final int trackTint=0x7f040206; - /** - * Blending mode used to apply the track tint. - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
add10Combines the tint and drawable color and alpha channels, clamping the - * result to valid color values. Saturate(S + D)
multiplyeMultiplies the color and alpha channels of the drawable with those of - * the tint. [Sa * Da, Sc * Dc]
screenf[Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]
src_atop9The tint is drawn above the drawable, but with the drawable’s alpha - * channel masking the result. [Da, Sc * Da + (1 - Sa) * Dc]
src_in5The tint is masked by the alpha channel of the drawable. The drawable’s - * color channels are thrown out. [Sa * Da, Sc * Da]
src_over3The tint is drawn on top of the drawable. - * [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc]
- */ - public static final int trackTintMode=0x7f040207; - /** - * The index of the font in the tcc font file. If the font file referenced is not in the - * tcc format, this attribute needs not be specified. - *

May be an integer value, such as "100". - */ - public static final int ttcIndex=0x7f040208; - /** - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int useCompatPadding=0x7f040209; - /** - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - */ - public static final int viewInflaterClass=0x7f04020a; - /** - * Voice button icon - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - */ - public static final int voiceIcon=0x7f04020b; - /** - * Flag indicating whether this window should have an Action Bar - * in place of the usual title bar. - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int windowActionBar=0x7f04020c; - /** - * Flag indicating whether this window's Action Bar should overlay - * application content. Does nothing if the window would not - * have an Action Bar. - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int windowActionBarOverlay=0x7f04020d; - /** - * Flag indicating whether action modes should overlay window content - * when there is not reserved space for their UI (such as an Action Bar). - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int windowActionModeOverlay=0x7f04020e; - /** - * A fixed height for the window along the major axis of the screen, - * that is, when in portrait. Can be either an absolute dimension - * or a fraction of the screen size in that dimension. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

May be a fractional value, which is a floating point number appended with - * either % or %p, such as "14.5%". - * The % suffix always means a percentage of the base size; - * the optional %p suffix provides a size relative to some parent container. - */ - public static final int windowFixedHeightMajor=0x7f04020f; - /** - * A fixed height for the window along the minor axis of the screen, - * that is, when in landscape. Can be either an absolute dimension - * or a fraction of the screen size in that dimension. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

May be a fractional value, which is a floating point number appended with - * either % or %p, such as "14.5%". - * The % suffix always means a percentage of the base size; - * the optional %p suffix provides a size relative to some parent container. - */ - public static final int windowFixedHeightMinor=0x7f040210; - /** - * A fixed width for the window along the major axis of the screen, - * that is, when in landscape. Can be either an absolute dimension - * or a fraction of the screen size in that dimension. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

May be a fractional value, which is a floating point number appended with - * either % or %p, such as "14.5%". - * The % suffix always means a percentage of the base size; - * the optional %p suffix provides a size relative to some parent container. - */ - public static final int windowFixedWidthMajor=0x7f040211; - /** - * A fixed width for the window along the minor axis of the screen, - * that is, when in portrait. Can be either an absolute dimension - * or a fraction of the screen size in that dimension. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

May be a fractional value, which is a floating point number appended with - * either % or %p, such as "14.5%". - * The % suffix always means a percentage of the base size; - * the optional %p suffix provides a size relative to some parent container. - */ - public static final int windowFixedWidthMinor=0x7f040212; - /** - * The minimum width the window is allowed to be, along the major - * axis of the screen. That is, when in landscape. Can be either - * an absolute dimension or a fraction of the screen size in that - * dimension. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

May be a fractional value, which is a floating point number appended with - * either % or %p, such as "14.5%". - * The % suffix always means a percentage of the base size; - * the optional %p suffix provides a size relative to some parent container. - */ - public static final int windowMinWidthMajor=0x7f040213; - /** - * The minimum width the window is allowed to be, along the minor - * axis of the screen. That is, when in portrait. Can be either - * an absolute dimension or a fraction of the screen size in that - * dimension. - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

May be a fractional value, which is a floating point number appended with - * either % or %p, such as "14.5%". - * The % suffix always means a percentage of the base size; - * the optional %p suffix provides a size relative to some parent container. - */ - public static final int windowMinWidthMinor=0x7f040214; - /** - * Flag indicating whether there should be no title on this window. - *

May be a boolean value, such as "true" or - * "false". - */ - public static final int windowNoTitle=0x7f040215; - } - public static final class bool { - public static final int abc_action_bar_embed_tabs=0x7f050000; - public static final int abc_allow_stacked_button_bar=0x7f050001; - public static final int abc_config_actionMenuItemAllCaps=0x7f050002; - public static final int mtrl_btn_textappearance_all_caps=0x7f050003; - } - public static final class color { - public static final int abc_background_cache_hint_selector_material_dark=0x7f060000; - public static final int abc_background_cache_hint_selector_material_light=0x7f060001; - public static final int abc_btn_colored_borderless_text_material=0x7f060002; - public static final int abc_btn_colored_text_material=0x7f060003; - public static final int abc_color_highlight_material=0x7f060004; - public static final int abc_hint_foreground_material_dark=0x7f060005; - public static final int abc_hint_foreground_material_light=0x7f060006; - public static final int abc_input_method_navigation_guard=0x7f060007; - public static final int abc_primary_text_disable_only_material_dark=0x7f060008; - public static final int abc_primary_text_disable_only_material_light=0x7f060009; - public static final int abc_primary_text_material_dark=0x7f06000a; - public static final int abc_primary_text_material_light=0x7f06000b; - public static final int abc_search_url_text=0x7f06000c; - public static final int abc_search_url_text_normal=0x7f06000d; - public static final int abc_search_url_text_pressed=0x7f06000e; - public static final int abc_search_url_text_selected=0x7f06000f; - public static final int abc_secondary_text_material_dark=0x7f060010; - public static final int abc_secondary_text_material_light=0x7f060011; - public static final int abc_tint_btn_checkable=0x7f060012; - public static final int abc_tint_default=0x7f060013; - public static final int abc_tint_edittext=0x7f060014; - public static final int abc_tint_seek_thumb=0x7f060015; - public static final int abc_tint_spinner=0x7f060016; - public static final int abc_tint_switch_track=0x7f060017; - public static final int accent_material_dark=0x7f060018; - public static final int accent_material_light=0x7f060019; - public static final int background_floating_material_dark=0x7f06001a; - public static final int background_floating_material_light=0x7f06001b; - public static final int background_material_dark=0x7f06001c; - public static final int background_material_light=0x7f06001d; - public static final int bright_foreground_disabled_material_dark=0x7f06001e; - public static final int bright_foreground_disabled_material_light=0x7f06001f; - public static final int bright_foreground_inverse_material_dark=0x7f060020; - public static final int bright_foreground_inverse_material_light=0x7f060021; - public static final int bright_foreground_material_dark=0x7f060022; - public static final int bright_foreground_material_light=0x7f060023; - public static final int button_material_dark=0x7f060024; - public static final int button_material_light=0x7f060025; - public static final int cardview_dark_background=0x7f060026; - public static final int cardview_light_background=0x7f060027; - public static final int cardview_shadow_end_color=0x7f060028; - public static final int cardview_shadow_start_color=0x7f060029; - public static final int colorAccent=0x7f06002a; - public static final int colorPrimary=0x7f06002b; - public static final int colorPrimaryDark=0x7f06002c; - public static final int design_bottom_navigation_shadow_color=0x7f06002d; - public static final int design_default_color_primary=0x7f06002e; - public static final int design_default_color_primary_dark=0x7f06002f; - public static final int design_error=0x7f060030; - public static final int design_fab_shadow_end_color=0x7f060031; - public static final int design_fab_shadow_mid_color=0x7f060032; - public static final int design_fab_shadow_start_color=0x7f060033; - public static final int design_fab_stroke_end_inner_color=0x7f060034; - public static final int design_fab_stroke_end_outer_color=0x7f060035; - public static final int design_fab_stroke_top_inner_color=0x7f060036; - public static final int design_fab_stroke_top_outer_color=0x7f060037; - public static final int design_snackbar_background_color=0x7f060038; - public static final int design_tint_password_toggle=0x7f060039; - public static final int dim_foreground_disabled_material_dark=0x7f06003a; - public static final int dim_foreground_disabled_material_light=0x7f06003b; - public static final int dim_foreground_material_dark=0x7f06003c; - public static final int dim_foreground_material_light=0x7f06003d; - public static final int error_color_material_dark=0x7f06003e; - public static final int error_color_material_light=0x7f06003f; - public static final int foreground_material_dark=0x7f060040; - public static final int foreground_material_light=0x7f060041; - public static final int highlighted_text_material_dark=0x7f060042; - public static final int highlighted_text_material_light=0x7f060043; - public static final int material_blue_grey_800=0x7f060044; - public static final int material_blue_grey_900=0x7f060045; - public static final int material_blue_grey_950=0x7f060046; - public static final int material_deep_teal_200=0x7f060047; - public static final int material_deep_teal_500=0x7f060048; - public static final int material_grey_100=0x7f060049; - public static final int material_grey_300=0x7f06004a; - public static final int material_grey_50=0x7f06004b; - public static final int material_grey_600=0x7f06004c; - public static final int material_grey_800=0x7f06004d; - public static final int material_grey_850=0x7f06004e; - public static final int material_grey_900=0x7f06004f; - public static final int mtrl_bottom_nav_colored_item_tint=0x7f060050; - public static final int mtrl_bottom_nav_item_tint=0x7f060051; - public static final int mtrl_btn_bg_color_disabled=0x7f060052; - public static final int mtrl_btn_bg_color_selector=0x7f060053; - public static final int mtrl_btn_ripple_color=0x7f060054; - public static final int mtrl_btn_stroke_color_selector=0x7f060055; - public static final int mtrl_btn_text_btn_ripple_color=0x7f060056; - public static final int mtrl_btn_text_color_disabled=0x7f060057; - public static final int mtrl_btn_text_color_selector=0x7f060058; - public static final int mtrl_btn_transparent_bg_color=0x7f060059; - public static final int mtrl_chip_background_color=0x7f06005a; - public static final int mtrl_chip_close_icon_tint=0x7f06005b; - public static final int mtrl_chip_ripple_color=0x7f06005c; - public static final int mtrl_chip_text_color=0x7f06005d; - public static final int mtrl_fab_ripple_color=0x7f06005e; - public static final int mtrl_scrim_color=0x7f06005f; - public static final int mtrl_tabs_colored_ripple_color=0x7f060060; - public static final int mtrl_tabs_icon_color_selector=0x7f060061; - public static final int mtrl_tabs_icon_color_selector_colored=0x7f060062; - public static final int mtrl_tabs_legacy_text_color_selector=0x7f060063; - public static final int mtrl_tabs_ripple_color=0x7f060064; - public static final int mtrl_text_btn_text_color_selector=0x7f060065; - public static final int mtrl_textinput_default_box_stroke_color=0x7f060066; - public static final int mtrl_textinput_disabled_color=0x7f060067; - public static final int mtrl_textinput_filled_box_default_background_color=0x7f060068; - public static final int mtrl_textinput_hovered_box_stroke_color=0x7f060069; - public static final int notification_action_color_filter=0x7f06006a; - public static final int notification_icon_bg_color=0x7f06006b; - public static final int primary_dark_material_dark=0x7f06006c; - public static final int primary_dark_material_light=0x7f06006d; - public static final int primary_material_dark=0x7f06006e; - public static final int primary_material_light=0x7f06006f; - public static final int primary_text_default_material_dark=0x7f060070; - public static final int primary_text_default_material_light=0x7f060071; - public static final int primary_text_disabled_material_dark=0x7f060072; - public static final int primary_text_disabled_material_light=0x7f060073; - public static final int ripple_material_dark=0x7f060074; - public static final int ripple_material_light=0x7f060075; - public static final int secondary_text_default_material_dark=0x7f060076; - public static final int secondary_text_default_material_light=0x7f060077; - public static final int secondary_text_disabled_material_dark=0x7f060078; - public static final int secondary_text_disabled_material_light=0x7f060079; - public static final int switch_thumb_disabled_material_dark=0x7f06007a; - public static final int switch_thumb_disabled_material_light=0x7f06007b; - public static final int switch_thumb_material_dark=0x7f06007c; - public static final int switch_thumb_material_light=0x7f06007d; - public static final int switch_thumb_normal_material_dark=0x7f06007e; - public static final int switch_thumb_normal_material_light=0x7f06007f; - public static final int tooltip_background_dark=0x7f060080; - public static final int tooltip_background_light=0x7f060081; - } - public static final class dimen { - public static final int abc_action_bar_content_inset_material=0x7f070000; - public static final int abc_action_bar_content_inset_with_nav=0x7f070001; - public static final int abc_action_bar_default_height_material=0x7f070002; - public static final int abc_action_bar_default_padding_end_material=0x7f070003; - public static final int abc_action_bar_default_padding_start_material=0x7f070004; - public static final int abc_action_bar_elevation_material=0x7f070005; - public static final int abc_action_bar_icon_vertical_padding_material=0x7f070006; - public static final int abc_action_bar_overflow_padding_end_material=0x7f070007; - public static final int abc_action_bar_overflow_padding_start_material=0x7f070008; - public static final int abc_action_bar_stacked_max_height=0x7f070009; - public static final int abc_action_bar_stacked_tab_max_width=0x7f07000a; - public static final int abc_action_bar_subtitle_bottom_margin_material=0x7f07000b; - public static final int abc_action_bar_subtitle_top_margin_material=0x7f07000c; - public static final int abc_action_button_min_height_material=0x7f07000d; - public static final int abc_action_button_min_width_material=0x7f07000e; - public static final int abc_action_button_min_width_overflow_material=0x7f07000f; - public static final int abc_alert_dialog_button_bar_height=0x7f070010; - public static final int abc_alert_dialog_button_dimen=0x7f070011; - public static final int abc_button_inset_horizontal_material=0x7f070012; - public static final int abc_button_inset_vertical_material=0x7f070013; - public static final int abc_button_padding_horizontal_material=0x7f070014; - public static final int abc_button_padding_vertical_material=0x7f070015; - public static final int abc_cascading_menus_min_smallest_width=0x7f070016; - public static final int abc_config_prefDialogWidth=0x7f070017; - public static final int abc_control_corner_material=0x7f070018; - public static final int abc_control_inset_material=0x7f070019; - public static final int abc_control_padding_material=0x7f07001a; - public static final int abc_dialog_corner_radius_material=0x7f07001b; - public static final int abc_dialog_fixed_height_major=0x7f07001c; - public static final int abc_dialog_fixed_height_minor=0x7f07001d; - public static final int abc_dialog_fixed_width_major=0x7f07001e; - public static final int abc_dialog_fixed_width_minor=0x7f07001f; - public static final int abc_dialog_list_padding_bottom_no_buttons=0x7f070020; - public static final int abc_dialog_list_padding_top_no_title=0x7f070021; - public static final int abc_dialog_min_width_major=0x7f070022; - public static final int abc_dialog_min_width_minor=0x7f070023; - public static final int abc_dialog_padding_material=0x7f070024; - public static final int abc_dialog_padding_top_material=0x7f070025; - public static final int abc_dialog_title_divider_material=0x7f070026; - public static final int abc_disabled_alpha_material_dark=0x7f070027; - public static final int abc_disabled_alpha_material_light=0x7f070028; - public static final int abc_dropdownitem_icon_width=0x7f070029; - public static final int abc_dropdownitem_text_padding_left=0x7f07002a; - public static final int abc_dropdownitem_text_padding_right=0x7f07002b; - public static final int abc_edit_text_inset_bottom_material=0x7f07002c; - public static final int abc_edit_text_inset_horizontal_material=0x7f07002d; - public static final int abc_edit_text_inset_top_material=0x7f07002e; - public static final int abc_floating_window_z=0x7f07002f; - public static final int abc_list_item_padding_horizontal_material=0x7f070030; - public static final int abc_panel_menu_list_width=0x7f070031; - public static final int abc_progress_bar_height_material=0x7f070032; - public static final int abc_search_view_preferred_height=0x7f070033; - public static final int abc_search_view_preferred_width=0x7f070034; - public static final int abc_seekbar_track_background_height_material=0x7f070035; - public static final int abc_seekbar_track_progress_height_material=0x7f070036; - public static final int abc_select_dialog_padding_start_material=0x7f070037; - public static final int abc_switch_padding=0x7f070038; - public static final int abc_text_size_body_1_material=0x7f070039; - public static final int abc_text_size_body_2_material=0x7f07003a; - public static final int abc_text_size_button_material=0x7f07003b; - public static final int abc_text_size_caption_material=0x7f07003c; - public static final int abc_text_size_display_1_material=0x7f07003d; - public static final int abc_text_size_display_2_material=0x7f07003e; - public static final int abc_text_size_display_3_material=0x7f07003f; - public static final int abc_text_size_display_4_material=0x7f070040; - public static final int abc_text_size_headline_material=0x7f070041; - public static final int abc_text_size_large_material=0x7f070042; - public static final int abc_text_size_medium_material=0x7f070043; - public static final int abc_text_size_menu_header_material=0x7f070044; - public static final int abc_text_size_menu_material=0x7f070045; - public static final int abc_text_size_small_material=0x7f070046; - public static final int abc_text_size_subhead_material=0x7f070047; - public static final int abc_text_size_subtitle_material_toolbar=0x7f070048; - public static final int abc_text_size_title_material=0x7f070049; - public static final int abc_text_size_title_material_toolbar=0x7f07004a; - public static final int cardview_compat_inset_shadow=0x7f07004b; - public static final int cardview_default_elevation=0x7f07004c; - public static final int cardview_default_radius=0x7f07004d; - public static final int compat_button_inset_horizontal_material=0x7f07004e; - public static final int compat_button_inset_vertical_material=0x7f07004f; - public static final int compat_button_padding_horizontal_material=0x7f070050; - public static final int compat_button_padding_vertical_material=0x7f070051; - public static final int compat_control_corner_material=0x7f070052; - public static final int compat_notification_large_icon_max_height=0x7f070053; - public static final int compat_notification_large_icon_max_width=0x7f070054; - public static final int design_appbar_elevation=0x7f070055; - public static final int design_bottom_navigation_active_item_max_width=0x7f070056; - public static final int design_bottom_navigation_active_item_min_width=0x7f070057; - public static final int design_bottom_navigation_active_text_size=0x7f070058; - public static final int design_bottom_navigation_elevation=0x7f070059; - public static final int design_bottom_navigation_height=0x7f07005a; - public static final int design_bottom_navigation_icon_size=0x7f07005b; - public static final int design_bottom_navigation_item_max_width=0x7f07005c; - public static final int design_bottom_navigation_item_min_width=0x7f07005d; - public static final int design_bottom_navigation_margin=0x7f07005e; - public static final int design_bottom_navigation_shadow_height=0x7f07005f; - public static final int design_bottom_navigation_text_size=0x7f070060; - public static final int design_bottom_sheet_modal_elevation=0x7f070061; - public static final int design_bottom_sheet_peek_height_min=0x7f070062; - public static final int design_fab_border_width=0x7f070063; - public static final int design_fab_elevation=0x7f070064; - public static final int design_fab_image_size=0x7f070065; - public static final int design_fab_size_mini=0x7f070066; - public static final int design_fab_size_normal=0x7f070067; - public static final int design_fab_translation_z_hovered_focused=0x7f070068; - public static final int design_fab_translation_z_pressed=0x7f070069; - public static final int design_navigation_elevation=0x7f07006a; - public static final int design_navigation_icon_padding=0x7f07006b; - public static final int design_navigation_icon_size=0x7f07006c; - public static final int design_navigation_item_horizontal_padding=0x7f07006d; - public static final int design_navigation_item_icon_padding=0x7f07006e; - public static final int design_navigation_max_width=0x7f07006f; - public static final int design_navigation_padding_bottom=0x7f070070; - public static final int design_navigation_separator_vertical_padding=0x7f070071; - public static final int design_snackbar_action_inline_max_width=0x7f070072; - public static final int design_snackbar_background_corner_radius=0x7f070073; - public static final int design_snackbar_elevation=0x7f070074; - public static final int design_snackbar_extra_spacing_horizontal=0x7f070075; - public static final int design_snackbar_max_width=0x7f070076; - public static final int design_snackbar_min_width=0x7f070077; - public static final int design_snackbar_padding_horizontal=0x7f070078; - public static final int design_snackbar_padding_vertical=0x7f070079; - public static final int design_snackbar_padding_vertical_2lines=0x7f07007a; - public static final int design_snackbar_text_size=0x7f07007b; - public static final int design_tab_max_width=0x7f07007c; - public static final int design_tab_scrollable_min_width=0x7f07007d; - public static final int design_tab_text_size=0x7f07007e; - public static final int design_tab_text_size_2line=0x7f07007f; - public static final int design_textinput_caption_translate_y=0x7f070080; - public static final int disabled_alpha_material_dark=0x7f070081; - public static final int disabled_alpha_material_light=0x7f070082; - public static final int fab_margin=0x7f070083; - public static final int fastscroll_default_thickness=0x7f070084; - public static final int fastscroll_margin=0x7f070085; - public static final int fastscroll_minimum_range=0x7f070086; - public static final int font_size=0x7f070087; - public static final int font_size_small=0x7f070088; - public static final int font_small_large=0x7f070089; - public static final int font_small_medium=0x7f07008a; - public static final int highlight_alpha_material_colored=0x7f07008b; - public static final int highlight_alpha_material_dark=0x7f07008c; - public static final int highlight_alpha_material_light=0x7f07008d; - public static final int hint_alpha_material_dark=0x7f07008e; - public static final int hint_alpha_material_light=0x7f07008f; - public static final int hint_pressed_alpha_material_dark=0x7f070090; - public static final int hint_pressed_alpha_material_light=0x7f070091; - public static final int item_touch_helper_max_drag_scroll_per_frame=0x7f070092; - public static final int item_touch_helper_swipe_escape_max_velocity=0x7f070093; - public static final int item_touch_helper_swipe_escape_velocity=0x7f070094; - public static final int mtrl_bottomappbar_fabOffsetEndMode=0x7f070095; - public static final int mtrl_bottomappbar_fab_cradle_margin=0x7f070096; - public static final int mtrl_bottomappbar_fab_cradle_rounded_corner_radius=0x7f070097; - public static final int mtrl_bottomappbar_fab_cradle_vertical_offset=0x7f070098; - public static final int mtrl_bottomappbar_height=0x7f070099; - public static final int mtrl_btn_corner_radius=0x7f07009a; - public static final int mtrl_btn_dialog_btn_min_width=0x7f07009b; - public static final int mtrl_btn_disabled_elevation=0x7f07009c; - public static final int mtrl_btn_disabled_z=0x7f07009d; - public static final int mtrl_btn_elevation=0x7f07009e; - public static final int mtrl_btn_focused_z=0x7f07009f; - public static final int mtrl_btn_hovered_z=0x7f0700a0; - public static final int mtrl_btn_icon_btn_padding_left=0x7f0700a1; - public static final int mtrl_btn_icon_padding=0x7f0700a2; - public static final int mtrl_btn_inset=0x7f0700a3; - public static final int mtrl_btn_letter_spacing=0x7f0700a4; - public static final int mtrl_btn_padding_bottom=0x7f0700a5; - public static final int mtrl_btn_padding_left=0x7f0700a6; - public static final int mtrl_btn_padding_right=0x7f0700a7; - public static final int mtrl_btn_padding_top=0x7f0700a8; - public static final int mtrl_btn_pressed_z=0x7f0700a9; - public static final int mtrl_btn_stroke_size=0x7f0700aa; - public static final int mtrl_btn_text_btn_icon_padding=0x7f0700ab; - public static final int mtrl_btn_text_btn_padding_left=0x7f0700ac; - public static final int mtrl_btn_text_btn_padding_right=0x7f0700ad; - public static final int mtrl_btn_text_size=0x7f0700ae; - public static final int mtrl_btn_z=0x7f0700af; - public static final int mtrl_card_elevation=0x7f0700b0; - public static final int mtrl_card_spacing=0x7f0700b1; - public static final int mtrl_chip_pressed_translation_z=0x7f0700b2; - public static final int mtrl_chip_text_size=0x7f0700b3; - public static final int mtrl_fab_elevation=0x7f0700b4; - public static final int mtrl_fab_translation_z_hovered_focused=0x7f0700b5; - public static final int mtrl_fab_translation_z_pressed=0x7f0700b6; - public static final int mtrl_navigation_elevation=0x7f0700b7; - public static final int mtrl_navigation_item_horizontal_padding=0x7f0700b8; - public static final int mtrl_navigation_item_icon_padding=0x7f0700b9; - public static final int mtrl_snackbar_background_corner_radius=0x7f0700ba; - public static final int mtrl_snackbar_margin=0x7f0700bb; - public static final int mtrl_textinput_box_bottom_offset=0x7f0700bc; - public static final int mtrl_textinput_box_corner_radius_medium=0x7f0700bd; - public static final int mtrl_textinput_box_corner_radius_small=0x7f0700be; - public static final int mtrl_textinput_box_label_cutout_padding=0x7f0700bf; - public static final int mtrl_textinput_box_padding_end=0x7f0700c0; - public static final int mtrl_textinput_box_stroke_width_default=0x7f0700c1; - public static final int mtrl_textinput_box_stroke_width_focused=0x7f0700c2; - public static final int mtrl_textinput_outline_box_expanded_padding=0x7f0700c3; - public static final int mtrl_toolbar_default_height=0x7f0700c4; - public static final int notification_action_icon_size=0x7f0700c5; - public static final int notification_action_text_size=0x7f0700c6; - public static final int notification_big_circle_margin=0x7f0700c7; - public static final int notification_content_margin_start=0x7f0700c8; - public static final int notification_large_icon_height=0x7f0700c9; - public static final int notification_large_icon_width=0x7f0700ca; - public static final int notification_main_column_padding_top=0x7f0700cb; - public static final int notification_media_narrow_margin=0x7f0700cc; - public static final int notification_right_icon_size=0x7f0700cd; - public static final int notification_right_side_padding_top=0x7f0700ce; - public static final int notification_small_icon_background_padding=0x7f0700cf; - public static final int notification_small_icon_size_as_large=0x7f0700d0; - public static final int notification_subtext_size=0x7f0700d1; - public static final int notification_top_pad=0x7f0700d2; - public static final int notification_top_pad_large_text=0x7f0700d3; - public static final int tooltip_corner_radius=0x7f0700d4; - public static final int tooltip_horizontal_padding=0x7f0700d5; - public static final int tooltip_margin=0x7f0700d6; - public static final int tooltip_precise_anchor_extra_offset=0x7f0700d7; - public static final int tooltip_precise_anchor_threshold=0x7f0700d8; - public static final int tooltip_vertical_padding=0x7f0700d9; - public static final int tooltip_y_offset_non_touch=0x7f0700da; - public static final int tooltip_y_offset_touch=0x7f0700db; - } - public static final class drawable { - public static final int abc_ab_share_pack_mtrl_alpha=0x7f080007; - public static final int abc_action_bar_item_background_material=0x7f080008; - public static final int abc_btn_borderless_material=0x7f080009; - public static final int abc_btn_check_material=0x7f08000a; - public static final int abc_btn_check_to_on_mtrl_000=0x7f08000b; - public static final int abc_btn_check_to_on_mtrl_015=0x7f08000c; - public static final int abc_btn_colored_material=0x7f08000d; - public static final int abc_btn_default_mtrl_shape=0x7f08000e; - public static final int abc_btn_radio_material=0x7f08000f; - public static final int abc_btn_radio_to_on_mtrl_000=0x7f080010; - public static final int abc_btn_radio_to_on_mtrl_015=0x7f080011; - public static final int abc_btn_switch_to_on_mtrl_00001=0x7f080012; - public static final int abc_btn_switch_to_on_mtrl_00012=0x7f080013; - public static final int abc_cab_background_internal_bg=0x7f080014; - public static final int abc_cab_background_top_material=0x7f080015; - public static final int abc_cab_background_top_mtrl_alpha=0x7f080016; - public static final int abc_control_background_material=0x7f080017; - public static final int abc_dialog_material_background=0x7f080018; - public static final int abc_edit_text_material=0x7f080019; - public static final int abc_ic_ab_back_material=0x7f08001a; - public static final int abc_ic_arrow_drop_right_black_24dp=0x7f08001b; - public static final int abc_ic_clear_material=0x7f08001c; - public static final int abc_ic_commit_search_api_mtrl_alpha=0x7f08001d; - public static final int abc_ic_go_search_api_material=0x7f08001e; - public static final int abc_ic_menu_copy_mtrl_am_alpha=0x7f08001f; - public static final int abc_ic_menu_cut_mtrl_alpha=0x7f080020; - public static final int abc_ic_menu_overflow_material=0x7f080021; - public static final int abc_ic_menu_paste_mtrl_am_alpha=0x7f080022; - public static final int abc_ic_menu_selectall_mtrl_alpha=0x7f080023; - public static final int abc_ic_menu_share_mtrl_alpha=0x7f080024; - public static final int abc_ic_search_api_material=0x7f080025; - public static final int abc_ic_star_black_16dp=0x7f080026; - public static final int abc_ic_star_black_36dp=0x7f080027; - public static final int abc_ic_star_black_48dp=0x7f080028; - public static final int abc_ic_star_half_black_16dp=0x7f080029; - public static final int abc_ic_star_half_black_36dp=0x7f08002a; - public static final int abc_ic_star_half_black_48dp=0x7f08002b; - public static final int abc_ic_voice_search_api_material=0x7f08002c; - public static final int abc_item_background_holo_dark=0x7f08002d; - public static final int abc_item_background_holo_light=0x7f08002e; - public static final int abc_list_divider_material=0x7f08002f; - public static final int abc_list_divider_mtrl_alpha=0x7f080030; - public static final int abc_list_focused_holo=0x7f080031; - public static final int abc_list_longpressed_holo=0x7f080032; - public static final int abc_list_pressed_holo_dark=0x7f080033; - public static final int abc_list_pressed_holo_light=0x7f080034; - public static final int abc_list_selector_background_transition_holo_dark=0x7f080035; - public static final int abc_list_selector_background_transition_holo_light=0x7f080036; - public static final int abc_list_selector_disabled_holo_dark=0x7f080037; - public static final int abc_list_selector_disabled_holo_light=0x7f080038; - public static final int abc_list_selector_holo_dark=0x7f080039; - public static final int abc_list_selector_holo_light=0x7f08003a; - public static final int abc_menu_hardkey_panel_mtrl_mult=0x7f08003b; - public static final int abc_popup_background_mtrl_mult=0x7f08003c; - public static final int abc_ratingbar_indicator_material=0x7f08003d; - public static final int abc_ratingbar_material=0x7f08003e; - public static final int abc_ratingbar_small_material=0x7f08003f; - public static final int abc_scrubber_control_off_mtrl_alpha=0x7f080040; - public static final int abc_scrubber_control_to_pressed_mtrl_000=0x7f080041; - public static final int abc_scrubber_control_to_pressed_mtrl_005=0x7f080042; - public static final int abc_scrubber_primary_mtrl_alpha=0x7f080043; - public static final int abc_scrubber_track_mtrl_alpha=0x7f080044; - public static final int abc_seekbar_thumb_material=0x7f080045; - public static final int abc_seekbar_tick_mark_material=0x7f080046; - public static final int abc_seekbar_track_material=0x7f080047; - public static final int abc_spinner_mtrl_am_alpha=0x7f080048; - public static final int abc_spinner_textfield_background_material=0x7f080049; - public static final int abc_switch_thumb_material=0x7f08004a; - public static final int abc_switch_track_mtrl_alpha=0x7f08004b; - public static final int abc_tab_indicator_material=0x7f08004c; - public static final int abc_tab_indicator_mtrl_alpha=0x7f08004d; - public static final int abc_text_cursor_material=0x7f08004e; - public static final int abc_text_select_handle_left_mtrl_dark=0x7f08004f; - public static final int abc_text_select_handle_left_mtrl_light=0x7f080050; - public static final int abc_text_select_handle_middle_mtrl_dark=0x7f080051; - public static final int abc_text_select_handle_middle_mtrl_light=0x7f080052; - public static final int abc_text_select_handle_right_mtrl_dark=0x7f080053; - public static final int abc_text_select_handle_right_mtrl_light=0x7f080054; - public static final int abc_textfield_activated_mtrl_alpha=0x7f080055; - public static final int abc_textfield_default_mtrl_alpha=0x7f080056; - public static final int abc_textfield_search_activated_mtrl_alpha=0x7f080057; - public static final int abc_textfield_search_default_mtrl_alpha=0x7f080058; - public static final int abc_textfield_search_material=0x7f080059; - public static final int abc_vector_test=0x7f08005a; - public static final int avd_hide_password=0x7f08005b; - public static final int avd_show_password=0x7f08005c; - public static final int design_bottom_navigation_item_background=0x7f08005d; - public static final int design_fab_background=0x7f08005e; - public static final int design_ic_visibility=0x7f08005f; - public static final int design_ic_visibility_off=0x7f080060; - public static final int design_password_eye=0x7f080061; - public static final int design_snackbar_background=0x7f080062; - public static final int ic_launcher_background=0x7f080063; - public static final int ic_launcher_foreground=0x7f080064; - public static final int ic_mtrl_chip_checked_black=0x7f080065; - public static final int ic_mtrl_chip_checked_circle=0x7f080066; - public static final int ic_mtrl_chip_close_circle=0x7f080067; - public static final int mtrl_snackbar_background=0x7f080068; - public static final int mtrl_tabs_default_indicator=0x7f080069; - public static final int navigation_empty_icon=0x7f08006a; - public static final int notification_action_background=0x7f08006b; - public static final int notification_bg=0x7f08006c; - public static final int notification_bg_low=0x7f08006d; - public static final int notification_bg_low_normal=0x7f08006e; - public static final int notification_bg_low_pressed=0x7f08006f; - public static final int notification_bg_normal=0x7f080070; - public static final int notification_bg_normal_pressed=0x7f080071; - public static final int notification_icon_background=0x7f080072; - public static final int notification_template_icon_bg=0x7f080073; - public static final int notification_template_icon_low_bg=0x7f080074; - public static final int notification_tile_bg=0x7f080075; - public static final int notify_panel_notification_icon_bg=0x7f080076; - public static final int tooltip_frame_dark=0x7f080077; - public static final int tooltip_frame_light=0x7f080078; - } - public static final class id { - public static final int ALT=0x7f090000; - public static final int CTRL=0x7f090001; - public static final int FUNCTION=0x7f090002; - public static final int META=0x7f090003; - public static final int SHIFT=0x7f090004; - public static final int SYM=0x7f090005; - public static final int action_bar=0x7f090006; - public static final int action_bar_activity_content=0x7f090007; - public static final int action_bar_container=0x7f090008; - public static final int action_bar_root=0x7f090009; - public static final int action_bar_spinner=0x7f09000a; - public static final int action_bar_subtitle=0x7f09000b; - public static final int action_bar_title=0x7f09000c; - public static final int action_container=0x7f09000d; - public static final int action_context_bar=0x7f09000e; - public static final int action_divider=0x7f09000f; - public static final int action_image=0x7f090010; - public static final int action_menu_divider=0x7f090011; - public static final int action_menu_presenter=0x7f090012; - public static final int action_mode_bar=0x7f090013; - public static final int action_mode_bar_stub=0x7f090014; - public static final int action_mode_close_button=0x7f090015; - public static final int action_settings=0x7f090016; - public static final int action_text=0x7f090017; - public static final int actions=0x7f090018; - public static final int activity_chooser_view_content=0x7f090019; - public static final int add=0x7f09001a; - public static final int alertTitle=0x7f09001b; - public static final int all=0x7f09001c; - public static final int always=0x7f09001d; - public static final int async=0x7f09001e; - public static final int auto=0x7f09001f; - public static final int barrier=0x7f090020; - public static final int beginning=0x7f090021; - public static final int blocking=0x7f090022; - public static final int bottom=0x7f090023; - public static final int button=0x7f090024; - public static final int buttonPanel=0x7f090025; - public static final int center=0x7f090026; - public static final int center_horizontal=0x7f090027; - public static final int center_vertical=0x7f090028; - public static final int chains=0x7f090029; - public static final int checkbox=0x7f09002a; - public static final int chronometer=0x7f09002b; - public static final int churchInfo=0x7f09002c; - public static final int churchSelectPrompt=0x7f09002d; - public static final int church_selection=0x7f09002e; - public static final int clip_horizontal=0x7f09002f; - public static final int clip_vertical=0x7f090030; - public static final int collapseActionView=0x7f090031; - public static final int container=0x7f090032; - public static final int content=0x7f090033; - public static final int contentPanel=0x7f090034; - public static final int coordinator=0x7f090035; - public static final int custom=0x7f090036; - public static final int customPanel=0x7f090037; - public static final int decor_content_parent=0x7f090038; - public static final int default_activity_button=0x7f090039; - public static final int design_bottom_sheet=0x7f09003a; - public static final int design_menu_item_action_area=0x7f09003b; - public static final int design_menu_item_action_area_stub=0x7f09003c; - public static final int design_menu_item_text=0x7f09003d; - public static final int design_navigation_view=0x7f09003e; - public static final int dimensions=0x7f09003f; - public static final int direct=0x7f090040; - public static final int disableHome=0x7f090041; - public static final int edit_query=0x7f090042; - public static final int end=0x7f090043; - public static final int enterAlways=0x7f090044; - public static final int enterAlwaysCollapsed=0x7f090045; - public static final int exitUntilCollapsed=0x7f090046; - public static final int expand_activities_button=0x7f090047; - public static final int expanded_menu=0x7f090048; - public static final int fill=0x7f090049; - public static final int fill_horizontal=0x7f09004a; - public static final int fill_vertical=0x7f09004b; - public static final int filled=0x7f09004c; - public static final int fixed=0x7f09004d; - public static final int fontSizePrompt=0x7f09004e; - public static final int forever=0x7f09004f; - public static final int ghost_view=0x7f090050; - public static final int gone=0x7f090051; - public static final int group_divider=0x7f090052; - public static final int groups=0x7f090053; - public static final int home=0x7f090054; - public static final int homeAsUp=0x7f090055; - public static final int icon=0x7f090056; - public static final int icon_group=0x7f090057; - public static final int ifRoom=0x7f090058; - public static final int image=0x7f090059; - public static final int info=0x7f09005a; - public static final int invisible=0x7f09005b; - public static final int italic=0x7f09005c; - public static final int item_touch_helper_previous_elevation=0x7f09005d; - public static final int labeled=0x7f09005e; - public static final int largeLabel=0x7f09005f; - public static final int largeSize=0x7f090060; - public static final int left=0x7f090061; - public static final int line1=0x7f090062; - public static final int line3=0x7f090063; - public static final int listMode=0x7f090064; - public static final int list_item=0x7f090065; - public static final int masked=0x7f090066; - public static final int mediumSize=0x7f090067; - public static final int message=0x7f090068; - public static final int middle=0x7f090069; - public static final int mini=0x7f09006a; - public static final int mtrl_child_content_container=0x7f09006b; - public static final int mtrl_internal_children_alpha_tag=0x7f09006c; - public static final int multiply=0x7f09006d; - public static final int navigation_header_container=0x7f09006e; - public static final int never=0x7f09006f; - public static final int none=0x7f090070; - public static final int normal=0x7f090071; - public static final int normalSize=0x7f090072; - public static final int notification_background=0x7f090073; - public static final int notification_main_column=0x7f090074; - public static final int notification_main_column_container=0x7f090075; - public static final int outline=0x7f090076; - public static final int packed=0x7f090077; - public static final int parallax=0x7f090078; - public static final int parent=0x7f090079; - public static final int parentPanel=0x7f09007a; - public static final int parent_matrix=0x7f09007b; - public static final int percent=0x7f09007c; - public static final int pin=0x7f09007d; - public static final int progress_circular=0x7f09007e; - public static final int progress_horizontal=0x7f09007f; - public static final int radio=0x7f090080; - public static final int right=0x7f090081; - public static final int right_icon=0x7f090082; - public static final int right_side=0x7f090083; - public static final int save_image_matrix=0x7f090084; - public static final int save_non_transition_alpha=0x7f090085; - public static final int save_scale_type=0x7f090086; - public static final int screen=0x7f090087; - public static final int scriptor=0x7f090088; - public static final int scroll=0x7f090089; - public static final int scrollIndicatorDown=0x7f09008a; - public static final int scrollIndicatorUp=0x7f09008b; - public static final int scrollView=0x7f09008c; - public static final int scrollable=0x7f09008d; - public static final int search_badge=0x7f09008e; - public static final int search_bar=0x7f09008f; - public static final int search_button=0x7f090090; - public static final int search_close_btn=0x7f090091; - public static final int search_edit_frame=0x7f090092; - public static final int search_go_btn=0x7f090093; - public static final int search_mag_icon=0x7f090094; - public static final int search_plate=0x7f090095; - public static final int search_src_text=0x7f090096; - public static final int search_voice_btn=0x7f090097; - public static final int select_dialog_listview=0x7f090098; - public static final int selected=0x7f090099; - public static final int shortcut=0x7f09009a; - public static final int showCustom=0x7f09009b; - public static final int showHome=0x7f09009c; - public static final int showTitle=0x7f09009d; - public static final int smallLabel=0x7f09009e; - public static final int smallSize=0x7f09009f; - public static final int snackbar_action=0x7f0900a0; - public static final int snackbar_text=0x7f0900a1; - public static final int snap=0x7f0900a2; - public static final int snapMargins=0x7f0900a3; - public static final int spacer=0x7f0900a4; - public static final int split_action_bar=0x7f0900a5; - public static final int spread=0x7f0900a6; - public static final int spread_inside=0x7f0900a7; - public static final int src_atop=0x7f0900a8; - public static final int src_in=0x7f0900a9; - public static final int src_over=0x7f0900aa; - public static final int standard=0x7f0900ab; - public static final int start=0x7f0900ac; - public static final int stretch=0x7f0900ad; - public static final int submenuarrow=0x7f0900ae; - public static final int submit_area=0x7f0900af; - public static final int tabMode=0x7f0900b0; - public static final int tag_transition_group=0x7f0900b1; - public static final int tag_unhandled_key_event_manager=0x7f0900b2; - public static final int tag_unhandled_key_listeners=0x7f0900b3; - public static final int text=0x7f0900b4; - public static final int text2=0x7f0900b5; - public static final int textSpacerNoButtons=0x7f0900b6; - public static final int textSpacerNoTitle=0x7f0900b7; - public static final int textStart=0x7f0900b8; - public static final int text_input_password_toggle=0x7f0900b9; - public static final int textinput_counter=0x7f0900ba; - public static final int textinput_error=0x7f0900bb; - public static final int textinput_helper_text=0x7f0900bc; - public static final int time=0x7f0900bd; - public static final int title=0x7f0900be; - public static final int titleDividerNoCustom=0x7f0900bf; - public static final int title_template=0x7f0900c0; - public static final int toolbar=0x7f0900c1; - public static final int top=0x7f0900c2; - public static final int topPanel=0x7f0900c3; - public static final int touch_outside=0x7f0900c4; - public static final int transition_current_scene=0x7f0900c5; - public static final int transition_layout_save=0x7f0900c6; - public static final int transition_position=0x7f0900c7; - public static final int transition_scene_layoutid_cache=0x7f0900c8; - public static final int transition_transform=0x7f0900c9; - public static final int uniform=0x7f0900ca; - public static final int unlabeled=0x7f0900cb; - public static final int up=0x7f0900cc; - public static final int useLogo=0x7f0900cd; - public static final int view_offset_helper=0x7f0900ce; - public static final int visible=0x7f0900cf; - public static final int withText=0x7f0900d0; - public static final int wrap=0x7f0900d1; - public static final int wrap_content=0x7f0900d2; - } - public static final class integer { - public static final int abc_config_activityDefaultDur=0x7f0a0000; - public static final int abc_config_activityShortDur=0x7f0a0001; - public static final int app_bar_elevation_anim_duration=0x7f0a0002; - public static final int bottom_sheet_slide_duration=0x7f0a0003; - public static final int cancel_button_image_alpha=0x7f0a0004; - public static final int config_tooltipAnimTime=0x7f0a0005; - public static final int design_snackbar_text_max_lines=0x7f0a0006; - public static final int design_tab_indicator_anim_duration_ms=0x7f0a0007; - public static final int hide_password_duration=0x7f0a0008; - public static final int mtrl_btn_anim_delay_ms=0x7f0a0009; - public static final int mtrl_btn_anim_duration_ms=0x7f0a000a; - public static final int mtrl_chip_anim_duration=0x7f0a000b; - public static final int mtrl_tab_indicator_anim_duration_ms=0x7f0a000c; - public static final int show_password_duration=0x7f0a000d; - public static final int status_bar_notification_info_maxnum=0x7f0a000e; - } - public static final class interpolator { - public static final int mtrl_fast_out_linear_in=0x7f0b0000; - public static final int mtrl_fast_out_slow_in=0x7f0b0001; - public static final int mtrl_linear=0x7f0b0002; - public static final int mtrl_linear_out_slow_in=0x7f0b0003; - } - public static final class layout { - public static final int abc_action_bar_title_item=0x7f0c0000; - public static final int abc_action_bar_up_container=0x7f0c0001; - public static final int abc_action_menu_item_layout=0x7f0c0002; - public static final int abc_action_menu_layout=0x7f0c0003; - public static final int abc_action_mode_bar=0x7f0c0004; - public static final int abc_action_mode_close_item_material=0x7f0c0005; - public static final int abc_activity_chooser_view=0x7f0c0006; - public static final int abc_activity_chooser_view_list_item=0x7f0c0007; - public static final int abc_alert_dialog_button_bar_material=0x7f0c0008; - public static final int abc_alert_dialog_material=0x7f0c0009; - public static final int abc_alert_dialog_title_material=0x7f0c000a; - public static final int abc_cascading_menu_item_layout=0x7f0c000b; - public static final int abc_dialog_title_material=0x7f0c000c; - public static final int abc_expanded_menu_layout=0x7f0c000d; - public static final int abc_list_menu_item_checkbox=0x7f0c000e; - public static final int abc_list_menu_item_icon=0x7f0c000f; - public static final int abc_list_menu_item_layout=0x7f0c0010; - public static final int abc_list_menu_item_radio=0x7f0c0011; - public static final int abc_popup_menu_header_item_layout=0x7f0c0012; - public static final int abc_popup_menu_item_layout=0x7f0c0013; - public static final int abc_screen_content_include=0x7f0c0014; - public static final int abc_screen_simple=0x7f0c0015; - public static final int abc_screen_simple_overlay_action_mode=0x7f0c0016; - public static final int abc_screen_toolbar=0x7f0c0017; - public static final int abc_search_dropdown_item_icons_2line=0x7f0c0018; - public static final int abc_search_view=0x7f0c0019; - public static final int abc_select_dialog_material=0x7f0c001a; - public static final int abc_tooltip=0x7f0c001b; - public static final int activity_main=0x7f0c001c; - public static final int activity_settings=0x7f0c001d; - public static final int content_main=0x7f0c001e; - public static final int content_settings=0x7f0c001f; - public static final int design_bottom_navigation_item=0x7f0c0020; - public static final int design_bottom_sheet_dialog=0x7f0c0021; - public static final int design_layout_snackbar=0x7f0c0022; - public static final int design_layout_snackbar_include=0x7f0c0023; - public static final int design_layout_tab_icon=0x7f0c0024; - public static final int design_layout_tab_text=0x7f0c0025; - public static final int design_menu_item_action_area=0x7f0c0026; - public static final int design_navigation_item=0x7f0c0027; - public static final int design_navigation_item_header=0x7f0c0028; - public static final int design_navigation_item_separator=0x7f0c0029; - public static final int design_navigation_item_subheader=0x7f0c002a; - public static final int design_navigation_menu=0x7f0c002b; - public static final int design_navigation_menu_item=0x7f0c002c; - public static final int design_text_input_password_icon=0x7f0c002d; - public static final int mtrl_layout_snackbar=0x7f0c002e; - public static final int mtrl_layout_snackbar_include=0x7f0c002f; - public static final int notification_action=0x7f0c0030; - public static final int notification_action_tombstone=0x7f0c0031; - public static final int notification_template_custom_big=0x7f0c0032; - public static final int notification_template_icon_group=0x7f0c0033; - public static final int notification_template_part_chronometer=0x7f0c0034; - public static final int notification_template_part_time=0x7f0c0035; - public static final int select_dialog_item_material=0x7f0c0036; - public static final int select_dialog_multichoice_material=0x7f0c0037; - public static final int select_dialog_singlechoice_material=0x7f0c0038; - public static final int support_simple_spinner_dropdown_item=0x7f0c0039; - } - public static final class menu { - public static final int menu_main=0x7f0d0000; - } - public static final class mipmap { - public static final int ic_launcher=0x7f0e0000; - public static final int ic_launcher_round=0x7f0e0001; - } - public static final class string { - public static final int abc_action_bar_home_description=0x7f0f0000; - public static final int abc_action_bar_up_description=0x7f0f0001; - public static final int abc_action_menu_overflow_description=0x7f0f0002; - public static final int abc_action_mode_done=0x7f0f0003; - public static final int abc_activity_chooser_view_see_all=0x7f0f0004; - public static final int abc_activitychooserview_choose_application=0x7f0f0005; - public static final int abc_capital_off=0x7f0f0006; - public static final int abc_capital_on=0x7f0f0007; - public static final int abc_font_family_body_1_material=0x7f0f0008; - public static final int abc_font_family_body_2_material=0x7f0f0009; - public static final int abc_font_family_button_material=0x7f0f000a; - public static final int abc_font_family_caption_material=0x7f0f000b; - public static final int abc_font_family_display_1_material=0x7f0f000c; - public static final int abc_font_family_display_2_material=0x7f0f000d; - public static final int abc_font_family_display_3_material=0x7f0f000e; - public static final int abc_font_family_display_4_material=0x7f0f000f; - public static final int abc_font_family_headline_material=0x7f0f0010; - public static final int abc_font_family_menu_material=0x7f0f0011; - public static final int abc_font_family_subhead_material=0x7f0f0012; - public static final int abc_font_family_title_material=0x7f0f0013; - public static final int abc_menu_alt_shortcut_label=0x7f0f0014; - public static final int abc_menu_ctrl_shortcut_label=0x7f0f0015; - public static final int abc_menu_delete_shortcut_label=0x7f0f0016; - public static final int abc_menu_enter_shortcut_label=0x7f0f0017; - public static final int abc_menu_function_shortcut_label=0x7f0f0018; - public static final int abc_menu_meta_shortcut_label=0x7f0f0019; - public static final int abc_menu_shift_shortcut_label=0x7f0f001a; - public static final int abc_menu_space_shortcut_label=0x7f0f001b; - public static final int abc_menu_sym_shortcut_label=0x7f0f001c; - public static final int abc_prepend_shortcut_label=0x7f0f001d; - public static final int abc_search_hint=0x7f0f001e; - public static final int abc_searchview_description_clear=0x7f0f001f; - public static final int abc_searchview_description_query=0x7f0f0020; - public static final int abc_searchview_description_search=0x7f0f0021; - public static final int abc_searchview_description_submit=0x7f0f0022; - public static final int abc_searchview_description_voice=0x7f0f0023; - public static final int abc_shareactionprovider_share_with=0x7f0f0024; - public static final int abc_shareactionprovider_share_with_application=0x7f0f0025; - public static final int abc_toolbar_collapse_description=0x7f0f0026; - public static final int action_settings=0x7f0f0027; - public static final int app_name=0x7f0f0028; - public static final int appbar_scrolling_view_behavior=0x7f0f0029; - public static final int bottom_sheet_behavior=0x7f0f002a; - public static final int character_counter_content_description=0x7f0f002b; - public static final int character_counter_pattern=0x7f0f002c; - public static final int fab_transformation_scrim_behavior=0x7f0f002d; - public static final int fab_transformation_sheet_behavior=0x7f0f002e; - public static final int hide_bottom_view_on_scroll_behavior=0x7f0f002f; - public static final int mtrl_chip_close_icon_content_description=0x7f0f0030; - public static final int password_toggle_content_description=0x7f0f0031; - public static final int path_password_eye=0x7f0f0032; - public static final int path_password_eye_mask_strike_through=0x7f0f0033; - public static final int path_password_eye_mask_visible=0x7f0f0034; - public static final int path_password_strike_through=0x7f0f0035; - public static final int search_menu_title=0x7f0f0036; - public static final int status_bar_notification_info_overflow=0x7f0f0037; - public static final int title_activity_settings=0x7f0f0038; - } - public static final class style { - public static final int AlertDialog_AppCompat=0x7f100000; - public static final int AlertDialog_AppCompat_Light=0x7f100001; - public static final int Animation_AppCompat_Dialog=0x7f100002; - public static final int Animation_AppCompat_DropDownUp=0x7f100003; - public static final int Animation_AppCompat_Tooltip=0x7f100004; - public static final int Animation_Design_BottomSheetDialog=0x7f100005; - public static final int AppTheme=0x7f100006; - public static final int AppTheme_AppBarOverlay=0x7f100007; - public static final int AppTheme_NoActionBar=0x7f100008; - public static final int AppTheme_PopupOverlay=0x7f100009; - public static final int Base_AlertDialog_AppCompat=0x7f10000a; - public static final int Base_AlertDialog_AppCompat_Light=0x7f10000b; - public static final int Base_Animation_AppCompat_Dialog=0x7f10000c; - public static final int Base_Animation_AppCompat_DropDownUp=0x7f10000d; - public static final int Base_Animation_AppCompat_Tooltip=0x7f10000e; - public static final int Base_CardView=0x7f10000f; - public static final int Base_DialogWindowTitle_AppCompat=0x7f100010; - public static final int Base_DialogWindowTitleBackground_AppCompat=0x7f100011; - public static final int Base_TextAppearance_AppCompat=0x7f100012; - public static final int Base_TextAppearance_AppCompat_Body1=0x7f100013; - public static final int Base_TextAppearance_AppCompat_Body2=0x7f100014; - public static final int Base_TextAppearance_AppCompat_Button=0x7f100015; - public static final int Base_TextAppearance_AppCompat_Caption=0x7f100016; - public static final int Base_TextAppearance_AppCompat_Display1=0x7f100017; - public static final int Base_TextAppearance_AppCompat_Display2=0x7f100018; - public static final int Base_TextAppearance_AppCompat_Display3=0x7f100019; - public static final int Base_TextAppearance_AppCompat_Display4=0x7f10001a; - public static final int Base_TextAppearance_AppCompat_Headline=0x7f10001b; - public static final int Base_TextAppearance_AppCompat_Inverse=0x7f10001c; - public static final int Base_TextAppearance_AppCompat_Large=0x7f10001d; - public static final int Base_TextAppearance_AppCompat_Large_Inverse=0x7f10001e; - public static final int Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large=0x7f10001f; - public static final int Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small=0x7f100020; - public static final int Base_TextAppearance_AppCompat_Medium=0x7f100021; - public static final int Base_TextAppearance_AppCompat_Medium_Inverse=0x7f100022; - public static final int Base_TextAppearance_AppCompat_Menu=0x7f100023; - public static final int Base_TextAppearance_AppCompat_SearchResult=0x7f100024; - public static final int Base_TextAppearance_AppCompat_SearchResult_Subtitle=0x7f100025; - public static final int Base_TextAppearance_AppCompat_SearchResult_Title=0x7f100026; - public static final int Base_TextAppearance_AppCompat_Small=0x7f100027; - public static final int Base_TextAppearance_AppCompat_Small_Inverse=0x7f100028; - public static final int Base_TextAppearance_AppCompat_Subhead=0x7f100029; - public static final int Base_TextAppearance_AppCompat_Subhead_Inverse=0x7f10002a; - public static final int Base_TextAppearance_AppCompat_Title=0x7f10002b; - public static final int Base_TextAppearance_AppCompat_Title_Inverse=0x7f10002c; - public static final int Base_TextAppearance_AppCompat_Tooltip=0x7f10002d; - public static final int Base_TextAppearance_AppCompat_Widget_ActionBar_Menu=0x7f10002e; - public static final int Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle=0x7f10002f; - public static final int Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse=0x7f100030; - public static final int Base_TextAppearance_AppCompat_Widget_ActionBar_Title=0x7f100031; - public static final int Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse=0x7f100032; - public static final int Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle=0x7f100033; - public static final int Base_TextAppearance_AppCompat_Widget_ActionMode_Title=0x7f100034; - public static final int Base_TextAppearance_AppCompat_Widget_Button=0x7f100035; - public static final int Base_TextAppearance_AppCompat_Widget_Button_Borderless_Colored=0x7f100036; - public static final int Base_TextAppearance_AppCompat_Widget_Button_Colored=0x7f100037; - public static final int Base_TextAppearance_AppCompat_Widget_Button_Inverse=0x7f100038; - public static final int Base_TextAppearance_AppCompat_Widget_DropDownItem=0x7f100039; - public static final int Base_TextAppearance_AppCompat_Widget_PopupMenu_Header=0x7f10003a; - public static final int Base_TextAppearance_AppCompat_Widget_PopupMenu_Large=0x7f10003b; - public static final int Base_TextAppearance_AppCompat_Widget_PopupMenu_Small=0x7f10003c; - public static final int Base_TextAppearance_AppCompat_Widget_Switch=0x7f10003d; - public static final int Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem=0x7f10003e; - public static final int Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item=0x7f10003f; - public static final int Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle=0x7f100040; - public static final int Base_TextAppearance_Widget_AppCompat_Toolbar_Title=0x7f100041; - public static final int Base_Theme_AppCompat=0x7f100042; - public static final int Base_Theme_AppCompat_CompactMenu=0x7f100043; - public static final int Base_Theme_AppCompat_Dialog=0x7f100044; - public static final int Base_Theme_AppCompat_Dialog_Alert=0x7f100045; - public static final int Base_Theme_AppCompat_Dialog_FixedSize=0x7f100046; - public static final int Base_Theme_AppCompat_Dialog_MinWidth=0x7f100047; - public static final int Base_Theme_AppCompat_DialogWhenLarge=0x7f100048; - public static final int Base_Theme_AppCompat_Light=0x7f100049; - public static final int Base_Theme_AppCompat_Light_DarkActionBar=0x7f10004a; - public static final int Base_Theme_AppCompat_Light_Dialog=0x7f10004b; - public static final int Base_Theme_AppCompat_Light_Dialog_Alert=0x7f10004c; - public static final int Base_Theme_AppCompat_Light_Dialog_FixedSize=0x7f10004d; - public static final int Base_Theme_AppCompat_Light_Dialog_MinWidth=0x7f10004e; - public static final int Base_Theme_AppCompat_Light_DialogWhenLarge=0x7f10004f; - public static final int Base_Theme_MaterialComponents=0x7f100050; - public static final int Base_Theme_MaterialComponents_Bridge=0x7f100051; - public static final int Base_Theme_MaterialComponents_CompactMenu=0x7f100052; - public static final int Base_Theme_MaterialComponents_Dialog=0x7f100053; - public static final int Base_Theme_MaterialComponents_Dialog_Alert=0x7f100054; - public static final int Base_Theme_MaterialComponents_Dialog_FixedSize=0x7f100055; - public static final int Base_Theme_MaterialComponents_Dialog_MinWidth=0x7f100056; - public static final int Base_Theme_MaterialComponents_DialogWhenLarge=0x7f100057; - public static final int Base_Theme_MaterialComponents_Light=0x7f100058; - public static final int Base_Theme_MaterialComponents_Light_Bridge=0x7f100059; - public static final int Base_Theme_MaterialComponents_Light_DarkActionBar=0x7f10005a; - public static final int Base_Theme_MaterialComponents_Light_DarkActionBar_Bridge=0x7f10005b; - public static final int Base_Theme_MaterialComponents_Light_Dialog=0x7f10005c; - public static final int Base_Theme_MaterialComponents_Light_Dialog_Alert=0x7f10005d; - public static final int Base_Theme_MaterialComponents_Light_Dialog_FixedSize=0x7f10005e; - public static final int Base_Theme_MaterialComponents_Light_Dialog_MinWidth=0x7f10005f; - public static final int Base_Theme_MaterialComponents_Light_DialogWhenLarge=0x7f100060; - public static final int Base_ThemeOverlay_AppCompat=0x7f100061; - public static final int Base_ThemeOverlay_AppCompat_ActionBar=0x7f100062; - public static final int Base_ThemeOverlay_AppCompat_Dark=0x7f100063; - public static final int Base_ThemeOverlay_AppCompat_Dark_ActionBar=0x7f100064; - public static final int Base_ThemeOverlay_AppCompat_Dialog=0x7f100065; - public static final int Base_ThemeOverlay_AppCompat_Dialog_Alert=0x7f100066; - public static final int Base_ThemeOverlay_AppCompat_Light=0x7f100067; - public static final int Base_ThemeOverlay_MaterialComponents_Dialog=0x7f100068; - public static final int Base_ThemeOverlay_MaterialComponents_Dialog_Alert=0x7f100069; - public static final int Base_V14_Theme_MaterialComponents=0x7f10006a; - public static final int Base_V14_Theme_MaterialComponents_Bridge=0x7f10006b; - public static final int Base_V14_Theme_MaterialComponents_Dialog=0x7f10006c; - public static final int Base_V14_Theme_MaterialComponents_Light=0x7f10006d; - public static final int Base_V14_Theme_MaterialComponents_Light_Bridge=0x7f10006e; - public static final int Base_V14_Theme_MaterialComponents_Light_DarkActionBar_Bridge=0x7f10006f; - public static final int Base_V14_Theme_MaterialComponents_Light_Dialog=0x7f100070; - public static final int Base_V14_ThemeOverlay_MaterialComponents_Dialog=0x7f100071; - public static final int Base_V14_ThemeOverlay_MaterialComponents_Dialog_Alert=0x7f100072; - public static final int Base_V21_Theme_AppCompat=0x7f100073; - public static final int Base_V21_Theme_AppCompat_Dialog=0x7f100074; - public static final int Base_V21_Theme_AppCompat_Light=0x7f100075; - public static final int Base_V21_Theme_AppCompat_Light_Dialog=0x7f100076; - public static final int Base_V21_ThemeOverlay_AppCompat_Dialog=0x7f100077; - public static final int Base_V22_Theme_AppCompat=0x7f100078; - public static final int Base_V22_Theme_AppCompat_Light=0x7f100079; - public static final int Base_V23_Theme_AppCompat=0x7f10007a; - public static final int Base_V23_Theme_AppCompat_Light=0x7f10007b; - public static final int Base_V26_Theme_AppCompat=0x7f10007c; - public static final int Base_V26_Theme_AppCompat_Light=0x7f10007d; - public static final int Base_V26_Widget_AppCompat_Toolbar=0x7f10007e; - public static final int Base_V28_Theme_AppCompat=0x7f10007f; - public static final int Base_V28_Theme_AppCompat_Light=0x7f100080; - public static final int Base_V7_Theme_AppCompat=0x7f100081; - public static final int Base_V7_Theme_AppCompat_Dialog=0x7f100082; - public static final int Base_V7_Theme_AppCompat_Light=0x7f100083; - public static final int Base_V7_Theme_AppCompat_Light_Dialog=0x7f100084; - public static final int Base_V7_ThemeOverlay_AppCompat_Dialog=0x7f100085; - public static final int Base_V7_Widget_AppCompat_AutoCompleteTextView=0x7f100086; - public static final int Base_V7_Widget_AppCompat_EditText=0x7f100087; - public static final int Base_V7_Widget_AppCompat_Toolbar=0x7f100088; - public static final int Base_Widget_AppCompat_ActionBar=0x7f100089; - public static final int Base_Widget_AppCompat_ActionBar_Solid=0x7f10008a; - public static final int Base_Widget_AppCompat_ActionBar_TabBar=0x7f10008b; - public static final int Base_Widget_AppCompat_ActionBar_TabText=0x7f10008c; - public static final int Base_Widget_AppCompat_ActionBar_TabView=0x7f10008d; - public static final int Base_Widget_AppCompat_ActionButton=0x7f10008e; - public static final int Base_Widget_AppCompat_ActionButton_CloseMode=0x7f10008f; - public static final int Base_Widget_AppCompat_ActionButton_Overflow=0x7f100090; - public static final int Base_Widget_AppCompat_ActionMode=0x7f100091; - public static final int Base_Widget_AppCompat_ActivityChooserView=0x7f100092; - public static final int Base_Widget_AppCompat_AutoCompleteTextView=0x7f100093; - public static final int Base_Widget_AppCompat_Button=0x7f100094; - public static final int Base_Widget_AppCompat_Button_Borderless=0x7f100095; - public static final int Base_Widget_AppCompat_Button_Borderless_Colored=0x7f100096; - public static final int Base_Widget_AppCompat_Button_ButtonBar_AlertDialog=0x7f100097; - public static final int Base_Widget_AppCompat_Button_Colored=0x7f100098; - public static final int Base_Widget_AppCompat_Button_Small=0x7f100099; - public static final int Base_Widget_AppCompat_ButtonBar=0x7f10009a; - public static final int Base_Widget_AppCompat_ButtonBar_AlertDialog=0x7f10009b; - public static final int Base_Widget_AppCompat_CompoundButton_CheckBox=0x7f10009c; - public static final int Base_Widget_AppCompat_CompoundButton_RadioButton=0x7f10009d; - public static final int Base_Widget_AppCompat_CompoundButton_Switch=0x7f10009e; - public static final int Base_Widget_AppCompat_DrawerArrowToggle=0x7f10009f; - public static final int Base_Widget_AppCompat_DrawerArrowToggle_Common=0x7f1000a0; - public static final int Base_Widget_AppCompat_DropDownItem_Spinner=0x7f1000a1; - public static final int Base_Widget_AppCompat_EditText=0x7f1000a2; - public static final int Base_Widget_AppCompat_ImageButton=0x7f1000a3; - public static final int Base_Widget_AppCompat_Light_ActionBar=0x7f1000a4; - public static final int Base_Widget_AppCompat_Light_ActionBar_Solid=0x7f1000a5; - public static final int Base_Widget_AppCompat_Light_ActionBar_TabBar=0x7f1000a6; - public static final int Base_Widget_AppCompat_Light_ActionBar_TabText=0x7f1000a7; - public static final int Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse=0x7f1000a8; - public static final int Base_Widget_AppCompat_Light_ActionBar_TabView=0x7f1000a9; - public static final int Base_Widget_AppCompat_Light_PopupMenu=0x7f1000aa; - public static final int Base_Widget_AppCompat_Light_PopupMenu_Overflow=0x7f1000ab; - public static final int Base_Widget_AppCompat_ListMenuView=0x7f1000ac; - public static final int Base_Widget_AppCompat_ListPopupWindow=0x7f1000ad; - public static final int Base_Widget_AppCompat_ListView=0x7f1000ae; - public static final int Base_Widget_AppCompat_ListView_DropDown=0x7f1000af; - public static final int Base_Widget_AppCompat_ListView_Menu=0x7f1000b0; - public static final int Base_Widget_AppCompat_PopupMenu=0x7f1000b1; - public static final int Base_Widget_AppCompat_PopupMenu_Overflow=0x7f1000b2; - public static final int Base_Widget_AppCompat_PopupWindow=0x7f1000b3; - public static final int Base_Widget_AppCompat_ProgressBar=0x7f1000b4; - public static final int Base_Widget_AppCompat_ProgressBar_Horizontal=0x7f1000b5; - public static final int Base_Widget_AppCompat_RatingBar=0x7f1000b6; - public static final int Base_Widget_AppCompat_RatingBar_Indicator=0x7f1000b7; - public static final int Base_Widget_AppCompat_RatingBar_Small=0x7f1000b8; - public static final int Base_Widget_AppCompat_SearchView=0x7f1000b9; - public static final int Base_Widget_AppCompat_SearchView_ActionBar=0x7f1000ba; - public static final int Base_Widget_AppCompat_SeekBar=0x7f1000bb; - public static final int Base_Widget_AppCompat_SeekBar_Discrete=0x7f1000bc; - public static final int Base_Widget_AppCompat_Spinner=0x7f1000bd; - public static final int Base_Widget_AppCompat_Spinner_Underlined=0x7f1000be; - public static final int Base_Widget_AppCompat_TextView_SpinnerItem=0x7f1000bf; - public static final int Base_Widget_AppCompat_Toolbar=0x7f1000c0; - public static final int Base_Widget_AppCompat_Toolbar_Button_Navigation=0x7f1000c1; - public static final int Base_Widget_Design_TabLayout=0x7f1000c2; - public static final int Base_Widget_MaterialComponents_Chip=0x7f1000c3; - public static final int Base_Widget_MaterialComponents_TextInputEditText=0x7f1000c4; - public static final int Base_Widget_MaterialComponents_TextInputLayout=0x7f1000c5; - public static final int CardView=0x7f1000c6; - public static final int CardView_Dark=0x7f1000c7; - public static final int CardView_Light=0x7f1000c8; - public static final int LargeText=0x7f1000c9; - public static final int MediumText=0x7f1000ca; - public static final int NormalText=0x7f1000cb; - public static final int Platform_AppCompat=0x7f1000cc; - public static final int Platform_AppCompat_Light=0x7f1000cd; - public static final int Platform_MaterialComponents=0x7f1000ce; - public static final int Platform_MaterialComponents_Dialog=0x7f1000cf; - public static final int Platform_MaterialComponents_Light=0x7f1000d0; - public static final int Platform_MaterialComponents_Light_Dialog=0x7f1000d1; - public static final int Platform_ThemeOverlay_AppCompat=0x7f1000d2; - public static final int Platform_ThemeOverlay_AppCompat_Dark=0x7f1000d3; - public static final int Platform_ThemeOverlay_AppCompat_Light=0x7f1000d4; - public static final int Platform_V21_AppCompat=0x7f1000d5; - public static final int Platform_V21_AppCompat_Light=0x7f1000d6; - public static final int Platform_V25_AppCompat=0x7f1000d7; - public static final int Platform_V25_AppCompat_Light=0x7f1000d8; - public static final int Platform_Widget_AppCompat_Spinner=0x7f1000d9; - public static final int RtlOverlay_DialogWindowTitle_AppCompat=0x7f1000da; - public static final int RtlOverlay_Widget_AppCompat_ActionBar_TitleItem=0x7f1000db; - public static final int RtlOverlay_Widget_AppCompat_DialogTitle_Icon=0x7f1000dc; - public static final int RtlOverlay_Widget_AppCompat_PopupMenuItem=0x7f1000dd; - public static final int RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup=0x7f1000de; - public static final int RtlOverlay_Widget_AppCompat_PopupMenuItem_Shortcut=0x7f1000df; - public static final int RtlOverlay_Widget_AppCompat_PopupMenuItem_SubmenuArrow=0x7f1000e0; - public static final int RtlOverlay_Widget_AppCompat_PopupMenuItem_Text=0x7f1000e1; - public static final int RtlOverlay_Widget_AppCompat_PopupMenuItem_Title=0x7f1000e2; - public static final int RtlOverlay_Widget_AppCompat_Search_DropDown=0x7f1000e3; - public static final int RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1=0x7f1000e4; - public static final int RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2=0x7f1000e5; - public static final int RtlOverlay_Widget_AppCompat_Search_DropDown_Query=0x7f1000e6; - public static final int RtlOverlay_Widget_AppCompat_Search_DropDown_Text=0x7f1000e7; - public static final int RtlOverlay_Widget_AppCompat_SearchView_MagIcon=0x7f1000e8; - public static final int RtlUnderlay_Widget_AppCompat_ActionButton=0x7f1000e9; - public static final int RtlUnderlay_Widget_AppCompat_ActionButton_Overflow=0x7f1000ea; - public static final int SmallText=0x7f1000eb; - public static final int TextAppearance_AppCompat=0x7f1000ec; - public static final int TextAppearance_AppCompat_Body1=0x7f1000ed; - public static final int TextAppearance_AppCompat_Body2=0x7f1000ee; - public static final int TextAppearance_AppCompat_Button=0x7f1000ef; - public static final int TextAppearance_AppCompat_Caption=0x7f1000f0; - public static final int TextAppearance_AppCompat_Display1=0x7f1000f1; - public static final int TextAppearance_AppCompat_Display2=0x7f1000f2; - public static final int TextAppearance_AppCompat_Display3=0x7f1000f3; - public static final int TextAppearance_AppCompat_Display4=0x7f1000f4; - public static final int TextAppearance_AppCompat_Headline=0x7f1000f5; - public static final int TextAppearance_AppCompat_Inverse=0x7f1000f6; - public static final int TextAppearance_AppCompat_Large=0x7f1000f7; - public static final int TextAppearance_AppCompat_Large_Inverse=0x7f1000f8; - public static final int TextAppearance_AppCompat_Light_SearchResult_Subtitle=0x7f1000f9; - public static final int TextAppearance_AppCompat_Light_SearchResult_Title=0x7f1000fa; - public static final int TextAppearance_AppCompat_Light_Widget_PopupMenu_Large=0x7f1000fb; - public static final int TextAppearance_AppCompat_Light_Widget_PopupMenu_Small=0x7f1000fc; - public static final int TextAppearance_AppCompat_Medium=0x7f1000fd; - public static final int TextAppearance_AppCompat_Medium_Inverse=0x7f1000fe; - public static final int TextAppearance_AppCompat_Menu=0x7f1000ff; - public static final int TextAppearance_AppCompat_SearchResult_Subtitle=0x7f100100; - public static final int TextAppearance_AppCompat_SearchResult_Title=0x7f100101; - public static final int TextAppearance_AppCompat_Small=0x7f100102; - public static final int TextAppearance_AppCompat_Small_Inverse=0x7f100103; - public static final int TextAppearance_AppCompat_Subhead=0x7f100104; - public static final int TextAppearance_AppCompat_Subhead_Inverse=0x7f100105; - public static final int TextAppearance_AppCompat_Title=0x7f100106; - public static final int TextAppearance_AppCompat_Title_Inverse=0x7f100107; - public static final int TextAppearance_AppCompat_Tooltip=0x7f100108; - public static final int TextAppearance_AppCompat_Widget_ActionBar_Menu=0x7f100109; - public static final int TextAppearance_AppCompat_Widget_ActionBar_Subtitle=0x7f10010a; - public static final int TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse=0x7f10010b; - public static final int TextAppearance_AppCompat_Widget_ActionBar_Title=0x7f10010c; - public static final int TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse=0x7f10010d; - public static final int TextAppearance_AppCompat_Widget_ActionMode_Subtitle=0x7f10010e; - public static final int TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse=0x7f10010f; - public static final int TextAppearance_AppCompat_Widget_ActionMode_Title=0x7f100110; - public static final int TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse=0x7f100111; - public static final int TextAppearance_AppCompat_Widget_Button=0x7f100112; - public static final int TextAppearance_AppCompat_Widget_Button_Borderless_Colored=0x7f100113; - public static final int TextAppearance_AppCompat_Widget_Button_Colored=0x7f100114; - public static final int TextAppearance_AppCompat_Widget_Button_Inverse=0x7f100115; - public static final int TextAppearance_AppCompat_Widget_DropDownItem=0x7f100116; - public static final int TextAppearance_AppCompat_Widget_PopupMenu_Header=0x7f100117; - public static final int TextAppearance_AppCompat_Widget_PopupMenu_Large=0x7f100118; - public static final int TextAppearance_AppCompat_Widget_PopupMenu_Small=0x7f100119; - public static final int TextAppearance_AppCompat_Widget_Switch=0x7f10011a; - public static final int TextAppearance_AppCompat_Widget_TextView_SpinnerItem=0x7f10011b; - public static final int TextAppearance_Compat_Notification=0x7f10011c; - public static final int TextAppearance_Compat_Notification_Info=0x7f10011d; - public static final int TextAppearance_Compat_Notification_Line2=0x7f10011e; - public static final int TextAppearance_Compat_Notification_Time=0x7f10011f; - public static final int TextAppearance_Compat_Notification_Title=0x7f100120; - public static final int TextAppearance_Design_CollapsingToolbar_Expanded=0x7f100121; - public static final int TextAppearance_Design_Counter=0x7f100122; - public static final int TextAppearance_Design_Counter_Overflow=0x7f100123; - public static final int TextAppearance_Design_Error=0x7f100124; - public static final int TextAppearance_Design_HelperText=0x7f100125; - public static final int TextAppearance_Design_Hint=0x7f100126; - public static final int TextAppearance_Design_Snackbar_Message=0x7f100127; - public static final int TextAppearance_Design_Tab=0x7f100128; - public static final int TextAppearance_MaterialComponents_Body1=0x7f100129; - public static final int TextAppearance_MaterialComponents_Body2=0x7f10012a; - public static final int TextAppearance_MaterialComponents_Button=0x7f10012b; - public static final int TextAppearance_MaterialComponents_Caption=0x7f10012c; - public static final int TextAppearance_MaterialComponents_Chip=0x7f10012d; - public static final int TextAppearance_MaterialComponents_Headline1=0x7f10012e; - public static final int TextAppearance_MaterialComponents_Headline2=0x7f10012f; - public static final int TextAppearance_MaterialComponents_Headline3=0x7f100130; - public static final int TextAppearance_MaterialComponents_Headline4=0x7f100131; - public static final int TextAppearance_MaterialComponents_Headline5=0x7f100132; - public static final int TextAppearance_MaterialComponents_Headline6=0x7f100133; - public static final int TextAppearance_MaterialComponents_Overline=0x7f100134; - public static final int TextAppearance_MaterialComponents_Subtitle1=0x7f100135; - public static final int TextAppearance_MaterialComponents_Subtitle2=0x7f100136; - public static final int TextAppearance_MaterialComponents_Tab=0x7f100137; - public static final int TextAppearance_Widget_AppCompat_ExpandedMenu_Item=0x7f100138; - public static final int TextAppearance_Widget_AppCompat_Toolbar_Subtitle=0x7f100139; - public static final int TextAppearance_Widget_AppCompat_Toolbar_Title=0x7f10013a; - public static final int Theme_AppCompat=0x7f10013b; - public static final int Theme_AppCompat_CompactMenu=0x7f10013c; - public static final int Theme_AppCompat_DayNight=0x7f10013d; - public static final int Theme_AppCompat_DayNight_DarkActionBar=0x7f10013e; - public static final int Theme_AppCompat_DayNight_Dialog=0x7f10013f; - public static final int Theme_AppCompat_DayNight_Dialog_Alert=0x7f100140; - public static final int Theme_AppCompat_DayNight_Dialog_MinWidth=0x7f100141; - public static final int Theme_AppCompat_DayNight_DialogWhenLarge=0x7f100142; - public static final int Theme_AppCompat_DayNight_NoActionBar=0x7f100143; - public static final int Theme_AppCompat_Dialog=0x7f100144; - public static final int Theme_AppCompat_Dialog_Alert=0x7f100145; - public static final int Theme_AppCompat_Dialog_MinWidth=0x7f100146; - public static final int Theme_AppCompat_DialogWhenLarge=0x7f100147; - public static final int Theme_AppCompat_Light=0x7f100148; - public static final int Theme_AppCompat_Light_DarkActionBar=0x7f100149; - public static final int Theme_AppCompat_Light_Dialog=0x7f10014a; - public static final int Theme_AppCompat_Light_Dialog_Alert=0x7f10014b; - public static final int Theme_AppCompat_Light_Dialog_MinWidth=0x7f10014c; - public static final int Theme_AppCompat_Light_DialogWhenLarge=0x7f10014d; - public static final int Theme_AppCompat_Light_NoActionBar=0x7f10014e; - public static final int Theme_AppCompat_NoActionBar=0x7f10014f; - public static final int Theme_Design=0x7f100150; - public static final int Theme_Design_BottomSheetDialog=0x7f100151; - public static final int Theme_Design_Light=0x7f100152; - public static final int Theme_Design_Light_BottomSheetDialog=0x7f100153; - public static final int Theme_Design_Light_NoActionBar=0x7f100154; - public static final int Theme_Design_NoActionBar=0x7f100155; - public static final int Theme_MaterialComponents=0x7f100156; - public static final int Theme_MaterialComponents_BottomSheetDialog=0x7f100157; - public static final int Theme_MaterialComponents_Bridge=0x7f100158; - public static final int Theme_MaterialComponents_CompactMenu=0x7f100159; - public static final int Theme_MaterialComponents_Dialog=0x7f10015a; - public static final int Theme_MaterialComponents_Dialog_Alert=0x7f10015b; - public static final int Theme_MaterialComponents_Dialog_MinWidth=0x7f10015c; - public static final int Theme_MaterialComponents_DialogWhenLarge=0x7f10015d; - public static final int Theme_MaterialComponents_Light=0x7f10015e; - public static final int Theme_MaterialComponents_Light_BottomSheetDialog=0x7f10015f; - public static final int Theme_MaterialComponents_Light_Bridge=0x7f100160; - public static final int Theme_MaterialComponents_Light_DarkActionBar=0x7f100161; - public static final int Theme_MaterialComponents_Light_DarkActionBar_Bridge=0x7f100162; - public static final int Theme_MaterialComponents_Light_Dialog=0x7f100163; - public static final int Theme_MaterialComponents_Light_Dialog_Alert=0x7f100164; - public static final int Theme_MaterialComponents_Light_Dialog_MinWidth=0x7f100165; - public static final int Theme_MaterialComponents_Light_DialogWhenLarge=0x7f100166; - public static final int Theme_MaterialComponents_Light_NoActionBar=0x7f100167; - public static final int Theme_MaterialComponents_Light_NoActionBar_Bridge=0x7f100168; - public static final int Theme_MaterialComponents_NoActionBar=0x7f100169; - public static final int Theme_MaterialComponents_NoActionBar_Bridge=0x7f10016a; - public static final int ThemeOverlay_AppCompat=0x7f10016b; - public static final int ThemeOverlay_AppCompat_ActionBar=0x7f10016c; - public static final int ThemeOverlay_AppCompat_Dark=0x7f10016d; - public static final int ThemeOverlay_AppCompat_Dark_ActionBar=0x7f10016e; - public static final int ThemeOverlay_AppCompat_Dialog=0x7f10016f; - public static final int ThemeOverlay_AppCompat_Dialog_Alert=0x7f100170; - public static final int ThemeOverlay_AppCompat_Light=0x7f100171; - public static final int ThemeOverlay_MaterialComponents=0x7f100172; - public static final int ThemeOverlay_MaterialComponents_ActionBar=0x7f100173; - public static final int ThemeOverlay_MaterialComponents_Dark=0x7f100174; - public static final int ThemeOverlay_MaterialComponents_Dark_ActionBar=0x7f100175; - public static final int ThemeOverlay_MaterialComponents_Dialog=0x7f100176; - public static final int ThemeOverlay_MaterialComponents_Dialog_Alert=0x7f100177; - public static final int ThemeOverlay_MaterialComponents_Light=0x7f100178; - public static final int ThemeOverlay_MaterialComponents_TextInputEditText=0x7f100179; - public static final int ThemeOverlay_MaterialComponents_TextInputEditText_FilledBox=0x7f10017a; - public static final int ThemeOverlay_MaterialComponents_TextInputEditText_FilledBox_Dense=0x7f10017b; - public static final int ThemeOverlay_MaterialComponents_TextInputEditText_OutlinedBox=0x7f10017c; - public static final int ThemeOverlay_MaterialComponents_TextInputEditText_OutlinedBox_Dense=0x7f10017d; - public static final int Widget_AppCompat_ActionBar=0x7f10017e; - public static final int Widget_AppCompat_ActionBar_Solid=0x7f10017f; - public static final int Widget_AppCompat_ActionBar_TabBar=0x7f100180; - public static final int Widget_AppCompat_ActionBar_TabText=0x7f100181; - public static final int Widget_AppCompat_ActionBar_TabView=0x7f100182; - public static final int Widget_AppCompat_ActionButton=0x7f100183; - public static final int Widget_AppCompat_ActionButton_CloseMode=0x7f100184; - public static final int Widget_AppCompat_ActionButton_Overflow=0x7f100185; - public static final int Widget_AppCompat_ActionMode=0x7f100186; - public static final int Widget_AppCompat_ActivityChooserView=0x7f100187; - public static final int Widget_AppCompat_AutoCompleteTextView=0x7f100188; - public static final int Widget_AppCompat_Button=0x7f100189; - public static final int Widget_AppCompat_Button_Borderless=0x7f10018a; - public static final int Widget_AppCompat_Button_Borderless_Colored=0x7f10018b; - public static final int Widget_AppCompat_Button_ButtonBar_AlertDialog=0x7f10018c; - public static final int Widget_AppCompat_Button_Colored=0x7f10018d; - public static final int Widget_AppCompat_Button_Small=0x7f10018e; - public static final int Widget_AppCompat_ButtonBar=0x7f10018f; - public static final int Widget_AppCompat_ButtonBar_AlertDialog=0x7f100190; - public static final int Widget_AppCompat_CompoundButton_CheckBox=0x7f100191; - public static final int Widget_AppCompat_CompoundButton_RadioButton=0x7f100192; - public static final int Widget_AppCompat_CompoundButton_Switch=0x7f100193; - public static final int Widget_AppCompat_DrawerArrowToggle=0x7f100194; - public static final int Widget_AppCompat_DropDownItem_Spinner=0x7f100195; - public static final int Widget_AppCompat_EditText=0x7f100196; - public static final int Widget_AppCompat_ImageButton=0x7f100197; - public static final int Widget_AppCompat_Light_ActionBar=0x7f100198; - public static final int Widget_AppCompat_Light_ActionBar_Solid=0x7f100199; - public static final int Widget_AppCompat_Light_ActionBar_Solid_Inverse=0x7f10019a; - public static final int Widget_AppCompat_Light_ActionBar_TabBar=0x7f10019b; - public static final int Widget_AppCompat_Light_ActionBar_TabBar_Inverse=0x7f10019c; - public static final int Widget_AppCompat_Light_ActionBar_TabText=0x7f10019d; - public static final int Widget_AppCompat_Light_ActionBar_TabText_Inverse=0x7f10019e; - public static final int Widget_AppCompat_Light_ActionBar_TabView=0x7f10019f; - public static final int Widget_AppCompat_Light_ActionBar_TabView_Inverse=0x7f1001a0; - public static final int Widget_AppCompat_Light_ActionButton=0x7f1001a1; - public static final int Widget_AppCompat_Light_ActionButton_CloseMode=0x7f1001a2; - public static final int Widget_AppCompat_Light_ActionButton_Overflow=0x7f1001a3; - public static final int Widget_AppCompat_Light_ActionMode_Inverse=0x7f1001a4; - public static final int Widget_AppCompat_Light_ActivityChooserView=0x7f1001a5; - public static final int Widget_AppCompat_Light_AutoCompleteTextView=0x7f1001a6; - public static final int Widget_AppCompat_Light_DropDownItem_Spinner=0x7f1001a7; - public static final int Widget_AppCompat_Light_ListPopupWindow=0x7f1001a8; - public static final int Widget_AppCompat_Light_ListView_DropDown=0x7f1001a9; - public static final int Widget_AppCompat_Light_PopupMenu=0x7f1001aa; - public static final int Widget_AppCompat_Light_PopupMenu_Overflow=0x7f1001ab; - public static final int Widget_AppCompat_Light_SearchView=0x7f1001ac; - public static final int Widget_AppCompat_Light_Spinner_DropDown_ActionBar=0x7f1001ad; - public static final int Widget_AppCompat_ListMenuView=0x7f1001ae; - public static final int Widget_AppCompat_ListPopupWindow=0x7f1001af; - public static final int Widget_AppCompat_ListView=0x7f1001b0; - public static final int Widget_AppCompat_ListView_DropDown=0x7f1001b1; - public static final int Widget_AppCompat_ListView_Menu=0x7f1001b2; - public static final int Widget_AppCompat_PopupMenu=0x7f1001b3; - public static final int Widget_AppCompat_PopupMenu_Overflow=0x7f1001b4; - public static final int Widget_AppCompat_PopupWindow=0x7f1001b5; - public static final int Widget_AppCompat_ProgressBar=0x7f1001b6; - public static final int Widget_AppCompat_ProgressBar_Horizontal=0x7f1001b7; - public static final int Widget_AppCompat_RatingBar=0x7f1001b8; - public static final int Widget_AppCompat_RatingBar_Indicator=0x7f1001b9; - public static final int Widget_AppCompat_RatingBar_Small=0x7f1001ba; - public static final int Widget_AppCompat_SearchView=0x7f1001bb; - public static final int Widget_AppCompat_SearchView_ActionBar=0x7f1001bc; - public static final int Widget_AppCompat_SeekBar=0x7f1001bd; - public static final int Widget_AppCompat_SeekBar_Discrete=0x7f1001be; - public static final int Widget_AppCompat_Spinner=0x7f1001bf; - public static final int Widget_AppCompat_Spinner_DropDown=0x7f1001c0; - public static final int Widget_AppCompat_Spinner_DropDown_ActionBar=0x7f1001c1; - public static final int Widget_AppCompat_Spinner_Underlined=0x7f1001c2; - public static final int Widget_AppCompat_TextView_SpinnerItem=0x7f1001c3; - public static final int Widget_AppCompat_Toolbar=0x7f1001c4; - public static final int Widget_AppCompat_Toolbar_Button_Navigation=0x7f1001c5; - public static final int Widget_Compat_NotificationActionContainer=0x7f1001c6; - public static final int Widget_Compat_NotificationActionText=0x7f1001c7; - public static final int Widget_Design_AppBarLayout=0x7f1001c8; - public static final int Widget_Design_BottomNavigationView=0x7f1001c9; - public static final int Widget_Design_BottomSheet_Modal=0x7f1001ca; - public static final int Widget_Design_CollapsingToolbar=0x7f1001cb; - public static final int Widget_Design_FloatingActionButton=0x7f1001cc; - public static final int Widget_Design_NavigationView=0x7f1001cd; - public static final int Widget_Design_ScrimInsetsFrameLayout=0x7f1001ce; - public static final int Widget_Design_Snackbar=0x7f1001cf; - public static final int Widget_Design_TabLayout=0x7f1001d0; - public static final int Widget_Design_TextInputLayout=0x7f1001d1; - public static final int Widget_MaterialComponents_BottomAppBar=0x7f1001d2; - public static final int Widget_MaterialComponents_BottomAppBar_Colored=0x7f1001d3; - public static final int Widget_MaterialComponents_BottomNavigationView=0x7f1001d4; - public static final int Widget_MaterialComponents_BottomNavigationView_Colored=0x7f1001d5; - public static final int Widget_MaterialComponents_BottomSheet_Modal=0x7f1001d6; - public static final int Widget_MaterialComponents_Button=0x7f1001d7; - public static final int Widget_MaterialComponents_Button_Icon=0x7f1001d8; - public static final int Widget_MaterialComponents_Button_OutlinedButton=0x7f1001d9; - public static final int Widget_MaterialComponents_Button_OutlinedButton_Icon=0x7f1001da; - public static final int Widget_MaterialComponents_Button_TextButton=0x7f1001db; - public static final int Widget_MaterialComponents_Button_TextButton_Dialog=0x7f1001dc; - public static final int Widget_MaterialComponents_Button_TextButton_Dialog_Icon=0x7f1001dd; - public static final int Widget_MaterialComponents_Button_TextButton_Icon=0x7f1001de; - public static final int Widget_MaterialComponents_Button_UnelevatedButton=0x7f1001df; - public static final int Widget_MaterialComponents_Button_UnelevatedButton_Icon=0x7f1001e0; - public static final int Widget_MaterialComponents_CardView=0x7f1001e1; - public static final int Widget_MaterialComponents_Chip_Action=0x7f1001e2; - public static final int Widget_MaterialComponents_Chip_Choice=0x7f1001e3; - public static final int Widget_MaterialComponents_Chip_Entry=0x7f1001e4; - public static final int Widget_MaterialComponents_Chip_Filter=0x7f1001e5; - public static final int Widget_MaterialComponents_ChipGroup=0x7f1001e6; - public static final int Widget_MaterialComponents_FloatingActionButton=0x7f1001e7; - public static final int Widget_MaterialComponents_NavigationView=0x7f1001e8; - public static final int Widget_MaterialComponents_Snackbar=0x7f1001e9; - public static final int Widget_MaterialComponents_Snackbar_FullWidth=0x7f1001ea; - public static final int Widget_MaterialComponents_TabLayout=0x7f1001eb; - public static final int Widget_MaterialComponents_TabLayout_Colored=0x7f1001ec; - public static final int Widget_MaterialComponents_TextInputEditText_FilledBox=0x7f1001ed; - public static final int Widget_MaterialComponents_TextInputEditText_FilledBox_Dense=0x7f1001ee; - public static final int Widget_MaterialComponents_TextInputEditText_OutlinedBox=0x7f1001ef; - public static final int Widget_MaterialComponents_TextInputEditText_OutlinedBox_Dense=0x7f1001f0; - public static final int Widget_MaterialComponents_TextInputLayout_FilledBox=0x7f1001f1; - public static final int Widget_MaterialComponents_TextInputLayout_FilledBox_Dense=0x7f1001f2; - public static final int Widget_MaterialComponents_TextInputLayout_OutlinedBox=0x7f1001f3; - public static final int Widget_MaterialComponents_TextInputLayout_OutlinedBox_Dense=0x7f1001f4; - public static final int Widget_MaterialComponents_Toolbar=0x7f1001f5; - public static final int Widget_Support_CoordinatorLayout=0x7f1001f6; - } - public static final class styleable { - /** - * Attributes that can be used with a ActionBar. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #ActionBar_background com.scriptor:background}Specifies a background drawable for the action bar.
{@link #ActionBar_backgroundSplit com.scriptor:backgroundSplit}Specifies a background drawable for the bottom component of a split action bar.
{@link #ActionBar_backgroundStacked com.scriptor:backgroundStacked}Specifies a background drawable for a second stacked row of the action bar.
{@link #ActionBar_contentInsetEnd com.scriptor:contentInsetEnd}Minimum inset for content views within a bar.
{@link #ActionBar_contentInsetEndWithActions com.scriptor:contentInsetEndWithActions}Minimum inset for content views within a bar when actions from a menu - * are present.
{@link #ActionBar_contentInsetLeft com.scriptor:contentInsetLeft}Minimum inset for content views within a bar.
{@link #ActionBar_contentInsetRight com.scriptor:contentInsetRight}Minimum inset for content views within a bar.
{@link #ActionBar_contentInsetStart com.scriptor:contentInsetStart}Minimum inset for content views within a bar.
{@link #ActionBar_contentInsetStartWithNavigation com.scriptor:contentInsetStartWithNavigation}Minimum inset for content views within a bar when a navigation button - * is present, such as the Up button.
{@link #ActionBar_customNavigationLayout com.scriptor:customNavigationLayout}Specifies a layout for custom navigation.
{@link #ActionBar_displayOptions com.scriptor:displayOptions}Options affecting how the action bar is displayed.
{@link #ActionBar_divider com.scriptor:divider}Specifies the drawable used for item dividers.
{@link #ActionBar_elevation com.scriptor:elevation}Elevation for the action bar itself
{@link #ActionBar_height com.scriptor:height}
{@link #ActionBar_hideOnContentScroll com.scriptor:hideOnContentScroll}Set true to hide the action bar on a vertical nested scroll of content.
{@link #ActionBar_homeAsUpIndicator com.scriptor:homeAsUpIndicator}Specifies a drawable to use for the 'home as up' indicator.
{@link #ActionBar_homeLayout com.scriptor:homeLayout}Specifies a layout to use for the "home" section of the action bar.
{@link #ActionBar_icon com.scriptor:icon}
{@link #ActionBar_indeterminateProgressStyle com.scriptor:indeterminateProgressStyle}Specifies a style resource to use for an indeterminate progress spinner.
{@link #ActionBar_itemPadding com.scriptor:itemPadding}Specifies padding that should be applied to the left and right sides of - * system-provided items in the bar.
{@link #ActionBar_logo com.scriptor:logo}Specifies the drawable used for the application logo.
{@link #ActionBar_navigationMode com.scriptor:navigationMode}The type of navigation to use.
{@link #ActionBar_popupTheme com.scriptor:popupTheme}Reference to a theme that should be used to inflate popups - * shown by widgets in the action bar.
{@link #ActionBar_progressBarPadding com.scriptor:progressBarPadding}Specifies the horizontal padding on either end for an embedded progress bar.
{@link #ActionBar_progressBarStyle com.scriptor:progressBarStyle}Specifies a style resource to use for an embedded progress bar.
{@link #ActionBar_subtitle com.scriptor:subtitle}Specifies subtitle text used for navigationMode="normal"
{@link #ActionBar_subtitleTextStyle com.scriptor:subtitleTextStyle}Specifies a style to use for subtitle text.
{@link #ActionBar_title com.scriptor:title}
{@link #ActionBar_titleTextStyle com.scriptor:titleTextStyle}Specifies a style to use for title text.
- * @see #ActionBar_background - * @see #ActionBar_backgroundSplit - * @see #ActionBar_backgroundStacked - * @see #ActionBar_contentInsetEnd - * @see #ActionBar_contentInsetEndWithActions - * @see #ActionBar_contentInsetLeft - * @see #ActionBar_contentInsetRight - * @see #ActionBar_contentInsetStart - * @see #ActionBar_contentInsetStartWithNavigation - * @see #ActionBar_customNavigationLayout - * @see #ActionBar_displayOptions - * @see #ActionBar_divider - * @see #ActionBar_elevation - * @see #ActionBar_height - * @see #ActionBar_hideOnContentScroll - * @see #ActionBar_homeAsUpIndicator - * @see #ActionBar_homeLayout - * @see #ActionBar_icon - * @see #ActionBar_indeterminateProgressStyle - * @see #ActionBar_itemPadding - * @see #ActionBar_logo - * @see #ActionBar_navigationMode - * @see #ActionBar_popupTheme - * @see #ActionBar_progressBarPadding - * @see #ActionBar_progressBarStyle - * @see #ActionBar_subtitle - * @see #ActionBar_subtitleTextStyle - * @see #ActionBar_title - * @see #ActionBar_titleTextStyle - */ - public static final int[] ActionBar={ - 0x7f040031, 0x7f040032, 0x7f040033, 0x7f040097, - 0x7f040098, 0x7f040099, 0x7f04009a, 0x7f04009b, - 0x7f04009c, 0x7f0400aa, 0x7f0400af, 0x7f0400b0, - 0x7f0400bb, 0x7f0400e6, 0x7f0400eb, 0x7f0400f0, - 0x7f0400f1, 0x7f0400f3, 0x7f0400fd, 0x7f040107, - 0x7f04015c, 0x7f040168, 0x7f040179, 0x7f04017d, - 0x7f04017e, 0x7f0401ac, 0x7f0401af, 0x7f0401f4, - 0x7f0401fe - }; - /** - *

- * @attr description - * Specifies a background drawable for the action bar. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:background - */ - public static final int ActionBar_background=0; - /** - *

- * @attr description - * Specifies a background drawable for the bottom component of a split action bar. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:backgroundSplit - */ - public static final int ActionBar_backgroundSplit=1; - /** - *

- * @attr description - * Specifies a background drawable for a second stacked row of the action bar. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:backgroundStacked - */ - public static final int ActionBar_backgroundStacked=2; - /** - *

- * @attr description - * Minimum inset for content views within a bar. Navigation buttons and - * menu views are excepted. Only valid for some themes and configurations. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:contentInsetEnd - */ - public static final int ActionBar_contentInsetEnd=3; - /** - *

- * @attr description - * Minimum inset for content views within a bar when actions from a menu - * are present. Only valid for some themes and configurations. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:contentInsetEndWithActions - */ - public static final int ActionBar_contentInsetEndWithActions=4; - /** - *

- * @attr description - * Minimum inset for content views within a bar. Navigation buttons and - * menu views are excepted. Only valid for some themes and configurations. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:contentInsetLeft - */ - public static final int ActionBar_contentInsetLeft=5; - /** - *

- * @attr description - * Minimum inset for content views within a bar. Navigation buttons and - * menu views are excepted. Only valid for some themes and configurations. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:contentInsetRight - */ - public static final int ActionBar_contentInsetRight=6; - /** - *

- * @attr description - * Minimum inset for content views within a bar. Navigation buttons and - * menu views are excepted. Only valid for some themes and configurations. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:contentInsetStart - */ - public static final int ActionBar_contentInsetStart=7; - /** - *

- * @attr description - * Minimum inset for content views within a bar when a navigation button - * is present, such as the Up button. Only valid for some themes and configurations. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:contentInsetStartWithNavigation - */ - public static final int ActionBar_contentInsetStartWithNavigation=8; - /** - *

- * @attr description - * Specifies a layout for custom navigation. Overrides navigationMode. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:customNavigationLayout - */ - public static final int ActionBar_customNavigationLayout=9; - /** - *

- * @attr description - * Options affecting how the action bar is displayed. - * - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
disableHome20
homeAsUp4
none0
showCustom10
showHome2
showTitle8
useLogo1
- * - * @attr name com.scriptor:displayOptions - */ - public static final int ActionBar_displayOptions=10; - /** - *

- * @attr description - * Specifies the drawable used for item dividers. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:divider - */ - public static final int ActionBar_divider=11; - /** - *

- * @attr description - * Elevation for the action bar itself - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:elevation - */ - public static final int ActionBar_elevation=12; - /** - *

- * @attr description - * Specifies a fixed height. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:height - */ - public static final int ActionBar_height=13; - /** - *

- * @attr description - * Set true to hide the action bar on a vertical nested scroll of content. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:hideOnContentScroll - */ - public static final int ActionBar_hideOnContentScroll=14; - /** - *

- * @attr description - * Up navigation glyph - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:homeAsUpIndicator - */ - public static final int ActionBar_homeAsUpIndicator=15; - /** - *

- * @attr description - * Specifies a layout to use for the "home" section of the action bar. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:homeLayout - */ - public static final int ActionBar_homeLayout=16; - /** - *

- * @attr description - * Specifies the drawable used for the application icon. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:icon - */ - public static final int ActionBar_icon=17; - /** - *

- * @attr description - * Specifies a style resource to use for an indeterminate progress spinner. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:indeterminateProgressStyle - */ - public static final int ActionBar_indeterminateProgressStyle=18; - /** - *

- * @attr description - * Specifies padding that should be applied to the left and right sides of - * system-provided items in the bar. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:itemPadding - */ - public static final int ActionBar_itemPadding=19; - /** - *

- * @attr description - * Specifies the drawable used for the application logo. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:logo - */ - public static final int ActionBar_logo=20; - /** - *

- * @attr description - * The type of navigation to use. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
listMode1The action bar will use a selection list for navigation.
normal0Normal static title text
tabMode2The action bar will use a series of horizontal tabs for navigation.
- * - * @attr name com.scriptor:navigationMode - */ - public static final int ActionBar_navigationMode=21; - /** - *

- * @attr description - * Reference to a theme that should be used to inflate popups - * shown by widgets in the action bar. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:popupTheme - */ - public static final int ActionBar_popupTheme=22; - /** - *

- * @attr description - * Specifies the horizontal padding on either end for an embedded progress bar. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:progressBarPadding - */ - public static final int ActionBar_progressBarPadding=23; - /** - *

- * @attr description - * Specifies a style resource to use for an embedded progress bar. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:progressBarStyle - */ - public static final int ActionBar_progressBarStyle=24; - /** - *

- * @attr description - * Specifies subtitle text used for navigationMode="normal" - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:subtitle - */ - public static final int ActionBar_subtitle=25; - /** - *

- * @attr description - * Specifies a style to use for subtitle text. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:subtitleTextStyle - */ - public static final int ActionBar_subtitleTextStyle=26; - /** - *

- * @attr description - * Specifies title text used for navigationMode="normal" - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:title - */ - public static final int ActionBar_title=27; - /** - *

- * @attr description - * Specifies a style to use for title text. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:titleTextStyle - */ - public static final int ActionBar_titleTextStyle=28; - /** - * Attributes that can be used with a ActionBarLayout. - *

Includes the following attributes:

- * - * - * - * - * - *
AttributeDescription
{@link #ActionBarLayout_android_layout_gravity android:layout_gravity}
- * @see #ActionBarLayout_android_layout_gravity - */ - public static final int[] ActionBarLayout={ - 0x010100b3 - }; - /** - *

This symbol is the offset where the {@link android.R.attr#layout_gravity} - * attribute's value can be found in the {@link #ActionBarLayout} array. - * - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
bottom50
center11
center_horizontal1
center_vertical10
clip_horizontal8
clip_vertical80
end800005
fill77
fill_horizontal7
fill_vertical70
left3
right5
start800003
top30
- * - * @attr name android:layout_gravity - */ - public static final int ActionBarLayout_android_layout_gravity=0; - /** - * Attributes that can be used with a ActionMenuItemView. - *

Includes the following attributes:

- * - * - * - * - * - *
AttributeDescription
{@link #ActionMenuItemView_android_minWidth android:minWidth}
- * @see #ActionMenuItemView_android_minWidth - */ - public static final int[] ActionMenuItemView={ - 0x0101013f - }; - /** - *

This symbol is the offset where the {@link android.R.attr#minWidth} - * attribute's value can be found in the {@link #ActionMenuItemView} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:minWidth - */ - public static final int ActionMenuItemView_android_minWidth=0; - public static final int[] ActionMenuView={ - }; - /** - * Attributes that can be used with a ActionMode. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #ActionMode_background com.scriptor:background}Specifies a background drawable for the action bar.
{@link #ActionMode_backgroundSplit com.scriptor:backgroundSplit}Specifies a background drawable for the bottom component of a split action bar.
{@link #ActionMode_closeItemLayout com.scriptor:closeItemLayout}Specifies a layout to use for the "close" item at the starting edge.
{@link #ActionMode_height com.scriptor:height}
{@link #ActionMode_subtitleTextStyle com.scriptor:subtitleTextStyle}Specifies a style to use for subtitle text.
{@link #ActionMode_titleTextStyle com.scriptor:titleTextStyle}Specifies a style to use for title text.
- * @see #ActionMode_background - * @see #ActionMode_backgroundSplit - * @see #ActionMode_closeItemLayout - * @see #ActionMode_height - * @see #ActionMode_subtitleTextStyle - * @see #ActionMode_titleTextStyle - */ - public static final int[] ActionMode={ - 0x7f040031, 0x7f040032, 0x7f040081, 0x7f0400e6, - 0x7f0401af, 0x7f0401fe - }; - /** - *

- * @attr description - * Specifies a background for the action mode bar. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:background - */ - public static final int ActionMode_background=0; - /** - *

- * @attr description - * Specifies a background for the split action mode bar. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:backgroundSplit - */ - public static final int ActionMode_backgroundSplit=1; - /** - *

- * @attr description - * Specifies a layout to use for the "close" item at the starting edge. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:closeItemLayout - */ - public static final int ActionMode_closeItemLayout=2; - /** - *

- * @attr description - * Specifies a fixed height for the action mode bar. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:height - */ - public static final int ActionMode_height=3; - /** - *

- * @attr description - * Specifies a style to use for subtitle text. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:subtitleTextStyle - */ - public static final int ActionMode_subtitleTextStyle=4; - /** - *

- * @attr description - * Specifies a style to use for title text. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:titleTextStyle - */ - public static final int ActionMode_titleTextStyle=5; - /** - * Attributes that can be used with a ActivityChooserView. - *

Includes the following attributes:

- * - * - * - * - * - * - *
AttributeDescription
{@link #ActivityChooserView_expandActivityOverflowButtonDrawable com.scriptor:expandActivityOverflowButtonDrawable}The drawable to show in the button for expanding the activities overflow popup.
{@link #ActivityChooserView_initialActivityCount com.scriptor:initialActivityCount}The maximal number of items initially shown in the activity list.
- * @see #ActivityChooserView_expandActivityOverflowButtonDrawable - * @see #ActivityChooserView_initialActivityCount - */ - public static final int[] ActivityChooserView={ - 0x7f0400c1, 0x7f0400fe - }; - /** - *

- * @attr description - * The drawable to show in the button for expanding the activities overflow popup. - * Note: Clients would like to set this drawable - * as a clue about the action the chosen activity will perform. For - * example, if share activity is to be chosen the drawable should - * give a clue that sharing is to be performed. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:expandActivityOverflowButtonDrawable - */ - public static final int ActivityChooserView_expandActivityOverflowButtonDrawable=0; - /** - *

- * @attr description - * The maximal number of items initially shown in the activity list. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:initialActivityCount - */ - public static final int ActivityChooserView_initialActivityCount=1; - /** - * Attributes that can be used with a AlertDialog. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #AlertDialog_android_layout android:layout}
{@link #AlertDialog_buttonIconDimen com.scriptor:buttonIconDimen}
{@link #AlertDialog_buttonPanelSideLayout com.scriptor:buttonPanelSideLayout}
{@link #AlertDialog_listItemLayout com.scriptor:listItemLayout}
{@link #AlertDialog_listLayout com.scriptor:listLayout}
{@link #AlertDialog_multiChoiceItemLayout com.scriptor:multiChoiceItemLayout}
{@link #AlertDialog_showTitle com.scriptor:showTitle}
{@link #AlertDialog_singleChoiceItemLayout com.scriptor:singleChoiceItemLayout}
- * @see #AlertDialog_android_layout - * @see #AlertDialog_buttonIconDimen - * @see #AlertDialog_buttonPanelSideLayout - * @see #AlertDialog_listItemLayout - * @see #AlertDialog_listLayout - * @see #AlertDialog_multiChoiceItemLayout - * @see #AlertDialog_showTitle - * @see #AlertDialog_singleChoiceItemLayout - */ - public static final int[] AlertDialog={ - 0x010100f2, 0x7f040054, 0x7f040055, 0x7f040153, - 0x7f040154, 0x7f040165, 0x7f040194, 0x7f040195 - }; - /** - *

This symbol is the offset where the {@link android.R.attr#layout} - * attribute's value can be found in the {@link #AlertDialog} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:layout - */ - public static final int AlertDialog_android_layout=0; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#buttonIconDimen} - * attribute's value can be found in the {@link #AlertDialog} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:buttonIconDimen - */ - public static final int AlertDialog_buttonIconDimen=1; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#buttonPanelSideLayout} - * attribute's value can be found in the {@link #AlertDialog} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:buttonPanelSideLayout - */ - public static final int AlertDialog_buttonPanelSideLayout=2; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#listItemLayout} - * attribute's value can be found in the {@link #AlertDialog} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:listItemLayout - */ - public static final int AlertDialog_listItemLayout=3; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#listLayout} - * attribute's value can be found in the {@link #AlertDialog} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:listLayout - */ - public static final int AlertDialog_listLayout=4; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#multiChoiceItemLayout} - * attribute's value can be found in the {@link #AlertDialog} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:multiChoiceItemLayout - */ - public static final int AlertDialog_multiChoiceItemLayout=5; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#showTitle} - * attribute's value can be found in the {@link #AlertDialog} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:showTitle - */ - public static final int AlertDialog_showTitle=6; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#singleChoiceItemLayout} - * attribute's value can be found in the {@link #AlertDialog} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:singleChoiceItemLayout - */ - public static final int AlertDialog_singleChoiceItemLayout=7; - /** - * Attributes that can be used with a AnimatedStateListDrawableCompat. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #AnimatedStateListDrawableCompat_android_dither android:dither}
{@link #AnimatedStateListDrawableCompat_android_visible android:visible}
{@link #AnimatedStateListDrawableCompat_android_variablePadding android:variablePadding}
{@link #AnimatedStateListDrawableCompat_android_constantSize android:constantSize}
{@link #AnimatedStateListDrawableCompat_android_enterFadeDuration android:enterFadeDuration}
{@link #AnimatedStateListDrawableCompat_android_exitFadeDuration android:exitFadeDuration}
- * @see #AnimatedStateListDrawableCompat_android_dither - * @see #AnimatedStateListDrawableCompat_android_visible - * @see #AnimatedStateListDrawableCompat_android_variablePadding - * @see #AnimatedStateListDrawableCompat_android_constantSize - * @see #AnimatedStateListDrawableCompat_android_enterFadeDuration - * @see #AnimatedStateListDrawableCompat_android_exitFadeDuration - */ - public static final int[] AnimatedStateListDrawableCompat={ - 0x0101011c, 0x01010194, 0x01010195, 0x01010196, - 0x0101030c, 0x0101030d - }; - /** - *

- * @attr description - * Enables or disables dithering of the bitmap if the bitmap does not have the - * same pixel configuration as the screen (for instance: a ARGB 8888 bitmap with - * an RGB 565 screen). - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name android:dither - */ - public static final int AnimatedStateListDrawableCompat_android_dither=0; - /** - *

- * @attr description - * Indicates whether the drawable should be initially visible. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name android:visible - */ - public static final int AnimatedStateListDrawableCompat_android_visible=1; - /** - *

- * @attr description - * If true, allows the drawable's padding to change based on the - * current state that is selected. If false, the padding will - * stay the same (based on the maximum padding of all the states). - * Enabling this feature requires that the owner of the drawable - * deal with performing layout when the state changes, which is - * often not supported. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name android:variablePadding - */ - public static final int AnimatedStateListDrawableCompat_android_variablePadding=2; - /** - *

- * @attr description - * If true, the drawable's reported internal size will remain - * constant as the state changes; the size is the maximum of all - * of the states. If false, the size will vary based on the - * current state. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name android:constantSize - */ - public static final int AnimatedStateListDrawableCompat_android_constantSize=3; - /** - *

- * @attr description - * Amount of time (in milliseconds) to fade in a new state drawable. - * - *

May be an integer value, such as "100". - * - * @attr name android:enterFadeDuration - */ - public static final int AnimatedStateListDrawableCompat_android_enterFadeDuration=4; - /** - *

- * @attr description - * Amount of time (in milliseconds) to fade out an old state drawable. - * - *

May be an integer value, such as "100". - * - * @attr name android:exitFadeDuration - */ - public static final int AnimatedStateListDrawableCompat_android_exitFadeDuration=5; - /** - * Attributes that can be used with a AnimatedStateListDrawableItem. - *

Includes the following attributes:

- * - * - * - * - * - * - *
AttributeDescription
{@link #AnimatedStateListDrawableItem_android_id android:id}
{@link #AnimatedStateListDrawableItem_android_drawable android:drawable}
- * @see #AnimatedStateListDrawableItem_android_id - * @see #AnimatedStateListDrawableItem_android_drawable - */ - public static final int[] AnimatedStateListDrawableItem={ - 0x010100d0, 0x01010199 - }; - /** - *

- * @attr description - * Keyframe identifier for use in specifying transitions. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:id - */ - public static final int AnimatedStateListDrawableItem_android_id=0; - /** - *

- * @attr description - * Reference to a drawable resource to use for the frame. If not - * given, the drawable must be defined by the first child tag. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:drawable - */ - public static final int AnimatedStateListDrawableItem_android_drawable=1; - /** - * Attributes that can be used with a AnimatedStateListDrawableTransition. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #AnimatedStateListDrawableTransition_android_drawable android:drawable}
{@link #AnimatedStateListDrawableTransition_android_toId android:toId}
{@link #AnimatedStateListDrawableTransition_android_fromId android:fromId}
{@link #AnimatedStateListDrawableTransition_android_reversible android:reversible}
- * @see #AnimatedStateListDrawableTransition_android_drawable - * @see #AnimatedStateListDrawableTransition_android_toId - * @see #AnimatedStateListDrawableTransition_android_fromId - * @see #AnimatedStateListDrawableTransition_android_reversible - */ - public static final int[] AnimatedStateListDrawableTransition={ - 0x01010199, 0x01010449, 0x0101044a, 0x0101044b - }; - /** - *

- * @attr description - * Reference to a animation drawable resource to use for the frame. If not - * given, the animation drawable must be defined by the first child tag. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:drawable - */ - public static final int AnimatedStateListDrawableTransition_android_drawable=0; - /** - *

- * @attr description - * Keyframe identifier for the ending state. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:toId - */ - public static final int AnimatedStateListDrawableTransition_android_toId=1; - /** - *

- * @attr description - * Keyframe identifier for the starting state. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:fromId - */ - public static final int AnimatedStateListDrawableTransition_android_fromId=2; - /** - *

- * @attr description - * Whether this transition is reversible. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name android:reversible - */ - public static final int AnimatedStateListDrawableTransition_android_reversible=3; - /** - * Attributes that can be used with a AppBarLayout. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #AppBarLayout_android_background android:background}
{@link #AppBarLayout_android_touchscreenBlocksFocus android:touchscreenBlocksFocus}
{@link #AppBarLayout_android_keyboardNavigationCluster android:keyboardNavigationCluster}
{@link #AppBarLayout_elevation com.scriptor:elevation}Elevation for the action bar itself
{@link #AppBarLayout_expanded com.scriptor:expanded}
{@link #AppBarLayout_liftOnScroll com.scriptor:liftOnScroll}
- * @see #AppBarLayout_android_background - * @see #AppBarLayout_android_touchscreenBlocksFocus - * @see #AppBarLayout_android_keyboardNavigationCluster - * @see #AppBarLayout_elevation - * @see #AppBarLayout_expanded - * @see #AppBarLayout_liftOnScroll - */ - public static final int[] AppBarLayout={ - 0x010100d4, 0x0101048f, 0x01010540, 0x7f0400bb, - 0x7f0400c2, 0x7f04014e - }; - /** - *

This symbol is the offset where the {@link android.R.attr#background} - * attribute's value can be found in the {@link #AppBarLayout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name android:background - */ - public static final int AppBarLayout_android_background=0; - /** - *

This symbol is the offset where the {@link android.R.attr#touchscreenBlocksFocus} - * attribute's value can be found in the {@link #AppBarLayout} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name android:touchscreenBlocksFocus - */ - public static final int AppBarLayout_android_touchscreenBlocksFocus=1; - /** - *

This symbol is the offset where the {@link android.R.attr#keyboardNavigationCluster} - * attribute's value can be found in the {@link #AppBarLayout} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name android:keyboardNavigationCluster - */ - public static final int AppBarLayout_android_keyboardNavigationCluster=2; - /** - *

- * @attr description - * Elevation for the action bar itself - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:elevation - */ - public static final int AppBarLayout_elevation=3; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#expanded} - * attribute's value can be found in the {@link #AppBarLayout} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:expanded - */ - public static final int AppBarLayout_expanded=4; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#liftOnScroll} - * attribute's value can be found in the {@link #AppBarLayout} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:liftOnScroll - */ - public static final int AppBarLayout_liftOnScroll=5; - /** - * Attributes that can be used with a AppBarLayoutStates. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #AppBarLayoutStates_state_collapsed com.scriptor:state_collapsed}
{@link #AppBarLayoutStates_state_collapsible com.scriptor:state_collapsible}
{@link #AppBarLayoutStates_state_liftable com.scriptor:state_liftable}
{@link #AppBarLayoutStates_state_lifted com.scriptor:state_lifted}
- * @see #AppBarLayoutStates_state_collapsed - * @see #AppBarLayoutStates_state_collapsible - * @see #AppBarLayoutStates_state_liftable - * @see #AppBarLayoutStates_state_lifted - */ - public static final int[] AppBarLayoutStates={ - 0x7f0401a2, 0x7f0401a3, 0x7f0401a4, 0x7f0401a5 - }; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#state_collapsed} - * attribute's value can be found in the {@link #AppBarLayoutStates} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:state_collapsed - */ - public static final int AppBarLayoutStates_state_collapsed=0; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#state_collapsible} - * attribute's value can be found in the {@link #AppBarLayoutStates} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:state_collapsible - */ - public static final int AppBarLayoutStates_state_collapsible=1; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#state_liftable} - * attribute's value can be found in the {@link #AppBarLayoutStates} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:state_liftable - */ - public static final int AppBarLayoutStates_state_liftable=2; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#state_lifted} - * attribute's value can be found in the {@link #AppBarLayoutStates} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:state_lifted - */ - public static final int AppBarLayoutStates_state_lifted=3; - /** - * Attributes that can be used with a AppBarLayout_Layout. - *

Includes the following attributes:

- * - * - * - * - * - * - *
AttributeDescription
{@link #AppBarLayout_Layout_layout_scrollFlags com.scriptor:layout_scrollFlags}
{@link #AppBarLayout_Layout_layout_scrollInterpolator com.scriptor:layout_scrollInterpolator}
- * @see #AppBarLayout_Layout_layout_scrollFlags - * @see #AppBarLayout_Layout_layout_scrollInterpolator - */ - public static final int[] AppBarLayout_Layout={ - 0x7f04014c, 0x7f04014d - }; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_scrollFlags} - * attribute's value can be found in the {@link #AppBarLayout_Layout} array. - * - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
enterAlways4
enterAlwaysCollapsed8
exitUntilCollapsed2
scroll1
snap10
snapMargins20
- * - * @attr name com.scriptor:layout_scrollFlags - */ - public static final int AppBarLayout_Layout_layout_scrollFlags=0; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_scrollInterpolator} - * attribute's value can be found in the {@link #AppBarLayout_Layout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:layout_scrollInterpolator - */ - public static final int AppBarLayout_Layout_layout_scrollInterpolator=1; - /** - * Attributes that can be used with a AppCompatImageView. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #AppCompatImageView_android_src android:src}
{@link #AppCompatImageView_srcCompat com.scriptor:srcCompat}Sets a drawable as the content of this ImageView.
{@link #AppCompatImageView_tint com.scriptor:tint}Tint to apply to the image source.
{@link #AppCompatImageView_tintMode com.scriptor:tintMode}Blending mode used to apply the image source tint.
- * @see #AppCompatImageView_android_src - * @see #AppCompatImageView_srcCompat - * @see #AppCompatImageView_tint - * @see #AppCompatImageView_tintMode - */ - public static final int[] AppCompatImageView={ - 0x01010119, 0x7f04019f, 0x7f0401f2, 0x7f0401f3 - }; - /** - *

This symbol is the offset where the {@link android.R.attr#src} - * attribute's value can be found in the {@link #AppCompatImageView} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name android:src - */ - public static final int AppCompatImageView_android_src=0; - /** - *

- * @attr description - * Sets a drawable as the content of this ImageView. Allows the use of vector drawable - * when running on older versions of the platform. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:srcCompat - */ - public static final int AppCompatImageView_srcCompat=1; - /** - *

- * @attr description - * Tint to apply to the image source. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:tint - */ - public static final int AppCompatImageView_tint=2; - /** - *

- * @attr description - * Blending mode used to apply the image source tint. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
add10Combines the tint and icon color and alpha channels, clamping the - * result to valid color values. Saturate(S + D)
multiplyeMultiplies the color and alpha channels of the drawable with those of - * the tint. [Sa * Da, Sc * Dc]
screenf[Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]
src_atop9The tint is drawn above the drawable, but with the drawable’s alpha - * channel masking the result. [Da, Sc * Da + (1 - Sa) * Dc]
src_in5The tint is masked by the alpha channel of the drawable. The drawable’s - * color channels are thrown out. [Sa * Da, Sc * Da]
src_over3The tint is drawn on top of the drawable. - * [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc]
- * - * @attr name com.scriptor:tintMode - */ - public static final int AppCompatImageView_tintMode=3; - /** - * Attributes that can be used with a AppCompatSeekBar. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #AppCompatSeekBar_android_thumb android:thumb}
{@link #AppCompatSeekBar_tickMark com.scriptor:tickMark}Drawable displayed at each progress position on a seekbar.
{@link #AppCompatSeekBar_tickMarkTint com.scriptor:tickMarkTint}Tint to apply to the tick mark drawable.
{@link #AppCompatSeekBar_tickMarkTintMode com.scriptor:tickMarkTintMode}Blending mode used to apply the tick mark tint.
- * @see #AppCompatSeekBar_android_thumb - * @see #AppCompatSeekBar_tickMark - * @see #AppCompatSeekBar_tickMarkTint - * @see #AppCompatSeekBar_tickMarkTintMode - */ - public static final int[] AppCompatSeekBar={ - 0x01010142, 0x7f0401ef, 0x7f0401f0, 0x7f0401f1 - }; - /** - *

This symbol is the offset where the {@link android.R.attr#thumb} - * attribute's value can be found in the {@link #AppCompatSeekBar} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:thumb - */ - public static final int AppCompatSeekBar_android_thumb=0; - /** - *

- * @attr description - * Drawable displayed at each progress position on a seekbar. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:tickMark - */ - public static final int AppCompatSeekBar_tickMark=1; - /** - *

- * @attr description - * Tint to apply to the tick mark drawable. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:tickMarkTint - */ - public static final int AppCompatSeekBar_tickMarkTint=2; - /** - *

- * @attr description - * Blending mode used to apply the tick mark tint. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
add10Combines the tint and drawable color and alpha channels, clamping the - * result to valid color values. Saturate(S + D)
multiplyeMultiplies the color and alpha channels of the drawable with those of - * the tint. [Sa * Da, Sc * Dc]
screenf[Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]
src_atop9The tint is drawn above the drawable, but with the drawable’s alpha - * channel masking the result. [Da, Sc * Da + (1 - Sa) * Dc]
src_in5The tint is masked by the alpha channel of the drawable. The drawable’s - * color channels are thrown out. [Sa * Da, Sc * Da]
src_over3The tint is drawn on top of the drawable. - * [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc]
- * - * @attr name com.scriptor:tickMarkTintMode - */ - public static final int AppCompatSeekBar_tickMarkTintMode=3; - /** - * Attributes that can be used with a AppCompatTextHelper. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #AppCompatTextHelper_android_textAppearance android:textAppearance}
{@link #AppCompatTextHelper_android_drawableTop android:drawableTop}
{@link #AppCompatTextHelper_android_drawableBottom android:drawableBottom}
{@link #AppCompatTextHelper_android_drawableLeft android:drawableLeft}
{@link #AppCompatTextHelper_android_drawableRight android:drawableRight}
{@link #AppCompatTextHelper_android_drawableStart android:drawableStart}
{@link #AppCompatTextHelper_android_drawableEnd android:drawableEnd}
- * @see #AppCompatTextHelper_android_textAppearance - * @see #AppCompatTextHelper_android_drawableTop - * @see #AppCompatTextHelper_android_drawableBottom - * @see #AppCompatTextHelper_android_drawableLeft - * @see #AppCompatTextHelper_android_drawableRight - * @see #AppCompatTextHelper_android_drawableStart - * @see #AppCompatTextHelper_android_drawableEnd - */ - public static final int[] AppCompatTextHelper={ - 0x01010034, 0x0101016d, 0x0101016e, 0x0101016f, - 0x01010170, 0x01010392, 0x01010393 - }; - /** - *

This symbol is the offset where the {@link android.R.attr#textAppearance} - * attribute's value can be found in the {@link #AppCompatTextHelper} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:textAppearance - */ - public static final int AppCompatTextHelper_android_textAppearance=0; - /** - *

This symbol is the offset where the {@link android.R.attr#drawableTop} - * attribute's value can be found in the {@link #AppCompatTextHelper} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name android:drawableTop - */ - public static final int AppCompatTextHelper_android_drawableTop=1; - /** - *

This symbol is the offset where the {@link android.R.attr#drawableBottom} - * attribute's value can be found in the {@link #AppCompatTextHelper} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name android:drawableBottom - */ - public static final int AppCompatTextHelper_android_drawableBottom=2; - /** - *

This symbol is the offset where the {@link android.R.attr#drawableLeft} - * attribute's value can be found in the {@link #AppCompatTextHelper} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name android:drawableLeft - */ - public static final int AppCompatTextHelper_android_drawableLeft=3; - /** - *

This symbol is the offset where the {@link android.R.attr#drawableRight} - * attribute's value can be found in the {@link #AppCompatTextHelper} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name android:drawableRight - */ - public static final int AppCompatTextHelper_android_drawableRight=4; - /** - *

This symbol is the offset where the {@link android.R.attr#drawableStart} - * attribute's value can be found in the {@link #AppCompatTextHelper} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name android:drawableStart - */ - public static final int AppCompatTextHelper_android_drawableStart=5; - /** - *

This symbol is the offset where the {@link android.R.attr#drawableEnd} - * attribute's value can be found in the {@link #AppCompatTextHelper} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name android:drawableEnd - */ - public static final int AppCompatTextHelper_android_drawableEnd=6; - /** - * Attributes that can be used with a AppCompatTextView. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #AppCompatTextView_android_textAppearance android:textAppearance}
{@link #AppCompatTextView_autoSizeMaxTextSize com.scriptor:autoSizeMaxTextSize}The maximum text size constraint to be used when auto-sizing text.
{@link #AppCompatTextView_autoSizeMinTextSize com.scriptor:autoSizeMinTextSize}The minimum text size constraint to be used when auto-sizing text.
{@link #AppCompatTextView_autoSizePresetSizes com.scriptor:autoSizePresetSizes}Resource array of dimensions to be used in conjunction with - * autoSizeTextType set to uniform.
{@link #AppCompatTextView_autoSizeStepGranularity com.scriptor:autoSizeStepGranularity}Specify the auto-size step size if autoSizeTextType is set to - * uniform.
{@link #AppCompatTextView_autoSizeTextType com.scriptor:autoSizeTextType}Specify the type of auto-size.
{@link #AppCompatTextView_firstBaselineToTopHeight com.scriptor:firstBaselineToTopHeight}Distance from the top of the TextView to the first text baseline.
{@link #AppCompatTextView_fontFamily com.scriptor:fontFamily}The attribute for the font family.
{@link #AppCompatTextView_lastBaselineToBottomHeight com.scriptor:lastBaselineToBottomHeight}Distance from the bottom of the TextView to the last text baseline.
{@link #AppCompatTextView_lineHeight com.scriptor:lineHeight}Explicit height between lines of text.
{@link #AppCompatTextView_textAllCaps com.scriptor:textAllCaps}Present the text in ALL CAPS.
- * @see #AppCompatTextView_android_textAppearance - * @see #AppCompatTextView_autoSizeMaxTextSize - * @see #AppCompatTextView_autoSizeMinTextSize - * @see #AppCompatTextView_autoSizePresetSizes - * @see #AppCompatTextView_autoSizeStepGranularity - * @see #AppCompatTextView_autoSizeTextType - * @see #AppCompatTextView_firstBaselineToTopHeight - * @see #AppCompatTextView_fontFamily - * @see #AppCompatTextView_lastBaselineToBottomHeight - * @see #AppCompatTextView_lineHeight - * @see #AppCompatTextView_textAllCaps - */ - public static final int[] AppCompatTextView={ - 0x01010034, 0x7f04002c, 0x7f04002d, 0x7f04002e, - 0x7f04002f, 0x7f040030, 0x7f0400d5, 0x7f0400d8, - 0x7f04010f, 0x7f04014f, 0x7f0401cf - }; - /** - *

This symbol is the offset where the {@link android.R.attr#textAppearance} - * attribute's value can be found in the {@link #AppCompatTextView} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:textAppearance - */ - public static final int AppCompatTextView_android_textAppearance=0; - /** - *

- * @attr description - * The maximum text size constraint to be used when auto-sizing text. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:autoSizeMaxTextSize - */ - public static final int AppCompatTextView_autoSizeMaxTextSize=1; - /** - *

- * @attr description - * The minimum text size constraint to be used when auto-sizing text. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:autoSizeMinTextSize - */ - public static final int AppCompatTextView_autoSizeMinTextSize=2; - /** - *

- * @attr description - * Resource array of dimensions to be used in conjunction with - * autoSizeTextType set to uniform. Overrides - * autoSizeStepGranularity if set. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:autoSizePresetSizes - */ - public static final int AppCompatTextView_autoSizePresetSizes=3; - /** - *

- * @attr description - * Specify the auto-size step size if autoSizeTextType is set to - * uniform. The default is 1px. Overwrites - * autoSizePresetSizes if set. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:autoSizeStepGranularity - */ - public static final int AppCompatTextView_autoSizeStepGranularity=4; - /** - *

- * @attr description - * Specify the type of auto-size. Note that this feature is not supported by EditText, - * works only for TextView. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - *
ConstantValueDescription
none0No auto-sizing (default).
uniform1Uniform horizontal and vertical text size scaling to fit within the - * container.
- * - * @attr name com.scriptor:autoSizeTextType - */ - public static final int AppCompatTextView_autoSizeTextType=5; - /** - *

- * @attr description - * Distance from the top of the TextView to the first text baseline. If set, this - * overrides the value set for paddingTop. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:firstBaselineToTopHeight - */ - public static final int AppCompatTextView_firstBaselineToTopHeight=6; - /** - *

- * @attr description - * The attribute for the font family. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:fontFamily - */ - public static final int AppCompatTextView_fontFamily=7; - /** - *

- * @attr description - * Distance from the bottom of the TextView to the last text baseline. If set, this - * overrides the value set for paddingBottom. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:lastBaselineToBottomHeight - */ - public static final int AppCompatTextView_lastBaselineToBottomHeight=8; - /** - *

- * @attr description - * Explicit height between lines of text. If set, this will override the values set - * for lineSpacingExtra and lineSpacingMultiplier. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:lineHeight - */ - public static final int AppCompatTextView_lineHeight=9; - /** - *

- * @attr description - * Present the text in ALL CAPS. This may use a small-caps form when available. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:textAllCaps - */ - public static final int AppCompatTextView_textAllCaps=10; - /** - * Attributes that can be used with a AppCompatTheme. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #AppCompatTheme_android_windowIsFloating android:windowIsFloating}
{@link #AppCompatTheme_android_windowAnimationStyle android:windowAnimationStyle}
{@link #AppCompatTheme_actionBarDivider com.scriptor:actionBarDivider}Custom divider drawable to use for elements in the action bar.
{@link #AppCompatTheme_actionBarItemBackground com.scriptor:actionBarItemBackground}Custom item state list drawable background for action bar items.
{@link #AppCompatTheme_actionBarPopupTheme com.scriptor:actionBarPopupTheme}Reference to a theme that should be used to inflate popups - * shown by widgets in the action bar.
{@link #AppCompatTheme_actionBarSize com.scriptor:actionBarSize}Size of the Action Bar, including the contextual - * bar used to present Action Modes.
{@link #AppCompatTheme_actionBarSplitStyle com.scriptor:actionBarSplitStyle}Reference to a style for the split Action Bar.
{@link #AppCompatTheme_actionBarStyle com.scriptor:actionBarStyle}Reference to a style for the Action Bar
{@link #AppCompatTheme_actionBarTabBarStyle com.scriptor:actionBarTabBarStyle}
{@link #AppCompatTheme_actionBarTabStyle com.scriptor:actionBarTabStyle}Default style for tabs within an action bar
{@link #AppCompatTheme_actionBarTabTextStyle com.scriptor:actionBarTabTextStyle}
{@link #AppCompatTheme_actionBarTheme com.scriptor:actionBarTheme}Reference to a theme that should be used to inflate the - * action bar.
{@link #AppCompatTheme_actionBarWidgetTheme com.scriptor:actionBarWidgetTheme}Reference to a theme that should be used to inflate widgets - * and layouts destined for the action bar.
{@link #AppCompatTheme_actionButtonStyle com.scriptor:actionButtonStyle}Default action button style.
{@link #AppCompatTheme_actionDropDownStyle com.scriptor:actionDropDownStyle}Default ActionBar dropdown style.
{@link #AppCompatTheme_actionMenuTextAppearance com.scriptor:actionMenuTextAppearance}TextAppearance style that will be applied to text that - * appears within action menu items.
{@link #AppCompatTheme_actionMenuTextColor com.scriptor:actionMenuTextColor}Color for text that appears within action menu items.
{@link #AppCompatTheme_actionModeBackground com.scriptor:actionModeBackground}Background drawable to use for action mode UI
{@link #AppCompatTheme_actionModeCloseButtonStyle com.scriptor:actionModeCloseButtonStyle}
{@link #AppCompatTheme_actionModeCloseDrawable com.scriptor:actionModeCloseDrawable}Drawable to use for the close action mode button
{@link #AppCompatTheme_actionModeCopyDrawable com.scriptor:actionModeCopyDrawable}Drawable to use for the Copy action button in Contextual Action Bar
{@link #AppCompatTheme_actionModeCutDrawable com.scriptor:actionModeCutDrawable}Drawable to use for the Cut action button in Contextual Action Bar
{@link #AppCompatTheme_actionModeFindDrawable com.scriptor:actionModeFindDrawable}Drawable to use for the Find action button in WebView selection action modes
{@link #AppCompatTheme_actionModePasteDrawable com.scriptor:actionModePasteDrawable}Drawable to use for the Paste action button in Contextual Action Bar
{@link #AppCompatTheme_actionModePopupWindowStyle com.scriptor:actionModePopupWindowStyle}PopupWindow style to use for action modes when showing as a window overlay.
{@link #AppCompatTheme_actionModeSelectAllDrawable com.scriptor:actionModeSelectAllDrawable}Drawable to use for the Select all action button in Contextual Action Bar
{@link #AppCompatTheme_actionModeShareDrawable com.scriptor:actionModeShareDrawable}Drawable to use for the Share action button in WebView selection action modes
{@link #AppCompatTheme_actionModeSplitBackground com.scriptor:actionModeSplitBackground}Background drawable to use for action mode UI in the lower split bar
{@link #AppCompatTheme_actionModeStyle com.scriptor:actionModeStyle}
{@link #AppCompatTheme_actionModeWebSearchDrawable com.scriptor:actionModeWebSearchDrawable}Drawable to use for the Web Search action button in WebView selection action modes
{@link #AppCompatTheme_actionOverflowButtonStyle com.scriptor:actionOverflowButtonStyle}
{@link #AppCompatTheme_actionOverflowMenuStyle com.scriptor:actionOverflowMenuStyle}
{@link #AppCompatTheme_activityChooserViewStyle com.scriptor:activityChooserViewStyle}Default ActivityChooserView style.
{@link #AppCompatTheme_alertDialogButtonGroupStyle com.scriptor:alertDialogButtonGroupStyle}
{@link #AppCompatTheme_alertDialogCenterButtons com.scriptor:alertDialogCenterButtons}
{@link #AppCompatTheme_alertDialogStyle com.scriptor:alertDialogStyle}
{@link #AppCompatTheme_alertDialogTheme com.scriptor:alertDialogTheme}Theme to use for alert dialogs spawned from this theme.
{@link #AppCompatTheme_autoCompleteTextViewStyle com.scriptor:autoCompleteTextViewStyle}Default AutoCompleteTextView style.
{@link #AppCompatTheme_borderlessButtonStyle com.scriptor:borderlessButtonStyle}Style for buttons without an explicit border, often used in groups.
{@link #AppCompatTheme_buttonBarButtonStyle com.scriptor:buttonBarButtonStyle}Style for buttons within button bars
{@link #AppCompatTheme_buttonBarNegativeButtonStyle com.scriptor:buttonBarNegativeButtonStyle}Style for the "negative" buttons within button bars
{@link #AppCompatTheme_buttonBarNeutralButtonStyle com.scriptor:buttonBarNeutralButtonStyle}Style for the "neutral" buttons within button bars
{@link #AppCompatTheme_buttonBarPositiveButtonStyle com.scriptor:buttonBarPositiveButtonStyle}Style for the "positive" buttons within button bars
{@link #AppCompatTheme_buttonBarStyle com.scriptor:buttonBarStyle}Style for button bars
{@link #AppCompatTheme_buttonStyle com.scriptor:buttonStyle}Normal Button style.
{@link #AppCompatTheme_buttonStyleSmall com.scriptor:buttonStyleSmall}Small Button style.
{@link #AppCompatTheme_checkboxStyle com.scriptor:checkboxStyle}Default Checkbox style.
{@link #AppCompatTheme_checkedTextViewStyle com.scriptor:checkedTextViewStyle}Default CheckedTextView style.
{@link #AppCompatTheme_colorAccent com.scriptor:colorAccent}Bright complement to the primary branding color.
{@link #AppCompatTheme_colorBackgroundFloating com.scriptor:colorBackgroundFloating}Default color of background imagery for floating components, ex.
{@link #AppCompatTheme_colorButtonNormal com.scriptor:colorButtonNormal}The color applied to framework buttons in their normal state.
{@link #AppCompatTheme_colorControlActivated com.scriptor:colorControlActivated}The color applied to framework controls in their activated (ex.
{@link #AppCompatTheme_colorControlHighlight com.scriptor:colorControlHighlight}The color applied to framework control highlights (ex.
{@link #AppCompatTheme_colorControlNormal com.scriptor:colorControlNormal}The color applied to framework controls in their normal state.
{@link #AppCompatTheme_colorError com.scriptor:colorError}Color used for error states and things that need to be drawn to - * the user's attention.
{@link #AppCompatTheme_colorPrimary com.scriptor:colorPrimary}The primary branding color for the app.
{@link #AppCompatTheme_colorPrimaryDark com.scriptor:colorPrimaryDark}Dark variant of the primary branding color.
{@link #AppCompatTheme_colorSwitchThumbNormal com.scriptor:colorSwitchThumbNormal}The color applied to framework switch thumbs in their normal state.
{@link #AppCompatTheme_controlBackground com.scriptor:controlBackground}The background used by framework controls.
{@link #AppCompatTheme_dialogCornerRadius com.scriptor:dialogCornerRadius}Preferred corner radius of dialogs.
{@link #AppCompatTheme_dialogPreferredPadding com.scriptor:dialogPreferredPadding}Preferred padding for dialog content.
{@link #AppCompatTheme_dialogTheme com.scriptor:dialogTheme}Theme to use for dialogs spawned from this theme.
{@link #AppCompatTheme_dividerHorizontal com.scriptor:dividerHorizontal}A drawable that may be used as a horizontal divider between visual elements.
{@link #AppCompatTheme_dividerVertical com.scriptor:dividerVertical}A drawable that may be used as a vertical divider between visual elements.
{@link #AppCompatTheme_dropDownListViewStyle com.scriptor:dropDownListViewStyle}ListPopupWindow compatibility
{@link #AppCompatTheme_dropdownListPreferredItemHeight com.scriptor:dropdownListPreferredItemHeight}The preferred item height for dropdown lists.
{@link #AppCompatTheme_editTextBackground com.scriptor:editTextBackground}EditText background drawable.
{@link #AppCompatTheme_editTextColor com.scriptor:editTextColor}EditText text foreground color.
{@link #AppCompatTheme_editTextStyle com.scriptor:editTextStyle}Default EditText style.
{@link #AppCompatTheme_homeAsUpIndicator com.scriptor:homeAsUpIndicator}Specifies a drawable to use for the 'home as up' indicator.
{@link #AppCompatTheme_imageButtonStyle com.scriptor:imageButtonStyle}ImageButton background drawable.
{@link #AppCompatTheme_listChoiceBackgroundIndicator com.scriptor:listChoiceBackgroundIndicator}Drawable used as a background for selected list items.
{@link #AppCompatTheme_listDividerAlertDialog com.scriptor:listDividerAlertDialog}The list divider used in alert dialogs.
{@link #AppCompatTheme_listMenuViewStyle com.scriptor:listMenuViewStyle}Default menu-style ListView style.
{@link #AppCompatTheme_listPopupWindowStyle com.scriptor:listPopupWindowStyle}
{@link #AppCompatTheme_listPreferredItemHeight com.scriptor:listPreferredItemHeight}The preferred list item height.
{@link #AppCompatTheme_listPreferredItemHeightLarge com.scriptor:listPreferredItemHeightLarge}A larger, more robust list item height.
{@link #AppCompatTheme_listPreferredItemHeightSmall com.scriptor:listPreferredItemHeightSmall}A smaller, sleeker list item height.
{@link #AppCompatTheme_listPreferredItemPaddingLeft com.scriptor:listPreferredItemPaddingLeft}The preferred padding along the left edge of list items.
{@link #AppCompatTheme_listPreferredItemPaddingRight com.scriptor:listPreferredItemPaddingRight}The preferred padding along the right edge of list items.
{@link #AppCompatTheme_panelBackground com.scriptor:panelBackground}The background of a panel when it is inset from the left and right edges of the screen.
{@link #AppCompatTheme_panelMenuListTheme com.scriptor:panelMenuListTheme}Default Panel Menu style.
{@link #AppCompatTheme_panelMenuListWidth com.scriptor:panelMenuListWidth}Default Panel Menu width.
{@link #AppCompatTheme_popupMenuStyle com.scriptor:popupMenuStyle}Default PopupMenu style.
{@link #AppCompatTheme_popupWindowStyle com.scriptor:popupWindowStyle}Default PopupWindow style.
{@link #AppCompatTheme_radioButtonStyle com.scriptor:radioButtonStyle}Default RadioButton style.
{@link #AppCompatTheme_ratingBarStyle com.scriptor:ratingBarStyle}Default RatingBar style.
{@link #AppCompatTheme_ratingBarStyleIndicator com.scriptor:ratingBarStyleIndicator}Indicator RatingBar style.
{@link #AppCompatTheme_ratingBarStyleSmall com.scriptor:ratingBarStyleSmall}Small indicator RatingBar style.
{@link #AppCompatTheme_searchViewStyle com.scriptor:searchViewStyle}Style for the search query widget.
{@link #AppCompatTheme_seekBarStyle com.scriptor:seekBarStyle}Default SeekBar style.
{@link #AppCompatTheme_selectableItemBackground com.scriptor:selectableItemBackground}A style that may be applied to buttons or other selectable items - * that should react to pressed and focus states, but that do not - * have a clear visual border along the edges.
{@link #AppCompatTheme_selectableItemBackgroundBorderless com.scriptor:selectableItemBackgroundBorderless}Background drawable for borderless standalone items that need focus/pressed states.
{@link #AppCompatTheme_spinnerDropDownItemStyle com.scriptor:spinnerDropDownItemStyle}Default Spinner style.
{@link #AppCompatTheme_spinnerStyle com.scriptor:spinnerStyle}Default Spinner style.
{@link #AppCompatTheme_switchStyle com.scriptor:switchStyle}Default style for the Switch widget.
{@link #AppCompatTheme_textAppearanceLargePopupMenu com.scriptor:textAppearanceLargePopupMenu}Text color, typeface, size, and style for the text inside of a popup menu.
{@link #AppCompatTheme_textAppearanceListItem com.scriptor:textAppearanceListItem}The preferred TextAppearance for the primary text of list items.
{@link #AppCompatTheme_textAppearanceListItemSecondary com.scriptor:textAppearanceListItemSecondary}The preferred TextAppearance for the secondary text of list items.
{@link #AppCompatTheme_textAppearanceListItemSmall com.scriptor:textAppearanceListItemSmall}The preferred TextAppearance for the primary text of small list items.
{@link #AppCompatTheme_textAppearancePopupMenuHeader com.scriptor:textAppearancePopupMenuHeader}Text color, typeface, size, and style for header text inside of a popup menu.
{@link #AppCompatTheme_textAppearanceSearchResultSubtitle com.scriptor:textAppearanceSearchResultSubtitle}Text color, typeface, size, and style for system search result subtitle.
{@link #AppCompatTheme_textAppearanceSearchResultTitle com.scriptor:textAppearanceSearchResultTitle}Text color, typeface, size, and style for system search result title.
{@link #AppCompatTheme_textAppearanceSmallPopupMenu com.scriptor:textAppearanceSmallPopupMenu}Text color, typeface, size, and style for small text inside of a popup menu.
{@link #AppCompatTheme_textColorAlertDialogListItem com.scriptor:textColorAlertDialogListItem}Color of list item text in alert dialogs.
{@link #AppCompatTheme_textColorSearchUrl com.scriptor:textColorSearchUrl}Text color for urls in search suggestions, used by things like global search
{@link #AppCompatTheme_toolbarNavigationButtonStyle com.scriptor:toolbarNavigationButtonStyle}Default Toolar NavigationButtonStyle
{@link #AppCompatTheme_toolbarStyle com.scriptor:toolbarStyle}Default Toolbar style.
{@link #AppCompatTheme_tooltipForegroundColor com.scriptor:tooltipForegroundColor}Foreground color to use for tooltips
{@link #AppCompatTheme_tooltipFrameBackground com.scriptor:tooltipFrameBackground}Background to use for tooltips
{@link #AppCompatTheme_viewInflaterClass com.scriptor:viewInflaterClass}
{@link #AppCompatTheme_windowActionBar com.scriptor:windowActionBar}Flag indicating whether this window should have an Action Bar - * in place of the usual title bar.
{@link #AppCompatTheme_windowActionBarOverlay com.scriptor:windowActionBarOverlay}Flag indicating whether this window's Action Bar should overlay - * application content.
{@link #AppCompatTheme_windowActionModeOverlay com.scriptor:windowActionModeOverlay}Flag indicating whether action modes should overlay window content - * when there is not reserved space for their UI (such as an Action Bar).
{@link #AppCompatTheme_windowFixedHeightMajor com.scriptor:windowFixedHeightMajor}A fixed height for the window along the major axis of the screen, - * that is, when in portrait.
{@link #AppCompatTheme_windowFixedHeightMinor com.scriptor:windowFixedHeightMinor}A fixed height for the window along the minor axis of the screen, - * that is, when in landscape.
{@link #AppCompatTheme_windowFixedWidthMajor com.scriptor:windowFixedWidthMajor}A fixed width for the window along the major axis of the screen, - * that is, when in landscape.
{@link #AppCompatTheme_windowFixedWidthMinor com.scriptor:windowFixedWidthMinor}A fixed width for the window along the minor axis of the screen, - * that is, when in portrait.
{@link #AppCompatTheme_windowMinWidthMajor com.scriptor:windowMinWidthMajor}The minimum width the window is allowed to be, along the major - * axis of the screen.
{@link #AppCompatTheme_windowMinWidthMinor com.scriptor:windowMinWidthMinor}The minimum width the window is allowed to be, along the minor - * axis of the screen.
{@link #AppCompatTheme_windowNoTitle com.scriptor:windowNoTitle}Flag indicating whether there should be no title on this window.
- * @see #AppCompatTheme_android_windowIsFloating - * @see #AppCompatTheme_android_windowAnimationStyle - * @see #AppCompatTheme_actionBarDivider - * @see #AppCompatTheme_actionBarItemBackground - * @see #AppCompatTheme_actionBarPopupTheme - * @see #AppCompatTheme_actionBarSize - * @see #AppCompatTheme_actionBarSplitStyle - * @see #AppCompatTheme_actionBarStyle - * @see #AppCompatTheme_actionBarTabBarStyle - * @see #AppCompatTheme_actionBarTabStyle - * @see #AppCompatTheme_actionBarTabTextStyle - * @see #AppCompatTheme_actionBarTheme - * @see #AppCompatTheme_actionBarWidgetTheme - * @see #AppCompatTheme_actionButtonStyle - * @see #AppCompatTheme_actionDropDownStyle - * @see #AppCompatTheme_actionMenuTextAppearance - * @see #AppCompatTheme_actionMenuTextColor - * @see #AppCompatTheme_actionModeBackground - * @see #AppCompatTheme_actionModeCloseButtonStyle - * @see #AppCompatTheme_actionModeCloseDrawable - * @see #AppCompatTheme_actionModeCopyDrawable - * @see #AppCompatTheme_actionModeCutDrawable - * @see #AppCompatTheme_actionModeFindDrawable - * @see #AppCompatTheme_actionModePasteDrawable - * @see #AppCompatTheme_actionModePopupWindowStyle - * @see #AppCompatTheme_actionModeSelectAllDrawable - * @see #AppCompatTheme_actionModeShareDrawable - * @see #AppCompatTheme_actionModeSplitBackground - * @see #AppCompatTheme_actionModeStyle - * @see #AppCompatTheme_actionModeWebSearchDrawable - * @see #AppCompatTheme_actionOverflowButtonStyle - * @see #AppCompatTheme_actionOverflowMenuStyle - * @see #AppCompatTheme_activityChooserViewStyle - * @see #AppCompatTheme_alertDialogButtonGroupStyle - * @see #AppCompatTheme_alertDialogCenterButtons - * @see #AppCompatTheme_alertDialogStyle - * @see #AppCompatTheme_alertDialogTheme - * @see #AppCompatTheme_autoCompleteTextViewStyle - * @see #AppCompatTheme_borderlessButtonStyle - * @see #AppCompatTheme_buttonBarButtonStyle - * @see #AppCompatTheme_buttonBarNegativeButtonStyle - * @see #AppCompatTheme_buttonBarNeutralButtonStyle - * @see #AppCompatTheme_buttonBarPositiveButtonStyle - * @see #AppCompatTheme_buttonBarStyle - * @see #AppCompatTheme_buttonStyle - * @see #AppCompatTheme_buttonStyleSmall - * @see #AppCompatTheme_checkboxStyle - * @see #AppCompatTheme_checkedTextViewStyle - * @see #AppCompatTheme_colorAccent - * @see #AppCompatTheme_colorBackgroundFloating - * @see #AppCompatTheme_colorButtonNormal - * @see #AppCompatTheme_colorControlActivated - * @see #AppCompatTheme_colorControlHighlight - * @see #AppCompatTheme_colorControlNormal - * @see #AppCompatTheme_colorError - * @see #AppCompatTheme_colorPrimary - * @see #AppCompatTheme_colorPrimaryDark - * @see #AppCompatTheme_colorSwitchThumbNormal - * @see #AppCompatTheme_controlBackground - * @see #AppCompatTheme_dialogCornerRadius - * @see #AppCompatTheme_dialogPreferredPadding - * @see #AppCompatTheme_dialogTheme - * @see #AppCompatTheme_dividerHorizontal - * @see #AppCompatTheme_dividerVertical - * @see #AppCompatTheme_dropDownListViewStyle - * @see #AppCompatTheme_dropdownListPreferredItemHeight - * @see #AppCompatTheme_editTextBackground - * @see #AppCompatTheme_editTextColor - * @see #AppCompatTheme_editTextStyle - * @see #AppCompatTheme_homeAsUpIndicator - * @see #AppCompatTheme_imageButtonStyle - * @see #AppCompatTheme_listChoiceBackgroundIndicator - * @see #AppCompatTheme_listDividerAlertDialog - * @see #AppCompatTheme_listMenuViewStyle - * @see #AppCompatTheme_listPopupWindowStyle - * @see #AppCompatTheme_listPreferredItemHeight - * @see #AppCompatTheme_listPreferredItemHeightLarge - * @see #AppCompatTheme_listPreferredItemHeightSmall - * @see #AppCompatTheme_listPreferredItemPaddingLeft - * @see #AppCompatTheme_listPreferredItemPaddingRight - * @see #AppCompatTheme_panelBackground - * @see #AppCompatTheme_panelMenuListTheme - * @see #AppCompatTheme_panelMenuListWidth - * @see #AppCompatTheme_popupMenuStyle - * @see #AppCompatTheme_popupWindowStyle - * @see #AppCompatTheme_radioButtonStyle - * @see #AppCompatTheme_ratingBarStyle - * @see #AppCompatTheme_ratingBarStyleIndicator - * @see #AppCompatTheme_ratingBarStyleSmall - * @see #AppCompatTheme_searchViewStyle - * @see #AppCompatTheme_seekBarStyle - * @see #AppCompatTheme_selectableItemBackground - * @see #AppCompatTheme_selectableItemBackgroundBorderless - * @see #AppCompatTheme_spinnerDropDownItemStyle - * @see #AppCompatTheme_spinnerStyle - * @see #AppCompatTheme_switchStyle - * @see #AppCompatTheme_textAppearanceLargePopupMenu - * @see #AppCompatTheme_textAppearanceListItem - * @see #AppCompatTheme_textAppearanceListItemSecondary - * @see #AppCompatTheme_textAppearanceListItemSmall - * @see #AppCompatTheme_textAppearancePopupMenuHeader - * @see #AppCompatTheme_textAppearanceSearchResultSubtitle - * @see #AppCompatTheme_textAppearanceSearchResultTitle - * @see #AppCompatTheme_textAppearanceSmallPopupMenu - * @see #AppCompatTheme_textColorAlertDialogListItem - * @see #AppCompatTheme_textColorSearchUrl - * @see #AppCompatTheme_toolbarNavigationButtonStyle - * @see #AppCompatTheme_toolbarStyle - * @see #AppCompatTheme_tooltipForegroundColor - * @see #AppCompatTheme_tooltipFrameBackground - * @see #AppCompatTheme_viewInflaterClass - * @see #AppCompatTheme_windowActionBar - * @see #AppCompatTheme_windowActionBarOverlay - * @see #AppCompatTheme_windowActionModeOverlay - * @see #AppCompatTheme_windowFixedHeightMajor - * @see #AppCompatTheme_windowFixedHeightMinor - * @see #AppCompatTheme_windowFixedWidthMajor - * @see #AppCompatTheme_windowFixedWidthMinor - * @see #AppCompatTheme_windowMinWidthMajor - * @see #AppCompatTheme_windowMinWidthMinor - * @see #AppCompatTheme_windowNoTitle - */ - public static final int[] AppCompatTheme={ - 0x01010057, 0x010100ae, 0x7f040000, 0x7f040001, - 0x7f040002, 0x7f040003, 0x7f040004, 0x7f040005, - 0x7f040006, 0x7f040007, 0x7f040008, 0x7f040009, - 0x7f04000a, 0x7f04000b, 0x7f04000c, 0x7f04000e, - 0x7f04000f, 0x7f040010, 0x7f040011, 0x7f040012, - 0x7f040013, 0x7f040014, 0x7f040015, 0x7f040016, - 0x7f040017, 0x7f040018, 0x7f040019, 0x7f04001a, - 0x7f04001b, 0x7f04001c, 0x7f04001d, 0x7f04001e, - 0x7f040021, 0x7f040022, 0x7f040023, 0x7f040024, - 0x7f040025, 0x7f04002b, 0x7f040040, 0x7f04004e, - 0x7f04004f, 0x7f040050, 0x7f040051, 0x7f040052, - 0x7f040056, 0x7f040057, 0x7f040062, 0x7f040067, - 0x7f040087, 0x7f040088, 0x7f040089, 0x7f04008a, - 0x7f04008b, 0x7f04008c, 0x7f04008d, 0x7f04008e, - 0x7f04008f, 0x7f040091, 0x7f0400a3, 0x7f0400ac, - 0x7f0400ad, 0x7f0400ae, 0x7f0400b1, 0x7f0400b3, - 0x7f0400b6, 0x7f0400b7, 0x7f0400b8, 0x7f0400b9, - 0x7f0400ba, 0x7f0400f0, 0x7f0400fc, 0x7f040151, - 0x7f040152, 0x7f040155, 0x7f040156, 0x7f040157, - 0x7f040158, 0x7f040159, 0x7f04015a, 0x7f04015b, - 0x7f040170, 0x7f040171, 0x7f040172, 0x7f040178, - 0x7f04017a, 0x7f040181, 0x7f040182, 0x7f040183, - 0x7f040184, 0x7f04018c, 0x7f04018d, 0x7f04018e, - 0x7f04018f, 0x7f04019c, 0x7f04019d, 0x7f0401b3, - 0x7f0401da, 0x7f0401db, 0x7f0401dc, 0x7f0401dd, - 0x7f0401df, 0x7f0401e0, 0x7f0401e1, 0x7f0401e2, - 0x7f0401e5, 0x7f0401e6, 0x7f040200, 0x7f040201, - 0x7f040202, 0x7f040203, 0x7f04020a, 0x7f04020c, - 0x7f04020d, 0x7f04020e, 0x7f04020f, 0x7f040210, - 0x7f040211, 0x7f040212, 0x7f040213, 0x7f040214, - 0x7f040215 - }; - /** - *

This symbol is the offset where the {@link android.R.attr#windowIsFloating} - * attribute's value can be found in the {@link #AppCompatTheme} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name android:windowIsFloating - */ - public static final int AppCompatTheme_android_windowIsFloating=0; - /** - *

This symbol is the offset where the {@link android.R.attr#windowAnimationStyle} - * attribute's value can be found in the {@link #AppCompatTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:windowAnimationStyle - */ - public static final int AppCompatTheme_android_windowAnimationStyle=1; - /** - *

- * @attr description - * Custom divider drawable to use for elements in the action bar. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionBarDivider - */ - public static final int AppCompatTheme_actionBarDivider=2; - /** - *

- * @attr description - * Custom item state list drawable background for action bar items. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionBarItemBackground - */ - public static final int AppCompatTheme_actionBarItemBackground=3; - /** - *

- * @attr description - * Reference to a theme that should be used to inflate popups - * shown by widgets in the action bar. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionBarPopupTheme - */ - public static final int AppCompatTheme_actionBarPopupTheme=4; - /** - *

- * @attr description - * Size of the Action Bar, including the contextual - * bar used to present Action Modes. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
wrap_content0
- * - * @attr name com.scriptor:actionBarSize - */ - public static final int AppCompatTheme_actionBarSize=5; - /** - *

- * @attr description - * Reference to a style for the split Action Bar. This style - * controls the split component that holds the menu/action - * buttons. actionBarStyle is still used for the primary - * bar. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionBarSplitStyle - */ - public static final int AppCompatTheme_actionBarSplitStyle=6; - /** - *

- * @attr description - * Reference to a style for the Action Bar - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionBarStyle - */ - public static final int AppCompatTheme_actionBarStyle=7; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#actionBarTabBarStyle} - * attribute's value can be found in the {@link #AppCompatTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionBarTabBarStyle - */ - public static final int AppCompatTheme_actionBarTabBarStyle=8; - /** - *

- * @attr description - * Default style for tabs within an action bar - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionBarTabStyle - */ - public static final int AppCompatTheme_actionBarTabStyle=9; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#actionBarTabTextStyle} - * attribute's value can be found in the {@link #AppCompatTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionBarTabTextStyle - */ - public static final int AppCompatTheme_actionBarTabTextStyle=10; - /** - *

- * @attr description - * Reference to a theme that should be used to inflate the - * action bar. This will be inherited by any widget inflated - * into the action bar. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionBarTheme - */ - public static final int AppCompatTheme_actionBarTheme=11; - /** - *

- * @attr description - * Reference to a theme that should be used to inflate widgets - * and layouts destined for the action bar. Most of the time - * this will be a reference to the current theme, but when - * the action bar has a significantly different contrast - * profile than the rest of the activity the difference - * can become important. If this is set to @null the current - * theme will be used. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionBarWidgetTheme - */ - public static final int AppCompatTheme_actionBarWidgetTheme=12; - /** - *

- * @attr description - * Default action button style. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionButtonStyle - */ - public static final int AppCompatTheme_actionButtonStyle=13; - /** - *

- * @attr description - * Default ActionBar dropdown style. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionDropDownStyle - */ - public static final int AppCompatTheme_actionDropDownStyle=14; - /** - *

- * @attr description - * TextAppearance style that will be applied to text that - * appears within action menu items. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionMenuTextAppearance - */ - public static final int AppCompatTheme_actionMenuTextAppearance=15; - /** - *

- * @attr description - * Color for text that appears within action menu items. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:actionMenuTextColor - */ - public static final int AppCompatTheme_actionMenuTextColor=16; - /** - *

- * @attr description - * Background drawable to use for action mode UI - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionModeBackground - */ - public static final int AppCompatTheme_actionModeBackground=17; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#actionModeCloseButtonStyle} - * attribute's value can be found in the {@link #AppCompatTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionModeCloseButtonStyle - */ - public static final int AppCompatTheme_actionModeCloseButtonStyle=18; - /** - *

- * @attr description - * Drawable to use for the close action mode button - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionModeCloseDrawable - */ - public static final int AppCompatTheme_actionModeCloseDrawable=19; - /** - *

- * @attr description - * Drawable to use for the Copy action button in Contextual Action Bar - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionModeCopyDrawable - */ - public static final int AppCompatTheme_actionModeCopyDrawable=20; - /** - *

- * @attr description - * Drawable to use for the Cut action button in Contextual Action Bar - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionModeCutDrawable - */ - public static final int AppCompatTheme_actionModeCutDrawable=21; - /** - *

- * @attr description - * Drawable to use for the Find action button in WebView selection action modes - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionModeFindDrawable - */ - public static final int AppCompatTheme_actionModeFindDrawable=22; - /** - *

- * @attr description - * Drawable to use for the Paste action button in Contextual Action Bar - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionModePasteDrawable - */ - public static final int AppCompatTheme_actionModePasteDrawable=23; - /** - *

- * @attr description - * PopupWindow style to use for action modes when showing as a window overlay. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionModePopupWindowStyle - */ - public static final int AppCompatTheme_actionModePopupWindowStyle=24; - /** - *

- * @attr description - * Drawable to use for the Select all action button in Contextual Action Bar - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionModeSelectAllDrawable - */ - public static final int AppCompatTheme_actionModeSelectAllDrawable=25; - /** - *

- * @attr description - * Drawable to use for the Share action button in WebView selection action modes - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionModeShareDrawable - */ - public static final int AppCompatTheme_actionModeShareDrawable=26; - /** - *

- * @attr description - * Background drawable to use for action mode UI in the lower split bar - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionModeSplitBackground - */ - public static final int AppCompatTheme_actionModeSplitBackground=27; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#actionModeStyle} - * attribute's value can be found in the {@link #AppCompatTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionModeStyle - */ - public static final int AppCompatTheme_actionModeStyle=28; - /** - *

- * @attr description - * Drawable to use for the Web Search action button in WebView selection action modes - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionModeWebSearchDrawable - */ - public static final int AppCompatTheme_actionModeWebSearchDrawable=29; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#actionOverflowButtonStyle} - * attribute's value can be found in the {@link #AppCompatTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionOverflowButtonStyle - */ - public static final int AppCompatTheme_actionOverflowButtonStyle=30; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#actionOverflowMenuStyle} - * attribute's value can be found in the {@link #AppCompatTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionOverflowMenuStyle - */ - public static final int AppCompatTheme_actionOverflowMenuStyle=31; - /** - *

- * @attr description - * Default ActivityChooserView style. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:activityChooserViewStyle - */ - public static final int AppCompatTheme_activityChooserViewStyle=32; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#alertDialogButtonGroupStyle} - * attribute's value can be found in the {@link #AppCompatTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:alertDialogButtonGroupStyle - */ - public static final int AppCompatTheme_alertDialogButtonGroupStyle=33; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#alertDialogCenterButtons} - * attribute's value can be found in the {@link #AppCompatTheme} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:alertDialogCenterButtons - */ - public static final int AppCompatTheme_alertDialogCenterButtons=34; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#alertDialogStyle} - * attribute's value can be found in the {@link #AppCompatTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:alertDialogStyle - */ - public static final int AppCompatTheme_alertDialogStyle=35; - /** - *

- * @attr description - * Theme to use for alert dialogs spawned from this theme. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:alertDialogTheme - */ - public static final int AppCompatTheme_alertDialogTheme=36; - /** - *

- * @attr description - * Default AutoCompleteTextView style. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:autoCompleteTextViewStyle - */ - public static final int AppCompatTheme_autoCompleteTextViewStyle=37; - /** - *

- * @attr description - * Style for buttons without an explicit border, often used in groups. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:borderlessButtonStyle - */ - public static final int AppCompatTheme_borderlessButtonStyle=38; - /** - *

- * @attr description - * Style for buttons within button bars - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:buttonBarButtonStyle - */ - public static final int AppCompatTheme_buttonBarButtonStyle=39; - /** - *

- * @attr description - * Style for the "negative" buttons within button bars - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:buttonBarNegativeButtonStyle - */ - public static final int AppCompatTheme_buttonBarNegativeButtonStyle=40; - /** - *

- * @attr description - * Style for the "neutral" buttons within button bars - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:buttonBarNeutralButtonStyle - */ - public static final int AppCompatTheme_buttonBarNeutralButtonStyle=41; - /** - *

- * @attr description - * Style for the "positive" buttons within button bars - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:buttonBarPositiveButtonStyle - */ - public static final int AppCompatTheme_buttonBarPositiveButtonStyle=42; - /** - *

- * @attr description - * Style for button bars - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:buttonBarStyle - */ - public static final int AppCompatTheme_buttonBarStyle=43; - /** - *

- * @attr description - * Normal Button style. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:buttonStyle - */ - public static final int AppCompatTheme_buttonStyle=44; - /** - *

- * @attr description - * Small Button style. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:buttonStyleSmall - */ - public static final int AppCompatTheme_buttonStyleSmall=45; - /** - *

- * @attr description - * Default Checkbox style. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:checkboxStyle - */ - public static final int AppCompatTheme_checkboxStyle=46; - /** - *

- * @attr description - * Default CheckedTextView style. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:checkedTextViewStyle - */ - public static final int AppCompatTheme_checkedTextViewStyle=47; - /** - *

- * @attr description - * Bright complement to the primary branding color. By default, this is the color applied - * to framework controls (via colorControlActivated). - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:colorAccent - */ - public static final int AppCompatTheme_colorAccent=48; - /** - *

- * @attr description - * Default color of background imagery for floating components, ex. dialogs, popups, and cards. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:colorBackgroundFloating - */ - public static final int AppCompatTheme_colorBackgroundFloating=49; - /** - *

- * @attr description - * The color applied to framework buttons in their normal state. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:colorButtonNormal - */ - public static final int AppCompatTheme_colorButtonNormal=50; - /** - *

- * @attr description - * The color applied to framework controls in their activated (ex. checked) state. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:colorControlActivated - */ - public static final int AppCompatTheme_colorControlActivated=51; - /** - *

- * @attr description - * The color applied to framework control highlights (ex. ripples, list selectors). - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:colorControlHighlight - */ - public static final int AppCompatTheme_colorControlHighlight=52; - /** - *

- * @attr description - * The color applied to framework controls in their normal state. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:colorControlNormal - */ - public static final int AppCompatTheme_colorControlNormal=53; - /** - *

- * @attr description - * Color used for error states and things that need to be drawn to - * the user's attention. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:colorError - */ - public static final int AppCompatTheme_colorError=54; - /** - *

- * @attr description - * The primary branding color for the app. By default, this is the color applied to the - * action bar background. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:colorPrimary - */ - public static final int AppCompatTheme_colorPrimary=55; - /** - *

- * @attr description - * Dark variant of the primary branding color. By default, this is the color applied to - * the status bar (via statusBarColor) and navigation bar (via navigationBarColor). - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:colorPrimaryDark - */ - public static final int AppCompatTheme_colorPrimaryDark=56; - /** - *

- * @attr description - * The color applied to framework switch thumbs in their normal state. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:colorSwitchThumbNormal - */ - public static final int AppCompatTheme_colorSwitchThumbNormal=57; - /** - *

- * @attr description - * The background used by framework controls. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:controlBackground - */ - public static final int AppCompatTheme_controlBackground=58; - /** - *

- * @attr description - * Preferred corner radius of dialogs. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:dialogCornerRadius - */ - public static final int AppCompatTheme_dialogCornerRadius=59; - /** - *

- * @attr description - * Preferred padding for dialog content. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:dialogPreferredPadding - */ - public static final int AppCompatTheme_dialogPreferredPadding=60; - /** - *

- * @attr description - * Theme to use for dialogs spawned from this theme. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:dialogTheme - */ - public static final int AppCompatTheme_dialogTheme=61; - /** - *

- * @attr description - * A drawable that may be used as a horizontal divider between visual elements. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:dividerHorizontal - */ - public static final int AppCompatTheme_dividerHorizontal=62; - /** - *

- * @attr description - * A drawable that may be used as a vertical divider between visual elements. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:dividerVertical - */ - public static final int AppCompatTheme_dividerVertical=63; - /** - *

- * @attr description - * ListPopupWindow compatibility - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:dropDownListViewStyle - */ - public static final int AppCompatTheme_dropDownListViewStyle=64; - /** - *

- * @attr description - * The preferred item height for dropdown lists. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:dropdownListPreferredItemHeight - */ - public static final int AppCompatTheme_dropdownListPreferredItemHeight=65; - /** - *

- * @attr description - * EditText background drawable. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:editTextBackground - */ - public static final int AppCompatTheme_editTextBackground=66; - /** - *

- * @attr description - * EditText text foreground color. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:editTextColor - */ - public static final int AppCompatTheme_editTextColor=67; - /** - *

- * @attr description - * Default EditText style. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:editTextStyle - */ - public static final int AppCompatTheme_editTextStyle=68; - /** - *

- * @attr description - * Specifies a drawable to use for the 'home as up' indicator. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:homeAsUpIndicator - */ - public static final int AppCompatTheme_homeAsUpIndicator=69; - /** - *

- * @attr description - * ImageButton background drawable. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:imageButtonStyle - */ - public static final int AppCompatTheme_imageButtonStyle=70; - /** - *

- * @attr description - * Drawable used as a background for selected list items. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:listChoiceBackgroundIndicator - */ - public static final int AppCompatTheme_listChoiceBackgroundIndicator=71; - /** - *

- * @attr description - * The list divider used in alert dialogs. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:listDividerAlertDialog - */ - public static final int AppCompatTheme_listDividerAlertDialog=72; - /** - *

- * @attr description - * Default menu-style ListView style. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:listMenuViewStyle - */ - public static final int AppCompatTheme_listMenuViewStyle=73; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#listPopupWindowStyle} - * attribute's value can be found in the {@link #AppCompatTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:listPopupWindowStyle - */ - public static final int AppCompatTheme_listPopupWindowStyle=74; - /** - *

- * @attr description - * The preferred list item height. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:listPreferredItemHeight - */ - public static final int AppCompatTheme_listPreferredItemHeight=75; - /** - *

- * @attr description - * A larger, more robust list item height. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:listPreferredItemHeightLarge - */ - public static final int AppCompatTheme_listPreferredItemHeightLarge=76; - /** - *

- * @attr description - * A smaller, sleeker list item height. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:listPreferredItemHeightSmall - */ - public static final int AppCompatTheme_listPreferredItemHeightSmall=77; - /** - *

- * @attr description - * The preferred padding along the left edge of list items. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:listPreferredItemPaddingLeft - */ - public static final int AppCompatTheme_listPreferredItemPaddingLeft=78; - /** - *

- * @attr description - * The preferred padding along the right edge of list items. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:listPreferredItemPaddingRight - */ - public static final int AppCompatTheme_listPreferredItemPaddingRight=79; - /** - *

- * @attr description - * The background of a panel when it is inset from the left and right edges of the screen. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:panelBackground - */ - public static final int AppCompatTheme_panelBackground=80; - /** - *

- * @attr description - * Default Panel Menu style. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:panelMenuListTheme - */ - public static final int AppCompatTheme_panelMenuListTheme=81; - /** - *

- * @attr description - * Default Panel Menu width. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:panelMenuListWidth - */ - public static final int AppCompatTheme_panelMenuListWidth=82; - /** - *

- * @attr description - * Default PopupMenu style. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:popupMenuStyle - */ - public static final int AppCompatTheme_popupMenuStyle=83; - /** - *

- * @attr description - * Default PopupWindow style. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:popupWindowStyle - */ - public static final int AppCompatTheme_popupWindowStyle=84; - /** - *

- * @attr description - * Default RadioButton style. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:radioButtonStyle - */ - public static final int AppCompatTheme_radioButtonStyle=85; - /** - *

- * @attr description - * Default RatingBar style. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:ratingBarStyle - */ - public static final int AppCompatTheme_ratingBarStyle=86; - /** - *

- * @attr description - * Indicator RatingBar style. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:ratingBarStyleIndicator - */ - public static final int AppCompatTheme_ratingBarStyleIndicator=87; - /** - *

- * @attr description - * Small indicator RatingBar style. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:ratingBarStyleSmall - */ - public static final int AppCompatTheme_ratingBarStyleSmall=88; - /** - *

- * @attr description - * Style for the search query widget. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:searchViewStyle - */ - public static final int AppCompatTheme_searchViewStyle=89; - /** - *

- * @attr description - * Default SeekBar style. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:seekBarStyle - */ - public static final int AppCompatTheme_seekBarStyle=90; - /** - *

- * @attr description - * A style that may be applied to buttons or other selectable items - * that should react to pressed and focus states, but that do not - * have a clear visual border along the edges. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:selectableItemBackground - */ - public static final int AppCompatTheme_selectableItemBackground=91; - /** - *

- * @attr description - * Background drawable for borderless standalone items that need focus/pressed states. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:selectableItemBackgroundBorderless - */ - public static final int AppCompatTheme_selectableItemBackgroundBorderless=92; - /** - *

- * @attr description - * Default Spinner style. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:spinnerDropDownItemStyle - */ - public static final int AppCompatTheme_spinnerDropDownItemStyle=93; - /** - *

- * @attr description - * Default Spinner style. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:spinnerStyle - */ - public static final int AppCompatTheme_spinnerStyle=94; - /** - *

- * @attr description - * Default style for the Switch widget. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:switchStyle - */ - public static final int AppCompatTheme_switchStyle=95; - /** - *

- * @attr description - * Text color, typeface, size, and style for the text inside of a popup menu. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:textAppearanceLargePopupMenu - */ - public static final int AppCompatTheme_textAppearanceLargePopupMenu=96; - /** - *

- * @attr description - * The preferred TextAppearance for the primary text of list items. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:textAppearanceListItem - */ - public static final int AppCompatTheme_textAppearanceListItem=97; - /** - *

- * @attr description - * The preferred TextAppearance for the secondary text of list items. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:textAppearanceListItemSecondary - */ - public static final int AppCompatTheme_textAppearanceListItemSecondary=98; - /** - *

- * @attr description - * The preferred TextAppearance for the primary text of small list items. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:textAppearanceListItemSmall - */ - public static final int AppCompatTheme_textAppearanceListItemSmall=99; - /** - *

- * @attr description - * Text color, typeface, size, and style for header text inside of a popup menu. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:textAppearancePopupMenuHeader - */ - public static final int AppCompatTheme_textAppearancePopupMenuHeader=100; - /** - *

- * @attr description - * Text color, typeface, size, and style for system search result subtitle. Defaults to primary inverse text color. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:textAppearanceSearchResultSubtitle - */ - public static final int AppCompatTheme_textAppearanceSearchResultSubtitle=101; - /** - *

- * @attr description - * Text color, typeface, size, and style for system search result title. Defaults to primary inverse text color. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:textAppearanceSearchResultTitle - */ - public static final int AppCompatTheme_textAppearanceSearchResultTitle=102; - /** - *

- * @attr description - * Text color, typeface, size, and style for small text inside of a popup menu. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:textAppearanceSmallPopupMenu - */ - public static final int AppCompatTheme_textAppearanceSmallPopupMenu=103; - /** - *

- * @attr description - * Color of list item text in alert dialogs. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:textColorAlertDialogListItem - */ - public static final int AppCompatTheme_textColorAlertDialogListItem=104; - /** - *

- * @attr description - * Text color for urls in search suggestions, used by things like global search - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:textColorSearchUrl - */ - public static final int AppCompatTheme_textColorSearchUrl=105; - /** - *

- * @attr description - * Default Toolar NavigationButtonStyle - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:toolbarNavigationButtonStyle - */ - public static final int AppCompatTheme_toolbarNavigationButtonStyle=106; - /** - *

- * @attr description - * Default Toolbar style. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:toolbarStyle - */ - public static final int AppCompatTheme_toolbarStyle=107; - /** - *

- * @attr description - * Foreground color to use for tooltips - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:tooltipForegroundColor - */ - public static final int AppCompatTheme_tooltipForegroundColor=108; - /** - *

- * @attr description - * Background to use for tooltips - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:tooltipFrameBackground - */ - public static final int AppCompatTheme_tooltipFrameBackground=109; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#viewInflaterClass} - * attribute's value can be found in the {@link #AppCompatTheme} array. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:viewInflaterClass - */ - public static final int AppCompatTheme_viewInflaterClass=110; - /** - *

- * @attr description - * Flag indicating whether this window should have an Action Bar - * in place of the usual title bar. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:windowActionBar - */ - public static final int AppCompatTheme_windowActionBar=111; - /** - *

- * @attr description - * Flag indicating whether this window's Action Bar should overlay - * application content. Does nothing if the window would not - * have an Action Bar. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:windowActionBarOverlay - */ - public static final int AppCompatTheme_windowActionBarOverlay=112; - /** - *

- * @attr description - * Flag indicating whether action modes should overlay window content - * when there is not reserved space for their UI (such as an Action Bar). - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:windowActionModeOverlay - */ - public static final int AppCompatTheme_windowActionModeOverlay=113; - /** - *

- * @attr description - * A fixed height for the window along the major axis of the screen, - * that is, when in portrait. Can be either an absolute dimension - * or a fraction of the screen size in that dimension. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

May be a fractional value, which is a floating point number appended with - * either % or %p, such as "14.5%". - * The % suffix always means a percentage of the base size; - * the optional %p suffix provides a size relative to some parent container. - * - * @attr name com.scriptor:windowFixedHeightMajor - */ - public static final int AppCompatTheme_windowFixedHeightMajor=114; - /** - *

- * @attr description - * A fixed height for the window along the minor axis of the screen, - * that is, when in landscape. Can be either an absolute dimension - * or a fraction of the screen size in that dimension. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

May be a fractional value, which is a floating point number appended with - * either % or %p, such as "14.5%". - * The % suffix always means a percentage of the base size; - * the optional %p suffix provides a size relative to some parent container. - * - * @attr name com.scriptor:windowFixedHeightMinor - */ - public static final int AppCompatTheme_windowFixedHeightMinor=115; - /** - *

- * @attr description - * A fixed width for the window along the major axis of the screen, - * that is, when in landscape. Can be either an absolute dimension - * or a fraction of the screen size in that dimension. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

May be a fractional value, which is a floating point number appended with - * either % or %p, such as "14.5%". - * The % suffix always means a percentage of the base size; - * the optional %p suffix provides a size relative to some parent container. - * - * @attr name com.scriptor:windowFixedWidthMajor - */ - public static final int AppCompatTheme_windowFixedWidthMajor=116; - /** - *

- * @attr description - * A fixed width for the window along the minor axis of the screen, - * that is, when in portrait. Can be either an absolute dimension - * or a fraction of the screen size in that dimension. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

May be a fractional value, which is a floating point number appended with - * either % or %p, such as "14.5%". - * The % suffix always means a percentage of the base size; - * the optional %p suffix provides a size relative to some parent container. - * - * @attr name com.scriptor:windowFixedWidthMinor - */ - public static final int AppCompatTheme_windowFixedWidthMinor=117; - /** - *

- * @attr description - * The minimum width the window is allowed to be, along the major - * axis of the screen. That is, when in landscape. Can be either - * an absolute dimension or a fraction of the screen size in that - * dimension. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

May be a fractional value, which is a floating point number appended with - * either % or %p, such as "14.5%". - * The % suffix always means a percentage of the base size; - * the optional %p suffix provides a size relative to some parent container. - * - * @attr name com.scriptor:windowMinWidthMajor - */ - public static final int AppCompatTheme_windowMinWidthMajor=118; - /** - *

- * @attr description - * The minimum width the window is allowed to be, along the minor - * axis of the screen. That is, when in portrait. Can be either - * an absolute dimension or a fraction of the screen size in that - * dimension. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

May be a fractional value, which is a floating point number appended with - * either % or %p, such as "14.5%". - * The % suffix always means a percentage of the base size; - * the optional %p suffix provides a size relative to some parent container. - * - * @attr name com.scriptor:windowMinWidthMinor - */ - public static final int AppCompatTheme_windowMinWidthMinor=119; - /** - *

- * @attr description - * Flag indicating whether there should be no title on this window. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:windowNoTitle - */ - public static final int AppCompatTheme_windowNoTitle=120; - /** - * Attributes that can be used with a BottomAppBar. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #BottomAppBar_backgroundTint com.scriptor:backgroundTint}Tint to apply to the background.
{@link #BottomAppBar_fabAlignmentMode com.scriptor:fabAlignmentMode}
{@link #BottomAppBar_fabCradleMargin com.scriptor:fabCradleMargin}
{@link #BottomAppBar_fabCradleRoundedCornerRadius com.scriptor:fabCradleRoundedCornerRadius}
{@link #BottomAppBar_fabCradleVerticalOffset com.scriptor:fabCradleVerticalOffset}
{@link #BottomAppBar_hideOnScroll com.scriptor:hideOnScroll}
- * @see #BottomAppBar_backgroundTint - * @see #BottomAppBar_fabAlignmentMode - * @see #BottomAppBar_fabCradleMargin - * @see #BottomAppBar_fabCradleRoundedCornerRadius - * @see #BottomAppBar_fabCradleVerticalOffset - * @see #BottomAppBar_hideOnScroll - */ - public static final int[] BottomAppBar={ - 0x7f040034, 0x7f0400ca, 0x7f0400cb, 0x7f0400cc, - 0x7f0400cd, 0x7f0400ec - }; - /** - *

- * @attr description - * Tint to apply to the background. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:backgroundTint - */ - public static final int BottomAppBar_backgroundTint=0; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#fabAlignmentMode} - * attribute's value can be found in the {@link #BottomAppBar} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - *
ConstantValueDescription
center0
end1
- * - * @attr name com.scriptor:fabAlignmentMode - */ - public static final int BottomAppBar_fabAlignmentMode=1; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#fabCradleMargin} - * attribute's value can be found in the {@link #BottomAppBar} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:fabCradleMargin - */ - public static final int BottomAppBar_fabCradleMargin=2; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#fabCradleRoundedCornerRadius} - * attribute's value can be found in the {@link #BottomAppBar} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:fabCradleRoundedCornerRadius - */ - public static final int BottomAppBar_fabCradleRoundedCornerRadius=3; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#fabCradleVerticalOffset} - * attribute's value can be found in the {@link #BottomAppBar} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:fabCradleVerticalOffset - */ - public static final int BottomAppBar_fabCradleVerticalOffset=4; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#hideOnScroll} - * attribute's value can be found in the {@link #BottomAppBar} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:hideOnScroll - */ - public static final int BottomAppBar_hideOnScroll=5; - /** - * Attributes that can be used with a BottomNavigationView. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #BottomNavigationView_elevation com.scriptor:elevation}Elevation for the action bar itself
{@link #BottomNavigationView_itemBackground com.scriptor:itemBackground}
{@link #BottomNavigationView_itemHorizontalTranslationEnabled com.scriptor:itemHorizontalTranslationEnabled}
{@link #BottomNavigationView_itemIconSize com.scriptor:itemIconSize}
{@link #BottomNavigationView_itemIconTint com.scriptor:itemIconTint}
{@link #BottomNavigationView_itemTextAppearanceActive com.scriptor:itemTextAppearanceActive}
{@link #BottomNavigationView_itemTextAppearanceInactive com.scriptor:itemTextAppearanceInactive}
{@link #BottomNavigationView_itemTextColor com.scriptor:itemTextColor}
{@link #BottomNavigationView_labelVisibilityMode com.scriptor:labelVisibilityMode}
{@link #BottomNavigationView_menu com.scriptor:menu}
- * @see #BottomNavigationView_elevation - * @see #BottomNavigationView_itemBackground - * @see #BottomNavigationView_itemHorizontalTranslationEnabled - * @see #BottomNavigationView_itemIconSize - * @see #BottomNavigationView_itemIconTint - * @see #BottomNavigationView_itemTextAppearanceActive - * @see #BottomNavigationView_itemTextAppearanceInactive - * @see #BottomNavigationView_itemTextColor - * @see #BottomNavigationView_labelVisibilityMode - * @see #BottomNavigationView_menu - */ - public static final int[] BottomNavigationView={ - 0x7f0400bb, 0x7f040101, 0x7f040103, 0x7f040105, - 0x7f040106, 0x7f04010a, 0x7f04010b, 0x7f04010c, - 0x7f04010e, 0x7f040164 - }; - /** - *

- * @attr description - * Elevation for the action bar itself - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:elevation - */ - public static final int BottomNavigationView_elevation=0; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#itemBackground} - * attribute's value can be found in the {@link #BottomNavigationView} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:itemBackground - */ - public static final int BottomNavigationView_itemBackground=1; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#itemHorizontalTranslationEnabled} - * attribute's value can be found in the {@link #BottomNavigationView} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:itemHorizontalTranslationEnabled - */ - public static final int BottomNavigationView_itemHorizontalTranslationEnabled=2; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#itemIconSize} - * attribute's value can be found in the {@link #BottomNavigationView} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:itemIconSize - */ - public static final int BottomNavigationView_itemIconSize=3; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#itemIconTint} - * attribute's value can be found in the {@link #BottomNavigationView} array. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:itemIconTint - */ - public static final int BottomNavigationView_itemIconTint=4; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#itemTextAppearanceActive} - * attribute's value can be found in the {@link #BottomNavigationView} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:itemTextAppearanceActive - */ - public static final int BottomNavigationView_itemTextAppearanceActive=5; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#itemTextAppearanceInactive} - * attribute's value can be found in the {@link #BottomNavigationView} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:itemTextAppearanceInactive - */ - public static final int BottomNavigationView_itemTextAppearanceInactive=6; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#itemTextColor} - * attribute's value can be found in the {@link #BottomNavigationView} array. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:itemTextColor - */ - public static final int BottomNavigationView_itemTextColor=7; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#labelVisibilityMode} - * attribute's value can be found in the {@link #BottomNavigationView} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
autoffffffff
labeled1
selected0
unlabeled2
- * - * @attr name com.scriptor:labelVisibilityMode - */ - public static final int BottomNavigationView_labelVisibilityMode=8; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#menu} - * attribute's value can be found in the {@link #BottomNavigationView} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:menu - */ - public static final int BottomNavigationView_menu=9; - /** - * Attributes that can be used with a BottomSheetBehavior_Layout. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #BottomSheetBehavior_Layout_behavior_fitToContents com.scriptor:behavior_fitToContents}
{@link #BottomSheetBehavior_Layout_behavior_hideable com.scriptor:behavior_hideable}
{@link #BottomSheetBehavior_Layout_behavior_peekHeight com.scriptor:behavior_peekHeight}
{@link #BottomSheetBehavior_Layout_behavior_skipCollapsed com.scriptor:behavior_skipCollapsed}
- * @see #BottomSheetBehavior_Layout_behavior_fitToContents - * @see #BottomSheetBehavior_Layout_behavior_hideable - * @see #BottomSheetBehavior_Layout_behavior_peekHeight - * @see #BottomSheetBehavior_Layout_behavior_skipCollapsed - */ - public static final int[] BottomSheetBehavior_Layout={ - 0x7f04003a, 0x7f04003b, 0x7f04003d, 0x7f04003e - }; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#behavior_fitToContents} - * attribute's value can be found in the {@link #BottomSheetBehavior_Layout} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:behavior_fitToContents - */ - public static final int BottomSheetBehavior_Layout_behavior_fitToContents=0; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#behavior_hideable} - * attribute's value can be found in the {@link #BottomSheetBehavior_Layout} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:behavior_hideable - */ - public static final int BottomSheetBehavior_Layout_behavior_hideable=1; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#behavior_peekHeight} - * attribute's value can be found in the {@link #BottomSheetBehavior_Layout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
autoffffffff
- * - * @attr name com.scriptor:behavior_peekHeight - */ - public static final int BottomSheetBehavior_Layout_behavior_peekHeight=2; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#behavior_skipCollapsed} - * attribute's value can be found in the {@link #BottomSheetBehavior_Layout} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:behavior_skipCollapsed - */ - public static final int BottomSheetBehavior_Layout_behavior_skipCollapsed=3; - /** - * Attributes that can be used with a ButtonBarLayout. - *

Includes the following attributes:

- * - * - * - * - * - *
AttributeDescription
{@link #ButtonBarLayout_allowStacking com.scriptor:allowStacking}Whether to automatically stack the buttons when there is not - * enough space to lay them out side-by-side.
- * @see #ButtonBarLayout_allowStacking - */ - public static final int[] ButtonBarLayout={ - 0x7f040026 - }; - /** - *

- * @attr description - * Whether to automatically stack the buttons when there is not - * enough space to lay them out side-by-side. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:allowStacking - */ - public static final int ButtonBarLayout_allowStacking=0; - /** - * Attributes that can be used with a CardView. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #CardView_android_minWidth android:minWidth}
{@link #CardView_android_minHeight android:minHeight}
{@link #CardView_cardBackgroundColor com.scriptor:cardBackgroundColor}Background color for CardView.
{@link #CardView_cardCornerRadius com.scriptor:cardCornerRadius}Corner radius for CardView.
{@link #CardView_cardElevation com.scriptor:cardElevation}Elevation for CardView.
{@link #CardView_cardMaxElevation com.scriptor:cardMaxElevation}Maximum Elevation for CardView.
{@link #CardView_cardPreventCornerOverlap com.scriptor:cardPreventCornerOverlap}Add padding to CardView on v20 and before to prevent intersections between the Card content and rounded corners.
{@link #CardView_cardUseCompatPadding com.scriptor:cardUseCompatPadding}Add padding in API v21+ as well to have the same measurements with previous versions.
{@link #CardView_contentPadding com.scriptor:contentPadding}Inner padding between the edges of the Card and children of the CardView.
{@link #CardView_contentPaddingBottom com.scriptor:contentPaddingBottom}Inner padding between the bottom edge of the Card and children of the CardView.
{@link #CardView_contentPaddingLeft com.scriptor:contentPaddingLeft}Inner padding between the left edge of the Card and children of the CardView.
{@link #CardView_contentPaddingRight com.scriptor:contentPaddingRight}Inner padding between the right edge of the Card and children of the CardView.
{@link #CardView_contentPaddingTop com.scriptor:contentPaddingTop}Inner padding between the top edge of the Card and children of the CardView.
- * @see #CardView_android_minWidth - * @see #CardView_android_minHeight - * @see #CardView_cardBackgroundColor - * @see #CardView_cardCornerRadius - * @see #CardView_cardElevation - * @see #CardView_cardMaxElevation - * @see #CardView_cardPreventCornerOverlap - * @see #CardView_cardUseCompatPadding - * @see #CardView_contentPadding - * @see #CardView_contentPaddingBottom - * @see #CardView_contentPaddingLeft - * @see #CardView_contentPaddingRight - * @see #CardView_contentPaddingTop - */ - public static final int[] CardView={ - 0x0101013f, 0x01010140, 0x7f04005a, 0x7f04005b, - 0x7f04005c, 0x7f04005d, 0x7f04005e, 0x7f04005f, - 0x7f04009d, 0x7f04009e, 0x7f04009f, 0x7f0400a0, - 0x7f0400a1 - }; - /** - *

- * @attr description - * Workaround to read user defined minimum width - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:minWidth - */ - public static final int CardView_android_minWidth=0; - /** - *

- * @attr description - * Workaround to read user defined minimum height - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:minHeight - */ - public static final int CardView_android_minHeight=1; - /** - *

- * @attr description - * Background color for CardView. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:cardBackgroundColor - */ - public static final int CardView_cardBackgroundColor=2; - /** - *

- * @attr description - * Corner radius for CardView. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:cardCornerRadius - */ - public static final int CardView_cardCornerRadius=3; - /** - *

- * @attr description - * Elevation for CardView. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:cardElevation - */ - public static final int CardView_cardElevation=4; - /** - *

- * @attr description - * Maximum Elevation for CardView. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:cardMaxElevation - */ - public static final int CardView_cardMaxElevation=5; - /** - *

- * @attr description - * Add padding to CardView on v20 and before to prevent intersections between the Card content and rounded corners. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:cardPreventCornerOverlap - */ - public static final int CardView_cardPreventCornerOverlap=6; - /** - *

- * @attr description - * Add padding in API v21+ as well to have the same measurements with previous versions. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:cardUseCompatPadding - */ - public static final int CardView_cardUseCompatPadding=7; - /** - *

- * @attr description - * Inner padding between the edges of the Card and children of the CardView. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:contentPadding - */ - public static final int CardView_contentPadding=8; - /** - *

- * @attr description - * Inner padding between the bottom edge of the Card and children of the CardView. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:contentPaddingBottom - */ - public static final int CardView_contentPaddingBottom=9; - /** - *

- * @attr description - * Inner padding between the left edge of the Card and children of the CardView. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:contentPaddingLeft - */ - public static final int CardView_contentPaddingLeft=10; - /** - *

- * @attr description - * Inner padding between the right edge of the Card and children of the CardView. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:contentPaddingRight - */ - public static final int CardView_contentPaddingRight=11; - /** - *

- * @attr description - * Inner padding between the top edge of the Card and children of the CardView. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:contentPaddingTop - */ - public static final int CardView_contentPaddingTop=12; - /** - * Attributes that can be used with a Chip. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #Chip_android_textAppearance android:textAppearance}
{@link #Chip_android_ellipsize android:ellipsize}
{@link #Chip_android_maxWidth android:maxWidth}
{@link #Chip_android_text android:text}
{@link #Chip_android_checkable android:checkable}
{@link #Chip_checkedIcon com.scriptor:checkedIcon}
{@link #Chip_checkedIconEnabled com.scriptor:checkedIconEnabled}
{@link #Chip_checkedIconVisible com.scriptor:checkedIconVisible}
{@link #Chip_chipBackgroundColor com.scriptor:chipBackgroundColor}
{@link #Chip_chipCornerRadius com.scriptor:chipCornerRadius}
{@link #Chip_chipEndPadding com.scriptor:chipEndPadding}
{@link #Chip_chipIcon com.scriptor:chipIcon}
{@link #Chip_chipIconEnabled com.scriptor:chipIconEnabled}
{@link #Chip_chipIconSize com.scriptor:chipIconSize}
{@link #Chip_chipIconTint com.scriptor:chipIconTint}
{@link #Chip_chipIconVisible com.scriptor:chipIconVisible}
{@link #Chip_chipMinHeight com.scriptor:chipMinHeight}
{@link #Chip_chipStartPadding com.scriptor:chipStartPadding}
{@link #Chip_chipStrokeColor com.scriptor:chipStrokeColor}
{@link #Chip_chipStrokeWidth com.scriptor:chipStrokeWidth}
{@link #Chip_closeIcon com.scriptor:closeIcon}Close button icon
{@link #Chip_closeIconEnabled com.scriptor:closeIconEnabled}
{@link #Chip_closeIconEndPadding com.scriptor:closeIconEndPadding}
{@link #Chip_closeIconSize com.scriptor:closeIconSize}
{@link #Chip_closeIconStartPadding com.scriptor:closeIconStartPadding}
{@link #Chip_closeIconTint com.scriptor:closeIconTint}
{@link #Chip_closeIconVisible com.scriptor:closeIconVisible}
{@link #Chip_hideMotionSpec com.scriptor:hideMotionSpec}
{@link #Chip_iconEndPadding com.scriptor:iconEndPadding}
{@link #Chip_iconStartPadding com.scriptor:iconStartPadding}
{@link #Chip_rippleColor com.scriptor:rippleColor}
{@link #Chip_showMotionSpec com.scriptor:showMotionSpec}
{@link #Chip_textEndPadding com.scriptor:textEndPadding}
{@link #Chip_textStartPadding com.scriptor:textStartPadding}
- * @see #Chip_android_textAppearance - * @see #Chip_android_ellipsize - * @see #Chip_android_maxWidth - * @see #Chip_android_text - * @see #Chip_android_checkable - * @see #Chip_checkedIcon - * @see #Chip_checkedIconEnabled - * @see #Chip_checkedIconVisible - * @see #Chip_chipBackgroundColor - * @see #Chip_chipCornerRadius - * @see #Chip_chipEndPadding - * @see #Chip_chipIcon - * @see #Chip_chipIconEnabled - * @see #Chip_chipIconSize - * @see #Chip_chipIconTint - * @see #Chip_chipIconVisible - * @see #Chip_chipMinHeight - * @see #Chip_chipStartPadding - * @see #Chip_chipStrokeColor - * @see #Chip_chipStrokeWidth - * @see #Chip_closeIcon - * @see #Chip_closeIconEnabled - * @see #Chip_closeIconEndPadding - * @see #Chip_closeIconSize - * @see #Chip_closeIconStartPadding - * @see #Chip_closeIconTint - * @see #Chip_closeIconVisible - * @see #Chip_hideMotionSpec - * @see #Chip_iconEndPadding - * @see #Chip_iconStartPadding - * @see #Chip_rippleColor - * @see #Chip_showMotionSpec - * @see #Chip_textEndPadding - * @see #Chip_textStartPadding - */ - public static final int[] Chip={ - 0x01010034, 0x010100ab, 0x0101011f, 0x0101014f, - 0x010101e5, 0x7f040064, 0x7f040065, 0x7f040066, - 0x7f040068, 0x7f040069, 0x7f04006a, 0x7f04006c, - 0x7f04006d, 0x7f04006e, 0x7f04006f, 0x7f040070, - 0x7f040071, 0x7f040076, 0x7f040077, 0x7f040078, - 0x7f04007a, 0x7f04007b, 0x7f04007c, 0x7f04007d, - 0x7f04007e, 0x7f04007f, 0x7f040080, 0x7f0400ea, - 0x7f0400f4, 0x7f0400f8, 0x7f040186, 0x7f040192, - 0x7f0401e7, 0x7f0401e9 - }; - /** - *

This symbol is the offset where the {@link android.R.attr#textAppearance} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:textAppearance - */ - public static final int Chip_android_textAppearance=0; - /** - *

This symbol is the offset where the {@link android.R.attr#ellipsize} - * attribute's value can be found in the {@link #Chip} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
end3
marquee4
middle2
none0
start1
- * - * @attr name android:ellipsize - */ - public static final int Chip_android_ellipsize=1; - /** - *

This symbol is the offset where the {@link android.R.attr#maxWidth} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:maxWidth - */ - public static final int Chip_android_maxWidth=2; - /** - *

This symbol is the offset where the {@link android.R.attr#text} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name android:text - */ - public static final int Chip_android_text=3; - /** - *

This symbol is the offset where the {@link android.R.attr#checkable} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name android:checkable - */ - public static final int Chip_android_checkable=4; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#checkedIcon} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:checkedIcon - */ - public static final int Chip_checkedIcon=5; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#checkedIconEnabled} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:checkedIconEnabled - */ - public static final int Chip_checkedIconEnabled=6; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#checkedIconVisible} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:checkedIconVisible - */ - public static final int Chip_checkedIconVisible=7; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#chipBackgroundColor} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:chipBackgroundColor - */ - public static final int Chip_chipBackgroundColor=8; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#chipCornerRadius} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:chipCornerRadius - */ - public static final int Chip_chipCornerRadius=9; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#chipEndPadding} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:chipEndPadding - */ - public static final int Chip_chipEndPadding=10; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#chipIcon} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:chipIcon - */ - public static final int Chip_chipIcon=11; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#chipIconEnabled} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:chipIconEnabled - */ - public static final int Chip_chipIconEnabled=12; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#chipIconSize} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:chipIconSize - */ - public static final int Chip_chipIconSize=13; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#chipIconTint} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:chipIconTint - */ - public static final int Chip_chipIconTint=14; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#chipIconVisible} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:chipIconVisible - */ - public static final int Chip_chipIconVisible=15; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#chipMinHeight} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:chipMinHeight - */ - public static final int Chip_chipMinHeight=16; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#chipStartPadding} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:chipStartPadding - */ - public static final int Chip_chipStartPadding=17; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#chipStrokeColor} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:chipStrokeColor - */ - public static final int Chip_chipStrokeColor=18; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#chipStrokeWidth} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:chipStrokeWidth - */ - public static final int Chip_chipStrokeWidth=19; - /** - *

- * @attr description - * Close button icon - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:closeIcon - */ - public static final int Chip_closeIcon=20; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#closeIconEnabled} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:closeIconEnabled - */ - public static final int Chip_closeIconEnabled=21; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#closeIconEndPadding} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:closeIconEndPadding - */ - public static final int Chip_closeIconEndPadding=22; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#closeIconSize} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:closeIconSize - */ - public static final int Chip_closeIconSize=23; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#closeIconStartPadding} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:closeIconStartPadding - */ - public static final int Chip_closeIconStartPadding=24; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#closeIconTint} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:closeIconTint - */ - public static final int Chip_closeIconTint=25; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#closeIconVisible} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:closeIconVisible - */ - public static final int Chip_closeIconVisible=26; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#hideMotionSpec} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:hideMotionSpec - */ - public static final int Chip_hideMotionSpec=27; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#iconEndPadding} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:iconEndPadding - */ - public static final int Chip_iconEndPadding=28; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#iconStartPadding} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:iconStartPadding - */ - public static final int Chip_iconStartPadding=29; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#rippleColor} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:rippleColor - */ - public static final int Chip_rippleColor=30; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#showMotionSpec} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:showMotionSpec - */ - public static final int Chip_showMotionSpec=31; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#textEndPadding} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:textEndPadding - */ - public static final int Chip_textEndPadding=32; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#textStartPadding} - * attribute's value can be found in the {@link #Chip} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:textStartPadding - */ - public static final int Chip_textStartPadding=33; - /** - * Attributes that can be used with a ChipGroup. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #ChipGroup_checkedChip com.scriptor:checkedChip}
{@link #ChipGroup_chipSpacing com.scriptor:chipSpacing}
{@link #ChipGroup_chipSpacingHorizontal com.scriptor:chipSpacingHorizontal}
{@link #ChipGroup_chipSpacingVertical com.scriptor:chipSpacingVertical}
{@link #ChipGroup_singleLine com.scriptor:singleLine}
{@link #ChipGroup_singleSelection com.scriptor:singleSelection}
- * @see #ChipGroup_checkedChip - * @see #ChipGroup_chipSpacing - * @see #ChipGroup_chipSpacingHorizontal - * @see #ChipGroup_chipSpacingVertical - * @see #ChipGroup_singleLine - * @see #ChipGroup_singleSelection - */ - public static final int[] ChipGroup={ - 0x7f040063, 0x7f040072, 0x7f040073, 0x7f040074, - 0x7f040196, 0x7f040197 - }; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#checkedChip} - * attribute's value can be found in the {@link #ChipGroup} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:checkedChip - */ - public static final int ChipGroup_checkedChip=0; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#chipSpacing} - * attribute's value can be found in the {@link #ChipGroup} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:chipSpacing - */ - public static final int ChipGroup_chipSpacing=1; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#chipSpacingHorizontal} - * attribute's value can be found in the {@link #ChipGroup} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:chipSpacingHorizontal - */ - public static final int ChipGroup_chipSpacingHorizontal=2; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#chipSpacingVertical} - * attribute's value can be found in the {@link #ChipGroup} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:chipSpacingVertical - */ - public static final int ChipGroup_chipSpacingVertical=3; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#singleLine} - * attribute's value can be found in the {@link #ChipGroup} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:singleLine - */ - public static final int ChipGroup_singleLine=4; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#singleSelection} - * attribute's value can be found in the {@link #ChipGroup} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:singleSelection - */ - public static final int ChipGroup_singleSelection=5; - /** - * Attributes that can be used with a CollapsingToolbarLayout. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #CollapsingToolbarLayout_collapsedTitleGravity com.scriptor:collapsedTitleGravity}
{@link #CollapsingToolbarLayout_collapsedTitleTextAppearance com.scriptor:collapsedTitleTextAppearance}
{@link #CollapsingToolbarLayout_contentScrim com.scriptor:contentScrim}
{@link #CollapsingToolbarLayout_expandedTitleGravity com.scriptor:expandedTitleGravity}
{@link #CollapsingToolbarLayout_expandedTitleMargin com.scriptor:expandedTitleMargin}
{@link #CollapsingToolbarLayout_expandedTitleMarginBottom com.scriptor:expandedTitleMarginBottom}
{@link #CollapsingToolbarLayout_expandedTitleMarginEnd com.scriptor:expandedTitleMarginEnd}
{@link #CollapsingToolbarLayout_expandedTitleMarginStart com.scriptor:expandedTitleMarginStart}
{@link #CollapsingToolbarLayout_expandedTitleMarginTop com.scriptor:expandedTitleMarginTop}
{@link #CollapsingToolbarLayout_expandedTitleTextAppearance com.scriptor:expandedTitleTextAppearance}
{@link #CollapsingToolbarLayout_scrimAnimationDuration com.scriptor:scrimAnimationDuration}
{@link #CollapsingToolbarLayout_scrimVisibleHeightTrigger com.scriptor:scrimVisibleHeightTrigger}
{@link #CollapsingToolbarLayout_statusBarScrim com.scriptor:statusBarScrim}
{@link #CollapsingToolbarLayout_title com.scriptor:title}
{@link #CollapsingToolbarLayout_titleEnabled com.scriptor:titleEnabled}
{@link #CollapsingToolbarLayout_toolbarId com.scriptor:toolbarId}
- * @see #CollapsingToolbarLayout_collapsedTitleGravity - * @see #CollapsingToolbarLayout_collapsedTitleTextAppearance - * @see #CollapsingToolbarLayout_contentScrim - * @see #CollapsingToolbarLayout_expandedTitleGravity - * @see #CollapsingToolbarLayout_expandedTitleMargin - * @see #CollapsingToolbarLayout_expandedTitleMarginBottom - * @see #CollapsingToolbarLayout_expandedTitleMarginEnd - * @see #CollapsingToolbarLayout_expandedTitleMarginStart - * @see #CollapsingToolbarLayout_expandedTitleMarginTop - * @see #CollapsingToolbarLayout_expandedTitleTextAppearance - * @see #CollapsingToolbarLayout_scrimAnimationDuration - * @see #CollapsingToolbarLayout_scrimVisibleHeightTrigger - * @see #CollapsingToolbarLayout_statusBarScrim - * @see #CollapsingToolbarLayout_title - * @see #CollapsingToolbarLayout_titleEnabled - * @see #CollapsingToolbarLayout_toolbarId - */ - public static final int[] CollapsingToolbarLayout={ - 0x7f040084, 0x7f040085, 0x7f0400a2, 0x7f0400c3, - 0x7f0400c4, 0x7f0400c5, 0x7f0400c6, 0x7f0400c7, - 0x7f0400c8, 0x7f0400c9, 0x7f040187, 0x7f040189, - 0x7f0401a7, 0x7f0401f4, 0x7f0401f5, 0x7f0401ff - }; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#collapsedTitleGravity} - * attribute's value can be found in the {@link #CollapsingToolbarLayout} array. - * - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
bottom50
center11
center_horizontal1
center_vertical10
end800005
fill_vertical70
left3
right5
start800003
top30
- * - * @attr name com.scriptor:collapsedTitleGravity - */ - public static final int CollapsingToolbarLayout_collapsedTitleGravity=0; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#collapsedTitleTextAppearance} - * attribute's value can be found in the {@link #CollapsingToolbarLayout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:collapsedTitleTextAppearance - */ - public static final int CollapsingToolbarLayout_collapsedTitleTextAppearance=1; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#contentScrim} - * attribute's value can be found in the {@link #CollapsingToolbarLayout} array. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:contentScrim - */ - public static final int CollapsingToolbarLayout_contentScrim=2; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#expandedTitleGravity} - * attribute's value can be found in the {@link #CollapsingToolbarLayout} array. - * - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
bottom50
center11
center_horizontal1
center_vertical10
end800005
fill_vertical70
left3
right5
start800003
top30
- * - * @attr name com.scriptor:expandedTitleGravity - */ - public static final int CollapsingToolbarLayout_expandedTitleGravity=3; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#expandedTitleMargin} - * attribute's value can be found in the {@link #CollapsingToolbarLayout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:expandedTitleMargin - */ - public static final int CollapsingToolbarLayout_expandedTitleMargin=4; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#expandedTitleMarginBottom} - * attribute's value can be found in the {@link #CollapsingToolbarLayout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:expandedTitleMarginBottom - */ - public static final int CollapsingToolbarLayout_expandedTitleMarginBottom=5; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#expandedTitleMarginEnd} - * attribute's value can be found in the {@link #CollapsingToolbarLayout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:expandedTitleMarginEnd - */ - public static final int CollapsingToolbarLayout_expandedTitleMarginEnd=6; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#expandedTitleMarginStart} - * attribute's value can be found in the {@link #CollapsingToolbarLayout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:expandedTitleMarginStart - */ - public static final int CollapsingToolbarLayout_expandedTitleMarginStart=7; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#expandedTitleMarginTop} - * attribute's value can be found in the {@link #CollapsingToolbarLayout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:expandedTitleMarginTop - */ - public static final int CollapsingToolbarLayout_expandedTitleMarginTop=8; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#expandedTitleTextAppearance} - * attribute's value can be found in the {@link #CollapsingToolbarLayout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:expandedTitleTextAppearance - */ - public static final int CollapsingToolbarLayout_expandedTitleTextAppearance=9; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#scrimAnimationDuration} - * attribute's value can be found in the {@link #CollapsingToolbarLayout} array. - * - *

May be an integer value, such as "100". - * - * @attr name com.scriptor:scrimAnimationDuration - */ - public static final int CollapsingToolbarLayout_scrimAnimationDuration=10; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#scrimVisibleHeightTrigger} - * attribute's value can be found in the {@link #CollapsingToolbarLayout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:scrimVisibleHeightTrigger - */ - public static final int CollapsingToolbarLayout_scrimVisibleHeightTrigger=11; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#statusBarScrim} - * attribute's value can be found in the {@link #CollapsingToolbarLayout} array. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:statusBarScrim - */ - public static final int CollapsingToolbarLayout_statusBarScrim=12; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#title} - * attribute's value can be found in the {@link #CollapsingToolbarLayout} array. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:title - */ - public static final int CollapsingToolbarLayout_title=13; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#titleEnabled} - * attribute's value can be found in the {@link #CollapsingToolbarLayout} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:titleEnabled - */ - public static final int CollapsingToolbarLayout_titleEnabled=14; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#toolbarId} - * attribute's value can be found in the {@link #CollapsingToolbarLayout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:toolbarId - */ - public static final int CollapsingToolbarLayout_toolbarId=15; - /** - * Attributes that can be used with a CollapsingToolbarLayout_Layout. - *

Includes the following attributes:

- * - * - * - * - * - * - *
AttributeDescription
{@link #CollapsingToolbarLayout_Layout_layout_collapseMode com.scriptor:layout_collapseMode}
{@link #CollapsingToolbarLayout_Layout_layout_collapseParallaxMultiplier com.scriptor:layout_collapseParallaxMultiplier}
- * @see #CollapsingToolbarLayout_Layout_layout_collapseMode - * @see #CollapsingToolbarLayout_Layout_layout_collapseParallaxMultiplier - */ - public static final int[] CollapsingToolbarLayout_Layout={ - 0x7f040115, 0x7f040116 - }; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_collapseMode} - * attribute's value can be found in the {@link #CollapsingToolbarLayout_Layout} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
none0
parallax2
pin1
- * - * @attr name com.scriptor:layout_collapseMode - */ - public static final int CollapsingToolbarLayout_Layout_layout_collapseMode=0; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_collapseParallaxMultiplier} - * attribute's value can be found in the {@link #CollapsingToolbarLayout_Layout} array. - * - *

May be a floating point value, such as "1.2". - * - * @attr name com.scriptor:layout_collapseParallaxMultiplier - */ - public static final int CollapsingToolbarLayout_Layout_layout_collapseParallaxMultiplier=1; - /** - * Attributes that can be used with a ColorStateListItem. - *

Includes the following attributes:

- * - * - * - * - * - * - * - *
AttributeDescription
{@link #ColorStateListItem_android_color android:color}
{@link #ColorStateListItem_android_alpha android:alpha}
{@link #ColorStateListItem_alpha com.scriptor:alpha}Alpha multiplier applied to the base color.
- * @see #ColorStateListItem_android_color - * @see #ColorStateListItem_android_alpha - * @see #ColorStateListItem_alpha - */ - public static final int[] ColorStateListItem={ - 0x010101a5, 0x0101031f, 0x7f040027 - }; - /** - *

- * @attr description - * Base color for this state. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name android:color - */ - public static final int ColorStateListItem_android_color=0; - /** - *

This symbol is the offset where the {@link android.R.attr#alpha} - * attribute's value can be found in the {@link #ColorStateListItem} array. - * - *

May be a floating point value, such as "1.2". - * - * @attr name android:alpha - */ - public static final int ColorStateListItem_android_alpha=1; - /** - *

- * @attr description - * Alpha multiplier applied to the base color. - * - *

May be a floating point value, such as "1.2". - * - * @attr name com.scriptor:alpha - */ - public static final int ColorStateListItem_alpha=2; - /** - * Attributes that can be used with a CompoundButton. - *

Includes the following attributes:

- * - * - * - * - * - * - * - *
AttributeDescription
{@link #CompoundButton_android_button android:button}
{@link #CompoundButton_buttonTint com.scriptor:buttonTint}Tint to apply to the button drawable.
{@link #CompoundButton_buttonTintMode com.scriptor:buttonTintMode}Blending mode used to apply the button tint.
- * @see #CompoundButton_android_button - * @see #CompoundButton_buttonTint - * @see #CompoundButton_buttonTintMode - */ - public static final int[] CompoundButton={ - 0x01010107, 0x7f040058, 0x7f040059 - }; - /** - *

This symbol is the offset where the {@link android.R.attr#button} - * attribute's value can be found in the {@link #CompoundButton} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:button - */ - public static final int CompoundButton_android_button=0; - /** - *

- * @attr description - * Tint to apply to the button drawable. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:buttonTint - */ - public static final int CompoundButton_buttonTint=1; - /** - *

- * @attr description - * Blending mode used to apply the button tint. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
add10Combines the tint and icon color and alpha channels, clamping the - * result to valid color values. Saturate(S + D)
multiplyeMultiplies the color and alpha channels of the drawable with those of - * the tint. [Sa * Da, Sc * Dc]
screenf[Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]
src_atop9The tint is drawn above the drawable, but with the drawable’s alpha - * channel masking the result. [Da, Sc * Da + (1 - Sa) * Dc]
src_in5The tint is masked by the alpha channel of the drawable. The drawable’s - * color channels are thrown out. [Sa * Da, Sc * Da]
src_over3The tint is drawn on top of the drawable. - * [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc]
- * - * @attr name com.scriptor:buttonTintMode - */ - public static final int CompoundButton_buttonTintMode=2; - /** - * Attributes that can be used with a ConstraintLayout_Layout. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #ConstraintLayout_Layout_android_orientation android:orientation}
{@link #ConstraintLayout_Layout_android_maxWidth android:maxWidth}
{@link #ConstraintLayout_Layout_android_maxHeight android:maxHeight}
{@link #ConstraintLayout_Layout_android_minWidth android:minWidth}
{@link #ConstraintLayout_Layout_android_minHeight android:minHeight}
{@link #ConstraintLayout_Layout_barrierAllowsGoneWidgets com.scriptor:barrierAllowsGoneWidgets}
{@link #ConstraintLayout_Layout_barrierDirection com.scriptor:barrierDirection}
{@link #ConstraintLayout_Layout_chainUseRtl com.scriptor:chainUseRtl}
{@link #ConstraintLayout_Layout_constraintSet com.scriptor:constraintSet}
{@link #ConstraintLayout_Layout_constraint_referenced_ids com.scriptor:constraint_referenced_ids}
{@link #ConstraintLayout_Layout_layout_constrainedHeight com.scriptor:layout_constrainedHeight}
{@link #ConstraintLayout_Layout_layout_constrainedWidth com.scriptor:layout_constrainedWidth}
{@link #ConstraintLayout_Layout_layout_constraintBaseline_creator com.scriptor:layout_constraintBaseline_creator}
{@link #ConstraintLayout_Layout_layout_constraintBaseline_toBaselineOf com.scriptor:layout_constraintBaseline_toBaselineOf}
{@link #ConstraintLayout_Layout_layout_constraintBottom_creator com.scriptor:layout_constraintBottom_creator}
{@link #ConstraintLayout_Layout_layout_constraintBottom_toBottomOf com.scriptor:layout_constraintBottom_toBottomOf}
{@link #ConstraintLayout_Layout_layout_constraintBottom_toTopOf com.scriptor:layout_constraintBottom_toTopOf}
{@link #ConstraintLayout_Layout_layout_constraintCircle com.scriptor:layout_constraintCircle}
{@link #ConstraintLayout_Layout_layout_constraintCircleAngle com.scriptor:layout_constraintCircleAngle}
{@link #ConstraintLayout_Layout_layout_constraintCircleRadius com.scriptor:layout_constraintCircleRadius}
{@link #ConstraintLayout_Layout_layout_constraintDimensionRatio com.scriptor:layout_constraintDimensionRatio}
{@link #ConstraintLayout_Layout_layout_constraintEnd_toEndOf com.scriptor:layout_constraintEnd_toEndOf}
{@link #ConstraintLayout_Layout_layout_constraintEnd_toStartOf com.scriptor:layout_constraintEnd_toStartOf}
{@link #ConstraintLayout_Layout_layout_constraintGuide_begin com.scriptor:layout_constraintGuide_begin}
{@link #ConstraintLayout_Layout_layout_constraintGuide_end com.scriptor:layout_constraintGuide_end}
{@link #ConstraintLayout_Layout_layout_constraintGuide_percent com.scriptor:layout_constraintGuide_percent}
{@link #ConstraintLayout_Layout_layout_constraintHeight_default com.scriptor:layout_constraintHeight_default}
{@link #ConstraintLayout_Layout_layout_constraintHeight_max com.scriptor:layout_constraintHeight_max}
{@link #ConstraintLayout_Layout_layout_constraintHeight_min com.scriptor:layout_constraintHeight_min}
{@link #ConstraintLayout_Layout_layout_constraintHeight_percent com.scriptor:layout_constraintHeight_percent}
{@link #ConstraintLayout_Layout_layout_constraintHorizontal_bias com.scriptor:layout_constraintHorizontal_bias}
{@link #ConstraintLayout_Layout_layout_constraintHorizontal_chainStyle com.scriptor:layout_constraintHorizontal_chainStyle}
{@link #ConstraintLayout_Layout_layout_constraintHorizontal_weight com.scriptor:layout_constraintHorizontal_weight}
{@link #ConstraintLayout_Layout_layout_constraintLeft_creator com.scriptor:layout_constraintLeft_creator}
{@link #ConstraintLayout_Layout_layout_constraintLeft_toLeftOf com.scriptor:layout_constraintLeft_toLeftOf}
{@link #ConstraintLayout_Layout_layout_constraintLeft_toRightOf com.scriptor:layout_constraintLeft_toRightOf}
{@link #ConstraintLayout_Layout_layout_constraintRight_creator com.scriptor:layout_constraintRight_creator}
{@link #ConstraintLayout_Layout_layout_constraintRight_toLeftOf com.scriptor:layout_constraintRight_toLeftOf}
{@link #ConstraintLayout_Layout_layout_constraintRight_toRightOf com.scriptor:layout_constraintRight_toRightOf}
{@link #ConstraintLayout_Layout_layout_constraintStart_toEndOf com.scriptor:layout_constraintStart_toEndOf}
{@link #ConstraintLayout_Layout_layout_constraintStart_toStartOf com.scriptor:layout_constraintStart_toStartOf}
{@link #ConstraintLayout_Layout_layout_constraintTop_creator com.scriptor:layout_constraintTop_creator}
{@link #ConstraintLayout_Layout_layout_constraintTop_toBottomOf com.scriptor:layout_constraintTop_toBottomOf}
{@link #ConstraintLayout_Layout_layout_constraintTop_toTopOf com.scriptor:layout_constraintTop_toTopOf}
{@link #ConstraintLayout_Layout_layout_constraintVertical_bias com.scriptor:layout_constraintVertical_bias}
{@link #ConstraintLayout_Layout_layout_constraintVertical_chainStyle com.scriptor:layout_constraintVertical_chainStyle}
{@link #ConstraintLayout_Layout_layout_constraintVertical_weight com.scriptor:layout_constraintVertical_weight}
{@link #ConstraintLayout_Layout_layout_constraintWidth_default com.scriptor:layout_constraintWidth_default}
{@link #ConstraintLayout_Layout_layout_constraintWidth_max com.scriptor:layout_constraintWidth_max}
{@link #ConstraintLayout_Layout_layout_constraintWidth_min com.scriptor:layout_constraintWidth_min}
{@link #ConstraintLayout_Layout_layout_constraintWidth_percent com.scriptor:layout_constraintWidth_percent}
{@link #ConstraintLayout_Layout_layout_editor_absoluteX com.scriptor:layout_editor_absoluteX}
{@link #ConstraintLayout_Layout_layout_editor_absoluteY com.scriptor:layout_editor_absoluteY}
{@link #ConstraintLayout_Layout_layout_goneMarginBottom com.scriptor:layout_goneMarginBottom}
{@link #ConstraintLayout_Layout_layout_goneMarginEnd com.scriptor:layout_goneMarginEnd}
{@link #ConstraintLayout_Layout_layout_goneMarginLeft com.scriptor:layout_goneMarginLeft}
{@link #ConstraintLayout_Layout_layout_goneMarginRight com.scriptor:layout_goneMarginRight}
{@link #ConstraintLayout_Layout_layout_goneMarginStart com.scriptor:layout_goneMarginStart}
{@link #ConstraintLayout_Layout_layout_goneMarginTop com.scriptor:layout_goneMarginTop}
{@link #ConstraintLayout_Layout_layout_optimizationLevel com.scriptor:layout_optimizationLevel}
- * @see #ConstraintLayout_Layout_android_orientation - * @see #ConstraintLayout_Layout_android_maxWidth - * @see #ConstraintLayout_Layout_android_maxHeight - * @see #ConstraintLayout_Layout_android_minWidth - * @see #ConstraintLayout_Layout_android_minHeight - * @see #ConstraintLayout_Layout_barrierAllowsGoneWidgets - * @see #ConstraintLayout_Layout_barrierDirection - * @see #ConstraintLayout_Layout_chainUseRtl - * @see #ConstraintLayout_Layout_constraintSet - * @see #ConstraintLayout_Layout_constraint_referenced_ids - * @see #ConstraintLayout_Layout_layout_constrainedHeight - * @see #ConstraintLayout_Layout_layout_constrainedWidth - * @see #ConstraintLayout_Layout_layout_constraintBaseline_creator - * @see #ConstraintLayout_Layout_layout_constraintBaseline_toBaselineOf - * @see #ConstraintLayout_Layout_layout_constraintBottom_creator - * @see #ConstraintLayout_Layout_layout_constraintBottom_toBottomOf - * @see #ConstraintLayout_Layout_layout_constraintBottom_toTopOf - * @see #ConstraintLayout_Layout_layout_constraintCircle - * @see #ConstraintLayout_Layout_layout_constraintCircleAngle - * @see #ConstraintLayout_Layout_layout_constraintCircleRadius - * @see #ConstraintLayout_Layout_layout_constraintDimensionRatio - * @see #ConstraintLayout_Layout_layout_constraintEnd_toEndOf - * @see #ConstraintLayout_Layout_layout_constraintEnd_toStartOf - * @see #ConstraintLayout_Layout_layout_constraintGuide_begin - * @see #ConstraintLayout_Layout_layout_constraintGuide_end - * @see #ConstraintLayout_Layout_layout_constraintGuide_percent - * @see #ConstraintLayout_Layout_layout_constraintHeight_default - * @see #ConstraintLayout_Layout_layout_constraintHeight_max - * @see #ConstraintLayout_Layout_layout_constraintHeight_min - * @see #ConstraintLayout_Layout_layout_constraintHeight_percent - * @see #ConstraintLayout_Layout_layout_constraintHorizontal_bias - * @see #ConstraintLayout_Layout_layout_constraintHorizontal_chainStyle - * @see #ConstraintLayout_Layout_layout_constraintHorizontal_weight - * @see #ConstraintLayout_Layout_layout_constraintLeft_creator - * @see #ConstraintLayout_Layout_layout_constraintLeft_toLeftOf - * @see #ConstraintLayout_Layout_layout_constraintLeft_toRightOf - * @see #ConstraintLayout_Layout_layout_constraintRight_creator - * @see #ConstraintLayout_Layout_layout_constraintRight_toLeftOf - * @see #ConstraintLayout_Layout_layout_constraintRight_toRightOf - * @see #ConstraintLayout_Layout_layout_constraintStart_toEndOf - * @see #ConstraintLayout_Layout_layout_constraintStart_toStartOf - * @see #ConstraintLayout_Layout_layout_constraintTop_creator - * @see #ConstraintLayout_Layout_layout_constraintTop_toBottomOf - * @see #ConstraintLayout_Layout_layout_constraintTop_toTopOf - * @see #ConstraintLayout_Layout_layout_constraintVertical_bias - * @see #ConstraintLayout_Layout_layout_constraintVertical_chainStyle - * @see #ConstraintLayout_Layout_layout_constraintVertical_weight - * @see #ConstraintLayout_Layout_layout_constraintWidth_default - * @see #ConstraintLayout_Layout_layout_constraintWidth_max - * @see #ConstraintLayout_Layout_layout_constraintWidth_min - * @see #ConstraintLayout_Layout_layout_constraintWidth_percent - * @see #ConstraintLayout_Layout_layout_editor_absoluteX - * @see #ConstraintLayout_Layout_layout_editor_absoluteY - * @see #ConstraintLayout_Layout_layout_goneMarginBottom - * @see #ConstraintLayout_Layout_layout_goneMarginEnd - * @see #ConstraintLayout_Layout_layout_goneMarginLeft - * @see #ConstraintLayout_Layout_layout_goneMarginRight - * @see #ConstraintLayout_Layout_layout_goneMarginStart - * @see #ConstraintLayout_Layout_layout_goneMarginTop - * @see #ConstraintLayout_Layout_layout_optimizationLevel - */ - public static final int[] ConstraintLayout_Layout={ - 0x010100c4, 0x0101011f, 0x01010120, 0x0101013f, - 0x01010140, 0x7f040037, 0x7f040038, 0x7f040061, - 0x7f040093, 0x7f040094, 0x7f040117, 0x7f040118, - 0x7f040119, 0x7f04011a, 0x7f04011b, 0x7f04011c, - 0x7f04011d, 0x7f04011e, 0x7f04011f, 0x7f040120, - 0x7f040121, 0x7f040122, 0x7f040123, 0x7f040124, - 0x7f040125, 0x7f040126, 0x7f040127, 0x7f040128, - 0x7f040129, 0x7f04012a, 0x7f04012b, 0x7f04012c, - 0x7f04012d, 0x7f04012e, 0x7f04012f, 0x7f040130, - 0x7f040131, 0x7f040132, 0x7f040133, 0x7f040134, - 0x7f040135, 0x7f040136, 0x7f040137, 0x7f040138, - 0x7f040139, 0x7f04013a, 0x7f04013b, 0x7f04013c, - 0x7f04013d, 0x7f04013e, 0x7f04013f, 0x7f040141, - 0x7f040142, 0x7f040143, 0x7f040144, 0x7f040145, - 0x7f040146, 0x7f040147, 0x7f040148, 0x7f04014b - }; - /** - *

This symbol is the offset where the {@link android.R.attr#orientation} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - *
ConstantValueDescription
horizontal0
vertical1
- * - * @attr name android:orientation - */ - public static final int ConstraintLayout_Layout_android_orientation=0; - /** - *

This symbol is the offset where the {@link android.R.attr#maxWidth} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:maxWidth - */ - public static final int ConstraintLayout_Layout_android_maxWidth=1; - /** - *

This symbol is the offset where the {@link android.R.attr#maxHeight} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:maxHeight - */ - public static final int ConstraintLayout_Layout_android_maxHeight=2; - /** - *

This symbol is the offset where the {@link android.R.attr#minWidth} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:minWidth - */ - public static final int ConstraintLayout_Layout_android_minWidth=3; - /** - *

This symbol is the offset where the {@link android.R.attr#minHeight} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:minHeight - */ - public static final int ConstraintLayout_Layout_android_minHeight=4; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#barrierAllowsGoneWidgets} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:barrierAllowsGoneWidgets - */ - public static final int ConstraintLayout_Layout_barrierAllowsGoneWidgets=5; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#barrierDirection} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
bottom3
end6
left0
right1
start5
top2
- * - * @attr name com.scriptor:barrierDirection - */ - public static final int ConstraintLayout_Layout_barrierDirection=6; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#chainUseRtl} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:chainUseRtl - */ - public static final int ConstraintLayout_Layout_chainUseRtl=7; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#constraintSet} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:constraintSet - */ - public static final int ConstraintLayout_Layout_constraintSet=8; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#constraint_referenced_ids} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:constraint_referenced_ids - */ - public static final int ConstraintLayout_Layout_constraint_referenced_ids=9; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constrainedHeight} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:layout_constrainedHeight - */ - public static final int ConstraintLayout_Layout_layout_constrainedHeight=10; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constrainedWidth} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:layout_constrainedWidth - */ - public static final int ConstraintLayout_Layout_layout_constrainedWidth=11; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintBaseline_creator} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be an integer value, such as "100". - * - * @attr name com.scriptor:layout_constraintBaseline_creator - */ - public static final int ConstraintLayout_Layout_layout_constraintBaseline_creator=12; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintBaseline_toBaselineOf} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- * - * @attr name com.scriptor:layout_constraintBaseline_toBaselineOf - */ - public static final int ConstraintLayout_Layout_layout_constraintBaseline_toBaselineOf=13; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintBottom_creator} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be an integer value, such as "100". - * - * @attr name com.scriptor:layout_constraintBottom_creator - */ - public static final int ConstraintLayout_Layout_layout_constraintBottom_creator=14; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintBottom_toBottomOf} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- * - * @attr name com.scriptor:layout_constraintBottom_toBottomOf - */ - public static final int ConstraintLayout_Layout_layout_constraintBottom_toBottomOf=15; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintBottom_toTopOf} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- * - * @attr name com.scriptor:layout_constraintBottom_toTopOf - */ - public static final int ConstraintLayout_Layout_layout_constraintBottom_toTopOf=16; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintCircle} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:layout_constraintCircle - */ - public static final int ConstraintLayout_Layout_layout_constraintCircle=17; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintCircleAngle} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be an integer value, such as "100". - * - * @attr name com.scriptor:layout_constraintCircleAngle - */ - public static final int ConstraintLayout_Layout_layout_constraintCircleAngle=18; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintCircleRadius} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:layout_constraintCircleRadius - */ - public static final int ConstraintLayout_Layout_layout_constraintCircleRadius=19; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintDimensionRatio} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:layout_constraintDimensionRatio - */ - public static final int ConstraintLayout_Layout_layout_constraintDimensionRatio=20; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintEnd_toEndOf} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- * - * @attr name com.scriptor:layout_constraintEnd_toEndOf - */ - public static final int ConstraintLayout_Layout_layout_constraintEnd_toEndOf=21; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintEnd_toStartOf} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- * - * @attr name com.scriptor:layout_constraintEnd_toStartOf - */ - public static final int ConstraintLayout_Layout_layout_constraintEnd_toStartOf=22; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintGuide_begin} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:layout_constraintGuide_begin - */ - public static final int ConstraintLayout_Layout_layout_constraintGuide_begin=23; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintGuide_end} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:layout_constraintGuide_end - */ - public static final int ConstraintLayout_Layout_layout_constraintGuide_end=24; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintGuide_percent} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a floating point value, such as "1.2". - * - * @attr name com.scriptor:layout_constraintGuide_percent - */ - public static final int ConstraintLayout_Layout_layout_constraintGuide_percent=25; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintHeight_default} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
percent2
spread0
wrap1
- * - * @attr name com.scriptor:layout_constraintHeight_default - */ - public static final int ConstraintLayout_Layout_layout_constraintHeight_default=26; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintHeight_max} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
wrapfffffffe
- * - * @attr name com.scriptor:layout_constraintHeight_max - */ - public static final int ConstraintLayout_Layout_layout_constraintHeight_max=27; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintHeight_min} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
wrapfffffffe
- * - * @attr name com.scriptor:layout_constraintHeight_min - */ - public static final int ConstraintLayout_Layout_layout_constraintHeight_min=28; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintHeight_percent} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a floating point value, such as "1.2". - * - * @attr name com.scriptor:layout_constraintHeight_percent - */ - public static final int ConstraintLayout_Layout_layout_constraintHeight_percent=29; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintHorizontal_bias} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a floating point value, such as "1.2". - * - * @attr name com.scriptor:layout_constraintHorizontal_bias - */ - public static final int ConstraintLayout_Layout_layout_constraintHorizontal_bias=30; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintHorizontal_chainStyle} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
packed2
spread0
spread_inside1
- * - * @attr name com.scriptor:layout_constraintHorizontal_chainStyle - */ - public static final int ConstraintLayout_Layout_layout_constraintHorizontal_chainStyle=31; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintHorizontal_weight} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a floating point value, such as "1.2". - * - * @attr name com.scriptor:layout_constraintHorizontal_weight - */ - public static final int ConstraintLayout_Layout_layout_constraintHorizontal_weight=32; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintLeft_creator} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be an integer value, such as "100". - * - * @attr name com.scriptor:layout_constraintLeft_creator - */ - public static final int ConstraintLayout_Layout_layout_constraintLeft_creator=33; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintLeft_toLeftOf} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- * - * @attr name com.scriptor:layout_constraintLeft_toLeftOf - */ - public static final int ConstraintLayout_Layout_layout_constraintLeft_toLeftOf=34; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintLeft_toRightOf} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- * - * @attr name com.scriptor:layout_constraintLeft_toRightOf - */ - public static final int ConstraintLayout_Layout_layout_constraintLeft_toRightOf=35; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintRight_creator} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be an integer value, such as "100". - * - * @attr name com.scriptor:layout_constraintRight_creator - */ - public static final int ConstraintLayout_Layout_layout_constraintRight_creator=36; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintRight_toLeftOf} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- * - * @attr name com.scriptor:layout_constraintRight_toLeftOf - */ - public static final int ConstraintLayout_Layout_layout_constraintRight_toLeftOf=37; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintRight_toRightOf} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- * - * @attr name com.scriptor:layout_constraintRight_toRightOf - */ - public static final int ConstraintLayout_Layout_layout_constraintRight_toRightOf=38; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintStart_toEndOf} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- * - * @attr name com.scriptor:layout_constraintStart_toEndOf - */ - public static final int ConstraintLayout_Layout_layout_constraintStart_toEndOf=39; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintStart_toStartOf} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- * - * @attr name com.scriptor:layout_constraintStart_toStartOf - */ - public static final int ConstraintLayout_Layout_layout_constraintStart_toStartOf=40; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintTop_creator} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be an integer value, such as "100". - * - * @attr name com.scriptor:layout_constraintTop_creator - */ - public static final int ConstraintLayout_Layout_layout_constraintTop_creator=41; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintTop_toBottomOf} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- * - * @attr name com.scriptor:layout_constraintTop_toBottomOf - */ - public static final int ConstraintLayout_Layout_layout_constraintTop_toBottomOf=42; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintTop_toTopOf} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- * - * @attr name com.scriptor:layout_constraintTop_toTopOf - */ - public static final int ConstraintLayout_Layout_layout_constraintTop_toTopOf=43; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintVertical_bias} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a floating point value, such as "1.2". - * - * @attr name com.scriptor:layout_constraintVertical_bias - */ - public static final int ConstraintLayout_Layout_layout_constraintVertical_bias=44; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintVertical_chainStyle} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
packed2
spread0
spread_inside1
- * - * @attr name com.scriptor:layout_constraintVertical_chainStyle - */ - public static final int ConstraintLayout_Layout_layout_constraintVertical_chainStyle=45; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintVertical_weight} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a floating point value, such as "1.2". - * - * @attr name com.scriptor:layout_constraintVertical_weight - */ - public static final int ConstraintLayout_Layout_layout_constraintVertical_weight=46; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintWidth_default} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
percent2
spread0
wrap1
- * - * @attr name com.scriptor:layout_constraintWidth_default - */ - public static final int ConstraintLayout_Layout_layout_constraintWidth_default=47; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintWidth_max} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
wrapfffffffe
- * - * @attr name com.scriptor:layout_constraintWidth_max - */ - public static final int ConstraintLayout_Layout_layout_constraintWidth_max=48; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintWidth_min} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
wrapfffffffe
- * - * @attr name com.scriptor:layout_constraintWidth_min - */ - public static final int ConstraintLayout_Layout_layout_constraintWidth_min=49; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintWidth_percent} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a floating point value, such as "1.2". - * - * @attr name com.scriptor:layout_constraintWidth_percent - */ - public static final int ConstraintLayout_Layout_layout_constraintWidth_percent=50; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_editor_absoluteX} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:layout_editor_absoluteX - */ - public static final int ConstraintLayout_Layout_layout_editor_absoluteX=51; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_editor_absoluteY} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:layout_editor_absoluteY - */ - public static final int ConstraintLayout_Layout_layout_editor_absoluteY=52; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_goneMarginBottom} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:layout_goneMarginBottom - */ - public static final int ConstraintLayout_Layout_layout_goneMarginBottom=53; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_goneMarginEnd} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:layout_goneMarginEnd - */ - public static final int ConstraintLayout_Layout_layout_goneMarginEnd=54; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_goneMarginLeft} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:layout_goneMarginLeft - */ - public static final int ConstraintLayout_Layout_layout_goneMarginLeft=55; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_goneMarginRight} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:layout_goneMarginRight - */ - public static final int ConstraintLayout_Layout_layout_goneMarginRight=56; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_goneMarginStart} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:layout_goneMarginStart - */ - public static final int ConstraintLayout_Layout_layout_goneMarginStart=57; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_goneMarginTop} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:layout_goneMarginTop - */ - public static final int ConstraintLayout_Layout_layout_goneMarginTop=58; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_optimizationLevel} - * attribute's value can be found in the {@link #ConstraintLayout_Layout} array. - * - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
barrier2
chains4
dimensions8
direct1direct, barriers, chains
groups20
none0
standard7
- * - * @attr name com.scriptor:layout_optimizationLevel - */ - public static final int ConstraintLayout_Layout_layout_optimizationLevel=59; - /** - * Attributes that can be used with a ConstraintLayout_placeholder. - *

Includes the following attributes:

- * - * - * - * - * - * - *
AttributeDescription
{@link #ConstraintLayout_placeholder_content com.scriptor:content}
{@link #ConstraintLayout_placeholder_emptyVisibility com.scriptor:emptyVisibility}
- * @see #ConstraintLayout_placeholder_content - * @see #ConstraintLayout_placeholder_emptyVisibility - */ - public static final int[] ConstraintLayout_placeholder={ - 0x7f040095, 0x7f0400bc - }; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#content} - * attribute's value can be found in the {@link #ConstraintLayout_placeholder} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:content - */ - public static final int ConstraintLayout_placeholder_content=0; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#emptyVisibility} - * attribute's value can be found in the {@link #ConstraintLayout_placeholder} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - *
ConstantValueDescription
gone0
invisible1
- * - * @attr name com.scriptor:emptyVisibility - */ - public static final int ConstraintLayout_placeholder_emptyVisibility=1; - /** - * Attributes that can be used with a ConstraintSet. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #ConstraintSet_android_orientation android:orientation}
{@link #ConstraintSet_android_id android:id}
{@link #ConstraintSet_android_visibility android:visibility}
{@link #ConstraintSet_android_layout_width android:layout_width}
{@link #ConstraintSet_android_layout_height android:layout_height}
{@link #ConstraintSet_android_layout_marginLeft android:layout_marginLeft}
{@link #ConstraintSet_android_layout_marginTop android:layout_marginTop}
{@link #ConstraintSet_android_layout_marginRight android:layout_marginRight}
{@link #ConstraintSet_android_layout_marginBottom android:layout_marginBottom}
{@link #ConstraintSet_android_maxWidth android:maxWidth}
{@link #ConstraintSet_android_maxHeight android:maxHeight}
{@link #ConstraintSet_android_minWidth android:minWidth}
{@link #ConstraintSet_android_minHeight android:minHeight}
{@link #ConstraintSet_android_alpha android:alpha}
{@link #ConstraintSet_android_transformPivotX android:transformPivotX}
{@link #ConstraintSet_android_transformPivotY android:transformPivotY}
{@link #ConstraintSet_android_translationX android:translationX}
{@link #ConstraintSet_android_translationY android:translationY}
{@link #ConstraintSet_android_scaleX android:scaleX}
{@link #ConstraintSet_android_scaleY android:scaleY}
{@link #ConstraintSet_android_rotation android:rotation}
{@link #ConstraintSet_android_rotationX android:rotationX}
{@link #ConstraintSet_android_rotationY android:rotationY}
{@link #ConstraintSet_android_layout_marginStart android:layout_marginStart}
{@link #ConstraintSet_android_layout_marginEnd android:layout_marginEnd}
{@link #ConstraintSet_android_translationZ android:translationZ}
{@link #ConstraintSet_android_elevation android:elevation}
{@link #ConstraintSet_barrierAllowsGoneWidgets com.scriptor:barrierAllowsGoneWidgets}
{@link #ConstraintSet_barrierDirection com.scriptor:barrierDirection}
{@link #ConstraintSet_chainUseRtl com.scriptor:chainUseRtl}
{@link #ConstraintSet_constraint_referenced_ids com.scriptor:constraint_referenced_ids}
{@link #ConstraintSet_layout_constrainedHeight com.scriptor:layout_constrainedHeight}
{@link #ConstraintSet_layout_constrainedWidth com.scriptor:layout_constrainedWidth}
{@link #ConstraintSet_layout_constraintBaseline_creator com.scriptor:layout_constraintBaseline_creator}
{@link #ConstraintSet_layout_constraintBaseline_toBaselineOf com.scriptor:layout_constraintBaseline_toBaselineOf}
{@link #ConstraintSet_layout_constraintBottom_creator com.scriptor:layout_constraintBottom_creator}
{@link #ConstraintSet_layout_constraintBottom_toBottomOf com.scriptor:layout_constraintBottom_toBottomOf}
{@link #ConstraintSet_layout_constraintBottom_toTopOf com.scriptor:layout_constraintBottom_toTopOf}
{@link #ConstraintSet_layout_constraintCircle com.scriptor:layout_constraintCircle}
{@link #ConstraintSet_layout_constraintCircleAngle com.scriptor:layout_constraintCircleAngle}
{@link #ConstraintSet_layout_constraintCircleRadius com.scriptor:layout_constraintCircleRadius}
{@link #ConstraintSet_layout_constraintDimensionRatio com.scriptor:layout_constraintDimensionRatio}
{@link #ConstraintSet_layout_constraintEnd_toEndOf com.scriptor:layout_constraintEnd_toEndOf}
{@link #ConstraintSet_layout_constraintEnd_toStartOf com.scriptor:layout_constraintEnd_toStartOf}
{@link #ConstraintSet_layout_constraintGuide_begin com.scriptor:layout_constraintGuide_begin}
{@link #ConstraintSet_layout_constraintGuide_end com.scriptor:layout_constraintGuide_end}
{@link #ConstraintSet_layout_constraintGuide_percent com.scriptor:layout_constraintGuide_percent}
{@link #ConstraintSet_layout_constraintHeight_default com.scriptor:layout_constraintHeight_default}
{@link #ConstraintSet_layout_constraintHeight_max com.scriptor:layout_constraintHeight_max}
{@link #ConstraintSet_layout_constraintHeight_min com.scriptor:layout_constraintHeight_min}
{@link #ConstraintSet_layout_constraintHeight_percent com.scriptor:layout_constraintHeight_percent}
{@link #ConstraintSet_layout_constraintHorizontal_bias com.scriptor:layout_constraintHorizontal_bias}
{@link #ConstraintSet_layout_constraintHorizontal_chainStyle com.scriptor:layout_constraintHorizontal_chainStyle}
{@link #ConstraintSet_layout_constraintHorizontal_weight com.scriptor:layout_constraintHorizontal_weight}
{@link #ConstraintSet_layout_constraintLeft_creator com.scriptor:layout_constraintLeft_creator}
{@link #ConstraintSet_layout_constraintLeft_toLeftOf com.scriptor:layout_constraintLeft_toLeftOf}
{@link #ConstraintSet_layout_constraintLeft_toRightOf com.scriptor:layout_constraintLeft_toRightOf}
{@link #ConstraintSet_layout_constraintRight_creator com.scriptor:layout_constraintRight_creator}
{@link #ConstraintSet_layout_constraintRight_toLeftOf com.scriptor:layout_constraintRight_toLeftOf}
{@link #ConstraintSet_layout_constraintRight_toRightOf com.scriptor:layout_constraintRight_toRightOf}
{@link #ConstraintSet_layout_constraintStart_toEndOf com.scriptor:layout_constraintStart_toEndOf}
{@link #ConstraintSet_layout_constraintStart_toStartOf com.scriptor:layout_constraintStart_toStartOf}
{@link #ConstraintSet_layout_constraintTop_creator com.scriptor:layout_constraintTop_creator}
{@link #ConstraintSet_layout_constraintTop_toBottomOf com.scriptor:layout_constraintTop_toBottomOf}
{@link #ConstraintSet_layout_constraintTop_toTopOf com.scriptor:layout_constraintTop_toTopOf}
{@link #ConstraintSet_layout_constraintVertical_bias com.scriptor:layout_constraintVertical_bias}
{@link #ConstraintSet_layout_constraintVertical_chainStyle com.scriptor:layout_constraintVertical_chainStyle}
{@link #ConstraintSet_layout_constraintVertical_weight com.scriptor:layout_constraintVertical_weight}
{@link #ConstraintSet_layout_constraintWidth_default com.scriptor:layout_constraintWidth_default}
{@link #ConstraintSet_layout_constraintWidth_max com.scriptor:layout_constraintWidth_max}
{@link #ConstraintSet_layout_constraintWidth_min com.scriptor:layout_constraintWidth_min}
{@link #ConstraintSet_layout_constraintWidth_percent com.scriptor:layout_constraintWidth_percent}
{@link #ConstraintSet_layout_editor_absoluteX com.scriptor:layout_editor_absoluteX}
{@link #ConstraintSet_layout_editor_absoluteY com.scriptor:layout_editor_absoluteY}
{@link #ConstraintSet_layout_goneMarginBottom com.scriptor:layout_goneMarginBottom}
{@link #ConstraintSet_layout_goneMarginEnd com.scriptor:layout_goneMarginEnd}
{@link #ConstraintSet_layout_goneMarginLeft com.scriptor:layout_goneMarginLeft}
{@link #ConstraintSet_layout_goneMarginRight com.scriptor:layout_goneMarginRight}
{@link #ConstraintSet_layout_goneMarginStart com.scriptor:layout_goneMarginStart}
{@link #ConstraintSet_layout_goneMarginTop com.scriptor:layout_goneMarginTop}
- * @see #ConstraintSet_android_orientation - * @see #ConstraintSet_android_id - * @see #ConstraintSet_android_visibility - * @see #ConstraintSet_android_layout_width - * @see #ConstraintSet_android_layout_height - * @see #ConstraintSet_android_layout_marginLeft - * @see #ConstraintSet_android_layout_marginTop - * @see #ConstraintSet_android_layout_marginRight - * @see #ConstraintSet_android_layout_marginBottom - * @see #ConstraintSet_android_maxWidth - * @see #ConstraintSet_android_maxHeight - * @see #ConstraintSet_android_minWidth - * @see #ConstraintSet_android_minHeight - * @see #ConstraintSet_android_alpha - * @see #ConstraintSet_android_transformPivotX - * @see #ConstraintSet_android_transformPivotY - * @see #ConstraintSet_android_translationX - * @see #ConstraintSet_android_translationY - * @see #ConstraintSet_android_scaleX - * @see #ConstraintSet_android_scaleY - * @see #ConstraintSet_android_rotation - * @see #ConstraintSet_android_rotationX - * @see #ConstraintSet_android_rotationY - * @see #ConstraintSet_android_layout_marginStart - * @see #ConstraintSet_android_layout_marginEnd - * @see #ConstraintSet_android_translationZ - * @see #ConstraintSet_android_elevation - * @see #ConstraintSet_barrierAllowsGoneWidgets - * @see #ConstraintSet_barrierDirection - * @see #ConstraintSet_chainUseRtl - * @see #ConstraintSet_constraint_referenced_ids - * @see #ConstraintSet_layout_constrainedHeight - * @see #ConstraintSet_layout_constrainedWidth - * @see #ConstraintSet_layout_constraintBaseline_creator - * @see #ConstraintSet_layout_constraintBaseline_toBaselineOf - * @see #ConstraintSet_layout_constraintBottom_creator - * @see #ConstraintSet_layout_constraintBottom_toBottomOf - * @see #ConstraintSet_layout_constraintBottom_toTopOf - * @see #ConstraintSet_layout_constraintCircle - * @see #ConstraintSet_layout_constraintCircleAngle - * @see #ConstraintSet_layout_constraintCircleRadius - * @see #ConstraintSet_layout_constraintDimensionRatio - * @see #ConstraintSet_layout_constraintEnd_toEndOf - * @see #ConstraintSet_layout_constraintEnd_toStartOf - * @see #ConstraintSet_layout_constraintGuide_begin - * @see #ConstraintSet_layout_constraintGuide_end - * @see #ConstraintSet_layout_constraintGuide_percent - * @see #ConstraintSet_layout_constraintHeight_default - * @see #ConstraintSet_layout_constraintHeight_max - * @see #ConstraintSet_layout_constraintHeight_min - * @see #ConstraintSet_layout_constraintHeight_percent - * @see #ConstraintSet_layout_constraintHorizontal_bias - * @see #ConstraintSet_layout_constraintHorizontal_chainStyle - * @see #ConstraintSet_layout_constraintHorizontal_weight - * @see #ConstraintSet_layout_constraintLeft_creator - * @see #ConstraintSet_layout_constraintLeft_toLeftOf - * @see #ConstraintSet_layout_constraintLeft_toRightOf - * @see #ConstraintSet_layout_constraintRight_creator - * @see #ConstraintSet_layout_constraintRight_toLeftOf - * @see #ConstraintSet_layout_constraintRight_toRightOf - * @see #ConstraintSet_layout_constraintStart_toEndOf - * @see #ConstraintSet_layout_constraintStart_toStartOf - * @see #ConstraintSet_layout_constraintTop_creator - * @see #ConstraintSet_layout_constraintTop_toBottomOf - * @see #ConstraintSet_layout_constraintTop_toTopOf - * @see #ConstraintSet_layout_constraintVertical_bias - * @see #ConstraintSet_layout_constraintVertical_chainStyle - * @see #ConstraintSet_layout_constraintVertical_weight - * @see #ConstraintSet_layout_constraintWidth_default - * @see #ConstraintSet_layout_constraintWidth_max - * @see #ConstraintSet_layout_constraintWidth_min - * @see #ConstraintSet_layout_constraintWidth_percent - * @see #ConstraintSet_layout_editor_absoluteX - * @see #ConstraintSet_layout_editor_absoluteY - * @see #ConstraintSet_layout_goneMarginBottom - * @see #ConstraintSet_layout_goneMarginEnd - * @see #ConstraintSet_layout_goneMarginLeft - * @see #ConstraintSet_layout_goneMarginRight - * @see #ConstraintSet_layout_goneMarginStart - * @see #ConstraintSet_layout_goneMarginTop - */ - public static final int[] ConstraintSet={ - 0x010100c4, 0x010100d0, 0x010100dc, 0x010100f4, - 0x010100f5, 0x010100f7, 0x010100f8, 0x010100f9, - 0x010100fa, 0x0101011f, 0x01010120, 0x0101013f, - 0x01010140, 0x0101031f, 0x01010320, 0x01010321, - 0x01010322, 0x01010323, 0x01010324, 0x01010325, - 0x01010326, 0x01010327, 0x01010328, 0x010103b5, - 0x010103b6, 0x010103fa, 0x01010440, 0x7f040037, - 0x7f040038, 0x7f040061, 0x7f040094, 0x7f040117, - 0x7f040118, 0x7f040119, 0x7f04011a, 0x7f04011b, - 0x7f04011c, 0x7f04011d, 0x7f04011e, 0x7f04011f, - 0x7f040120, 0x7f040121, 0x7f040122, 0x7f040123, - 0x7f040124, 0x7f040125, 0x7f040126, 0x7f040127, - 0x7f040128, 0x7f040129, 0x7f04012a, 0x7f04012b, - 0x7f04012c, 0x7f04012d, 0x7f04012e, 0x7f04012f, - 0x7f040130, 0x7f040131, 0x7f040132, 0x7f040133, - 0x7f040134, 0x7f040135, 0x7f040136, 0x7f040137, - 0x7f040138, 0x7f040139, 0x7f04013a, 0x7f04013b, - 0x7f04013c, 0x7f04013d, 0x7f04013e, 0x7f04013f, - 0x7f040141, 0x7f040142, 0x7f040143, 0x7f040144, - 0x7f040145, 0x7f040146, 0x7f040147, 0x7f040148 - }; - /** - *

This symbol is the offset where the {@link android.R.attr#orientation} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - *
ConstantValueDescription
horizontal0
vertical1
- * - * @attr name android:orientation - */ - public static final int ConstraintSet_android_orientation=0; - /** - *

This symbol is the offset where the {@link android.R.attr#id} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:id - */ - public static final int ConstraintSet_android_id=1; - /** - *

This symbol is the offset where the {@link android.R.attr#visibility} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
gone2
invisible1
visible0
- * - * @attr name android:visibility - */ - public static final int ConstraintSet_android_visibility=2; - /** - *

This symbol is the offset where the {@link android.R.attr#layout_width} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
fill_parentffffffff
match_parentffffffff
wrap_contentfffffffe
- * - * @attr name android:layout_width - */ - public static final int ConstraintSet_android_layout_width=3; - /** - *

This symbol is the offset where the {@link android.R.attr#layout_height} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
fill_parentffffffff
match_parentffffffff
wrap_contentfffffffe
- * - * @attr name android:layout_height - */ - public static final int ConstraintSet_android_layout_height=4; - /** - *

This symbol is the offset where the {@link android.R.attr#layout_marginLeft} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:layout_marginLeft - */ - public static final int ConstraintSet_android_layout_marginLeft=5; - /** - *

This symbol is the offset where the {@link android.R.attr#layout_marginTop} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:layout_marginTop - */ - public static final int ConstraintSet_android_layout_marginTop=6; - /** - *

This symbol is the offset where the {@link android.R.attr#layout_marginRight} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:layout_marginRight - */ - public static final int ConstraintSet_android_layout_marginRight=7; - /** - *

This symbol is the offset where the {@link android.R.attr#layout_marginBottom} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:layout_marginBottom - */ - public static final int ConstraintSet_android_layout_marginBottom=8; - /** - *

This symbol is the offset where the {@link android.R.attr#maxWidth} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:maxWidth - */ - public static final int ConstraintSet_android_maxWidth=9; - /** - *

This symbol is the offset where the {@link android.R.attr#maxHeight} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:maxHeight - */ - public static final int ConstraintSet_android_maxHeight=10; - /** - *

This symbol is the offset where the {@link android.R.attr#minWidth} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:minWidth - */ - public static final int ConstraintSet_android_minWidth=11; - /** - *

This symbol is the offset where the {@link android.R.attr#minHeight} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:minHeight - */ - public static final int ConstraintSet_android_minHeight=12; - /** - *

This symbol is the offset where the {@link android.R.attr#alpha} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a floating point value, such as "1.2". - * - * @attr name android:alpha - */ - public static final int ConstraintSet_android_alpha=13; - /** - *

This symbol is the offset where the {@link android.R.attr#transformPivotX} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:transformPivotX - */ - public static final int ConstraintSet_android_transformPivotX=14; - /** - *

This symbol is the offset where the {@link android.R.attr#transformPivotY} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:transformPivotY - */ - public static final int ConstraintSet_android_transformPivotY=15; - /** - *

This symbol is the offset where the {@link android.R.attr#translationX} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:translationX - */ - public static final int ConstraintSet_android_translationX=16; - /** - *

This symbol is the offset where the {@link android.R.attr#translationY} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:translationY - */ - public static final int ConstraintSet_android_translationY=17; - /** - *

This symbol is the offset where the {@link android.R.attr#scaleX} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a floating point value, such as "1.2". - * - * @attr name android:scaleX - */ - public static final int ConstraintSet_android_scaleX=18; - /** - *

This symbol is the offset where the {@link android.R.attr#scaleY} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a floating point value, such as "1.2". - * - * @attr name android:scaleY - */ - public static final int ConstraintSet_android_scaleY=19; - /** - *

This symbol is the offset where the {@link android.R.attr#rotation} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a floating point value, such as "1.2". - * - * @attr name android:rotation - */ - public static final int ConstraintSet_android_rotation=20; - /** - *

This symbol is the offset where the {@link android.R.attr#rotationX} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a floating point value, such as "1.2". - * - * @attr name android:rotationX - */ - public static final int ConstraintSet_android_rotationX=21; - /** - *

This symbol is the offset where the {@link android.R.attr#rotationY} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a floating point value, such as "1.2". - * - * @attr name android:rotationY - */ - public static final int ConstraintSet_android_rotationY=22; - /** - *

This symbol is the offset where the {@link android.R.attr#layout_marginStart} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:layout_marginStart - */ - public static final int ConstraintSet_android_layout_marginStart=23; - /** - *

This symbol is the offset where the {@link android.R.attr#layout_marginEnd} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:layout_marginEnd - */ - public static final int ConstraintSet_android_layout_marginEnd=24; - /** - *

This symbol is the offset where the {@link android.R.attr#translationZ} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:translationZ - */ - public static final int ConstraintSet_android_translationZ=25; - /** - *

This symbol is the offset where the {@link android.R.attr#elevation} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:elevation - */ - public static final int ConstraintSet_android_elevation=26; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#barrierAllowsGoneWidgets} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:barrierAllowsGoneWidgets - */ - public static final int ConstraintSet_barrierAllowsGoneWidgets=27; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#barrierDirection} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
bottom3
end6
left0
right1
start5
top2
- * - * @attr name com.scriptor:barrierDirection - */ - public static final int ConstraintSet_barrierDirection=28; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#chainUseRtl} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:chainUseRtl - */ - public static final int ConstraintSet_chainUseRtl=29; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#constraint_referenced_ids} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:constraint_referenced_ids - */ - public static final int ConstraintSet_constraint_referenced_ids=30; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constrainedHeight} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:layout_constrainedHeight - */ - public static final int ConstraintSet_layout_constrainedHeight=31; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constrainedWidth} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:layout_constrainedWidth - */ - public static final int ConstraintSet_layout_constrainedWidth=32; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintBaseline_creator} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be an integer value, such as "100". - * - * @attr name com.scriptor:layout_constraintBaseline_creator - */ - public static final int ConstraintSet_layout_constraintBaseline_creator=33; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintBaseline_toBaselineOf} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- * - * @attr name com.scriptor:layout_constraintBaseline_toBaselineOf - */ - public static final int ConstraintSet_layout_constraintBaseline_toBaselineOf=34; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintBottom_creator} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be an integer value, such as "100". - * - * @attr name com.scriptor:layout_constraintBottom_creator - */ - public static final int ConstraintSet_layout_constraintBottom_creator=35; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintBottom_toBottomOf} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- * - * @attr name com.scriptor:layout_constraintBottom_toBottomOf - */ - public static final int ConstraintSet_layout_constraintBottom_toBottomOf=36; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintBottom_toTopOf} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- * - * @attr name com.scriptor:layout_constraintBottom_toTopOf - */ - public static final int ConstraintSet_layout_constraintBottom_toTopOf=37; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintCircle} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:layout_constraintCircle - */ - public static final int ConstraintSet_layout_constraintCircle=38; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintCircleAngle} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be an integer value, such as "100". - * - * @attr name com.scriptor:layout_constraintCircleAngle - */ - public static final int ConstraintSet_layout_constraintCircleAngle=39; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintCircleRadius} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:layout_constraintCircleRadius - */ - public static final int ConstraintSet_layout_constraintCircleRadius=40; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintDimensionRatio} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:layout_constraintDimensionRatio - */ - public static final int ConstraintSet_layout_constraintDimensionRatio=41; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintEnd_toEndOf} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- * - * @attr name com.scriptor:layout_constraintEnd_toEndOf - */ - public static final int ConstraintSet_layout_constraintEnd_toEndOf=42; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintEnd_toStartOf} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- * - * @attr name com.scriptor:layout_constraintEnd_toStartOf - */ - public static final int ConstraintSet_layout_constraintEnd_toStartOf=43; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintGuide_begin} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:layout_constraintGuide_begin - */ - public static final int ConstraintSet_layout_constraintGuide_begin=44; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintGuide_end} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:layout_constraintGuide_end - */ - public static final int ConstraintSet_layout_constraintGuide_end=45; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintGuide_percent} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a floating point value, such as "1.2". - * - * @attr name com.scriptor:layout_constraintGuide_percent - */ - public static final int ConstraintSet_layout_constraintGuide_percent=46; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintHeight_default} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
percent2
spread0
wrap1
- * - * @attr name com.scriptor:layout_constraintHeight_default - */ - public static final int ConstraintSet_layout_constraintHeight_default=47; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintHeight_max} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
wrapfffffffe
- * - * @attr name com.scriptor:layout_constraintHeight_max - */ - public static final int ConstraintSet_layout_constraintHeight_max=48; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintHeight_min} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
wrapfffffffe
- * - * @attr name com.scriptor:layout_constraintHeight_min - */ - public static final int ConstraintSet_layout_constraintHeight_min=49; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintHeight_percent} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a floating point value, such as "1.2". - * - * @attr name com.scriptor:layout_constraintHeight_percent - */ - public static final int ConstraintSet_layout_constraintHeight_percent=50; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintHorizontal_bias} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a floating point value, such as "1.2". - * - * @attr name com.scriptor:layout_constraintHorizontal_bias - */ - public static final int ConstraintSet_layout_constraintHorizontal_bias=51; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintHorizontal_chainStyle} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
packed2
spread0
spread_inside1
- * - * @attr name com.scriptor:layout_constraintHorizontal_chainStyle - */ - public static final int ConstraintSet_layout_constraintHorizontal_chainStyle=52; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintHorizontal_weight} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a floating point value, such as "1.2". - * - * @attr name com.scriptor:layout_constraintHorizontal_weight - */ - public static final int ConstraintSet_layout_constraintHorizontal_weight=53; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintLeft_creator} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be an integer value, such as "100". - * - * @attr name com.scriptor:layout_constraintLeft_creator - */ - public static final int ConstraintSet_layout_constraintLeft_creator=54; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintLeft_toLeftOf} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- * - * @attr name com.scriptor:layout_constraintLeft_toLeftOf - */ - public static final int ConstraintSet_layout_constraintLeft_toLeftOf=55; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintLeft_toRightOf} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- * - * @attr name com.scriptor:layout_constraintLeft_toRightOf - */ - public static final int ConstraintSet_layout_constraintLeft_toRightOf=56; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintRight_creator} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be an integer value, such as "100". - * - * @attr name com.scriptor:layout_constraintRight_creator - */ - public static final int ConstraintSet_layout_constraintRight_creator=57; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintRight_toLeftOf} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- * - * @attr name com.scriptor:layout_constraintRight_toLeftOf - */ - public static final int ConstraintSet_layout_constraintRight_toLeftOf=58; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintRight_toRightOf} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- * - * @attr name com.scriptor:layout_constraintRight_toRightOf - */ - public static final int ConstraintSet_layout_constraintRight_toRightOf=59; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintStart_toEndOf} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- * - * @attr name com.scriptor:layout_constraintStart_toEndOf - */ - public static final int ConstraintSet_layout_constraintStart_toEndOf=60; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintStart_toStartOf} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- * - * @attr name com.scriptor:layout_constraintStart_toStartOf - */ - public static final int ConstraintSet_layout_constraintStart_toStartOf=61; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintTop_creator} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be an integer value, such as "100". - * - * @attr name com.scriptor:layout_constraintTop_creator - */ - public static final int ConstraintSet_layout_constraintTop_creator=62; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintTop_toBottomOf} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- * - * @attr name com.scriptor:layout_constraintTop_toBottomOf - */ - public static final int ConstraintSet_layout_constraintTop_toBottomOf=63; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintTop_toTopOf} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
parent0
- * - * @attr name com.scriptor:layout_constraintTop_toTopOf - */ - public static final int ConstraintSet_layout_constraintTop_toTopOf=64; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintVertical_bias} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a floating point value, such as "1.2". - * - * @attr name com.scriptor:layout_constraintVertical_bias - */ - public static final int ConstraintSet_layout_constraintVertical_bias=65; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintVertical_chainStyle} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
packed2
spread0
spread_inside1
- * - * @attr name com.scriptor:layout_constraintVertical_chainStyle - */ - public static final int ConstraintSet_layout_constraintVertical_chainStyle=66; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintVertical_weight} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a floating point value, such as "1.2". - * - * @attr name com.scriptor:layout_constraintVertical_weight - */ - public static final int ConstraintSet_layout_constraintVertical_weight=67; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintWidth_default} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
percent2
spread0
wrap1
- * - * @attr name com.scriptor:layout_constraintWidth_default - */ - public static final int ConstraintSet_layout_constraintWidth_default=68; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintWidth_max} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
wrapfffffffe
- * - * @attr name com.scriptor:layout_constraintWidth_max - */ - public static final int ConstraintSet_layout_constraintWidth_max=69; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintWidth_min} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
wrapfffffffe
- * - * @attr name com.scriptor:layout_constraintWidth_min - */ - public static final int ConstraintSet_layout_constraintWidth_min=70; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_constraintWidth_percent} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a floating point value, such as "1.2". - * - * @attr name com.scriptor:layout_constraintWidth_percent - */ - public static final int ConstraintSet_layout_constraintWidth_percent=71; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_editor_absoluteX} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:layout_editor_absoluteX - */ - public static final int ConstraintSet_layout_editor_absoluteX=72; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_editor_absoluteY} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:layout_editor_absoluteY - */ - public static final int ConstraintSet_layout_editor_absoluteY=73; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_goneMarginBottom} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:layout_goneMarginBottom - */ - public static final int ConstraintSet_layout_goneMarginBottom=74; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_goneMarginEnd} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:layout_goneMarginEnd - */ - public static final int ConstraintSet_layout_goneMarginEnd=75; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_goneMarginLeft} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:layout_goneMarginLeft - */ - public static final int ConstraintSet_layout_goneMarginLeft=76; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_goneMarginRight} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:layout_goneMarginRight - */ - public static final int ConstraintSet_layout_goneMarginRight=77; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_goneMarginStart} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:layout_goneMarginStart - */ - public static final int ConstraintSet_layout_goneMarginStart=78; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#layout_goneMarginTop} - * attribute's value can be found in the {@link #ConstraintSet} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:layout_goneMarginTop - */ - public static final int ConstraintSet_layout_goneMarginTop=79; - /** - * Attributes that can be used with a CoordinatorLayout. - *

Includes the following attributes:

- * - * - * - * - * - * - *
AttributeDescription
{@link #CoordinatorLayout_keylines com.scriptor:keylines}A reference to an array of integers representing the - * locations of horizontal keylines in dp from the starting edge.
{@link #CoordinatorLayout_statusBarBackground com.scriptor:statusBarBackground}Drawable to display behind the status bar when the view is set to draw behind it.
- * @see #CoordinatorLayout_keylines - * @see #CoordinatorLayout_statusBarBackground - */ - public static final int[] CoordinatorLayout={ - 0x7f04010d, 0x7f0401a6 - }; - /** - *

- * @attr description - * A reference to an array of integers representing the - * locations of horizontal keylines in dp from the starting edge. - * Child views can refer to these keylines for alignment using - * layout_keyline="index" where index is a 0-based index into - * this array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:keylines - */ - public static final int CoordinatorLayout_keylines=0; - /** - *

- * @attr description - * Drawable to display behind the status bar when the view is set to draw behind it. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:statusBarBackground - */ - public static final int CoordinatorLayout_statusBarBackground=1; - /** - * Attributes that can be used with a CoordinatorLayout_Layout. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #CoordinatorLayout_Layout_android_layout_gravity android:layout_gravity}
{@link #CoordinatorLayout_Layout_layout_anchor com.scriptor:layout_anchor}The id of an anchor view that this view should position relative to.
{@link #CoordinatorLayout_Layout_layout_anchorGravity com.scriptor:layout_anchorGravity}Specifies how an object should position relative to an anchor, on both the X and Y axes, - * within its parent's bounds.
{@link #CoordinatorLayout_Layout_layout_behavior com.scriptor:layout_behavior}The class name of a Behavior class defining special runtime behavior - * for this child view.
{@link #CoordinatorLayout_Layout_layout_dodgeInsetEdges com.scriptor:layout_dodgeInsetEdges}Specifies how this view dodges the inset edges of the CoordinatorLayout.
{@link #CoordinatorLayout_Layout_layout_insetEdge com.scriptor:layout_insetEdge}Specifies how this view insets the CoordinatorLayout and make some other views - * dodge it.
{@link #CoordinatorLayout_Layout_layout_keyline com.scriptor:layout_keyline}The index of a keyline this view should position relative to.
- * @see #CoordinatorLayout_Layout_android_layout_gravity - * @see #CoordinatorLayout_Layout_layout_anchor - * @see #CoordinatorLayout_Layout_layout_anchorGravity - * @see #CoordinatorLayout_Layout_layout_behavior - * @see #CoordinatorLayout_Layout_layout_dodgeInsetEdges - * @see #CoordinatorLayout_Layout_layout_insetEdge - * @see #CoordinatorLayout_Layout_layout_keyline - */ - public static final int[] CoordinatorLayout_Layout={ - 0x010100b3, 0x7f040112, 0x7f040113, 0x7f040114, - 0x7f040140, 0x7f040149, 0x7f04014a - }; - /** - *

This symbol is the offset where the {@link android.R.attr#layout_gravity} - * attribute's value can be found in the {@link #CoordinatorLayout_Layout} array. - * - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
bottom50
center11
center_horizontal1
center_vertical10
clip_horizontal8
clip_vertical80
end800005
fill77
fill_horizontal7
fill_vertical70
left3
right5
start800003
top30
- * - * @attr name android:layout_gravity - */ - public static final int CoordinatorLayout_Layout_android_layout_gravity=0; - /** - *

- * @attr description - * The id of an anchor view that this view should position relative to. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:layout_anchor - */ - public static final int CoordinatorLayout_Layout_layout_anchor=1; - /** - *

- * @attr description - * Specifies how an object should position relative to an anchor, on both the X and Y axes, - * within its parent's bounds. - * - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
bottom50Push object to the bottom of its container, not changing its size.
center11Place the object in the center of its container in both the vertical and horizontal axis, not changing its size.
center_horizontal1Place object in the horizontal center of its container, not changing its size.
center_vertical10Place object in the vertical center of its container, not changing its size.
clip_horizontal8Additional option that can be set to have the left and/or right edges of - * the child clipped to its container's bounds. - * The clip will be based on the horizontal gravity: a left gravity will clip the right - * edge, a right gravity will clip the left edge, and neither will clip both edges.
clip_vertical80Additional option that can be set to have the top and/or bottom edges of - * the child clipped to its container's bounds. - * The clip will be based on the vertical gravity: a top gravity will clip the bottom - * edge, a bottom gravity will clip the top edge, and neither will clip both edges.
end800005Push object to the end of its container, not changing its size.
fill77Grow the horizontal and vertical size of the object if needed so it completely fills its container.
fill_horizontal7Grow the horizontal size of the object if needed so it completely fills its container.
fill_vertical70Grow the vertical size of the object if needed so it completely fills its container.
left3Push object to the left of its container, not changing its size.
right5Push object to the right of its container, not changing its size.
start800003Push object to the beginning of its container, not changing its size.
top30Push object to the top of its container, not changing its size.
- * - * @attr name com.scriptor:layout_anchorGravity - */ - public static final int CoordinatorLayout_Layout_layout_anchorGravity=2; - /** - *

- * @attr description - * The class name of a Behavior class defining special runtime behavior - * for this child view. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:layout_behavior - */ - public static final int CoordinatorLayout_Layout_layout_behavior=3; - /** - *

- * @attr description - * Specifies how this view dodges the inset edges of the CoordinatorLayout. - * - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
all77Dodge all the inset edges.
bottom50Dodge the bottom inset edge.
end800005Dodge the end inset edge.
left3Dodge the left inset edge.
none0Don't dodge any edges
right5Dodge the right inset edge.
start800003Dodge the start inset edge.
top30Dodge the top inset edge.
- * - * @attr name com.scriptor:layout_dodgeInsetEdges - */ - public static final int CoordinatorLayout_Layout_layout_dodgeInsetEdges=4; - /** - *

- * @attr description - * Specifies how this view insets the CoordinatorLayout and make some other views - * dodge it. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
bottom50Inset the bottom edge.
end800005Inset the end edge.
left3Inset the left edge.
none0Don't inset.
right5Inset the right edge.
start800003Inset the start edge.
top30Inset the top edge.
- * - * @attr name com.scriptor:layout_insetEdge - */ - public static final int CoordinatorLayout_Layout_layout_insetEdge=5; - /** - *

- * @attr description - * The index of a keyline this view should position relative to. - * android:layout_gravity will affect how the view aligns to the - * specified keyline. - * - *

May be an integer value, such as "100". - * - * @attr name com.scriptor:layout_keyline - */ - public static final int CoordinatorLayout_Layout_layout_keyline=6; - /** - * Attributes that can be used with a DesignTheme. - *

Includes the following attributes:

- * - * - * - * - * - * - *
AttributeDescription
{@link #DesignTheme_bottomSheetDialogTheme com.scriptor:bottomSheetDialogTheme}
{@link #DesignTheme_bottomSheetStyle com.scriptor:bottomSheetStyle}
- * @see #DesignTheme_bottomSheetDialogTheme - * @see #DesignTheme_bottomSheetStyle - */ - public static final int[] DesignTheme={ - 0x7f040043, 0x7f040044 - }; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#bottomSheetDialogTheme} - * attribute's value can be found in the {@link #DesignTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:bottomSheetDialogTheme - */ - public static final int DesignTheme_bottomSheetDialogTheme=0; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#bottomSheetStyle} - * attribute's value can be found in the {@link #DesignTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:bottomSheetStyle - */ - public static final int DesignTheme_bottomSheetStyle=1; - /** - * Attributes that can be used with a DrawerArrowToggle. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #DrawerArrowToggle_arrowHeadLength com.scriptor:arrowHeadLength}The length of the arrow head when formed to make an arrow
{@link #DrawerArrowToggle_arrowShaftLength com.scriptor:arrowShaftLength}The length of the shaft when formed to make an arrow
{@link #DrawerArrowToggle_barLength com.scriptor:barLength}The length of the bars when they are parallel to each other
{@link #DrawerArrowToggle_color com.scriptor:color}The drawing color for the bars
{@link #DrawerArrowToggle_drawableSize com.scriptor:drawableSize}The total size of the drawable
{@link #DrawerArrowToggle_gapBetweenBars com.scriptor:gapBetweenBars}The max gap between the bars when they are parallel to each other
{@link #DrawerArrowToggle_spinBars com.scriptor:spinBars}Whether bars should rotate or not during transition
{@link #DrawerArrowToggle_thickness com.scriptor:thickness}The thickness (stroke size) for the bar paint
- * @see #DrawerArrowToggle_arrowHeadLength - * @see #DrawerArrowToggle_arrowShaftLength - * @see #DrawerArrowToggle_barLength - * @see #DrawerArrowToggle_color - * @see #DrawerArrowToggle_drawableSize - * @see #DrawerArrowToggle_gapBetweenBars - * @see #DrawerArrowToggle_spinBars - * @see #DrawerArrowToggle_thickness - */ - public static final int[] DrawerArrowToggle={ - 0x7f040029, 0x7f04002a, 0x7f040036, 0x7f040086, - 0x7f0400b4, 0x7f0400e3, 0x7f04019b, 0x7f0401eb - }; - /** - *

- * @attr description - * The length of the arrow head when formed to make an arrow - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:arrowHeadLength - */ - public static final int DrawerArrowToggle_arrowHeadLength=0; - /** - *

- * @attr description - * The length of the shaft when formed to make an arrow - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:arrowShaftLength - */ - public static final int DrawerArrowToggle_arrowShaftLength=1; - /** - *

- * @attr description - * The length of the bars when they are parallel to each other - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:barLength - */ - public static final int DrawerArrowToggle_barLength=2; - /** - *

- * @attr description - * The drawing color for the bars - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:color - */ - public static final int DrawerArrowToggle_color=3; - /** - *

- * @attr description - * The total size of the drawable - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:drawableSize - */ - public static final int DrawerArrowToggle_drawableSize=4; - /** - *

- * @attr description - * The max gap between the bars when they are parallel to each other - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:gapBetweenBars - */ - public static final int DrawerArrowToggle_gapBetweenBars=5; - /** - *

- * @attr description - * Whether bars should rotate or not during transition - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:spinBars - */ - public static final int DrawerArrowToggle_spinBars=6; - /** - *

- * @attr description - * The thickness (stroke size) for the bar paint - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:thickness - */ - public static final int DrawerArrowToggle_thickness=7; - /** - * Attributes that can be used with a FloatingActionButton. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #FloatingActionButton_backgroundTint com.scriptor:backgroundTint}Tint to apply to the background.
{@link #FloatingActionButton_backgroundTintMode com.scriptor:backgroundTintMode}Blending mode used to apply the background tint.
{@link #FloatingActionButton_borderWidth com.scriptor:borderWidth}
{@link #FloatingActionButton_elevation com.scriptor:elevation}Elevation for the action bar itself
{@link #FloatingActionButton_fabCustomSize com.scriptor:fabCustomSize}
{@link #FloatingActionButton_fabSize com.scriptor:fabSize}
{@link #FloatingActionButton_hideMotionSpec com.scriptor:hideMotionSpec}
{@link #FloatingActionButton_hoveredFocusedTranslationZ com.scriptor:hoveredFocusedTranslationZ}
{@link #FloatingActionButton_maxImageSize com.scriptor:maxImageSize}
{@link #FloatingActionButton_pressedTranslationZ com.scriptor:pressedTranslationZ}
{@link #FloatingActionButton_rippleColor com.scriptor:rippleColor}
{@link #FloatingActionButton_showMotionSpec com.scriptor:showMotionSpec}
{@link #FloatingActionButton_useCompatPadding com.scriptor:useCompatPadding}
- * @see #FloatingActionButton_backgroundTint - * @see #FloatingActionButton_backgroundTintMode - * @see #FloatingActionButton_borderWidth - * @see #FloatingActionButton_elevation - * @see #FloatingActionButton_fabCustomSize - * @see #FloatingActionButton_fabSize - * @see #FloatingActionButton_hideMotionSpec - * @see #FloatingActionButton_hoveredFocusedTranslationZ - * @see #FloatingActionButton_maxImageSize - * @see #FloatingActionButton_pressedTranslationZ - * @see #FloatingActionButton_rippleColor - * @see #FloatingActionButton_showMotionSpec - * @see #FloatingActionButton_useCompatPadding - */ - public static final int[] FloatingActionButton={ - 0x7f040034, 0x7f040035, 0x7f04003f, 0x7f0400bb, - 0x7f0400ce, 0x7f0400cf, 0x7f0400ea, 0x7f0400f2, - 0x7f040162, 0x7f04017c, 0x7f040186, 0x7f040192, - 0x7f040209 - }; - /** - *

- * @attr description - * Tint to apply to the background. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:backgroundTint - */ - public static final int FloatingActionButton_backgroundTint=0; - /** - *

- * @attr description - * Blending mode used to apply the background tint. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
add10Combines the tint and icon color and alpha channels, clamping the - * result to valid color values. Saturate(S + D)
multiplyeMultiplies the color and alpha channels of the drawable with those of - * the tint. [Sa * Da, Sc * Dc]
screenf[Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]
src_atop9The tint is drawn above the drawable, but with the drawable’s alpha - * channel masking the result. [Da, Sc * Da + (1 - Sa) * Dc]
src_in5The tint is masked by the alpha channel of the drawable. The drawable’s - * color channels are thrown out. [Sa * Da, Sc * Da]
src_over3The tint is drawn on top of the drawable. - * [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc]
- * - * @attr name com.scriptor:backgroundTintMode - */ - public static final int FloatingActionButton_backgroundTintMode=1; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#borderWidth} - * attribute's value can be found in the {@link #FloatingActionButton} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:borderWidth - */ - public static final int FloatingActionButton_borderWidth=2; - /** - *

- * @attr description - * Elevation for the action bar itself - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:elevation - */ - public static final int FloatingActionButton_elevation=3; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#fabCustomSize} - * attribute's value can be found in the {@link #FloatingActionButton} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:fabCustomSize - */ - public static final int FloatingActionButton_fabCustomSize=4; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#fabSize} - * attribute's value can be found in the {@link #FloatingActionButton} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
autoffffffff
mini1
normal0
- * - * @attr name com.scriptor:fabSize - */ - public static final int FloatingActionButton_fabSize=5; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#hideMotionSpec} - * attribute's value can be found in the {@link #FloatingActionButton} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:hideMotionSpec - */ - public static final int FloatingActionButton_hideMotionSpec=6; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#hoveredFocusedTranslationZ} - * attribute's value can be found in the {@link #FloatingActionButton} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:hoveredFocusedTranslationZ - */ - public static final int FloatingActionButton_hoveredFocusedTranslationZ=7; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#maxImageSize} - * attribute's value can be found in the {@link #FloatingActionButton} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:maxImageSize - */ - public static final int FloatingActionButton_maxImageSize=8; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#pressedTranslationZ} - * attribute's value can be found in the {@link #FloatingActionButton} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:pressedTranslationZ - */ - public static final int FloatingActionButton_pressedTranslationZ=9; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#rippleColor} - * attribute's value can be found in the {@link #FloatingActionButton} array. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:rippleColor - */ - public static final int FloatingActionButton_rippleColor=10; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#showMotionSpec} - * attribute's value can be found in the {@link #FloatingActionButton} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:showMotionSpec - */ - public static final int FloatingActionButton_showMotionSpec=11; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#useCompatPadding} - * attribute's value can be found in the {@link #FloatingActionButton} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:useCompatPadding - */ - public static final int FloatingActionButton_useCompatPadding=12; - /** - * Attributes that can be used with a FloatingActionButton_Behavior_Layout. - *

Includes the following attributes:

- * - * - * - * - * - *
AttributeDescription
{@link #FloatingActionButton_Behavior_Layout_behavior_autoHide com.scriptor:behavior_autoHide}
- * @see #FloatingActionButton_Behavior_Layout_behavior_autoHide - */ - public static final int[] FloatingActionButton_Behavior_Layout={ - 0x7f040039 - }; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#behavior_autoHide} - * attribute's value can be found in the {@link #FloatingActionButton_Behavior_Layout} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:behavior_autoHide - */ - public static final int FloatingActionButton_Behavior_Layout_behavior_autoHide=0; - /** - * Attributes that can be used with a FlowLayout. - *

Includes the following attributes:

- * - * - * - * - * - * - *
AttributeDescription
{@link #FlowLayout_itemSpacing com.scriptor:itemSpacing}
{@link #FlowLayout_lineSpacing com.scriptor:lineSpacing}
- * @see #FlowLayout_itemSpacing - * @see #FlowLayout_lineSpacing - */ - public static final int[] FlowLayout={ - 0x7f040108, 0x7f040150 - }; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#itemSpacing} - * attribute's value can be found in the {@link #FlowLayout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:itemSpacing - */ - public static final int FlowLayout_itemSpacing=0; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#lineSpacing} - * attribute's value can be found in the {@link #FlowLayout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:lineSpacing - */ - public static final int FlowLayout_lineSpacing=1; - /** - * Attributes that can be used with a FontFamily. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #FontFamily_fontProviderAuthority com.scriptor:fontProviderAuthority}The authority of the Font Provider to be used for the request.
{@link #FontFamily_fontProviderCerts com.scriptor:fontProviderCerts}The sets of hashes for the certificates the provider should be signed with.
{@link #FontFamily_fontProviderFetchStrategy com.scriptor:fontProviderFetchStrategy}The strategy to be used when fetching font data from a font provider in XML layouts.
{@link #FontFamily_fontProviderFetchTimeout com.scriptor:fontProviderFetchTimeout}The length of the timeout during fetching.
{@link #FontFamily_fontProviderPackage com.scriptor:fontProviderPackage}The package for the Font Provider to be used for the request.
{@link #FontFamily_fontProviderQuery com.scriptor:fontProviderQuery}The query to be sent over to the provider.
- * @see #FontFamily_fontProviderAuthority - * @see #FontFamily_fontProviderCerts - * @see #FontFamily_fontProviderFetchStrategy - * @see #FontFamily_fontProviderFetchTimeout - * @see #FontFamily_fontProviderPackage - * @see #FontFamily_fontProviderQuery - */ - public static final int[] FontFamily={ - 0x7f0400d9, 0x7f0400da, 0x7f0400db, 0x7f0400dc, - 0x7f0400dd, 0x7f0400de - }; - /** - *

- * @attr description - * The authority of the Font Provider to be used for the request. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:fontProviderAuthority - */ - public static final int FontFamily_fontProviderAuthority=0; - /** - *

- * @attr description - * The sets of hashes for the certificates the provider should be signed with. This is - * used to verify the identity of the provider, and is only required if the provider is not - * part of the system image. This value may point to one list or a list of lists, where each - * individual list represents one collection of signature hashes. Refer to your font provider's - * documentation for these values. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:fontProviderCerts - */ - public static final int FontFamily_fontProviderCerts=1; - /** - *

- * @attr description - * The strategy to be used when fetching font data from a font provider in XML layouts. - * This attribute is ignored when the resource is loaded from code, as it is equivalent to the - * choice of API between {@link - * androidx.core.content.res.ResourcesCompat#getFont(Context, int)} (blocking) and - * {@link - * androidx.core.content.res.ResourcesCompat#getFont(Context, int, FontCallback, Handler)} - * (async). - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - *
ConstantValueDescription
async1The async font fetch works as follows. - * First, check the local cache, then if the requeted font is not cached, trigger a - * request the font and continue with layout inflation. Once the font fetch succeeds, the - * target text view will be refreshed with the downloaded font data. The - * fontProviderFetchTimeout will be ignored if async loading is specified.
blocking0The blocking font fetch works as follows. - * First, check the local cache, then if the requested font is not cached, request the - * font from the provider and wait until it is finished. You can change the length of - * the timeout by modifying fontProviderFetchTimeout. If the timeout happens, the - * default typeface will be used instead.
- * - * @attr name com.scriptor:fontProviderFetchStrategy - */ - public static final int FontFamily_fontProviderFetchStrategy=2; - /** - *

- * @attr description - * The length of the timeout during fetching. - * - *

May be an integer value, such as "100". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
foreverffffffffA special value for the timeout. In this case, the blocking font fetching will not - * timeout and wait until a reply is received from the font provider.
- * - * @attr name com.scriptor:fontProviderFetchTimeout - */ - public static final int FontFamily_fontProviderFetchTimeout=3; - /** - *

- * @attr description - * The package for the Font Provider to be used for the request. This is used to verify - * the identity of the provider. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:fontProviderPackage - */ - public static final int FontFamily_fontProviderPackage=4; - /** - *

- * @attr description - * The query to be sent over to the provider. Refer to your font provider's documentation - * on the format of this string. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:fontProviderQuery - */ - public static final int FontFamily_fontProviderQuery=5; - /** - * Attributes that can be used with a FontFamilyFont. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #FontFamilyFont_android_font android:font}
{@link #FontFamilyFont_android_fontWeight android:fontWeight}
{@link #FontFamilyFont_android_fontStyle android:fontStyle}
{@link #FontFamilyFont_android_ttcIndex android:ttcIndex}
{@link #FontFamilyFont_android_fontVariationSettings android:fontVariationSettings}
{@link #FontFamilyFont_font com.scriptor:font}The reference to the font file to be used.
{@link #FontFamilyFont_fontStyle com.scriptor:fontStyle}The style of the given font file.
{@link #FontFamilyFont_fontVariationSettings com.scriptor:fontVariationSettings}The variation settings to be applied to the font.
{@link #FontFamilyFont_fontWeight com.scriptor:fontWeight}The weight of the given font file.
{@link #FontFamilyFont_ttcIndex com.scriptor:ttcIndex}The index of the font in the tcc font file.
- * @see #FontFamilyFont_android_font - * @see #FontFamilyFont_android_fontWeight - * @see #FontFamilyFont_android_fontStyle - * @see #FontFamilyFont_android_ttcIndex - * @see #FontFamilyFont_android_fontVariationSettings - * @see #FontFamilyFont_font - * @see #FontFamilyFont_fontStyle - * @see #FontFamilyFont_fontVariationSettings - * @see #FontFamilyFont_fontWeight - * @see #FontFamilyFont_ttcIndex - */ - public static final int[] FontFamilyFont={ - 0x01010532, 0x01010533, 0x0101053f, 0x0101056f, - 0x01010570, 0x7f0400d7, 0x7f0400df, 0x7f0400e0, - 0x7f0400e1, 0x7f040208 - }; - /** - *

This symbol is the offset where the {@link android.R.attr#font} - * attribute's value can be found in the {@link #FontFamilyFont} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:font - */ - public static final int FontFamilyFont_android_font=0; - /** - *

This symbol is the offset where the {@link android.R.attr#fontWeight} - * attribute's value can be found in the {@link #FontFamilyFont} array. - * - *

May be an integer value, such as "100". - * - * @attr name android:fontWeight - */ - public static final int FontFamilyFont_android_fontWeight=1; - /** - *

- * @attr description - * References to the framework attrs - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - *
ConstantValueDescription
italic1
normal0
- * - * @attr name android:fontStyle - */ - public static final int FontFamilyFont_android_fontStyle=2; - /** - *

This symbol is the offset where the {@link android.R.attr#ttcIndex} - * attribute's value can be found in the {@link #FontFamilyFont} array. - * - *

May be an integer value, such as "100". - * - * @attr name android:ttcIndex - */ - public static final int FontFamilyFont_android_ttcIndex=3; - /** - *

This symbol is the offset where the {@link android.R.attr#fontVariationSettings} - * attribute's value can be found in the {@link #FontFamilyFont} array. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name android:fontVariationSettings - */ - public static final int FontFamilyFont_android_fontVariationSettings=4; - /** - *

- * @attr description - * The reference to the font file to be used. This should be a file in the res/font folder - * and should therefore have an R reference value. E.g. @font/myfont - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:font - */ - public static final int FontFamilyFont_font=5; - /** - *

- * @attr description - * The style of the given font file. This will be used when the font is being loaded into - * the font stack and will override any style information in the font's header tables. If - * unspecified, the value in the font's header tables will be used. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - *
ConstantValueDescription
italic1
normal0
- * - * @attr name com.scriptor:fontStyle - */ - public static final int FontFamilyFont_fontStyle=6; - /** - *

- * @attr description - * The variation settings to be applied to the font. The string should be in the following - * format: "'tag1' value1, 'tag2' value2, ...". If the default variation settings should be - * used, or the font used does not support variation settings, this attribute needs not be - * specified. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:fontVariationSettings - */ - public static final int FontFamilyFont_fontVariationSettings=7; - /** - *

- * @attr description - * The weight of the given font file. This will be used when the font is being loaded into - * the font stack and will override any weight information in the font's header tables. Must - * be a positive number, a multiple of 100, and between 100 and 900, inclusive. The most - * common values are 400 for regular weight and 700 for bold weight. If unspecified, the value - * in the font's header tables will be used. - * - *

May be an integer value, such as "100". - * - * @attr name com.scriptor:fontWeight - */ - public static final int FontFamilyFont_fontWeight=8; - /** - *

- * @attr description - * The index of the font in the tcc font file. If the font file referenced is not in the - * tcc format, this attribute needs not be specified. - * - *

May be an integer value, such as "100". - * - * @attr name com.scriptor:ttcIndex - */ - public static final int FontFamilyFont_ttcIndex=9; - /** - * Attributes that can be used with a ForegroundLinearLayout. - *

Includes the following attributes:

- * - * - * - * - * - * - * - *
AttributeDescription
{@link #ForegroundLinearLayout_android_foreground android:foreground}
{@link #ForegroundLinearLayout_android_foregroundGravity android:foregroundGravity}
{@link #ForegroundLinearLayout_foregroundInsidePadding com.scriptor:foregroundInsidePadding}
- * @see #ForegroundLinearLayout_android_foreground - * @see #ForegroundLinearLayout_android_foregroundGravity - * @see #ForegroundLinearLayout_foregroundInsidePadding - */ - public static final int[] ForegroundLinearLayout={ - 0x01010109, 0x01010200, 0x7f0400e2 - }; - /** - *

This symbol is the offset where the {@link android.R.attr#foreground} - * attribute's value can be found in the {@link #ForegroundLinearLayout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name android:foreground - */ - public static final int ForegroundLinearLayout_android_foreground=0; - /** - *

This symbol is the offset where the {@link android.R.attr#foregroundGravity} - * attribute's value can be found in the {@link #ForegroundLinearLayout} array. - * - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
bottom50
center11
center_horizontal1
center_vertical10
clip_horizontal8
clip_vertical80
fill77
fill_horizontal7
fill_vertical70
left3
right5
top30
- * - * @attr name android:foregroundGravity - */ - public static final int ForegroundLinearLayout_android_foregroundGravity=1; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#foregroundInsidePadding} - * attribute's value can be found in the {@link #ForegroundLinearLayout} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:foregroundInsidePadding - */ - public static final int ForegroundLinearLayout_foregroundInsidePadding=2; - /** - * Attributes that can be used with a GradientColor. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #GradientColor_android_startColor android:startColor}
{@link #GradientColor_android_endColor android:endColor}
{@link #GradientColor_android_type android:type}
{@link #GradientColor_android_centerX android:centerX}
{@link #GradientColor_android_centerY android:centerY}
{@link #GradientColor_android_gradientRadius android:gradientRadius}
{@link #GradientColor_android_tileMode android:tileMode}
{@link #GradientColor_android_centerColor android:centerColor}
{@link #GradientColor_android_startX android:startX}
{@link #GradientColor_android_startY android:startY}
{@link #GradientColor_android_endX android:endX}
{@link #GradientColor_android_endY android:endY}
- * @see #GradientColor_android_startColor - * @see #GradientColor_android_endColor - * @see #GradientColor_android_type - * @see #GradientColor_android_centerX - * @see #GradientColor_android_centerY - * @see #GradientColor_android_gradientRadius - * @see #GradientColor_android_tileMode - * @see #GradientColor_android_centerColor - * @see #GradientColor_android_startX - * @see #GradientColor_android_startY - * @see #GradientColor_android_endX - * @see #GradientColor_android_endY - */ - public static final int[] GradientColor={ - 0x0101019d, 0x0101019e, 0x010101a1, 0x010101a2, - 0x010101a3, 0x010101a4, 0x01010201, 0x0101020b, - 0x01010510, 0x01010511, 0x01010512, 0x01010513 - }; - /** - *

- * @attr description - * Start color of the gradient. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name android:startColor - */ - public static final int GradientColor_android_startColor=0; - /** - *

- * @attr description - * End color of the gradient. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name android:endColor - */ - public static final int GradientColor_android_endColor=1; - /** - *

- * @attr description - * Type of gradient. The default type is linear. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
linear0
radial1
sweep2
- * - * @attr name android:type - */ - public static final int GradientColor_android_type=2; - /** - *

- * @attr description - * X coordinate of the center of the gradient within the path. - * - *

May be a floating point value, such as "1.2". - *

May be a fractional value, which is a floating point number appended with - * either % or %p, such as "14.5%". - * The % suffix always means a percentage of the base size; - * the optional %p suffix provides a size relative to some parent container. - * - * @attr name android:centerX - */ - public static final int GradientColor_android_centerX=3; - /** - *

- * @attr description - * Y coordinate of the center of the gradient within the path. - * - *

May be a floating point value, such as "1.2". - *

May be a fractional value, which is a floating point number appended with - * either % or %p, such as "14.5%". - * The % suffix always means a percentage of the base size; - * the optional %p suffix provides a size relative to some parent container. - * - * @attr name android:centerY - */ - public static final int GradientColor_android_centerY=4; - /** - *

- * @attr description - * Radius of the gradient, used only with radial gradient. - * - *

May be a floating point value, such as "1.2". - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

May be a fractional value, which is a floating point number appended with - * either % or %p, such as "14.5%". - * The % suffix always means a percentage of the base size; - * the optional %p suffix provides a size relative to some parent container. - * - * @attr name android:gradientRadius - */ - public static final int GradientColor_android_gradientRadius=5; - /** - *

- * @attr description - * Defines the tile mode of the gradient. SweepGradient doesn't support tiling. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
clamp0
disabledffffffff
mirror2
repeat1
- * - * @attr name android:tileMode - */ - public static final int GradientColor_android_tileMode=6; - /** - *

- * @attr description - * Optional center color. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name android:centerColor - */ - public static final int GradientColor_android_centerColor=7; - /** - *

- * @attr description - * X coordinate of the start point origin of the gradient. - * Defined in same coordinates as the path itself - * - *

May be a floating point value, such as "1.2". - * - * @attr name android:startX - */ - public static final int GradientColor_android_startX=8; - /** - *

- * @attr description - * Y coordinate of the start point of the gradient within the shape. - * Defined in same coordinates as the path itself - * - *

May be a floating point value, such as "1.2". - * - * @attr name android:startY - */ - public static final int GradientColor_android_startY=9; - /** - *

- * @attr description - * X coordinate of the end point origin of the gradient. - * Defined in same coordinates as the path itself - * - *

May be a floating point value, such as "1.2". - * - * @attr name android:endX - */ - public static final int GradientColor_android_endX=10; - /** - *

- * @attr description - * Y coordinate of the end point of the gradient within the shape. - * Defined in same coordinates as the path itself - * - *

May be a floating point value, such as "1.2". - * - * @attr name android:endY - */ - public static final int GradientColor_android_endY=11; - /** - * Attributes that can be used with a GradientColorItem. - *

Includes the following attributes:

- * - * - * - * - * - * - *
AttributeDescription
{@link #GradientColorItem_android_color android:color}
{@link #GradientColorItem_android_offset android:offset}
- * @see #GradientColorItem_android_color - * @see #GradientColorItem_android_offset - */ - public static final int[] GradientColorItem={ - 0x010101a5, 0x01010514 - }; - /** - *

- * @attr description - * The current color for the offset inside the gradient. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name android:color - */ - public static final int GradientColorItem_android_color=0; - /** - *

- * @attr description - * The offset (or ratio) of this current color item inside the gradient. - * The value is only meaningful when it is between 0 and 1. - * - *

May be a floating point value, such as "1.2". - * - * @attr name android:offset - */ - public static final int GradientColorItem_android_offset=1; - /** - * Attributes that can be used with a LinearConstraintLayout. - *

Includes the following attributes:

- * - * - * - * - * - *
AttributeDescription
{@link #LinearConstraintLayout_android_orientation android:orientation}
- * @see #LinearConstraintLayout_android_orientation - */ - public static final int[] LinearConstraintLayout={ - 0x010100c4 - }; - /** - *

This symbol is the offset where the {@link android.R.attr#orientation} - * attribute's value can be found in the {@link #LinearConstraintLayout} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - *
ConstantValueDescription
horizontal0
vertical1
- * - * @attr name android:orientation - */ - public static final int LinearConstraintLayout_android_orientation=0; - /** - * Attributes that can be used with a LinearLayoutCompat. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #LinearLayoutCompat_android_gravity android:gravity}
{@link #LinearLayoutCompat_android_orientation android:orientation}
{@link #LinearLayoutCompat_android_baselineAligned android:baselineAligned}
{@link #LinearLayoutCompat_android_baselineAlignedChildIndex android:baselineAlignedChildIndex}
{@link #LinearLayoutCompat_android_weightSum android:weightSum}
{@link #LinearLayoutCompat_divider com.scriptor:divider}Specifies the drawable used for item dividers.
{@link #LinearLayoutCompat_dividerPadding com.scriptor:dividerPadding}Size of padding on either end of a divider.
{@link #LinearLayoutCompat_measureWithLargestChild com.scriptor:measureWithLargestChild}When set to true, all children with a weight will be considered having - * the minimum size of the largest child.
{@link #LinearLayoutCompat_showDividers com.scriptor:showDividers}Setting for which dividers to show.
- * @see #LinearLayoutCompat_android_gravity - * @see #LinearLayoutCompat_android_orientation - * @see #LinearLayoutCompat_android_baselineAligned - * @see #LinearLayoutCompat_android_baselineAlignedChildIndex - * @see #LinearLayoutCompat_android_weightSum - * @see #LinearLayoutCompat_divider - * @see #LinearLayoutCompat_dividerPadding - * @see #LinearLayoutCompat_measureWithLargestChild - * @see #LinearLayoutCompat_showDividers - */ - public static final int[] LinearLayoutCompat={ - 0x010100af, 0x010100c4, 0x01010126, 0x01010127, - 0x01010128, 0x7f0400b0, 0x7f0400b2, 0x7f040163, - 0x7f040191 - }; - /** - *

This symbol is the offset where the {@link android.R.attr#gravity} - * attribute's value can be found in the {@link #LinearLayoutCompat} array. - * - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
bottom50
center11
center_horizontal1
center_vertical10
clip_horizontal8
clip_vertical80
end800005
fill77
fill_horizontal7
fill_vertical70
left3
right5
start800003
top30
- * - * @attr name android:gravity - */ - public static final int LinearLayoutCompat_android_gravity=0; - /** - *

- * @attr description - * Should the layout be a column or a row? Use "horizontal" - * for a row, "vertical" for a column. The default is - * horizontal. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - *
ConstantValueDescription
horizontal0
vertical1
- * - * @attr name android:orientation - */ - public static final int LinearLayoutCompat_android_orientation=1; - /** - *

- * @attr description - * When set to false, prevents the layout from aligning its children's - * baselines. This attribute is particularly useful when the children - * use different values for gravity. The default value is true. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name android:baselineAligned - */ - public static final int LinearLayoutCompat_android_baselineAligned=2; - /** - *

- * @attr description - * When a linear layout is part of another layout that is baseline - * aligned, it can specify which of its children to baseline align to - * (that is, which child TextView). - * - *

May be an integer value, such as "100". - * - * @attr name android:baselineAlignedChildIndex - */ - public static final int LinearLayoutCompat_android_baselineAlignedChildIndex=3; - /** - *

- * @attr description - * Defines the maximum weight sum. If unspecified, the sum is computed - * by adding the layout_weight of all of the children. This can be - * used for instance to give a single child 50% of the total available - * space by giving it a layout_weight of 0.5 and setting the weightSum - * to 1.0. - * - *

May be a floating point value, such as "1.2". - * - * @attr name android:weightSum - */ - public static final int LinearLayoutCompat_android_weightSum=4; - /** - *

- * @attr description - * Drawable to use as a vertical divider between buttons. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:divider - */ - public static final int LinearLayoutCompat_divider=5; - /** - *

- * @attr description - * Size of padding on either end of a divider. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:dividerPadding - */ - public static final int LinearLayoutCompat_dividerPadding=6; - /** - *

- * @attr description - * When set to true, all children with a weight will be considered having - * the minimum size of the largest child. If false, all children are - * measured normally. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:measureWithLargestChild - */ - public static final int LinearLayoutCompat_measureWithLargestChild=7; - /** - *

- * @attr description - * Setting for which dividers to show. - * - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
beginning1
end4
middle2
none0
- * - * @attr name com.scriptor:showDividers - */ - public static final int LinearLayoutCompat_showDividers=8; - /** - * Attributes that can be used with a LinearLayoutCompat_Layout. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #LinearLayoutCompat_Layout_android_layout_gravity android:layout_gravity}
{@link #LinearLayoutCompat_Layout_android_layout_width android:layout_width}
{@link #LinearLayoutCompat_Layout_android_layout_height android:layout_height}
{@link #LinearLayoutCompat_Layout_android_layout_weight android:layout_weight}
- * @see #LinearLayoutCompat_Layout_android_layout_gravity - * @see #LinearLayoutCompat_Layout_android_layout_width - * @see #LinearLayoutCompat_Layout_android_layout_height - * @see #LinearLayoutCompat_Layout_android_layout_weight - */ - public static final int[] LinearLayoutCompat_Layout={ - 0x010100b3, 0x010100f4, 0x010100f5, 0x01010181 - }; - /** - *

This symbol is the offset where the {@link android.R.attr#layout_gravity} - * attribute's value can be found in the {@link #LinearLayoutCompat_Layout} array. - * - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
bottom50
center11
center_horizontal1
center_vertical10
clip_horizontal8
clip_vertical80
end800005
fill77
fill_horizontal7
fill_vertical70
left3
right5
start800003
top30
- * - * @attr name android:layout_gravity - */ - public static final int LinearLayoutCompat_Layout_android_layout_gravity=0; - /** - *

This symbol is the offset where the {@link android.R.attr#layout_width} - * attribute's value can be found in the {@link #LinearLayoutCompat_Layout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
fill_parentffffffff
match_parentffffffff
wrap_contentfffffffe
- * - * @attr name android:layout_width - */ - public static final int LinearLayoutCompat_Layout_android_layout_width=1; - /** - *

This symbol is the offset where the {@link android.R.attr#layout_height} - * attribute's value can be found in the {@link #LinearLayoutCompat_Layout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
fill_parentffffffff
match_parentffffffff
wrap_contentfffffffe
- * - * @attr name android:layout_height - */ - public static final int LinearLayoutCompat_Layout_android_layout_height=2; - /** - *

This symbol is the offset where the {@link android.R.attr#layout_weight} - * attribute's value can be found in the {@link #LinearLayoutCompat_Layout} array. - * - *

May be a floating point value, such as "1.2". - * - * @attr name android:layout_weight - */ - public static final int LinearLayoutCompat_Layout_android_layout_weight=3; - /** - * Attributes that can be used with a ListPopupWindow. - *

Includes the following attributes:

- * - * - * - * - * - * - *
AttributeDescription
{@link #ListPopupWindow_android_dropDownHorizontalOffset android:dropDownHorizontalOffset}
{@link #ListPopupWindow_android_dropDownVerticalOffset android:dropDownVerticalOffset}
- * @see #ListPopupWindow_android_dropDownHorizontalOffset - * @see #ListPopupWindow_android_dropDownVerticalOffset - */ - public static final int[] ListPopupWindow={ - 0x010102ac, 0x010102ad - }; - /** - *

- * @attr description - * Amount of pixels by which the drop down should be offset horizontally. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:dropDownHorizontalOffset - */ - public static final int ListPopupWindow_android_dropDownHorizontalOffset=0; - /** - *

- * @attr description - * Amount of pixels by which the drop down should be offset vertically. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:dropDownVerticalOffset - */ - public static final int ListPopupWindow_android_dropDownVerticalOffset=1; - /** - * Attributes that can be used with a MaterialButton. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #MaterialButton_android_insetLeft android:insetLeft}
{@link #MaterialButton_android_insetRight android:insetRight}
{@link #MaterialButton_android_insetTop android:insetTop}
{@link #MaterialButton_android_insetBottom android:insetBottom}
{@link #MaterialButton_backgroundTint com.scriptor:backgroundTint}Tint to apply to the background.
{@link #MaterialButton_backgroundTintMode com.scriptor:backgroundTintMode}Blending mode used to apply the background tint.
{@link #MaterialButton_cornerRadius com.scriptor:cornerRadius}
{@link #MaterialButton_icon com.scriptor:icon}
{@link #MaterialButton_iconGravity com.scriptor:iconGravity}
{@link #MaterialButton_iconPadding com.scriptor:iconPadding}
{@link #MaterialButton_iconSize com.scriptor:iconSize}
{@link #MaterialButton_iconTint com.scriptor:iconTint}Tint to apply to the icon.
{@link #MaterialButton_iconTintMode com.scriptor:iconTintMode}Blending mode used to apply the icon tint.
{@link #MaterialButton_rippleColor com.scriptor:rippleColor}
{@link #MaterialButton_strokeColor com.scriptor:strokeColor}
{@link #MaterialButton_strokeWidth com.scriptor:strokeWidth}
- * @see #MaterialButton_android_insetLeft - * @see #MaterialButton_android_insetRight - * @see #MaterialButton_android_insetTop - * @see #MaterialButton_android_insetBottom - * @see #MaterialButton_backgroundTint - * @see #MaterialButton_backgroundTintMode - * @see #MaterialButton_cornerRadius - * @see #MaterialButton_icon - * @see #MaterialButton_iconGravity - * @see #MaterialButton_iconPadding - * @see #MaterialButton_iconSize - * @see #MaterialButton_iconTint - * @see #MaterialButton_iconTintMode - * @see #MaterialButton_rippleColor - * @see #MaterialButton_strokeColor - * @see #MaterialButton_strokeWidth - */ - public static final int[] MaterialButton={ - 0x010101b7, 0x010101b8, 0x010101b9, 0x010101ba, - 0x7f040034, 0x7f040035, 0x7f0400a5, 0x7f0400f3, - 0x7f0400f5, 0x7f0400f6, 0x7f0400f7, 0x7f0400f9, - 0x7f0400fa, 0x7f040186, 0x7f0401a8, 0x7f0401a9 - }; - /** - *

This symbol is the offset where the {@link android.R.attr#insetLeft} - * attribute's value can be found in the {@link #MaterialButton} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

May be a fractional value, which is a floating point number appended with - * either % or %p, such as "14.5%". - * The % suffix always means a percentage of the base size; - * the optional %p suffix provides a size relative to some parent container. - * - * @attr name android:insetLeft - */ - public static final int MaterialButton_android_insetLeft=0; - /** - *

This symbol is the offset where the {@link android.R.attr#insetRight} - * attribute's value can be found in the {@link #MaterialButton} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

May be a fractional value, which is a floating point number appended with - * either % or %p, such as "14.5%". - * The % suffix always means a percentage of the base size; - * the optional %p suffix provides a size relative to some parent container. - * - * @attr name android:insetRight - */ - public static final int MaterialButton_android_insetRight=1; - /** - *

This symbol is the offset where the {@link android.R.attr#insetTop} - * attribute's value can be found in the {@link #MaterialButton} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

May be a fractional value, which is a floating point number appended with - * either % or %p, such as "14.5%". - * The % suffix always means a percentage of the base size; - * the optional %p suffix provides a size relative to some parent container. - * - * @attr name android:insetTop - */ - public static final int MaterialButton_android_insetTop=2; - /** - *

This symbol is the offset where the {@link android.R.attr#insetBottom} - * attribute's value can be found in the {@link #MaterialButton} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

May be a fractional value, which is a floating point number appended with - * either % or %p, such as "14.5%". - * The % suffix always means a percentage of the base size; - * the optional %p suffix provides a size relative to some parent container. - * - * @attr name android:insetBottom - */ - public static final int MaterialButton_android_insetBottom=3; - /** - *

- * @attr description - * Tint to apply to the background. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:backgroundTint - */ - public static final int MaterialButton_backgroundTint=4; - /** - *

- * @attr description - * Blending mode used to apply the background tint. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
add10Combines the tint and icon color and alpha channels, clamping the - * result to valid color values. Saturate(S + D)
multiplyeMultiplies the color and alpha channels of the drawable with those of - * the tint. [Sa * Da, Sc * Dc]
screenf[Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]
src_atop9The tint is drawn above the drawable, but with the drawable’s alpha - * channel masking the result. [Da, Sc * Da + (1 - Sa) * Dc]
src_in5The tint is masked by the alpha channel of the drawable. The drawable’s - * color channels are thrown out. [Sa * Da, Sc * Da]
src_over3The tint is drawn on top of the drawable. - * [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc]
- * - * @attr name com.scriptor:backgroundTintMode - */ - public static final int MaterialButton_backgroundTintMode=5; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#cornerRadius} - * attribute's value can be found in the {@link #MaterialButton} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:cornerRadius - */ - public static final int MaterialButton_cornerRadius=6; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#icon} - * attribute's value can be found in the {@link #MaterialButton} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:icon - */ - public static final int MaterialButton_icon=7; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#iconGravity} - * attribute's value can be found in the {@link #MaterialButton} array. - * - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - *
ConstantValueDescription
start1
textStart2
- * - * @attr name com.scriptor:iconGravity - */ - public static final int MaterialButton_iconGravity=8; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#iconPadding} - * attribute's value can be found in the {@link #MaterialButton} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:iconPadding - */ - public static final int MaterialButton_iconPadding=9; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#iconSize} - * attribute's value can be found in the {@link #MaterialButton} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:iconSize - */ - public static final int MaterialButton_iconSize=10; - /** - *

- * @attr description - * Tint to apply to the icon. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:iconTint - */ - public static final int MaterialButton_iconTint=11; - /** - *

- * @attr description - * Blending mode used to apply the icon tint. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
add10Combines the tint and icon color and alpha channels, clamping the - * result to valid color values. Saturate(S + D)
multiplyeMultiplies the color and alpha channels of the icon with those of - * the tint. [Sa * Da, Sc * Dc]
screenf[Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]
src_atop9The tint is drawn above the icon, but with the icon’s alpha - * channel masking the result. [Da, Sc * Da + (1 - Sa) * Dc]
src_in5The tint is masked by the alpha channel of the icon. The icon’s - * color channels are thrown out. [Sa * Da, Sc * Da]
src_over3The tint is drawn on top of the icon. - * [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc]
- * - * @attr name com.scriptor:iconTintMode - */ - public static final int MaterialButton_iconTintMode=12; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#rippleColor} - * attribute's value can be found in the {@link #MaterialButton} array. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:rippleColor - */ - public static final int MaterialButton_rippleColor=13; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#strokeColor} - * attribute's value can be found in the {@link #MaterialButton} array. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:strokeColor - */ - public static final int MaterialButton_strokeColor=14; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#strokeWidth} - * attribute's value can be found in the {@link #MaterialButton} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:strokeWidth - */ - public static final int MaterialButton_strokeWidth=15; - /** - * Attributes that can be used with a MaterialCardView. - *

Includes the following attributes:

- * - * - * - * - * - * - *
AttributeDescription
{@link #MaterialCardView_strokeColor com.scriptor:strokeColor}
{@link #MaterialCardView_strokeWidth com.scriptor:strokeWidth}
- * @see #MaterialCardView_strokeColor - * @see #MaterialCardView_strokeWidth - */ - public static final int[] MaterialCardView={ - 0x7f0401a8, 0x7f0401a9 - }; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#strokeColor} - * attribute's value can be found in the {@link #MaterialCardView} array. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:strokeColor - */ - public static final int MaterialCardView_strokeColor=0; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#strokeWidth} - * attribute's value can be found in the {@link #MaterialCardView} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:strokeWidth - */ - public static final int MaterialCardView_strokeWidth=1; - /** - * Attributes that can be used with a MaterialComponentsTheme. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #MaterialComponentsTheme_bottomSheetDialogTheme com.scriptor:bottomSheetDialogTheme}
{@link #MaterialComponentsTheme_bottomSheetStyle com.scriptor:bottomSheetStyle}
{@link #MaterialComponentsTheme_chipGroupStyle com.scriptor:chipGroupStyle}
{@link #MaterialComponentsTheme_chipStandaloneStyle com.scriptor:chipStandaloneStyle}
{@link #MaterialComponentsTheme_chipStyle com.scriptor:chipStyle}
{@link #MaterialComponentsTheme_colorAccent com.scriptor:colorAccent}Bright complement to the primary branding color.
{@link #MaterialComponentsTheme_colorBackgroundFloating com.scriptor:colorBackgroundFloating}Default color of background imagery for floating components, ex.
{@link #MaterialComponentsTheme_colorPrimary com.scriptor:colorPrimary}The primary branding color for the app.
{@link #MaterialComponentsTheme_colorPrimaryDark com.scriptor:colorPrimaryDark}Dark variant of the primary branding color.
{@link #MaterialComponentsTheme_colorSecondary com.scriptor:colorSecondary}
{@link #MaterialComponentsTheme_editTextStyle com.scriptor:editTextStyle}Default EditText style.
{@link #MaterialComponentsTheme_floatingActionButtonStyle com.scriptor:floatingActionButtonStyle}
{@link #MaterialComponentsTheme_materialButtonStyle com.scriptor:materialButtonStyle}
{@link #MaterialComponentsTheme_materialCardViewStyle com.scriptor:materialCardViewStyle}
{@link #MaterialComponentsTheme_navigationViewStyle com.scriptor:navigationViewStyle}
{@link #MaterialComponentsTheme_scrimBackground com.scriptor:scrimBackground}
{@link #MaterialComponentsTheme_snackbarButtonStyle com.scriptor:snackbarButtonStyle}
{@link #MaterialComponentsTheme_tabStyle com.scriptor:tabStyle}
{@link #MaterialComponentsTheme_textAppearanceBody1 com.scriptor:textAppearanceBody1}
{@link #MaterialComponentsTheme_textAppearanceBody2 com.scriptor:textAppearanceBody2}
{@link #MaterialComponentsTheme_textAppearanceButton com.scriptor:textAppearanceButton}
{@link #MaterialComponentsTheme_textAppearanceCaption com.scriptor:textAppearanceCaption}
{@link #MaterialComponentsTheme_textAppearanceHeadline1 com.scriptor:textAppearanceHeadline1}
{@link #MaterialComponentsTheme_textAppearanceHeadline2 com.scriptor:textAppearanceHeadline2}
{@link #MaterialComponentsTheme_textAppearanceHeadline3 com.scriptor:textAppearanceHeadline3}
{@link #MaterialComponentsTheme_textAppearanceHeadline4 com.scriptor:textAppearanceHeadline4}
{@link #MaterialComponentsTheme_textAppearanceHeadline5 com.scriptor:textAppearanceHeadline5}
{@link #MaterialComponentsTheme_textAppearanceHeadline6 com.scriptor:textAppearanceHeadline6}
{@link #MaterialComponentsTheme_textAppearanceOverline com.scriptor:textAppearanceOverline}
{@link #MaterialComponentsTheme_textAppearanceSubtitle1 com.scriptor:textAppearanceSubtitle1}
{@link #MaterialComponentsTheme_textAppearanceSubtitle2 com.scriptor:textAppearanceSubtitle2}
{@link #MaterialComponentsTheme_textInputStyle com.scriptor:textInputStyle}
- * @see #MaterialComponentsTheme_bottomSheetDialogTheme - * @see #MaterialComponentsTheme_bottomSheetStyle - * @see #MaterialComponentsTheme_chipGroupStyle - * @see #MaterialComponentsTheme_chipStandaloneStyle - * @see #MaterialComponentsTheme_chipStyle - * @see #MaterialComponentsTheme_colorAccent - * @see #MaterialComponentsTheme_colorBackgroundFloating - * @see #MaterialComponentsTheme_colorPrimary - * @see #MaterialComponentsTheme_colorPrimaryDark - * @see #MaterialComponentsTheme_colorSecondary - * @see #MaterialComponentsTheme_editTextStyle - * @see #MaterialComponentsTheme_floatingActionButtonStyle - * @see #MaterialComponentsTheme_materialButtonStyle - * @see #MaterialComponentsTheme_materialCardViewStyle - * @see #MaterialComponentsTheme_navigationViewStyle - * @see #MaterialComponentsTheme_scrimBackground - * @see #MaterialComponentsTheme_snackbarButtonStyle - * @see #MaterialComponentsTheme_tabStyle - * @see #MaterialComponentsTheme_textAppearanceBody1 - * @see #MaterialComponentsTheme_textAppearanceBody2 - * @see #MaterialComponentsTheme_textAppearanceButton - * @see #MaterialComponentsTheme_textAppearanceCaption - * @see #MaterialComponentsTheme_textAppearanceHeadline1 - * @see #MaterialComponentsTheme_textAppearanceHeadline2 - * @see #MaterialComponentsTheme_textAppearanceHeadline3 - * @see #MaterialComponentsTheme_textAppearanceHeadline4 - * @see #MaterialComponentsTheme_textAppearanceHeadline5 - * @see #MaterialComponentsTheme_textAppearanceHeadline6 - * @see #MaterialComponentsTheme_textAppearanceOverline - * @see #MaterialComponentsTheme_textAppearanceSubtitle1 - * @see #MaterialComponentsTheme_textAppearanceSubtitle2 - * @see #MaterialComponentsTheme_textInputStyle - */ - public static final int[] MaterialComponentsTheme={ - 0x7f040043, 0x7f040044, 0x7f04006b, 0x7f040075, - 0x7f040079, 0x7f040087, 0x7f040088, 0x7f04008e, - 0x7f04008f, 0x7f040090, 0x7f0400ba, 0x7f0400d6, - 0x7f04015e, 0x7f04015f, 0x7f040169, 0x7f040188, - 0x7f040198, 0x7f0401cb, 0x7f0401d0, 0x7f0401d1, - 0x7f0401d2, 0x7f0401d3, 0x7f0401d4, 0x7f0401d5, - 0x7f0401d6, 0x7f0401d7, 0x7f0401d8, 0x7f0401d9, - 0x7f0401de, 0x7f0401e3, 0x7f0401e4, 0x7f0401e8 - }; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#bottomSheetDialogTheme} - * attribute's value can be found in the {@link #MaterialComponentsTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:bottomSheetDialogTheme - */ - public static final int MaterialComponentsTheme_bottomSheetDialogTheme=0; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#bottomSheetStyle} - * attribute's value can be found in the {@link #MaterialComponentsTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:bottomSheetStyle - */ - public static final int MaterialComponentsTheme_bottomSheetStyle=1; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#chipGroupStyle} - * attribute's value can be found in the {@link #MaterialComponentsTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:chipGroupStyle - */ - public static final int MaterialComponentsTheme_chipGroupStyle=2; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#chipStandaloneStyle} - * attribute's value can be found in the {@link #MaterialComponentsTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:chipStandaloneStyle - */ - public static final int MaterialComponentsTheme_chipStandaloneStyle=3; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#chipStyle} - * attribute's value can be found in the {@link #MaterialComponentsTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:chipStyle - */ - public static final int MaterialComponentsTheme_chipStyle=4; - /** - *

- * @attr description - * Bright complement to the primary branding color. By default, this is the color applied - * to framework controls (via colorControlActivated). - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:colorAccent - */ - public static final int MaterialComponentsTheme_colorAccent=5; - /** - *

- * @attr description - * Default color of background imagery for floating components, ex. dialogs, popups, and cards. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:colorBackgroundFloating - */ - public static final int MaterialComponentsTheme_colorBackgroundFloating=6; - /** - *

- * @attr description - * The primary branding color for the app. By default, this is the color applied to the - * action bar background. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:colorPrimary - */ - public static final int MaterialComponentsTheme_colorPrimary=7; - /** - *

- * @attr description - * Dark variant of the primary branding color. By default, this is the color applied to - * the status bar (via statusBarColor) and navigation bar (via navigationBarColor). - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:colorPrimaryDark - */ - public static final int MaterialComponentsTheme_colorPrimaryDark=8; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#colorSecondary} - * attribute's value can be found in the {@link #MaterialComponentsTheme} array. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:colorSecondary - */ - public static final int MaterialComponentsTheme_colorSecondary=9; - /** - *

- * @attr description - * Default EditText style. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:editTextStyle - */ - public static final int MaterialComponentsTheme_editTextStyle=10; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#floatingActionButtonStyle} - * attribute's value can be found in the {@link #MaterialComponentsTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - *

May be an integer value, such as "100". - *

May be a boolean value, such as "true" or - * "false". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - *

May be a floating point value, such as "1.2". - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

May be a fractional value, which is a floating point number appended with - * either % or %p, such as "14.5%". - * The % suffix always means a percentage of the base size; - * the optional %p suffix provides a size relative to some parent container. - * - * @attr name com.scriptor:floatingActionButtonStyle - */ - public static final int MaterialComponentsTheme_floatingActionButtonStyle=11; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#materialButtonStyle} - * attribute's value can be found in the {@link #MaterialComponentsTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:materialButtonStyle - */ - public static final int MaterialComponentsTheme_materialButtonStyle=12; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#materialCardViewStyle} - * attribute's value can be found in the {@link #MaterialComponentsTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:materialCardViewStyle - */ - public static final int MaterialComponentsTheme_materialCardViewStyle=13; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#navigationViewStyle} - * attribute's value can be found in the {@link #MaterialComponentsTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:navigationViewStyle - */ - public static final int MaterialComponentsTheme_navigationViewStyle=14; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#scrimBackground} - * attribute's value can be found in the {@link #MaterialComponentsTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:scrimBackground - */ - public static final int MaterialComponentsTheme_scrimBackground=15; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#snackbarButtonStyle} - * attribute's value can be found in the {@link #MaterialComponentsTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:snackbarButtonStyle - */ - public static final int MaterialComponentsTheme_snackbarButtonStyle=16; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#tabStyle} - * attribute's value can be found in the {@link #MaterialComponentsTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:tabStyle - */ - public static final int MaterialComponentsTheme_tabStyle=17; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#textAppearanceBody1} - * attribute's value can be found in the {@link #MaterialComponentsTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:textAppearanceBody1 - */ - public static final int MaterialComponentsTheme_textAppearanceBody1=18; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#textAppearanceBody2} - * attribute's value can be found in the {@link #MaterialComponentsTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:textAppearanceBody2 - */ - public static final int MaterialComponentsTheme_textAppearanceBody2=19; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#textAppearanceButton} - * attribute's value can be found in the {@link #MaterialComponentsTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:textAppearanceButton - */ - public static final int MaterialComponentsTheme_textAppearanceButton=20; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#textAppearanceCaption} - * attribute's value can be found in the {@link #MaterialComponentsTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:textAppearanceCaption - */ - public static final int MaterialComponentsTheme_textAppearanceCaption=21; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#textAppearanceHeadline1} - * attribute's value can be found in the {@link #MaterialComponentsTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:textAppearanceHeadline1 - */ - public static final int MaterialComponentsTheme_textAppearanceHeadline1=22; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#textAppearanceHeadline2} - * attribute's value can be found in the {@link #MaterialComponentsTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:textAppearanceHeadline2 - */ - public static final int MaterialComponentsTheme_textAppearanceHeadline2=23; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#textAppearanceHeadline3} - * attribute's value can be found in the {@link #MaterialComponentsTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:textAppearanceHeadline3 - */ - public static final int MaterialComponentsTheme_textAppearanceHeadline3=24; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#textAppearanceHeadline4} - * attribute's value can be found in the {@link #MaterialComponentsTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:textAppearanceHeadline4 - */ - public static final int MaterialComponentsTheme_textAppearanceHeadline4=25; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#textAppearanceHeadline5} - * attribute's value can be found in the {@link #MaterialComponentsTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:textAppearanceHeadline5 - */ - public static final int MaterialComponentsTheme_textAppearanceHeadline5=26; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#textAppearanceHeadline6} - * attribute's value can be found in the {@link #MaterialComponentsTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:textAppearanceHeadline6 - */ - public static final int MaterialComponentsTheme_textAppearanceHeadline6=27; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#textAppearanceOverline} - * attribute's value can be found in the {@link #MaterialComponentsTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:textAppearanceOverline - */ - public static final int MaterialComponentsTheme_textAppearanceOverline=28; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#textAppearanceSubtitle1} - * attribute's value can be found in the {@link #MaterialComponentsTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:textAppearanceSubtitle1 - */ - public static final int MaterialComponentsTheme_textAppearanceSubtitle1=29; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#textAppearanceSubtitle2} - * attribute's value can be found in the {@link #MaterialComponentsTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:textAppearanceSubtitle2 - */ - public static final int MaterialComponentsTheme_textAppearanceSubtitle2=30; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#textInputStyle} - * attribute's value can be found in the {@link #MaterialComponentsTheme} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:textInputStyle - */ - public static final int MaterialComponentsTheme_textInputStyle=31; - /** - * Attributes that can be used with a MenuGroup. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #MenuGroup_android_enabled android:enabled}
{@link #MenuGroup_android_id android:id}
{@link #MenuGroup_android_visible android:visible}
{@link #MenuGroup_android_menuCategory android:menuCategory}
{@link #MenuGroup_android_orderInCategory android:orderInCategory}
{@link #MenuGroup_android_checkableBehavior android:checkableBehavior}
- * @see #MenuGroup_android_enabled - * @see #MenuGroup_android_id - * @see #MenuGroup_android_visible - * @see #MenuGroup_android_menuCategory - * @see #MenuGroup_android_orderInCategory - * @see #MenuGroup_android_checkableBehavior - */ - public static final int[] MenuGroup={ - 0x0101000e, 0x010100d0, 0x01010194, 0x010101de, - 0x010101df, 0x010101e0 - }; - /** - *

- * @attr description - * Whether the items are enabled. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name android:enabled - */ - public static final int MenuGroup_android_enabled=0; - /** - *

- * @attr description - * The ID of the group. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:id - */ - public static final int MenuGroup_android_id=1; - /** - *

- * @attr description - * Whether the items are shown/visible. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name android:visible - */ - public static final int MenuGroup_android_visible=2; - /** - *

- * @attr description - * The category applied to all items within this group. - * (This will be or'ed with the orderInCategory attribute.) - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
alternative40000
container10000
secondary30000
system20000
- * - * @attr name android:menuCategory - */ - public static final int MenuGroup_android_menuCategory=3; - /** - *

- * @attr description - * The order within the category applied to all items within this group. - * (This will be or'ed with the category attribute.) - * - *

May be an integer value, such as "100". - * - * @attr name android:orderInCategory - */ - public static final int MenuGroup_android_orderInCategory=4; - /** - *

- * @attr description - * Whether the items are capable of displaying a check mark. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
all1
none0
single2
- * - * @attr name android:checkableBehavior - */ - public static final int MenuGroup_android_checkableBehavior=5; - /** - * Attributes that can be used with a MenuItem. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #MenuItem_android_icon android:icon}
{@link #MenuItem_android_enabled android:enabled}
{@link #MenuItem_android_id android:id}
{@link #MenuItem_android_checked android:checked}
{@link #MenuItem_android_visible android:visible}
{@link #MenuItem_android_menuCategory android:menuCategory}
{@link #MenuItem_android_orderInCategory android:orderInCategory}
{@link #MenuItem_android_title android:title}
{@link #MenuItem_android_titleCondensed android:titleCondensed}
{@link #MenuItem_android_alphabeticShortcut android:alphabeticShortcut}
{@link #MenuItem_android_numericShortcut android:numericShortcut}
{@link #MenuItem_android_checkable android:checkable}
{@link #MenuItem_android_onClick android:onClick}
{@link #MenuItem_actionLayout com.scriptor:actionLayout}An optional layout to be used as an action view.
{@link #MenuItem_actionProviderClass com.scriptor:actionProviderClass}The name of an optional ActionProvider class to instantiate an action view - * and perform operations such as default action for that menu item.
{@link #MenuItem_actionViewClass com.scriptor:actionViewClass}The name of an optional View class to instantiate and use as an - * action view.
{@link #MenuItem_alphabeticModifiers com.scriptor:alphabeticModifiers}The alphabetic modifier key.
{@link #MenuItem_contentDescription com.scriptor:contentDescription}The content description associated with the item.
{@link #MenuItem_iconTint com.scriptor:iconTint}Tint to apply to the icon.
{@link #MenuItem_iconTintMode com.scriptor:iconTintMode}Blending mode used to apply the icon tint.
{@link #MenuItem_numericModifiers com.scriptor:numericModifiers}The numeric modifier key.
{@link #MenuItem_showAsAction com.scriptor:showAsAction}How this item should display in the Action Bar, if present.
{@link #MenuItem_tooltipText com.scriptor:tooltipText}The tooltip text associated with the item.
- * @see #MenuItem_android_icon - * @see #MenuItem_android_enabled - * @see #MenuItem_android_id - * @see #MenuItem_android_checked - * @see #MenuItem_android_visible - * @see #MenuItem_android_menuCategory - * @see #MenuItem_android_orderInCategory - * @see #MenuItem_android_title - * @see #MenuItem_android_titleCondensed - * @see #MenuItem_android_alphabeticShortcut - * @see #MenuItem_android_numericShortcut - * @see #MenuItem_android_checkable - * @see #MenuItem_android_onClick - * @see #MenuItem_actionLayout - * @see #MenuItem_actionProviderClass - * @see #MenuItem_actionViewClass - * @see #MenuItem_alphabeticModifiers - * @see #MenuItem_contentDescription - * @see #MenuItem_iconTint - * @see #MenuItem_iconTintMode - * @see #MenuItem_numericModifiers - * @see #MenuItem_showAsAction - * @see #MenuItem_tooltipText - */ - public static final int[] MenuItem={ - 0x01010002, 0x0101000e, 0x010100d0, 0x01010106, - 0x01010194, 0x010101de, 0x010101df, 0x010101e1, - 0x010101e2, 0x010101e3, 0x010101e4, 0x010101e5, - 0x0101026f, 0x7f04000d, 0x7f04001f, 0x7f040020, - 0x7f040028, 0x7f040096, 0x7f0400f9, 0x7f0400fa, - 0x7f04016a, 0x7f040190, 0x7f040204 - }; - /** - *

- * @attr description - * The icon associated with this item. This icon will not always be shown, so - * the title should be sufficient in describing this item. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:icon - */ - public static final int MenuItem_android_icon=0; - /** - *

- * @attr description - * Whether the item is enabled. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name android:enabled - */ - public static final int MenuItem_android_enabled=1; - /** - *

- * @attr description - * The ID of the item. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:id - */ - public static final int MenuItem_android_id=2; - /** - *

- * @attr description - * Whether the item is checked. Note that you must first have enabled checking with - * the checkable attribute or else the check mark will not appear. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name android:checked - */ - public static final int MenuItem_android_checked=3; - /** - *

- * @attr description - * Whether the item is shown/visible. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name android:visible - */ - public static final int MenuItem_android_visible=4; - /** - *

- * @attr description - * The category applied to the item. - * (This will be or'ed with the orderInCategory attribute.) - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
alternative40000
container10000
secondary30000
system20000
- * - * @attr name android:menuCategory - */ - public static final int MenuItem_android_menuCategory=5; - /** - *

- * @attr description - * The order within the category applied to the item. - * (This will be or'ed with the category attribute.) - * - *

May be an integer value, such as "100". - * - * @attr name android:orderInCategory - */ - public static final int MenuItem_android_orderInCategory=6; - /** - *

- * @attr description - * The title associated with the item. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name android:title - */ - public static final int MenuItem_android_title=7; - /** - *

- * @attr description - * The condensed title associated with the item. This is used in situations where the - * normal title may be too long to be displayed. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name android:titleCondensed - */ - public static final int MenuItem_android_titleCondensed=8; - /** - *

- * @attr description - * The alphabetic shortcut key. This is the shortcut when using a keyboard - * with alphabetic keys. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name android:alphabeticShortcut - */ - public static final int MenuItem_android_alphabeticShortcut=9; - /** - *

- * @attr description - * The numeric shortcut key. This is the shortcut when using a numeric (e.g., 12-key) - * keyboard. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name android:numericShortcut - */ - public static final int MenuItem_android_numericShortcut=10; - /** - *

- * @attr description - * Whether the item is capable of displaying a check mark. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name android:checkable - */ - public static final int MenuItem_android_checkable=11; - /** - *

- * @attr description - * Name of a method on the Context used to inflate the menu that will be - * called when the item is clicked. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name android:onClick - */ - public static final int MenuItem_android_onClick=12; - /** - *

- * @attr description - * An optional layout to be used as an action view. - * See {@link android.view.MenuItem#setActionView(android.view.View)} - * for more info. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:actionLayout - */ - public static final int MenuItem_actionLayout=13; - /** - *

- * @attr description - * The name of an optional ActionProvider class to instantiate an action view - * and perform operations such as default action for that menu item. - * See {@link android.view.MenuItem#setActionProvider(android.view.ActionProvider)} - * for more info. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:actionProviderClass - */ - public static final int MenuItem_actionProviderClass=14; - /** - *

- * @attr description - * The name of an optional View class to instantiate and use as an - * action view. See {@link android.view.MenuItem#setActionView(android.view.View)} - * for more info. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:actionViewClass - */ - public static final int MenuItem_actionViewClass=15; - /** - *

- * @attr description - * The alphabetic modifier key. This is the modifier when using a keyboard - * with alphabetic keys. The values should be kept in sync with KeyEvent - * - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
ALT2
CTRL1000
FUNCTION8
META10000
SHIFT1
SYM4
- * - * @attr name com.scriptor:alphabeticModifiers - */ - public static final int MenuItem_alphabeticModifiers=16; - /** - *

- * @attr description - * The content description associated with the item. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:contentDescription - */ - public static final int MenuItem_contentDescription=17; - /** - *

- * @attr description - * Tint to apply to the icon. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:iconTint - */ - public static final int MenuItem_iconTint=18; - /** - *

- * @attr description - * Blending mode used to apply the icon tint. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
add10Combines the tint and icon color and alpha channels, clamping the - * result to valid color values. Saturate(S + D)
multiplyeMultiplies the color and alpha channels of the icon with those of - * the tint. [Sa * Da, Sc * Dc]
screenf[Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]
src_atop9The tint is drawn above the icon, but with the icon’s alpha - * channel masking the result. [Da, Sc * Da + (1 - Sa) * Dc]
src_in5The tint is masked by the alpha channel of the icon. The icon’s - * color channels are thrown out. [Sa * Da, Sc * Da]
src_over3The tint is drawn on top of the icon. - * [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc]
- * - * @attr name com.scriptor:iconTintMode - */ - public static final int MenuItem_iconTintMode=19; - /** - *

- * @attr description - * The numeric modifier key. This is the modifier when using a numeric (e.g., 12-key) - * keyboard. The values should be kept in sync with KeyEvent - * - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
ALT2
CTRL1000
FUNCTION8
META10000
SHIFT1
SYM4
- * - * @attr name com.scriptor:numericModifiers - */ - public static final int MenuItem_numericModifiers=20; - /** - *

- * @attr description - * How this item should display in the Action Bar, if present. - * - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
always2Always show this item in an actionbar, even if it would override - * the system's limits of how much stuff to put there. This may make - * your action bar look bad on some screens. In most cases you should - * use "ifRoom" instead. Mutually exclusive with "ifRoom" and "never".
collapseActionView8This item's action view collapses to a normal menu - * item. When expanded, the action view takes over a - * larger segment of its container.
ifRoom1Show this item in an action bar if there is room for it as determined - * by the system. Favor this option over "always" where possible. - * Mutually exclusive with "never" and "always".
never0Never show this item in an action bar, show it in the overflow menu instead. - * Mutually exclusive with "ifRoom" and "always".
withText4When this item is shown as an action in the action bar, show a text - * label with it even if it has an icon representation.
- * - * @attr name com.scriptor:showAsAction - */ - public static final int MenuItem_showAsAction=21; - /** - *

- * @attr description - * The tooltip text associated with the item. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:tooltipText - */ - public static final int MenuItem_tooltipText=22; - /** - * Attributes that can be used with a MenuView. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #MenuView_android_windowAnimationStyle android:windowAnimationStyle}
{@link #MenuView_android_itemTextAppearance android:itemTextAppearance}
{@link #MenuView_android_horizontalDivider android:horizontalDivider}
{@link #MenuView_android_verticalDivider android:verticalDivider}
{@link #MenuView_android_headerBackground android:headerBackground}
{@link #MenuView_android_itemBackground android:itemBackground}
{@link #MenuView_android_itemIconDisabledAlpha android:itemIconDisabledAlpha}
{@link #MenuView_preserveIconSpacing com.scriptor:preserveIconSpacing}Whether space should be reserved in layout when an icon is missing.
{@link #MenuView_subMenuArrow com.scriptor:subMenuArrow}Drawable for the arrow icon indicating a particular item is a submenu.
- * @see #MenuView_android_windowAnimationStyle - * @see #MenuView_android_itemTextAppearance - * @see #MenuView_android_horizontalDivider - * @see #MenuView_android_verticalDivider - * @see #MenuView_android_headerBackground - * @see #MenuView_android_itemBackground - * @see #MenuView_android_itemIconDisabledAlpha - * @see #MenuView_preserveIconSpacing - * @see #MenuView_subMenuArrow - */ - public static final int[] MenuView={ - 0x010100ae, 0x0101012c, 0x0101012d, 0x0101012e, - 0x0101012f, 0x01010130, 0x01010131, 0x7f04017b, - 0x7f0401aa - }; - /** - *

- * @attr description - * Default animations for the menu. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:windowAnimationStyle - */ - public static final int MenuView_android_windowAnimationStyle=0; - /** - *

- * @attr description - * Default appearance of menu item text. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:itemTextAppearance - */ - public static final int MenuView_android_itemTextAppearance=1; - /** - *

- * @attr description - * Default horizontal divider between rows of menu items. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:horizontalDivider - */ - public static final int MenuView_android_horizontalDivider=2; - /** - *

- * @attr description - * Default vertical divider between menu items. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:verticalDivider - */ - public static final int MenuView_android_verticalDivider=3; - /** - *

- * @attr description - * Default background for the menu header. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name android:headerBackground - */ - public static final int MenuView_android_headerBackground=4; - /** - *

- * @attr description - * Default background for each menu item. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name android:itemBackground - */ - public static final int MenuView_android_itemBackground=5; - /** - *

- * @attr description - * Default disabled icon alpha for each menu item that shows an icon. - * - *

May be a floating point value, such as "1.2". - * - * @attr name android:itemIconDisabledAlpha - */ - public static final int MenuView_android_itemIconDisabledAlpha=6; - /** - *

- * @attr description - * Whether space should be reserved in layout when an icon is missing. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:preserveIconSpacing - */ - public static final int MenuView_preserveIconSpacing=7; - /** - *

- * @attr description - * Drawable for the arrow icon indicating a particular item is a submenu. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:subMenuArrow - */ - public static final int MenuView_subMenuArrow=8; - /** - * Attributes that can be used with a NavigationView. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #NavigationView_android_background android:background}
{@link #NavigationView_android_fitsSystemWindows android:fitsSystemWindows}
{@link #NavigationView_android_maxWidth android:maxWidth}
{@link #NavigationView_elevation com.scriptor:elevation}Elevation for the action bar itself
{@link #NavigationView_headerLayout com.scriptor:headerLayout}
{@link #NavigationView_itemBackground com.scriptor:itemBackground}
{@link #NavigationView_itemHorizontalPadding com.scriptor:itemHorizontalPadding}
{@link #NavigationView_itemIconPadding com.scriptor:itemIconPadding}
{@link #NavigationView_itemIconTint com.scriptor:itemIconTint}
{@link #NavigationView_itemTextAppearance com.scriptor:itemTextAppearance}
{@link #NavigationView_itemTextColor com.scriptor:itemTextColor}
{@link #NavigationView_menu com.scriptor:menu}
- * @see #NavigationView_android_background - * @see #NavigationView_android_fitsSystemWindows - * @see #NavigationView_android_maxWidth - * @see #NavigationView_elevation - * @see #NavigationView_headerLayout - * @see #NavigationView_itemBackground - * @see #NavigationView_itemHorizontalPadding - * @see #NavigationView_itemIconPadding - * @see #NavigationView_itemIconTint - * @see #NavigationView_itemTextAppearance - * @see #NavigationView_itemTextColor - * @see #NavigationView_menu - */ - public static final int[] NavigationView={ - 0x010100d4, 0x010100dd, 0x0101011f, 0x7f0400bb, - 0x7f0400e5, 0x7f040101, 0x7f040102, 0x7f040104, - 0x7f040106, 0x7f040109, 0x7f04010c, 0x7f040164 - }; - /** - *

This symbol is the offset where the {@link android.R.attr#background} - * attribute's value can be found in the {@link #NavigationView} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name android:background - */ - public static final int NavigationView_android_background=0; - /** - *

This symbol is the offset where the {@link android.R.attr#fitsSystemWindows} - * attribute's value can be found in the {@link #NavigationView} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name android:fitsSystemWindows - */ - public static final int NavigationView_android_fitsSystemWindows=1; - /** - *

This symbol is the offset where the {@link android.R.attr#maxWidth} - * attribute's value can be found in the {@link #NavigationView} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:maxWidth - */ - public static final int NavigationView_android_maxWidth=2; - /** - *

- * @attr description - * Elevation for the action bar itself - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:elevation - */ - public static final int NavigationView_elevation=3; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#headerLayout} - * attribute's value can be found in the {@link #NavigationView} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:headerLayout - */ - public static final int NavigationView_headerLayout=4; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#itemBackground} - * attribute's value can be found in the {@link #NavigationView} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:itemBackground - */ - public static final int NavigationView_itemBackground=5; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#itemHorizontalPadding} - * attribute's value can be found in the {@link #NavigationView} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:itemHorizontalPadding - */ - public static final int NavigationView_itemHorizontalPadding=6; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#itemIconPadding} - * attribute's value can be found in the {@link #NavigationView} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:itemIconPadding - */ - public static final int NavigationView_itemIconPadding=7; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#itemIconTint} - * attribute's value can be found in the {@link #NavigationView} array. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:itemIconTint - */ - public static final int NavigationView_itemIconTint=8; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#itemTextAppearance} - * attribute's value can be found in the {@link #NavigationView} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:itemTextAppearance - */ - public static final int NavigationView_itemTextAppearance=9; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#itemTextColor} - * attribute's value can be found in the {@link #NavigationView} array. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:itemTextColor - */ - public static final int NavigationView_itemTextColor=10; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#menu} - * attribute's value can be found in the {@link #NavigationView} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:menu - */ - public static final int NavigationView_menu=11; - /** - * Attributes that can be used with a PopupWindow. - *

Includes the following attributes:

- * - * - * - * - * - * - * - *
AttributeDescription
{@link #PopupWindow_android_popupBackground android:popupBackground}
{@link #PopupWindow_android_popupAnimationStyle android:popupAnimationStyle}
{@link #PopupWindow_overlapAnchor com.scriptor:overlapAnchor}Whether the popup window should overlap its anchor view.
- * @see #PopupWindow_android_popupBackground - * @see #PopupWindow_android_popupAnimationStyle - * @see #PopupWindow_overlapAnchor - */ - public static final int[] PopupWindow={ - 0x01010176, 0x010102c9, 0x7f04016b - }; - /** - *

This symbol is the offset where the {@link android.R.attr#popupBackground} - * attribute's value can be found in the {@link #PopupWindow} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name android:popupBackground - */ - public static final int PopupWindow_android_popupBackground=0; - /** - *

This symbol is the offset where the {@link android.R.attr#popupAnimationStyle} - * attribute's value can be found in the {@link #PopupWindow} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:popupAnimationStyle - */ - public static final int PopupWindow_android_popupAnimationStyle=1; - /** - *

- * @attr description - * Whether the popup window should overlap its anchor view. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:overlapAnchor - */ - public static final int PopupWindow_overlapAnchor=2; - /** - * Attributes that can be used with a PopupWindowBackgroundState. - *

Includes the following attributes:

- * - * - * - * - * - *
AttributeDescription
{@link #PopupWindowBackgroundState_state_above_anchor com.scriptor:state_above_anchor}State identifier indicating the popup will be above the anchor.
- * @see #PopupWindowBackgroundState_state_above_anchor - */ - public static final int[] PopupWindowBackgroundState={ - 0x7f0401a1 - }; - /** - *

- * @attr description - * State identifier indicating the popup will be above the anchor. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:state_above_anchor - */ - public static final int PopupWindowBackgroundState_state_above_anchor=0; - /** - * Attributes that can be used with a RecycleListView. - *

Includes the following attributes:

- * - * - * - * - * - * - *
AttributeDescription
{@link #RecycleListView_paddingBottomNoButtons com.scriptor:paddingBottomNoButtons}Bottom padding to use when no buttons are present.
{@link #RecycleListView_paddingTopNoTitle com.scriptor:paddingTopNoTitle}Top padding to use when no title is present.
- * @see #RecycleListView_paddingBottomNoButtons - * @see #RecycleListView_paddingTopNoTitle - */ - public static final int[] RecycleListView={ - 0x7f04016c, 0x7f04016f - }; - /** - *

- * @attr description - * Bottom padding to use when no buttons are present. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:paddingBottomNoButtons - */ - public static final int RecycleListView_paddingBottomNoButtons=0; - /** - *

- * @attr description - * Top padding to use when no title is present. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:paddingTopNoTitle - */ - public static final int RecycleListView_paddingTopNoTitle=1; - /** - * Attributes that can be used with a RecyclerView. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #RecyclerView_android_orientation android:orientation}
{@link #RecyclerView_android_descendantFocusability android:descendantFocusability}
{@link #RecyclerView_fastScrollEnabled com.scriptor:fastScrollEnabled}
{@link #RecyclerView_fastScrollHorizontalThumbDrawable com.scriptor:fastScrollHorizontalThumbDrawable}
{@link #RecyclerView_fastScrollHorizontalTrackDrawable com.scriptor:fastScrollHorizontalTrackDrawable}
{@link #RecyclerView_fastScrollVerticalThumbDrawable com.scriptor:fastScrollVerticalThumbDrawable}
{@link #RecyclerView_fastScrollVerticalTrackDrawable com.scriptor:fastScrollVerticalTrackDrawable}
{@link #RecyclerView_layoutManager com.scriptor:layoutManager}Class name of the Layout Manager to be used.
{@link #RecyclerView_reverseLayout com.scriptor:reverseLayout}
{@link #RecyclerView_spanCount com.scriptor:spanCount}
{@link #RecyclerView_stackFromEnd com.scriptor:stackFromEnd}
- * @see #RecyclerView_android_orientation - * @see #RecyclerView_android_descendantFocusability - * @see #RecyclerView_fastScrollEnabled - * @see #RecyclerView_fastScrollHorizontalThumbDrawable - * @see #RecyclerView_fastScrollHorizontalTrackDrawable - * @see #RecyclerView_fastScrollVerticalThumbDrawable - * @see #RecyclerView_fastScrollVerticalTrackDrawable - * @see #RecyclerView_layoutManager - * @see #RecyclerView_reverseLayout - * @see #RecyclerView_spanCount - * @see #RecyclerView_stackFromEnd - */ - public static final int[] RecyclerView={ - 0x010100c4, 0x010100f1, 0x7f0400d0, 0x7f0400d1, - 0x7f0400d2, 0x7f0400d3, 0x7f0400d4, 0x7f040111, - 0x7f040185, 0x7f04019a, 0x7f0401a0 - }; - /** - *

This symbol is the offset where the {@link android.R.attr#orientation} - * attribute's value can be found in the {@link #RecyclerView} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - *
ConstantValueDescription
horizontal0
vertical1
- * - * @attr name android:orientation - */ - public static final int RecyclerView_android_orientation=0; - /** - *

This symbol is the offset where the {@link android.R.attr#descendantFocusability} - * attribute's value can be found in the {@link #RecyclerView} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
afterDescendants1
beforeDescendants0
blocksDescendants2
- * - * @attr name android:descendantFocusability - */ - public static final int RecyclerView_android_descendantFocusability=1; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#fastScrollEnabled} - * attribute's value can be found in the {@link #RecyclerView} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:fastScrollEnabled - */ - public static final int RecyclerView_fastScrollEnabled=2; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#fastScrollHorizontalThumbDrawable} - * attribute's value can be found in the {@link #RecyclerView} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:fastScrollHorizontalThumbDrawable - */ - public static final int RecyclerView_fastScrollHorizontalThumbDrawable=3; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#fastScrollHorizontalTrackDrawable} - * attribute's value can be found in the {@link #RecyclerView} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:fastScrollHorizontalTrackDrawable - */ - public static final int RecyclerView_fastScrollHorizontalTrackDrawable=4; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#fastScrollVerticalThumbDrawable} - * attribute's value can be found in the {@link #RecyclerView} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:fastScrollVerticalThumbDrawable - */ - public static final int RecyclerView_fastScrollVerticalThumbDrawable=5; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#fastScrollVerticalTrackDrawable} - * attribute's value can be found in the {@link #RecyclerView} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:fastScrollVerticalTrackDrawable - */ - public static final int RecyclerView_fastScrollVerticalTrackDrawable=6; - /** - *

- * @attr description - * Class name of the Layout Manager to be used. - *

- * The class must extandroidx.recyclerview.widget.RecyclerViewView$LayoutManager - * and have either a default constructor or constructor with the signature - * (android.content.Context, android.util.AttributeSet, int, int). - *

- * If the name starts with a '.', application package is prefixed. - * Else, if the name contains a '.', the classname is assumed to be a full class name. - * Else, the recycler view package naandroidx.appcompat.widgetdget) is prefixed. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:layoutManager - */ - public static final int RecyclerView_layoutManager=7; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#reverseLayout} - * attribute's value can be found in the {@link #RecyclerView} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:reverseLayout - */ - public static final int RecyclerView_reverseLayout=8; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#spanCount} - * attribute's value can be found in the {@link #RecyclerView} array. - * - *

May be an integer value, such as "100". - * - * @attr name com.scriptor:spanCount - */ - public static final int RecyclerView_spanCount=9; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#stackFromEnd} - * attribute's value can be found in the {@link #RecyclerView} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:stackFromEnd - */ - public static final int RecyclerView_stackFromEnd=10; - /** - * Attributes that can be used with a ScrimInsetsFrameLayout. - *

Includes the following attributes:

- * - * - * - * - * - *
AttributeDescription
{@link #ScrimInsetsFrameLayout_insetForeground com.scriptor:insetForeground}
- * @see #ScrimInsetsFrameLayout_insetForeground - */ - public static final int[] ScrimInsetsFrameLayout={ - 0x7f0400ff - }; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#insetForeground} - * attribute's value can be found in the {@link #ScrimInsetsFrameLayout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:insetForeground - */ - public static final int ScrimInsetsFrameLayout_insetForeground=0; - /** - * Attributes that can be used with a ScrollingViewBehavior_Layout. - *

Includes the following attributes:

- * - * - * - * - * - *
AttributeDescription
{@link #ScrollingViewBehavior_Layout_behavior_overlapTop com.scriptor:behavior_overlapTop}
- * @see #ScrollingViewBehavior_Layout_behavior_overlapTop - */ - public static final int[] ScrollingViewBehavior_Layout={ - 0x7f04003c - }; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#behavior_overlapTop} - * attribute's value can be found in the {@link #ScrollingViewBehavior_Layout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:behavior_overlapTop - */ - public static final int ScrollingViewBehavior_Layout_behavior_overlapTop=0; - /** - * Attributes that can be used with a SearchView. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #SearchView_android_focusable android:focusable}
{@link #SearchView_android_maxWidth android:maxWidth}
{@link #SearchView_android_inputType android:inputType}
{@link #SearchView_android_imeOptions android:imeOptions}
{@link #SearchView_closeIcon com.scriptor:closeIcon}Close button icon
{@link #SearchView_commitIcon com.scriptor:commitIcon}Commit icon shown in the query suggestion row
{@link #SearchView_defaultQueryHint com.scriptor:defaultQueryHint}Default query hint used when {@code queryHint} is undefined and - * the search view's {@code SearchableInfo} does not provide a hint.
{@link #SearchView_goIcon com.scriptor:goIcon}Go button icon
{@link #SearchView_iconifiedByDefault com.scriptor:iconifiedByDefault}The default state of the SearchView.
{@link #SearchView_layout com.scriptor:layout}The layout to use for the search view.
{@link #SearchView_queryBackground com.scriptor:queryBackground}Background for the section containing the search query
{@link #SearchView_queryHint com.scriptor:queryHint}An optional user-defined query hint string to be displayed in the empty query field.
{@link #SearchView_searchHintIcon com.scriptor:searchHintIcon}Search icon displayed as a text field hint
{@link #SearchView_searchIcon com.scriptor:searchIcon}Search icon
{@link #SearchView_submitBackground com.scriptor:submitBackground}Background for the section containing the action (e.g.
{@link #SearchView_suggestionRowLayout com.scriptor:suggestionRowLayout}Layout for query suggestion rows
{@link #SearchView_voiceIcon com.scriptor:voiceIcon}Voice button icon
- * @see #SearchView_android_focusable - * @see #SearchView_android_maxWidth - * @see #SearchView_android_inputType - * @see #SearchView_android_imeOptions - * @see #SearchView_closeIcon - * @see #SearchView_commitIcon - * @see #SearchView_defaultQueryHint - * @see #SearchView_goIcon - * @see #SearchView_iconifiedByDefault - * @see #SearchView_layout - * @see #SearchView_queryBackground - * @see #SearchView_queryHint - * @see #SearchView_searchHintIcon - * @see #SearchView_searchIcon - * @see #SearchView_submitBackground - * @see #SearchView_suggestionRowLayout - * @see #SearchView_voiceIcon - */ - public static final int[] SearchView={ - 0x010100da, 0x0101011f, 0x01010220, 0x01010264, - 0x7f04007a, 0x7f040092, 0x7f0400ab, 0x7f0400e4, - 0x7f0400fb, 0x7f040110, 0x7f04017f, 0x7f040180, - 0x7f04018a, 0x7f04018b, 0x7f0401ab, 0x7f0401b0, - 0x7f04020b - }; - /** - *

This symbol is the offset where the {@link android.R.attr#focusable} - * attribute's value can be found in the {@link #SearchView} array. - * - *

May be a boolean value, such as "true" or - * "false". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
auto10
- * - * @attr name android:focusable - */ - public static final int SearchView_android_focusable=0; - /** - *

- * @attr description - * An optional maximum width of the SearchView. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:maxWidth - */ - public static final int SearchView_android_maxWidth=1; - /** - *

- * @attr description - * The input type to set on the query text field. - * - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
date14
datetime4
none0
number2
numberDecimal2002
numberPassword12
numberSigned1002
phone3
text1
textAutoComplete10001
textAutoCorrect8001
textCapCharacters1001
textCapSentences4001
textCapWords2001
textEmailAddress21
textEmailSubject31
textFilterb1
textImeMultiLine40001
textLongMessage51
textMultiLine20001
textNoSuggestions80001
textPassword81
textPersonName61
textPhoneticc1
textPostalAddress71
textShortMessage41
textUri11
textVisiblePassword91
textWebEditTexta1
textWebEmailAddressd1
textWebPassworde1
time24
- * - * @attr name android:inputType - */ - public static final int SearchView_android_inputType=2; - /** - *

- * @attr description - * The IME options to set on the query text field. - * - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
actionDone6
actionGo2
actionNext5
actionNone1
actionPrevious7
actionSearch3
actionSend4
actionUnspecified0
flagForceAscii80000000
flagNavigateNext8000000
flagNavigatePrevious4000000
flagNoAccessoryAction20000000
flagNoEnterAction40000000
flagNoExtractUi10000000
flagNoFullscreen2000000
flagNoPersonalizedLearning1000000
normal0
- * - * @attr name android:imeOptions - */ - public static final int SearchView_android_imeOptions=3; - /** - *

- * @attr description - * Close button icon - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:closeIcon - */ - public static final int SearchView_closeIcon=4; - /** - *

- * @attr description - * Commit icon shown in the query suggestion row - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:commitIcon - */ - public static final int SearchView_commitIcon=5; - /** - *

- * @attr description - * Default query hint used when {@code queryHint} is undefined and - * the search view's {@code SearchableInfo} does not provide a hint. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:defaultQueryHint - */ - public static final int SearchView_defaultQueryHint=6; - /** - *

- * @attr description - * Go button icon - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:goIcon - */ - public static final int SearchView_goIcon=7; - /** - *

- * @attr description - * The default state of the SearchView. If true, it will be iconified when not in - * use and expanded when clicked. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:iconifiedByDefault - */ - public static final int SearchView_iconifiedByDefault=8; - /** - *

- * @attr description - * The layout to use for the search view. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:layout - */ - public static final int SearchView_layout=9; - /** - *

- * @attr description - * Background for the section containing the search query - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:queryBackground - */ - public static final int SearchView_queryBackground=10; - /** - *

- * @attr description - * An optional user-defined query hint string to be displayed in the empty query field. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:queryHint - */ - public static final int SearchView_queryHint=11; - /** - *

- * @attr description - * Search icon displayed as a text field hint - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:searchHintIcon - */ - public static final int SearchView_searchHintIcon=12; - /** - *

- * @attr description - * Search icon - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:searchIcon - */ - public static final int SearchView_searchIcon=13; - /** - *

- * @attr description - * Background for the section containing the action (e.g. voice search) - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:submitBackground - */ - public static final int SearchView_submitBackground=14; - /** - *

- * @attr description - * Layout for query suggestion rows - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:suggestionRowLayout - */ - public static final int SearchView_suggestionRowLayout=15; - /** - *

- * @attr description - * Voice button icon - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:voiceIcon - */ - public static final int SearchView_voiceIcon=16; - /** - * Attributes that can be used with a Snackbar. - *

Includes the following attributes:

- * - * - * - * - * - * - *
AttributeDescription
{@link #Snackbar_snackbarButtonStyle com.scriptor:snackbarButtonStyle}
{@link #Snackbar_snackbarStyle com.scriptor:snackbarStyle}
- * @see #Snackbar_snackbarButtonStyle - * @see #Snackbar_snackbarStyle - */ - public static final int[] Snackbar={ - 0x7f040198, 0x7f040199 - }; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#snackbarButtonStyle} - * attribute's value can be found in the {@link #Snackbar} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:snackbarButtonStyle - */ - public static final int Snackbar_snackbarButtonStyle=0; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#snackbarStyle} - * attribute's value can be found in the {@link #Snackbar} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:snackbarStyle - */ - public static final int Snackbar_snackbarStyle=1; - /** - * Attributes that can be used with a SnackbarLayout. - *

Includes the following attributes:

- * - * - * - * - * - * - * - *
AttributeDescription
{@link #SnackbarLayout_android_maxWidth android:maxWidth}
{@link #SnackbarLayout_elevation com.scriptor:elevation}Elevation for the action bar itself
{@link #SnackbarLayout_maxActionInlineWidth com.scriptor:maxActionInlineWidth}
- * @see #SnackbarLayout_android_maxWidth - * @see #SnackbarLayout_elevation - * @see #SnackbarLayout_maxActionInlineWidth - */ - public static final int[] SnackbarLayout={ - 0x0101011f, 0x7f0400bb, 0x7f040160 - }; - /** - *

This symbol is the offset where the {@link android.R.attr#maxWidth} - * attribute's value can be found in the {@link #SnackbarLayout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:maxWidth - */ - public static final int SnackbarLayout_android_maxWidth=0; - /** - *

- * @attr description - * Elevation for the action bar itself - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:elevation - */ - public static final int SnackbarLayout_elevation=1; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#maxActionInlineWidth} - * attribute's value can be found in the {@link #SnackbarLayout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:maxActionInlineWidth - */ - public static final int SnackbarLayout_maxActionInlineWidth=2; - /** - * Attributes that can be used with a Spinner. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #Spinner_android_entries android:entries}
{@link #Spinner_android_popupBackground android:popupBackground}
{@link #Spinner_android_prompt android:prompt}
{@link #Spinner_android_dropDownWidth android:dropDownWidth}
{@link #Spinner_popupTheme com.scriptor:popupTheme}Reference to a theme that should be used to inflate popups - * shown by widgets in the action bar.
- * @see #Spinner_android_entries - * @see #Spinner_android_popupBackground - * @see #Spinner_android_prompt - * @see #Spinner_android_dropDownWidth - * @see #Spinner_popupTheme - */ - public static final int[] Spinner={ - 0x010100b2, 0x01010176, 0x0101017b, 0x01010262, - 0x7f040179 - }; - /** - *

- * @attr description - * Reference to an array resource that will populate the Spinner. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:entries - */ - public static final int Spinner_android_entries=0; - /** - *

- * @attr description - * Background drawable to use for the dropdown in spinnerMode="dropdown". - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name android:popupBackground - */ - public static final int Spinner_android_popupBackground=1; - /** - *

- * @attr description - * The prompt to display when the spinner's dialog is shown. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:prompt - */ - public static final int Spinner_android_prompt=2; - /** - *

- * @attr description - * Width of the dropdown in spinnerMode="dropdown". - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
fill_parentffffffff
match_parentffffffff
wrap_contentfffffffe
- * - * @attr name android:dropDownWidth - */ - public static final int Spinner_android_dropDownWidth=3; - /** - *

- * @attr description - * Theme to use for the drop-down or dialog popup window. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:popupTheme - */ - public static final int Spinner_popupTheme=4; - /** - * Attributes that can be used with a StateListDrawable. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #StateListDrawable_android_dither android:dither}
{@link #StateListDrawable_android_visible android:visible}
{@link #StateListDrawable_android_variablePadding android:variablePadding}
{@link #StateListDrawable_android_constantSize android:constantSize}
{@link #StateListDrawable_android_enterFadeDuration android:enterFadeDuration}
{@link #StateListDrawable_android_exitFadeDuration android:exitFadeDuration}
- * @see #StateListDrawable_android_dither - * @see #StateListDrawable_android_visible - * @see #StateListDrawable_android_variablePadding - * @see #StateListDrawable_android_constantSize - * @see #StateListDrawable_android_enterFadeDuration - * @see #StateListDrawable_android_exitFadeDuration - */ - public static final int[] StateListDrawable={ - 0x0101011c, 0x01010194, 0x01010195, 0x01010196, - 0x0101030c, 0x0101030d - }; - /** - *

- * @attr description - * Enables or disables dithering of the bitmap if the bitmap does not have the - * same pixel configuration as the screen (for instance: a ARGB 8888 bitmap with - * an RGB 565 screen). - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name android:dither - */ - public static final int StateListDrawable_android_dither=0; - /** - *

- * @attr description - * Indicates whether the drawable should be initially visible. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name android:visible - */ - public static final int StateListDrawable_android_visible=1; - /** - *

- * @attr description - * If true, allows the drawable's padding to change based on the - * current state that is selected. If false, the padding will - * stay the same (based on the maximum padding of all the states). - * Enabling this feature requires that the owner of the drawable - * deal with performing layout when the state changes, which is - * often not supported. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name android:variablePadding - */ - public static final int StateListDrawable_android_variablePadding=2; - /** - *

- * @attr description - * If true, the drawable's reported internal size will remain - * constant as the state changes; the size is the maximum of all - * of the states. If false, the size will vary based on the - * current state. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name android:constantSize - */ - public static final int StateListDrawable_android_constantSize=3; - /** - *

- * @attr description - * Amount of time (in milliseconds) to fade in a new state drawable. - * - *

May be an integer value, such as "100". - * - * @attr name android:enterFadeDuration - */ - public static final int StateListDrawable_android_enterFadeDuration=4; - /** - *

- * @attr description - * Amount of time (in milliseconds) to fade out an old state drawable. - * - *

May be an integer value, such as "100". - * - * @attr name android:exitFadeDuration - */ - public static final int StateListDrawable_android_exitFadeDuration=5; - /** - * Attributes that can be used with a StateListDrawableItem. - *

Includes the following attributes:

- * - * - * - * - * - *
AttributeDescription
{@link #StateListDrawableItem_android_drawable android:drawable}
- * @see #StateListDrawableItem_android_drawable - */ - public static final int[] StateListDrawableItem={ - 0x01010199 - }; - /** - *

- * @attr description - * Reference to a drawable resource to use for the state. If not - * given, the drawable must be defined by the first child tag. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:drawable - */ - public static final int StateListDrawableItem_android_drawable=0; - /** - * Attributes that can be used with a SwitchCompat. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #SwitchCompat_android_textOn android:textOn}
{@link #SwitchCompat_android_textOff android:textOff}
{@link #SwitchCompat_android_thumb android:thumb}
{@link #SwitchCompat_showText com.scriptor:showText}Whether to draw on/off text.
{@link #SwitchCompat_splitTrack com.scriptor:splitTrack}Whether to split the track and leave a gap for the thumb drawable.
{@link #SwitchCompat_switchMinWidth com.scriptor:switchMinWidth}Minimum width for the switch component
{@link #SwitchCompat_switchPadding com.scriptor:switchPadding}Minimum space between the switch and caption text
{@link #SwitchCompat_switchTextAppearance com.scriptor:switchTextAppearance}TextAppearance style for text displayed on the switch thumb.
{@link #SwitchCompat_thumbTextPadding com.scriptor:thumbTextPadding}Amount of padding on either side of text within the switch thumb.
{@link #SwitchCompat_thumbTint com.scriptor:thumbTint}Tint to apply to the thumb drawable.
{@link #SwitchCompat_thumbTintMode com.scriptor:thumbTintMode}Blending mode used to apply the thumb tint.
{@link #SwitchCompat_track com.scriptor:track}Drawable to use as the "track" that the switch thumb slides within.
{@link #SwitchCompat_trackTint com.scriptor:trackTint}Tint to apply to the track.
{@link #SwitchCompat_trackTintMode com.scriptor:trackTintMode}Blending mode used to apply the track tint.
- * @see #SwitchCompat_android_textOn - * @see #SwitchCompat_android_textOff - * @see #SwitchCompat_android_thumb - * @see #SwitchCompat_showText - * @see #SwitchCompat_splitTrack - * @see #SwitchCompat_switchMinWidth - * @see #SwitchCompat_switchPadding - * @see #SwitchCompat_switchTextAppearance - * @see #SwitchCompat_thumbTextPadding - * @see #SwitchCompat_thumbTint - * @see #SwitchCompat_thumbTintMode - * @see #SwitchCompat_track - * @see #SwitchCompat_trackTint - * @see #SwitchCompat_trackTintMode - */ - public static final int[] SwitchCompat={ - 0x01010124, 0x01010125, 0x01010142, 0x7f040193, - 0x7f04019e, 0x7f0401b1, 0x7f0401b2, 0x7f0401b4, - 0x7f0401ec, 0x7f0401ed, 0x7f0401ee, 0x7f040205, - 0x7f040206, 0x7f040207 - }; - /** - *

- * @attr description - * Text to use when the switch is in the checked/"on" state. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name android:textOn - */ - public static final int SwitchCompat_android_textOn=0; - /** - *

- * @attr description - * Text to use when the switch is in the unchecked/"off" state. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name android:textOff - */ - public static final int SwitchCompat_android_textOff=1; - /** - *

- * @attr description - * Drawable to use as the "thumb" that switches back and forth. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:thumb - */ - public static final int SwitchCompat_android_thumb=2; - /** - *

- * @attr description - * Whether to draw on/off text. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:showText - */ - public static final int SwitchCompat_showText=3; - /** - *

- * @attr description - * Whether to split the track and leave a gap for the thumb drawable. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:splitTrack - */ - public static final int SwitchCompat_splitTrack=4; - /** - *

- * @attr description - * Minimum width for the switch component - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:switchMinWidth - */ - public static final int SwitchCompat_switchMinWidth=5; - /** - *

- * @attr description - * Minimum space between the switch and caption text - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:switchPadding - */ - public static final int SwitchCompat_switchPadding=6; - /** - *

- * @attr description - * TextAppearance style for text displayed on the switch thumb. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:switchTextAppearance - */ - public static final int SwitchCompat_switchTextAppearance=7; - /** - *

- * @attr description - * Amount of padding on either side of text within the switch thumb. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:thumbTextPadding - */ - public static final int SwitchCompat_thumbTextPadding=8; - /** - *

- * @attr description - * Tint to apply to the thumb drawable. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:thumbTint - */ - public static final int SwitchCompat_thumbTint=9; - /** - *

- * @attr description - * Blending mode used to apply the thumb tint. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
add10Combines the tint and drawable color and alpha channels, clamping the - * result to valid color values. Saturate(S + D)
multiplyeMultiplies the color and alpha channels of the drawable with those of - * the tint. [Sa * Da, Sc * Dc]
screenf[Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]
src_atop9The tint is drawn above the drawable, but with the drawable’s alpha - * channel masking the result. [Da, Sc * Da + (1 - Sa) * Dc]
src_in5The tint is masked by the alpha channel of the drawable. The drawable’s - * color channels are thrown out. [Sa * Da, Sc * Da]
src_over3The tint is drawn on top of the drawable. - * [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc]
- * - * @attr name com.scriptor:thumbTintMode - */ - public static final int SwitchCompat_thumbTintMode=10; - /** - *

- * @attr description - * Drawable to use as the "track" that the switch thumb slides within. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:track - */ - public static final int SwitchCompat_track=11; - /** - *

- * @attr description - * Tint to apply to the track. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:trackTint - */ - public static final int SwitchCompat_trackTint=12; - /** - *

- * @attr description - * Blending mode used to apply the track tint. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
add10Combines the tint and drawable color and alpha channels, clamping the - * result to valid color values. Saturate(S + D)
multiplyeMultiplies the color and alpha channels of the drawable with those of - * the tint. [Sa * Da, Sc * Dc]
screenf[Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]
src_atop9The tint is drawn above the drawable, but with the drawable’s alpha - * channel masking the result. [Da, Sc * Da + (1 - Sa) * Dc]
src_in5The tint is masked by the alpha channel of the drawable. The drawable’s - * color channels are thrown out. [Sa * Da, Sc * Da]
src_over3The tint is drawn on top of the drawable. - * [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc]
- * - * @attr name com.scriptor:trackTintMode - */ - public static final int SwitchCompat_trackTintMode=13; - /** - * Attributes that can be used with a TabItem. - *

Includes the following attributes:

- * - * - * - * - * - * - * - *
AttributeDescription
{@link #TabItem_android_icon android:icon}
{@link #TabItem_android_layout android:layout}
{@link #TabItem_android_text android:text}
- * @see #TabItem_android_icon - * @see #TabItem_android_layout - * @see #TabItem_android_text - */ - public static final int[] TabItem={ - 0x01010002, 0x010100f2, 0x0101014f - }; - /** - *

This symbol is the offset where the {@link android.R.attr#icon} - * attribute's value can be found in the {@link #TabItem} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:icon - */ - public static final int TabItem_android_icon=0; - /** - *

This symbol is the offset where the {@link android.R.attr#layout} - * attribute's value can be found in the {@link #TabItem} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:layout - */ - public static final int TabItem_android_layout=1; - /** - *

This symbol is the offset where the {@link android.R.attr#text} - * attribute's value can be found in the {@link #TabItem} array. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name android:text - */ - public static final int TabItem_android_text=2; - /** - * Attributes that can be used with a TabLayout. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #TabLayout_tabBackground com.scriptor:tabBackground}
{@link #TabLayout_tabContentStart com.scriptor:tabContentStart}
{@link #TabLayout_tabGravity com.scriptor:tabGravity}
{@link #TabLayout_tabIconTint com.scriptor:tabIconTint}
{@link #TabLayout_tabIconTintMode com.scriptor:tabIconTintMode}
{@link #TabLayout_tabIndicator com.scriptor:tabIndicator}
{@link #TabLayout_tabIndicatorAnimationDuration com.scriptor:tabIndicatorAnimationDuration}
{@link #TabLayout_tabIndicatorColor com.scriptor:tabIndicatorColor}
{@link #TabLayout_tabIndicatorFullWidth com.scriptor:tabIndicatorFullWidth}
{@link #TabLayout_tabIndicatorGravity com.scriptor:tabIndicatorGravity}
{@link #TabLayout_tabIndicatorHeight com.scriptor:tabIndicatorHeight}
{@link #TabLayout_tabInlineLabel com.scriptor:tabInlineLabel}
{@link #TabLayout_tabMaxWidth com.scriptor:tabMaxWidth}
{@link #TabLayout_tabMinWidth com.scriptor:tabMinWidth}
{@link #TabLayout_tabMode com.scriptor:tabMode}
{@link #TabLayout_tabPadding com.scriptor:tabPadding}
{@link #TabLayout_tabPaddingBottom com.scriptor:tabPaddingBottom}
{@link #TabLayout_tabPaddingEnd com.scriptor:tabPaddingEnd}
{@link #TabLayout_tabPaddingStart com.scriptor:tabPaddingStart}
{@link #TabLayout_tabPaddingTop com.scriptor:tabPaddingTop}
{@link #TabLayout_tabRippleColor com.scriptor:tabRippleColor}
{@link #TabLayout_tabSelectedTextColor com.scriptor:tabSelectedTextColor}
{@link #TabLayout_tabTextAppearance com.scriptor:tabTextAppearance}
{@link #TabLayout_tabTextColor com.scriptor:tabTextColor}
{@link #TabLayout_tabUnboundedRipple com.scriptor:tabUnboundedRipple}
- * @see #TabLayout_tabBackground - * @see #TabLayout_tabContentStart - * @see #TabLayout_tabGravity - * @see #TabLayout_tabIconTint - * @see #TabLayout_tabIconTintMode - * @see #TabLayout_tabIndicator - * @see #TabLayout_tabIndicatorAnimationDuration - * @see #TabLayout_tabIndicatorColor - * @see #TabLayout_tabIndicatorFullWidth - * @see #TabLayout_tabIndicatorGravity - * @see #TabLayout_tabIndicatorHeight - * @see #TabLayout_tabInlineLabel - * @see #TabLayout_tabMaxWidth - * @see #TabLayout_tabMinWidth - * @see #TabLayout_tabMode - * @see #TabLayout_tabPadding - * @see #TabLayout_tabPaddingBottom - * @see #TabLayout_tabPaddingEnd - * @see #TabLayout_tabPaddingStart - * @see #TabLayout_tabPaddingTop - * @see #TabLayout_tabRippleColor - * @see #TabLayout_tabSelectedTextColor - * @see #TabLayout_tabTextAppearance - * @see #TabLayout_tabTextColor - * @see #TabLayout_tabUnboundedRipple - */ - public static final int[] TabLayout={ - 0x7f0401b5, 0x7f0401b6, 0x7f0401b7, 0x7f0401b8, - 0x7f0401b9, 0x7f0401ba, 0x7f0401bb, 0x7f0401bc, - 0x7f0401bd, 0x7f0401be, 0x7f0401bf, 0x7f0401c0, - 0x7f0401c1, 0x7f0401c2, 0x7f0401c3, 0x7f0401c4, - 0x7f0401c5, 0x7f0401c6, 0x7f0401c7, 0x7f0401c8, - 0x7f0401c9, 0x7f0401ca, 0x7f0401cc, 0x7f0401cd, - 0x7f0401ce - }; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#tabBackground} - * attribute's value can be found in the {@link #TabLayout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:tabBackground - */ - public static final int TabLayout_tabBackground=0; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#tabContentStart} - * attribute's value can be found in the {@link #TabLayout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:tabContentStart - */ - public static final int TabLayout_tabContentStart=1; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#tabGravity} - * attribute's value can be found in the {@link #TabLayout} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - *
ConstantValueDescription
center1
fill0
- * - * @attr name com.scriptor:tabGravity - */ - public static final int TabLayout_tabGravity=2; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#tabIconTint} - * attribute's value can be found in the {@link #TabLayout} array. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:tabIconTint - */ - public static final int TabLayout_tabIconTint=3; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#tabIconTintMode} - * attribute's value can be found in the {@link #TabLayout} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
add10
multiplye
screenf
src_atop9
src_in5
src_over3
- * - * @attr name com.scriptor:tabIconTintMode - */ - public static final int TabLayout_tabIconTintMode=4; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#tabIndicator} - * attribute's value can be found in the {@link #TabLayout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:tabIndicator - */ - public static final int TabLayout_tabIndicator=5; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#tabIndicatorAnimationDuration} - * attribute's value can be found in the {@link #TabLayout} array. - * - *

May be an integer value, such as "100". - * - * @attr name com.scriptor:tabIndicatorAnimationDuration - */ - public static final int TabLayout_tabIndicatorAnimationDuration=6; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#tabIndicatorColor} - * attribute's value can be found in the {@link #TabLayout} array. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:tabIndicatorColor - */ - public static final int TabLayout_tabIndicatorColor=7; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#tabIndicatorFullWidth} - * attribute's value can be found in the {@link #TabLayout} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:tabIndicatorFullWidth - */ - public static final int TabLayout_tabIndicatorFullWidth=8; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#tabIndicatorGravity} - * attribute's value can be found in the {@link #TabLayout} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
bottom0
center1
stretch3
top2
- * - * @attr name com.scriptor:tabIndicatorGravity - */ - public static final int TabLayout_tabIndicatorGravity=9; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#tabIndicatorHeight} - * attribute's value can be found in the {@link #TabLayout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:tabIndicatorHeight - */ - public static final int TabLayout_tabIndicatorHeight=10; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#tabInlineLabel} - * attribute's value can be found in the {@link #TabLayout} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:tabInlineLabel - */ - public static final int TabLayout_tabInlineLabel=11; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#tabMaxWidth} - * attribute's value can be found in the {@link #TabLayout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:tabMaxWidth - */ - public static final int TabLayout_tabMaxWidth=12; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#tabMinWidth} - * attribute's value can be found in the {@link #TabLayout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:tabMinWidth - */ - public static final int TabLayout_tabMinWidth=13; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#tabMode} - * attribute's value can be found in the {@link #TabLayout} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - *
ConstantValueDescription
fixed1
scrollable0
- * - * @attr name com.scriptor:tabMode - */ - public static final int TabLayout_tabMode=14; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#tabPadding} - * attribute's value can be found in the {@link #TabLayout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:tabPadding - */ - public static final int TabLayout_tabPadding=15; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#tabPaddingBottom} - * attribute's value can be found in the {@link #TabLayout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:tabPaddingBottom - */ - public static final int TabLayout_tabPaddingBottom=16; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#tabPaddingEnd} - * attribute's value can be found in the {@link #TabLayout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:tabPaddingEnd - */ - public static final int TabLayout_tabPaddingEnd=17; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#tabPaddingStart} - * attribute's value can be found in the {@link #TabLayout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:tabPaddingStart - */ - public static final int TabLayout_tabPaddingStart=18; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#tabPaddingTop} - * attribute's value can be found in the {@link #TabLayout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:tabPaddingTop - */ - public static final int TabLayout_tabPaddingTop=19; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#tabRippleColor} - * attribute's value can be found in the {@link #TabLayout} array. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:tabRippleColor - */ - public static final int TabLayout_tabRippleColor=20; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#tabSelectedTextColor} - * attribute's value can be found in the {@link #TabLayout} array. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:tabSelectedTextColor - */ - public static final int TabLayout_tabSelectedTextColor=21; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#tabTextAppearance} - * attribute's value can be found in the {@link #TabLayout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:tabTextAppearance - */ - public static final int TabLayout_tabTextAppearance=22; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#tabTextColor} - * attribute's value can be found in the {@link #TabLayout} array. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:tabTextColor - */ - public static final int TabLayout_tabTextColor=23; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#tabUnboundedRipple} - * attribute's value can be found in the {@link #TabLayout} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:tabUnboundedRipple - */ - public static final int TabLayout_tabUnboundedRipple=24; - /** - * Attributes that can be used with a TextAppearance. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #TextAppearance_android_textSize android:textSize}
{@link #TextAppearance_android_typeface android:typeface}
{@link #TextAppearance_android_textStyle android:textStyle}
{@link #TextAppearance_android_textColor android:textColor}
{@link #TextAppearance_android_textColorHint android:textColorHint}
{@link #TextAppearance_android_textColorLink android:textColorLink}
{@link #TextAppearance_android_shadowColor android:shadowColor}
{@link #TextAppearance_android_shadowDx android:shadowDx}
{@link #TextAppearance_android_shadowDy android:shadowDy}
{@link #TextAppearance_android_shadowRadius android:shadowRadius}
{@link #TextAppearance_android_fontFamily android:fontFamily}
{@link #TextAppearance_fontFamily com.scriptor:fontFamily}The attribute for the font family.
{@link #TextAppearance_textAllCaps com.scriptor:textAllCaps}Present the text in ALL CAPS.
- * @see #TextAppearance_android_textSize - * @see #TextAppearance_android_typeface - * @see #TextAppearance_android_textStyle - * @see #TextAppearance_android_textColor - * @see #TextAppearance_android_textColorHint - * @see #TextAppearance_android_textColorLink - * @see #TextAppearance_android_shadowColor - * @see #TextAppearance_android_shadowDx - * @see #TextAppearance_android_shadowDy - * @see #TextAppearance_android_shadowRadius - * @see #TextAppearance_android_fontFamily - * @see #TextAppearance_fontFamily - * @see #TextAppearance_textAllCaps - */ - public static final int[] TextAppearance={ - 0x01010095, 0x01010096, 0x01010097, 0x01010098, - 0x0101009a, 0x0101009b, 0x01010161, 0x01010162, - 0x01010163, 0x01010164, 0x010103ac, 0x7f0400d8, - 0x7f0401cf - }; - /** - *

This symbol is the offset where the {@link android.R.attr#textSize} - * attribute's value can be found in the {@link #TextAppearance} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:textSize - */ - public static final int TextAppearance_android_textSize=0; - /** - *

This symbol is the offset where the {@link android.R.attr#typeface} - * attribute's value can be found in the {@link #TextAppearance} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
monospace3
normal0
sans1
serif2
- * - * @attr name android:typeface - */ - public static final int TextAppearance_android_typeface=1; - /** - *

This symbol is the offset where the {@link android.R.attr#textStyle} - * attribute's value can be found in the {@link #TextAppearance} array. - * - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
bold1
italic2
normal0
- * - * @attr name android:textStyle - */ - public static final int TextAppearance_android_textStyle=2; - /** - *

This symbol is the offset where the {@link android.R.attr#textColor} - * attribute's value can be found in the {@link #TextAppearance} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name android:textColor - */ - public static final int TextAppearance_android_textColor=3; - /** - *

This symbol is the offset where the {@link android.R.attr#textColorHint} - * attribute's value can be found in the {@link #TextAppearance} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name android:textColorHint - */ - public static final int TextAppearance_android_textColorHint=4; - /** - *

This symbol is the offset where the {@link android.R.attr#textColorLink} - * attribute's value can be found in the {@link #TextAppearance} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name android:textColorLink - */ - public static final int TextAppearance_android_textColorLink=5; - /** - *

This symbol is the offset where the {@link android.R.attr#shadowColor} - * attribute's value can be found in the {@link #TextAppearance} array. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name android:shadowColor - */ - public static final int TextAppearance_android_shadowColor=6; - /** - *

This symbol is the offset where the {@link android.R.attr#shadowDx} - * attribute's value can be found in the {@link #TextAppearance} array. - * - *

May be a floating point value, such as "1.2". - * - * @attr name android:shadowDx - */ - public static final int TextAppearance_android_shadowDx=7; - /** - *

This symbol is the offset where the {@link android.R.attr#shadowDy} - * attribute's value can be found in the {@link #TextAppearance} array. - * - *

May be a floating point value, such as "1.2". - * - * @attr name android:shadowDy - */ - public static final int TextAppearance_android_shadowDy=8; - /** - *

This symbol is the offset where the {@link android.R.attr#shadowRadius} - * attribute's value can be found in the {@link #TextAppearance} array. - * - *

May be a floating point value, such as "1.2". - * - * @attr name android:shadowRadius - */ - public static final int TextAppearance_android_shadowRadius=9; - /** - *

This symbol is the offset where the {@link android.R.attr#fontFamily} - * attribute's value can be found in the {@link #TextAppearance} array. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name android:fontFamily - */ - public static final int TextAppearance_android_fontFamily=10; - /** - *

- * @attr description - * The attribute for the font family. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:fontFamily - */ - public static final int TextAppearance_fontFamily=11; - /** - *

- * @attr description - * Present the text in ALL CAPS. This may use a small-caps form when available. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:textAllCaps - */ - public static final int TextAppearance_textAllCaps=12; - /** - * Attributes that can be used with a TextInputLayout. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #TextInputLayout_android_textColorHint android:textColorHint}
{@link #TextInputLayout_android_hint android:hint}
{@link #TextInputLayout_boxBackgroundColor com.scriptor:boxBackgroundColor}
{@link #TextInputLayout_boxBackgroundMode com.scriptor:boxBackgroundMode}
{@link #TextInputLayout_boxCollapsedPaddingTop com.scriptor:boxCollapsedPaddingTop}
{@link #TextInputLayout_boxCornerRadiusBottomEnd com.scriptor:boxCornerRadiusBottomEnd}
{@link #TextInputLayout_boxCornerRadiusBottomStart com.scriptor:boxCornerRadiusBottomStart}
{@link #TextInputLayout_boxCornerRadiusTopEnd com.scriptor:boxCornerRadiusTopEnd}
{@link #TextInputLayout_boxCornerRadiusTopStart com.scriptor:boxCornerRadiusTopStart}
{@link #TextInputLayout_boxStrokeColor com.scriptor:boxStrokeColor}
{@link #TextInputLayout_boxStrokeWidth com.scriptor:boxStrokeWidth}
{@link #TextInputLayout_counterEnabled com.scriptor:counterEnabled}
{@link #TextInputLayout_counterMaxLength com.scriptor:counterMaxLength}
{@link #TextInputLayout_counterOverflowTextAppearance com.scriptor:counterOverflowTextAppearance}
{@link #TextInputLayout_counterTextAppearance com.scriptor:counterTextAppearance}
{@link #TextInputLayout_errorEnabled com.scriptor:errorEnabled}
{@link #TextInputLayout_errorTextAppearance com.scriptor:errorTextAppearance}
{@link #TextInputLayout_helperText com.scriptor:helperText}
{@link #TextInputLayout_helperTextEnabled com.scriptor:helperTextEnabled}
{@link #TextInputLayout_helperTextTextAppearance com.scriptor:helperTextTextAppearance}
{@link #TextInputLayout_hintAnimationEnabled com.scriptor:hintAnimationEnabled}
{@link #TextInputLayout_hintEnabled com.scriptor:hintEnabled}
{@link #TextInputLayout_hintTextAppearance com.scriptor:hintTextAppearance}
{@link #TextInputLayout_passwordToggleContentDescription com.scriptor:passwordToggleContentDescription}
{@link #TextInputLayout_passwordToggleDrawable com.scriptor:passwordToggleDrawable}
{@link #TextInputLayout_passwordToggleEnabled com.scriptor:passwordToggleEnabled}
{@link #TextInputLayout_passwordToggleTint com.scriptor:passwordToggleTint}
{@link #TextInputLayout_passwordToggleTintMode com.scriptor:passwordToggleTintMode}
- * @see #TextInputLayout_android_textColorHint - * @see #TextInputLayout_android_hint - * @see #TextInputLayout_boxBackgroundColor - * @see #TextInputLayout_boxBackgroundMode - * @see #TextInputLayout_boxCollapsedPaddingTop - * @see #TextInputLayout_boxCornerRadiusBottomEnd - * @see #TextInputLayout_boxCornerRadiusBottomStart - * @see #TextInputLayout_boxCornerRadiusTopEnd - * @see #TextInputLayout_boxCornerRadiusTopStart - * @see #TextInputLayout_boxStrokeColor - * @see #TextInputLayout_boxStrokeWidth - * @see #TextInputLayout_counterEnabled - * @see #TextInputLayout_counterMaxLength - * @see #TextInputLayout_counterOverflowTextAppearance - * @see #TextInputLayout_counterTextAppearance - * @see #TextInputLayout_errorEnabled - * @see #TextInputLayout_errorTextAppearance - * @see #TextInputLayout_helperText - * @see #TextInputLayout_helperTextEnabled - * @see #TextInputLayout_helperTextTextAppearance - * @see #TextInputLayout_hintAnimationEnabled - * @see #TextInputLayout_hintEnabled - * @see #TextInputLayout_hintTextAppearance - * @see #TextInputLayout_passwordToggleContentDescription - * @see #TextInputLayout_passwordToggleDrawable - * @see #TextInputLayout_passwordToggleEnabled - * @see #TextInputLayout_passwordToggleTint - * @see #TextInputLayout_passwordToggleTintMode - */ - public static final int[] TextInputLayout={ - 0x0101009a, 0x01010150, 0x7f040045, 0x7f040046, - 0x7f040047, 0x7f040048, 0x7f040049, 0x7f04004a, - 0x7f04004b, 0x7f04004c, 0x7f04004d, 0x7f0400a6, - 0x7f0400a7, 0x7f0400a8, 0x7f0400a9, 0x7f0400bf, - 0x7f0400c0, 0x7f0400e7, 0x7f0400e8, 0x7f0400e9, - 0x7f0400ed, 0x7f0400ee, 0x7f0400ef, 0x7f040173, - 0x7f040174, 0x7f040175, 0x7f040176, 0x7f040177 - }; - /** - *

This symbol is the offset where the {@link android.R.attr#textColorHint} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name android:textColorHint - */ - public static final int TextInputLayout_android_textColorHint=0; - /** - *

This symbol is the offset where the {@link android.R.attr#hint} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name android:hint - */ - public static final int TextInputLayout_android_hint=1; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#boxBackgroundColor} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:boxBackgroundColor - */ - public static final int TextInputLayout_boxBackgroundColor=2; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#boxBackgroundMode} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - *
ConstantValueDescription
filled1
none0
outline2
- * - * @attr name com.scriptor:boxBackgroundMode - */ - public static final int TextInputLayout_boxBackgroundMode=3; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#boxCollapsedPaddingTop} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:boxCollapsedPaddingTop - */ - public static final int TextInputLayout_boxCollapsedPaddingTop=4; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#boxCornerRadiusBottomEnd} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:boxCornerRadiusBottomEnd - */ - public static final int TextInputLayout_boxCornerRadiusBottomEnd=5; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#boxCornerRadiusBottomStart} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:boxCornerRadiusBottomStart - */ - public static final int TextInputLayout_boxCornerRadiusBottomStart=6; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#boxCornerRadiusTopEnd} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:boxCornerRadiusTopEnd - */ - public static final int TextInputLayout_boxCornerRadiusTopEnd=7; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#boxCornerRadiusTopStart} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:boxCornerRadiusTopStart - */ - public static final int TextInputLayout_boxCornerRadiusTopStart=8; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#boxStrokeColor} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:boxStrokeColor - */ - public static final int TextInputLayout_boxStrokeColor=9; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#boxStrokeWidth} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:boxStrokeWidth - */ - public static final int TextInputLayout_boxStrokeWidth=10; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#counterEnabled} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:counterEnabled - */ - public static final int TextInputLayout_counterEnabled=11; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#counterMaxLength} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

May be an integer value, such as "100". - * - * @attr name com.scriptor:counterMaxLength - */ - public static final int TextInputLayout_counterMaxLength=12; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#counterOverflowTextAppearance} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:counterOverflowTextAppearance - */ - public static final int TextInputLayout_counterOverflowTextAppearance=13; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#counterTextAppearance} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:counterTextAppearance - */ - public static final int TextInputLayout_counterTextAppearance=14; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#errorEnabled} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:errorEnabled - */ - public static final int TextInputLayout_errorEnabled=15; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#errorTextAppearance} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:errorTextAppearance - */ - public static final int TextInputLayout_errorTextAppearance=16; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#helperText} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:helperText - */ - public static final int TextInputLayout_helperText=17; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#helperTextEnabled} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:helperTextEnabled - */ - public static final int TextInputLayout_helperTextEnabled=18; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#helperTextTextAppearance} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:helperTextTextAppearance - */ - public static final int TextInputLayout_helperTextTextAppearance=19; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#hintAnimationEnabled} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:hintAnimationEnabled - */ - public static final int TextInputLayout_hintAnimationEnabled=20; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#hintEnabled} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:hintEnabled - */ - public static final int TextInputLayout_hintEnabled=21; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#hintTextAppearance} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:hintTextAppearance - */ - public static final int TextInputLayout_hintTextAppearance=22; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#passwordToggleContentDescription} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:passwordToggleContentDescription - */ - public static final int TextInputLayout_passwordToggleContentDescription=23; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#passwordToggleDrawable} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:passwordToggleDrawable - */ - public static final int TextInputLayout_passwordToggleDrawable=24; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#passwordToggleEnabled} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:passwordToggleEnabled - */ - public static final int TextInputLayout_passwordToggleEnabled=25; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#passwordToggleTint} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:passwordToggleTint - */ - public static final int TextInputLayout_passwordToggleTint=26; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#passwordToggleTintMode} - * attribute's value can be found in the {@link #TextInputLayout} array. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
multiplye
screenf
src_atop9
src_in5
src_over3
- * - * @attr name com.scriptor:passwordToggleTintMode - */ - public static final int TextInputLayout_passwordToggleTintMode=27; - /** - * Attributes that can be used with a ThemeEnforcement. - *

Includes the following attributes:

- * - * - * - * - * - * - * - *
AttributeDescription
{@link #ThemeEnforcement_android_textAppearance android:textAppearance}
{@link #ThemeEnforcement_enforceMaterialTheme com.scriptor:enforceMaterialTheme}
{@link #ThemeEnforcement_enforceTextAppearance com.scriptor:enforceTextAppearance}
- * @see #ThemeEnforcement_android_textAppearance - * @see #ThemeEnforcement_enforceMaterialTheme - * @see #ThemeEnforcement_enforceTextAppearance - */ - public static final int[] ThemeEnforcement={ - 0x01010034, 0x7f0400bd, 0x7f0400be - }; - /** - *

This symbol is the offset where the {@link android.R.attr#textAppearance} - * attribute's value can be found in the {@link #ThemeEnforcement} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:textAppearance - */ - public static final int ThemeEnforcement_android_textAppearance=0; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#enforceMaterialTheme} - * attribute's value can be found in the {@link #ThemeEnforcement} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:enforceMaterialTheme - */ - public static final int ThemeEnforcement_enforceMaterialTheme=1; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#enforceTextAppearance} - * attribute's value can be found in the {@link #ThemeEnforcement} array. - * - *

May be a boolean value, such as "true" or - * "false". - * - * @attr name com.scriptor:enforceTextAppearance - */ - public static final int ThemeEnforcement_enforceTextAppearance=2; - /** - * Attributes that can be used with a Toolbar. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #Toolbar_android_gravity android:gravity}
{@link #Toolbar_android_minHeight android:minHeight}
{@link #Toolbar_buttonGravity com.scriptor:buttonGravity}
{@link #Toolbar_collapseContentDescription com.scriptor:collapseContentDescription}Text to set as the content description for the collapse button.
{@link #Toolbar_collapseIcon com.scriptor:collapseIcon}Icon drawable to use for the collapse button.
{@link #Toolbar_contentInsetEnd com.scriptor:contentInsetEnd}Minimum inset for content views within a bar.
{@link #Toolbar_contentInsetEndWithActions com.scriptor:contentInsetEndWithActions}Minimum inset for content views within a bar when actions from a menu - * are present.
{@link #Toolbar_contentInsetLeft com.scriptor:contentInsetLeft}Minimum inset for content views within a bar.
{@link #Toolbar_contentInsetRight com.scriptor:contentInsetRight}Minimum inset for content views within a bar.
{@link #Toolbar_contentInsetStart com.scriptor:contentInsetStart}Minimum inset for content views within a bar.
{@link #Toolbar_contentInsetStartWithNavigation com.scriptor:contentInsetStartWithNavigation}Minimum inset for content views within a bar when a navigation button - * is present, such as the Up button.
{@link #Toolbar_logo com.scriptor:logo}Specifies the drawable used for the application logo.
{@link #Toolbar_logoDescription com.scriptor:logoDescription}A content description string to describe the appearance of the - * associated logo image.
{@link #Toolbar_maxButtonHeight com.scriptor:maxButtonHeight}
{@link #Toolbar_navigationContentDescription com.scriptor:navigationContentDescription}Text to set as the content description for the navigation button - * located at the start of the toolbar.
{@link #Toolbar_navigationIcon com.scriptor:navigationIcon}Icon drawable to use for the navigation button located at - * the start of the toolbar.
{@link #Toolbar_popupTheme com.scriptor:popupTheme}Reference to a theme that should be used to inflate popups - * shown by widgets in the action bar.
{@link #Toolbar_subtitle com.scriptor:subtitle}Specifies subtitle text used for navigationMode="normal"
{@link #Toolbar_subtitleTextAppearance com.scriptor:subtitleTextAppearance}
{@link #Toolbar_subtitleTextColor com.scriptor:subtitleTextColor}A color to apply to the subtitle string.
{@link #Toolbar_title com.scriptor:title}
{@link #Toolbar_titleMargin com.scriptor:titleMargin}Specifies extra space on the left, start, right and end sides - * of the toolbar's title.
{@link #Toolbar_titleMarginBottom com.scriptor:titleMarginBottom}Specifies extra space on the bottom side of the toolbar's title.
{@link #Toolbar_titleMarginEnd com.scriptor:titleMarginEnd}Specifies extra space on the end side of the toolbar's title.
{@link #Toolbar_titleMarginStart com.scriptor:titleMarginStart}Specifies extra space on the start side of the toolbar's title.
{@link #Toolbar_titleMarginTop com.scriptor:titleMarginTop}Specifies extra space on the top side of the toolbar's title.
{@link #Toolbar_titleMargins com.scriptor:titleMargins}{@deprecated Use titleMargin}
{@link #Toolbar_titleTextAppearance com.scriptor:titleTextAppearance}
{@link #Toolbar_titleTextColor com.scriptor:titleTextColor}A color to apply to the title string.
- * @see #Toolbar_android_gravity - * @see #Toolbar_android_minHeight - * @see #Toolbar_buttonGravity - * @see #Toolbar_collapseContentDescription - * @see #Toolbar_collapseIcon - * @see #Toolbar_contentInsetEnd - * @see #Toolbar_contentInsetEndWithActions - * @see #Toolbar_contentInsetLeft - * @see #Toolbar_contentInsetRight - * @see #Toolbar_contentInsetStart - * @see #Toolbar_contentInsetStartWithNavigation - * @see #Toolbar_logo - * @see #Toolbar_logoDescription - * @see #Toolbar_maxButtonHeight - * @see #Toolbar_navigationContentDescription - * @see #Toolbar_navigationIcon - * @see #Toolbar_popupTheme - * @see #Toolbar_subtitle - * @see #Toolbar_subtitleTextAppearance - * @see #Toolbar_subtitleTextColor - * @see #Toolbar_title - * @see #Toolbar_titleMargin - * @see #Toolbar_titleMarginBottom - * @see #Toolbar_titleMarginEnd - * @see #Toolbar_titleMarginStart - * @see #Toolbar_titleMarginTop - * @see #Toolbar_titleMargins - * @see #Toolbar_titleTextAppearance - * @see #Toolbar_titleTextColor - */ - @Deprecated - public static final int[] Toolbar={ - 0x010100af, 0x01010140, 0x7f040053, 0x7f040082, - 0x7f040083, 0x7f040097, 0x7f040098, 0x7f040099, - 0x7f04009a, 0x7f04009b, 0x7f04009c, 0x7f04015c, - 0x7f04015d, 0x7f040161, 0x7f040166, 0x7f040167, - 0x7f040179, 0x7f0401ac, 0x7f0401ad, 0x7f0401ae, - 0x7f0401f4, 0x7f0401f6, 0x7f0401f7, 0x7f0401f8, - 0x7f0401f9, 0x7f0401fa, 0x7f0401fb, 0x7f0401fc, - 0x7f0401fd - }; - /** - *

This symbol is the offset where the {@link android.R.attr#gravity} - * attribute's value can be found in the {@link #Toolbar} array. - * - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
bottom50
center11
center_horizontal1
center_vertical10
clip_horizontal8
clip_vertical80
end800005
fill77
fill_horizontal7
fill_vertical70
left3
right5
start800003
top30
- * - * @attr name android:gravity - */ - public static final int Toolbar_android_gravity=0; - /** - *

This symbol is the offset where the {@link android.R.attr#minHeight} - * attribute's value can be found in the {@link #Toolbar} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name android:minHeight - */ - public static final int Toolbar_android_minHeight=1; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#buttonGravity} - * attribute's value can be found in the {@link #Toolbar} array. - * - *

Must be one or more (separated by '|') of the following constant values.

- * - * - * - * - * - * - * - *
ConstantValueDescription
bottom50Push object to the bottom of its container, not changing its size.
top30Push object to the top of its container, not changing its size.
- * - * @attr name com.scriptor:buttonGravity - */ - public static final int Toolbar_buttonGravity=2; - /** - *

- * @attr description - * Text to set as the content description for the collapse button. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:collapseContentDescription - */ - public static final int Toolbar_collapseContentDescription=3; - /** - *

- * @attr description - * Icon drawable to use for the collapse button. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:collapseIcon - */ - public static final int Toolbar_collapseIcon=4; - /** - *

- * @attr description - * Minimum inset for content views within a bar. Navigation buttons and - * menu views are excepted. Only valid for some themes and configurations. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:contentInsetEnd - */ - public static final int Toolbar_contentInsetEnd=5; - /** - *

- * @attr description - * Minimum inset for content views within a bar when actions from a menu - * are present. Only valid for some themes and configurations. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:contentInsetEndWithActions - */ - public static final int Toolbar_contentInsetEndWithActions=6; - /** - *

- * @attr description - * Minimum inset for content views within a bar. Navigation buttons and - * menu views are excepted. Only valid for some themes and configurations. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:contentInsetLeft - */ - public static final int Toolbar_contentInsetLeft=7; - /** - *

- * @attr description - * Minimum inset for content views within a bar. Navigation buttons and - * menu views are excepted. Only valid for some themes and configurations. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:contentInsetRight - */ - public static final int Toolbar_contentInsetRight=8; - /** - *

- * @attr description - * Minimum inset for content views within a bar. Navigation buttons and - * menu views are excepted. Only valid for some themes and configurations. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:contentInsetStart - */ - public static final int Toolbar_contentInsetStart=9; - /** - *

- * @attr description - * Minimum inset for content views within a bar when a navigation button - * is present, such as the Up button. Only valid for some themes and configurations. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:contentInsetStartWithNavigation - */ - public static final int Toolbar_contentInsetStartWithNavigation=10; - /** - *

- * @attr description - * Drawable to set as the logo that appears at the starting side of - * the Toolbar, just after the navigation button. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:logo - */ - public static final int Toolbar_logo=11; - /** - *

- * @attr description - * A content description string to describe the appearance of the - * associated logo image. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:logoDescription - */ - public static final int Toolbar_logoDescription=12; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#maxButtonHeight} - * attribute's value can be found in the {@link #Toolbar} array. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:maxButtonHeight - */ - public static final int Toolbar_maxButtonHeight=13; - /** - *

- * @attr description - * Text to set as the content description for the navigation button - * located at the start of the toolbar. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:navigationContentDescription - */ - public static final int Toolbar_navigationContentDescription=14; - /** - *

- * @attr description - * Icon drawable to use for the navigation button located at - * the start of the toolbar. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:navigationIcon - */ - public static final int Toolbar_navigationIcon=15; - /** - *

- * @attr description - * Reference to a theme that should be used to inflate popups - * shown by widgets in the toolbar. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:popupTheme - */ - public static final int Toolbar_popupTheme=16; - /** - *

- * @attr description - * Specifies subtitle text used for navigationMode="normal" - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:subtitle - */ - public static final int Toolbar_subtitle=17; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#subtitleTextAppearance} - * attribute's value can be found in the {@link #Toolbar} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:subtitleTextAppearance - */ - public static final int Toolbar_subtitleTextAppearance=18; - /** - *

- * @attr description - * A color to apply to the subtitle string. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:subtitleTextColor - */ - public static final int Toolbar_subtitleTextColor=19; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#title} - * attribute's value can be found in the {@link #Toolbar} array. - * - *

May be a string value, using '\\;' to escape characters such as - * '\\n' or '\\uxxxx' for a unicode character; - * - * @attr name com.scriptor:title - */ - public static final int Toolbar_title=20; - /** - *

- * @attr description - * Specifies extra space on the left, start, right and end sides - * of the toolbar's title. Margin values should be positive. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:titleMargin - */ - public static final int Toolbar_titleMargin=21; - /** - *

- * @attr description - * Specifies extra space on the bottom side of the toolbar's title. - * If both this attribute and titleMargin are specified, then this - * attribute takes precedence. Margin values should be positive. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:titleMarginBottom - */ - public static final int Toolbar_titleMarginBottom=22; - /** - *

- * @attr description - * Specifies extra space on the end side of the toolbar's title. - * If both this attribute and titleMargin are specified, then this - * attribute takes precedence. Margin values should be positive. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:titleMarginEnd - */ - public static final int Toolbar_titleMarginEnd=23; - /** - *

- * @attr description - * Specifies extra space on the start side of the toolbar's title. - * If both this attribute and titleMargin are specified, then this - * attribute takes precedence. Margin values should be positive. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:titleMarginStart - */ - public static final int Toolbar_titleMarginStart=24; - /** - *

- * @attr description - * Specifies extra space on the top side of the toolbar's title. - * If both this attribute and titleMargin are specified, then this - * attribute takes precedence. Margin values should be positive. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:titleMarginTop - */ - public static final int Toolbar_titleMarginTop=25; - /** - *

- * @attr description - * {@deprecated Use titleMargin} - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:titleMargins - */ - @Deprecated - public static final int Toolbar_titleMargins=26; - /** - *

This symbol is the offset where the {@link com.scriptor.R.attr#titleTextAppearance} - * attribute's value can be found in the {@link #Toolbar} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:titleTextAppearance - */ - public static final int Toolbar_titleTextAppearance=27; - /** - *

- * @attr description - * A color to apply to the title string. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:titleTextColor - */ - public static final int Toolbar_titleTextColor=28; - /** - * Attributes that can be used with a View. - *

Includes the following attributes:

- * - * - * - * - * - * - * - * - * - *
AttributeDescription
{@link #View_android_theme android:theme}
{@link #View_android_focusable android:focusable}
{@link #View_paddingEnd com.scriptor:paddingEnd}Sets the padding, in pixels, of the end edge; see {@link android.R.attr#padding}.
{@link #View_paddingStart com.scriptor:paddingStart}Sets the padding, in pixels, of the start edge; see {@link android.R.attr#padding}.
{@link #View_theme com.scriptor:theme}Deprecated.
- * @see #View_android_theme - * @see #View_android_focusable - * @see #View_paddingEnd - * @see #View_paddingStart - * @see #View_theme - */ - public static final int[] View={ - 0x01010000, 0x010100da, 0x7f04016d, 0x7f04016e, - 0x7f0401ea - }; - /** - *

- * @attr description - * Specifies a theme override for a view. When a theme override is set, the - * view will be inflated using a {@link android.content.Context} themed with - * the specified resource. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:theme - */ - public static final int View_android_theme=0; - /** - *

- * @attr description - * Boolean that controls whether a view can take focus. By default the user can not - * move focus to a view; by setting this attribute to true the view is - * allowed to take focus. This value does not impact the behavior of - * directly calling {@link android.view.View#requestFocus}, which will - * always request focus regardless of this view. It only impacts where - * focus navigation will try to move focus. - * - *

May be a boolean value, such as "true" or - * "false". - *

Must be one of the following constant values.

- * - * - * - * - * - * - *
ConstantValueDescription
auto10
- * - * @attr name android:focusable - */ - public static final int View_android_focusable=1; - /** - *

- * @attr description - * Sets the padding, in pixels, of the end edge; see {@link android.R.attr#padding}. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:paddingEnd - */ - public static final int View_paddingEnd=2; - /** - *

- * @attr description - * Sets the padding, in pixels, of the start edge; see {@link android.R.attr#padding}. - * - *

May be a dimension value, which is a floating point number appended with a - * unit such as "14.5sp". - * Available units are: px (pixels), dp (density-independent pixels), - * sp (scaled pixels based on preferred font size), in (inches), and - * mm (millimeters). - * - * @attr name com.scriptor:paddingStart - */ - public static final int View_paddingStart=3; - /** - *

- * @attr description - * Deprecated. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name com.scriptor:theme - */ - public static final int View_theme=4; - /** - * Attributes that can be used with a ViewBackgroundHelper. - *

Includes the following attributes:

- * - * - * - * - * - * - * - *
AttributeDescription
{@link #ViewBackgroundHelper_android_background android:background}
{@link #ViewBackgroundHelper_backgroundTint com.scriptor:backgroundTint}Tint to apply to the background.
{@link #ViewBackgroundHelper_backgroundTintMode com.scriptor:backgroundTintMode}Blending mode used to apply the background tint.
- * @see #ViewBackgroundHelper_android_background - * @see #ViewBackgroundHelper_backgroundTint - * @see #ViewBackgroundHelper_backgroundTintMode - */ - public static final int[] ViewBackgroundHelper={ - 0x010100d4, 0x7f040034, 0x7f040035 - }; - /** - *

This symbol is the offset where the {@link android.R.attr#background} - * attribute's value can be found in the {@link #ViewBackgroundHelper} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name android:background - */ - public static final int ViewBackgroundHelper_android_background=0; - /** - *

- * @attr description - * Tint to apply to the background. - * - *

May be a color value, in the form of "#rgb", - * "#argb", "#rrggbb", or - * "#aarrggbb". - * - * @attr name com.scriptor:backgroundTint - */ - public static final int ViewBackgroundHelper_backgroundTint=1; - /** - *

- * @attr description - * Blending mode used to apply the background tint. - * - *

Must be one of the following constant values.

- * - * - * - * - * - * - * - * - * - * - * - *
ConstantValueDescription
add10Combines the tint and icon color and alpha channels, clamping the - * result to valid color values. Saturate(S + D)
multiplyeMultiplies the color and alpha channels of the drawable with those of - * the tint. [Sa * Da, Sc * Dc]
screenf[Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]
src_atop9The tint is drawn above the drawable, but with the drawable’s alpha - * channel masking the result. [Da, Sc * Da + (1 - Sa) * Dc]
src_in5The tint is masked by the alpha channel of the drawable. The drawable’s - * color channels are thrown out. [Sa * Da, Sc * Da]
src_over3The tint is drawn on top of the drawable. - * [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc]
- * - * @attr name com.scriptor:backgroundTintMode - */ - public static final int ViewBackgroundHelper_backgroundTintMode=2; - /** - * Attributes that can be used with a ViewStubCompat. - *

Includes the following attributes:

- * - * - * - * - * - * - * - *
AttributeDescription
{@link #ViewStubCompat_android_id android:id}
{@link #ViewStubCompat_android_layout android:layout}
{@link #ViewStubCompat_android_inflatedId android:inflatedId}
- * @see #ViewStubCompat_android_id - * @see #ViewStubCompat_android_layout - * @see #ViewStubCompat_android_inflatedId - */ - public static final int[] ViewStubCompat={ - 0x010100d0, 0x010100f2, 0x010100f3 - }; - /** - *

This symbol is the offset where the {@link android.R.attr#id} - * attribute's value can be found in the {@link #ViewStubCompat} array. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:id - */ - public static final int ViewStubCompat_android_id=0; - /** - *

- * @attr description - * Supply an identifier for the layout resource to inflate when the ViewStub - * becomes visible or when forced to do so. The layout resource must be a - * valid reference to a layout. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:layout - */ - public static final int ViewStubCompat_android_layout=1; - /** - *

- * @attr description - * Overrides the id of the inflated View with this value. - * - *

May be a reference to another resource, in the form - * "@[+][package:]type/name" or a theme - * attribute in the form - * "?[package:]type/name". - * - * @attr name android:inflatedId - */ - public static final int ViewStubCompat_android_inflatedId=2; - } -} \ No newline at end of file diff --git a/code/Android App/build/generated/res/pngs/debug/drawable-anydpi-v21/ic_launcher_background.xml b/code/Android App/build/generated/res/pngs/debug/drawable-anydpi-v21/ic_launcher_background.xml deleted file mode 100755 index 0d025f9..0000000 --- a/code/Android App/build/generated/res/pngs/debug/drawable-anydpi-v21/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/code/Android App/build/generated/res/pngs/debug/drawable-hdpi/ic_launcher_background.png b/code/Android App/build/generated/res/pngs/debug/drawable-hdpi/ic_launcher_background.png deleted file mode 100755 index fc2b9fd..0000000 Binary files a/code/Android App/build/generated/res/pngs/debug/drawable-hdpi/ic_launcher_background.png and /dev/null differ diff --git a/code/Android App/build/generated/res/pngs/debug/drawable-ldpi/ic_launcher_background.png b/code/Android App/build/generated/res/pngs/debug/drawable-ldpi/ic_launcher_background.png deleted file mode 100755 index 4049425..0000000 Binary files a/code/Android App/build/generated/res/pngs/debug/drawable-ldpi/ic_launcher_background.png and /dev/null differ diff --git a/code/Android App/build/generated/res/pngs/debug/drawable-mdpi/ic_launcher_background.png b/code/Android App/build/generated/res/pngs/debug/drawable-mdpi/ic_launcher_background.png deleted file mode 100755 index 344e208..0000000 Binary files a/code/Android App/build/generated/res/pngs/debug/drawable-mdpi/ic_launcher_background.png and /dev/null differ diff --git a/code/Android App/build/generated/res/pngs/debug/drawable-xhdpi/ic_launcher_background.png b/code/Android App/build/generated/res/pngs/debug/drawable-xhdpi/ic_launcher_background.png deleted file mode 100755 index 77014c5..0000000 Binary files a/code/Android App/build/generated/res/pngs/debug/drawable-xhdpi/ic_launcher_background.png and /dev/null differ diff --git a/code/Android App/build/generated/res/pngs/debug/drawable-xxhdpi/ic_launcher_background.png b/code/Android App/build/generated/res/pngs/debug/drawable-xxhdpi/ic_launcher_background.png deleted file mode 100755 index 327fa8b..0000000 Binary files a/code/Android App/build/generated/res/pngs/debug/drawable-xxhdpi/ic_launcher_background.png and /dev/null differ diff --git a/code/Android App/build/generated/res/pngs/debug/drawable-xxxhdpi/ic_launcher_background.png b/code/Android App/build/generated/res/pngs/debug/drawable-xxxhdpi/ic_launcher_background.png deleted file mode 100755 index 93984bf..0000000 Binary files a/code/Android App/build/generated/res/pngs/debug/drawable-xxxhdpi/ic_launcher_background.png and /dev/null differ diff --git a/code/Android App/build/generated/source/buildConfig/debug/com/scriptor/BuildConfig.java b/code/Android App/build/generated/source/buildConfig/debug/com/scriptor/BuildConfig.java deleted file mode 100755 index facf78a..0000000 --- a/code/Android App/build/generated/source/buildConfig/debug/com/scriptor/BuildConfig.java +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Automatically generated file. DO NOT MODIFY - */ -package com.scriptor; - -public final class BuildConfig { - public static final boolean DEBUG = Boolean.parseBoolean("true"); - public static final String APPLICATION_ID = "com.scriptor"; - public static final String BUILD_TYPE = "debug"; - public static final String FLAVOR = ""; - public static final int VERSION_CODE = 1; - public static final String VERSION_NAME = "1.0"; -} diff --git a/code/Android App/build/intermediates/annotation_processor_list/debug/annotationProcessors.json b/code/Android App/build/intermediates/annotation_processor_list/debug/annotationProcessors.json deleted file mode 100755 index 9e26dfe..0000000 --- a/code/Android App/build/intermediates/annotation_processor_list/debug/annotationProcessors.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/code/Android App/build/intermediates/apk_list/debug/mainApkListPersistenceDebug/apk-list.gson b/code/Android App/build/intermediates/apk_list/debug/mainApkListPersistenceDebug/apk-list.gson deleted file mode 100755 index eaec468..0000000 --- a/code/Android App/build/intermediates/apk_list/debug/mainApkListPersistenceDebug/apk-list.gson +++ /dev/null @@ -1 +0,0 @@ -[{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-debug.apk","fullName":"debug","baseName":"debug"}] \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/debug.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/debug.json deleted file mode 100755 index 811971d..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/debug.json +++ /dev/null @@ -1,3416 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-iw_values-iw.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-iw\\values-iw.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,209,308,416,500,600,714,792,870,961,1055,1151,1245,1346,1439,1534,1631,1722,1814,1895,1997,2101,2199,2302,2403,2503,2655,2751", - "endColumns": "103,98,107,83,99,113,77,77,90,93,95,93,100,92,94,96,90,91,80,101,103,97,102,100,99,151,95,80", - "endOffsets": "204,303,411,495,595,709,787,865,956,1050,1146,1240,1341,1434,1529,1626,1717,1809,1890,1992,2096,2194,2297,2398,2498,2650,2746,2827" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-iw\\values-iw.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2832", - "endColumns": "100", - "endOffsets": "2928" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-sl_values-sl.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-sl\\values-sl.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2936", - "endColumns": "100", - "endOffsets": "3032" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-sl\\values-sl.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,212,319,427,514,617,736,821,905,997,1091,1187,1281,1377,1471,1567,1667,1759,1851,1935,2043,2152,2252,2365,2472,2576,2756,2853", - "endColumns": "106,106,107,86,102,118,84,83,91,93,95,93,95,93,95,99,91,91,83,107,108,99,112,106,103,179,96,82", - "endOffsets": "207,314,422,509,612,731,816,900,992,1086,1182,1276,1372,1466,1562,1662,1754,1846,1930,2038,2147,2247,2360,2467,2571,2751,2848,2931" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-land_values-land.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-land\\values-land.xml", - "from": { - "startLines": "2,3,4", - "startColumns": "4,4,4", - "startOffsets": "55,125,196", - "endColumns": "69,70,67", - "endOffsets": "120,191,259" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\values-land\\values-land.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endLines": "5", - "endColumns": "10", - "endOffsets": "222" - }, - "to": { - "startLines": "5", - "startColumns": "4", - "startOffsets": "264", - "endLines": "8", - "endColumns": "10", - "endOffsets": "431" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-ja_values-ja.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ja\\values-ja.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,202,295,400,482,580,688,765,841,932,1025,1121,1215,1316,1409,1504,1598,1689,1780,1858,1960,2059,2154,2257,2352,2448,2596,2693", - "endColumns": "96,92,104,81,97,107,76,75,90,92,95,93,100,92,94,93,90,90,77,101,98,94,102,94,95,147,96,77", - "endOffsets": "197,290,395,477,575,683,760,836,927,1020,1116,1210,1311,1404,1499,1593,1684,1775,1853,1955,2054,2149,2252,2347,2443,2591,2688,2766" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-ja\\values-ja.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2771", - "endColumns": "100", - "endOffsets": "2867" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-fi_values-fi.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-fi\\values-fi.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2872", - "endColumns": "100", - "endOffsets": "2968" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-fi\\values-fi.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,313,414,500,605,723,810,892,983,1076,1172,1266,1361,1454,1550,1649,1740,1834,1914,2021,2124,2221,2327,2426,2530,2693,2792", - "endColumns": "107,99,100,85,104,117,86,81,90,92,95,93,94,92,95,98,90,93,79,106,102,96,105,98,103,162,98,79", - "endOffsets": "208,308,409,495,600,718,805,887,978,1071,1167,1261,1356,1449,1545,1644,1735,1829,1909,2016,2119,2216,2322,2421,2525,2688,2787,2867" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-fr_values-fr.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-fr\\values-fr.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2945", - "endColumns": "100", - "endOffsets": "3041" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-fr\\values-fr.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,216,331,442,524,630,760,843,923,1014,1107,1206,1301,1402,1495,1588,1683,1774,1865,1951,2061,2173,2276,2387,2494,2601,2760,2859", - "endColumns": "110,114,110,81,105,129,82,79,90,92,98,94,100,92,92,94,90,90,85,109,111,102,110,106,106,158,98,85", - "endOffsets": "211,326,437,519,625,755,838,918,1009,1102,1201,1296,1397,1490,1583,1678,1769,1860,1946,2056,2168,2271,2382,2489,2596,2755,2854,2940" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-nb_values-nb.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-nb\\values-nb.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,308,422,508,608,721,797,873,964,1057,1153,1247,1348,1441,1536,1634,1725,1816,1896,1999,2098,2194,2298,2396,2497,2650,2747", - "endColumns": "107,94,113,85,99,112,75,75,90,92,95,93,100,92,94,97,90,90,79,102,98,95,103,97,100,152,96,78", - "endOffsets": "208,303,417,503,603,716,792,868,959,1052,1148,1242,1343,1436,1531,1629,1720,1811,1891,1994,2093,2189,2293,2391,2492,2645,2742,2821" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-nb\\values-nb.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2826", - "endColumns": "100", - "endOffsets": "2922" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-uz_values-uz.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-uz\\values-uz.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,210,314,428,514,614,730,810,889,980,1073,1169,1263,1358,1451,1546,1641,1732,1824,1908,2017,2124,2225,2333,2438,2545,2706,2805", - "endColumns": "104,103,113,85,99,115,79,78,90,92,95,93,94,92,94,94,90,91,83,108,106,100,107,104,106,160,98,83", - "endOffsets": "205,309,423,509,609,725,805,884,975,1068,1164,1258,1353,1446,1541,1636,1727,1819,1903,2012,2119,2220,2328,2433,2540,2701,2800,2884" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-uz\\values-uz.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2889", - "endColumns": "100", - "endOffsets": "2985" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-zh-rTW_values-zh-rTW.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-zh-rTW\\values-zh-rTW.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,200,293,393,475,572,680,756,832,924,1018,1116,1212,1308,1402,1498,1590,1682,1774,1852,1948,2044,2139,2236,2331,2431,2581,2675", - "endColumns": "94,92,99,81,96,107,75,75,91,93,97,95,95,93,95,91,91,91,77,95,95,94,96,94,99,149,93,77", - "endOffsets": "195,288,388,470,567,675,751,827,919,1013,1111,1207,1303,1397,1493,1585,1677,1769,1847,1943,2039,2134,2231,2326,2426,2576,2670,2748" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-zh-rTW\\values-zh-rTW.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2753", - "endColumns": "100", - "endOffsets": "2849" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-tl_values-tl.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-tl\\values-tl.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2949", - "endColumns": "100", - "endOffsets": "3045" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-tl\\values-tl.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,224,332,449,537,643,764,843,921,1012,1105,1201,1295,1396,1489,1584,1678,1769,1860,1944,2053,2164,2265,2375,2492,2600,2763,2865", - "endColumns": "118,107,116,87,105,120,78,77,90,92,95,93,100,92,94,93,90,90,83,108,110,100,109,116,107,162,101,83", - "endOffsets": "219,327,444,532,638,759,838,916,1007,1100,1196,1290,1391,1484,1579,1673,1764,1855,1939,2048,2159,2260,2370,2487,2595,2758,2860,2944" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-v28_values-v28.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-v28\\values-v28.xml", - "from": { - "startLines": "2,3,4,8", - "startColumns": "4,4,4,4", - "startOffsets": "55,130,217,447", - "endLines": "2,3,7,11", - "endColumns": "74,86,12,12", - "endOffsets": "125,212,442,684" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-en-rAU_values-en-rAU.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-en-rAU\\values-en-rAU.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,209,309,417,501,601,716,793,869,960,1053,1149,1243,1344,1437,1532,1626,1717,1808,1890,1993,2097,2196,2301,2404,2508,2664,2764", - "endColumns": "103,99,107,83,99,114,76,75,90,92,95,93,100,92,94,93,90,90,81,102,103,98,104,102,103,155,99,81", - "endOffsets": "204,304,412,496,596,711,788,864,955,1048,1144,1238,1339,1432,1527,1621,1712,1803,1885,1988,2092,2191,2296,2399,2503,2659,2759,2841" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-en-rAU\\values-en-rAU.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2846", - "endColumns": "100", - "endOffsets": "2942" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-mk_values-mk.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-mk\\values-mk.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,317,425,511,616,735,818,900,997,1096,1193,1293,1400,1499,1600,1696,1793,1884,1971,2077,2184,2285,2392,2503,2607,2763,2861", - "endColumns": "107,103,107,85,104,118,82,81,96,98,96,99,106,98,100,95,96,90,86,105,106,100,106,110,103,155,97,83", - "endOffsets": "208,312,420,506,611,730,813,895,992,1091,1188,1288,1395,1494,1595,1691,1788,1879,1966,2072,2179,2280,2387,2498,2602,2758,2856,2940" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-mk\\values-mk.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2945", - "endColumns": "100", - "endOffsets": "3041" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-in_values-in.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-in\\values-in.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,215,317,422,509,613,729,811,890,981,1074,1170,1264,1365,1458,1553,1647,1738,1829,1915,2018,2127,2228,2332,2440,2548,2704,2803", - "endColumns": "109,101,104,86,103,115,81,78,90,92,95,93,100,92,94,93,90,90,85,102,108,100,103,107,107,155,98,83", - "endOffsets": "210,312,417,504,608,724,806,885,976,1069,1165,1259,1360,1453,1548,1642,1733,1824,1910,2013,2122,2223,2327,2435,2543,2699,2798,2882" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-in\\values-in.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2887", - "endColumns": "100", - "endOffsets": "2983" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-v24_values-v24.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-v24\\values-v24.xml", - "from": { - "startLines": "2,3", - "startColumns": "4,4", - "startOffsets": "55,212", - "endColumns": "156,134", - "endOffsets": "207,342" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-pt_values-pt.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-pt\\values-pt.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2929", - "endColumns": "100", - "endOffsets": "3025" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-pt\\values-pt.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,225,331,438,527,628,746,829,909,1000,1093,1189,1283,1384,1477,1572,1667,1758,1849,1936,2043,2155,2257,2365,2472,2582,2744,2844", - "endColumns": "119,105,106,88,100,117,82,79,90,92,95,93,100,92,94,94,90,90,86,106,111,101,107,106,109,161,99,84", - "endOffsets": "220,326,433,522,623,741,824,904,995,1088,1184,1278,1379,1472,1567,1662,1753,1844,1931,2038,2150,2252,2360,2467,2577,2739,2839,2924" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-hi_values-hi.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-hi\\values-hi.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,211,308,418,504,606,728,805,883,974,1067,1163,1257,1358,1451,1546,1640,1731,1822,1912,2021,2124,2226,2336,2437,2549,2711,2812", - "endColumns": "105,96,109,85,101,121,76,77,90,92,95,93,100,92,94,93,90,90,89,108,102,101,109,100,111,161,100,79", - "endOffsets": "206,303,413,499,601,723,800,878,969,1062,1158,1252,1353,1446,1541,1635,1726,1817,1907,2016,2119,2221,2331,2432,2544,2706,2807,2887" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-hi\\values-hi.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2892", - "endColumns": "100", - "endOffsets": "2988" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-ka_values-ka.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-ka\\values-ka.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2899", - "endColumns": "100", - "endOffsets": "2995" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ka\\values-ka.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,214,318,429,517,622,735,819,901,992,1085,1180,1276,1377,1470,1565,1659,1750,1841,1924,2037,2144,2242,2355,2459,2563,2720,2818", - "endColumns": "108,103,110,87,104,112,83,81,90,92,94,95,100,92,94,93,90,90,82,112,106,97,112,103,103,156,97,80", - "endOffsets": "209,313,424,512,617,730,814,896,987,1080,1175,1271,1372,1465,1560,1654,1745,1836,1919,2032,2139,2237,2350,2454,2558,2715,2813,2894" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-sw600dp-v13_values-sw600dp-v13.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-sw600dp-v13\\values-sw600dp-v13.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9", - "startColumns": "4,4,4,4,4,4,4,4", - "startOffsets": "55,124,193,263,337,413,472,543", - "endColumns": "68,68,69,73,75,58,70,67", - "endOffsets": "119,188,258,332,408,467,538,606" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\values-sw600dp-v13\\values-sw600dp-v13.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,10,11,12", - "startColumns": "4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,115,185,256,328,386,444,553,617,680", - "endLines": "2,3,4,5,6,7,9,10,11,15", - "endColumns": "59,69,70,71,57,57,10,63,62,10", - "endOffsets": "110,180,251,323,381,439,548,612,675,847" - }, - "to": { - "startLines": "10,11,12,13,14,15,16,18,19,20", - "startColumns": "4,4,4,4,4,4,4,4,4,4", - "startOffsets": "611,671,741,812,884,942,1000,1109,1173,1236", - "endLines": "10,11,12,13,14,15,17,18,19,23", - "endColumns": "59,69,70,71,57,57,10,63,62,10", - "endOffsets": "666,736,807,879,937,995,1104,1168,1231,1403" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-sq_values-sq.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-sq\\values-sq.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2907", - "endColumns": "100", - "endOffsets": "3003" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-sq\\values-sq.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,219,319,431,518,628,751,832,911,1002,1095,1191,1285,1387,1480,1575,1672,1763,1856,1939,2045,2150,2248,2354,2457,2573,2727,2826", - "endColumns": "113,99,111,86,109,122,80,78,90,92,95,93,101,92,94,96,90,92,82,105,104,97,105,102,115,153,98,80", - "endOffsets": "214,314,426,513,623,746,827,906,997,1090,1186,1280,1382,1475,1570,1667,1758,1851,1934,2040,2145,2243,2349,2452,2568,2722,2821,2902" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-kn_values-kn.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-kn\\values-kn.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2948", - "endColumns": "100", - "endOffsets": "3044" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-kn\\values-kn.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,223,335,448,536,643,770,847,924,1015,1108,1204,1298,1399,1492,1587,1681,1772,1863,1945,2061,2172,2271,2384,2488,2602,2766,2866", - "endColumns": "117,111,112,87,106,126,76,76,90,92,95,93,100,92,94,93,90,90,81,115,110,98,112,103,113,163,99,81", - "endOffsets": "218,330,443,531,638,765,842,919,1010,1103,1199,1293,1394,1487,1582,1676,1767,1858,1940,2056,2167,2266,2379,2483,2597,2761,2861,2943" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-v18_values-v18.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-v18\\values-v18.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "48", - "endOffsets": "99" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-ms_values-ms.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-ms\\values-ms.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2881", - "endColumns": "100", - "endOffsets": "2977" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ms\\values-ms.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,216,321,429,516,620,731,809,888,979,1072,1167,1261,1360,1453,1548,1642,1733,1824,1904,2016,2125,2222,2331,2434,2541,2700,2801", - "endColumns": "110,104,107,86,103,110,77,78,90,92,94,93,98,92,94,93,90,90,79,111,108,96,108,102,106,158,100,79", - "endOffsets": "211,316,424,511,615,726,804,883,974,1067,1162,1256,1355,1448,1543,1637,1728,1819,1899,2011,2120,2217,2326,2429,2536,2695,2796,2876" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-az_values-az.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-az\\values-az.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,312,424,512,619,733,814,893,984,1077,1172,1271,1372,1465,1560,1655,1746,1838,1923,2030,2137,2237,2346,2450,2560,2718,2820", - "endColumns": "107,98,111,87,106,113,80,78,90,92,94,98,100,92,94,94,90,91,84,106,106,99,108,103,109,157,101,82", - "endOffsets": "208,307,419,507,614,728,809,888,979,1072,1167,1266,1367,1460,1555,1650,1741,1833,1918,2025,2132,2232,2341,2445,2555,2713,2815,2898" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-az\\values-az.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2903", - "endColumns": "100", - "endOffsets": "2999" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-th_values-th.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-th\\values-th.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2845", - "endColumns": "100", - "endOffsets": "2941" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-th\\values-th.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,210,308,416,505,607,717,794,872,963,1056,1152,1246,1347,1440,1535,1629,1720,1811,1892,2000,2104,2202,2310,2415,2516,2669,2764", - "endColumns": "104,97,107,88,101,109,76,77,90,92,95,93,100,92,94,93,90,90,80,107,103,97,107,104,100,152,94,80", - "endOffsets": "205,303,411,500,602,712,789,867,958,1051,1147,1241,1342,1435,1530,1624,1715,1806,1887,1995,2099,2197,2305,2410,2511,2664,2759,2840" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-en-rXC_values-en-rXC.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-en-rXC\\values-en-rXC.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "202", - "endOffsets": "253" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "5682", - "endColumns": "202", - "endOffsets": "5880" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-en-rXC\\values-en-rXC.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,310,510,719,904,1106,1321,1494,1671,1862,2055,2253,2449,2652,2847,3044,3239,3432,3623,3807,4011,4216,4417,4624,4826,5031,5303,5503", - "endColumns": "204,199,208,184,201,214,172,176,190,192,197,195,202,194,196,194,192,190,183,203,204,200,206,201,204,271,199,178", - "endOffsets": "305,505,714,899,1101,1316,1489,1666,1857,2050,2248,2444,2647,2842,3039,3234,3427,3618,3802,4006,4211,4412,4619,4821,5026,5298,5498,5677" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-hr_values-hr.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-hr\\values-hr.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2926", - "endColumns": "100", - "endOffsets": "3022" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-hr\\values-hr.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,210,307,417,503,607,726,810,893,984,1077,1173,1267,1368,1461,1556,1655,1746,1837,1923,2027,2140,2246,2351,2464,2571,2740,2837", - "endColumns": "104,96,109,85,103,118,83,82,90,92,95,93,100,92,94,98,90,90,85,103,112,105,104,112,106,168,96,88", - "endOffsets": "205,302,412,498,602,721,805,888,979,1072,1168,1262,1363,1456,1551,1650,1741,1832,1918,2022,2135,2241,2346,2459,2566,2735,2832,2921" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-es-rUS_values-es-rUS.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-es-rUS\\values-es-rUS.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,225,334,442,527,628,751,836,918,1009,1102,1198,1292,1392,1485,1584,1680,1771,1862,1944,2056,2156,2257,2365,2472,2579,2738,2838", - "endColumns": "119,108,107,84,100,122,84,81,90,92,95,93,99,92,98,95,90,90,81,111,99,100,107,106,106,158,99,81", - "endOffsets": "220,329,437,522,623,746,831,913,1004,1097,1193,1287,1387,1480,1579,1675,1766,1857,1939,2051,2151,2252,2360,2467,2574,2733,2833,2915" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-es-rUS\\values-es-rUS.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2920", - "endColumns": "100", - "endOffsets": "3016" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-pl_values-pl.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-pl\\values-pl.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,221,323,431,517,626,745,823,900,991,1084,1180,1274,1376,1469,1564,1659,1750,1841,1923,2032,2141,2240,2349,2460,2568,2731,2827", - "endColumns": "115,101,107,85,108,118,77,76,90,92,95,93,101,92,94,94,90,90,81,108,108,98,108,110,107,162,95,81", - "endOffsets": "216,318,426,512,621,740,818,895,986,1079,1175,1269,1371,1464,1559,1654,1745,1836,1918,2027,2136,2235,2344,2455,2563,2726,2822,2904" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-pl\\values-pl.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2909", - "endColumns": "100", - "endOffsets": "3005" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-mn_values-mn.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-mn\\values-mn.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,218,318,431,518,624,736,818,900,991,1084,1180,1276,1374,1467,1562,1654,1745,1835,1917,2026,2130,2227,2335,2436,2539,2698,2795", - "endColumns": "112,99,112,86,105,111,81,81,90,92,95,95,97,92,94,91,90,89,81,108,103,96,107,100,102,158,96,80", - "endOffsets": "213,313,426,513,619,731,813,895,986,1079,1175,1271,1369,1462,1557,1649,1740,1830,1912,2021,2125,2222,2330,2431,2534,2693,2790,2871" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-mn\\values-mn.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2876", - "endColumns": "100", - "endOffsets": "2972" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-ur_values-ur.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-ur\\values-ur.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2904", - "endColumns": "100", - "endOffsets": "3000" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ur\\values-ur.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,215,321,430,516,620,740,816,892,984,1078,1174,1268,1370,1464,1560,1654,1746,1838,1923,2031,2140,2242,2353,2453,2561,2726,2824", - "endColumns": "109,105,108,85,103,119,75,75,91,93,95,93,101,93,95,93,91,91,84,107,108,101,110,99,107,164,97,79", - "endOffsets": "210,316,425,511,615,735,811,887,979,1073,1169,1263,1365,1459,1555,1649,1741,1833,1918,2026,2135,2237,2348,2448,2556,2721,2819,2899" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-ro_values-ro.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ro\\values-ro.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,226,330,443,531,643,764,849,930,1021,1114,1210,1304,1404,1497,1592,1687,1778,1870,1953,2065,2178,2278,2392,2497,2603,2767,2870", - "endColumns": "120,103,112,87,111,120,84,80,90,92,95,93,99,92,94,94,90,91,82,111,112,99,113,104,105,163,102,82", - "endOffsets": "221,325,438,526,638,759,844,925,1016,1109,1205,1299,1399,1492,1587,1682,1773,1865,1948,2060,2173,2273,2387,2492,2598,2762,2865,2948" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-ro\\values-ro.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2953", - "endColumns": "100", - "endOffsets": "3049" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-de_values-de.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-de\\values-de.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2925", - "endColumns": "100", - "endOffsets": "3021" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-de\\values-de.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,210,308,420,506,611,726,803,879,971,1065,1162,1263,1371,1471,1575,1675,1773,1870,1952,2063,2166,2265,2376,2478,2585,2741,2843", - "endColumns": "104,97,111,85,104,114,76,75,91,93,96,100,107,99,103,99,97,96,81,110,102,98,110,101,106,155,101,81", - "endOffsets": "205,303,415,501,606,721,798,874,966,1060,1157,1258,1366,1466,1570,1670,1768,1865,1947,2058,2161,2260,2371,2473,2580,2736,2838,2920" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values_values.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\constraint-layout-1.1.3.aar\\78c302b72b1c55c024ab2e374fc3bb28\\res\\values\\values.xml", - "from": { - "startLines": "2,3,11,12,13,14,15,19,20,21,22,25,26,29,32,33,34,35,36,39,42,43,44,45,50,53,56,57,58,63,64,65,68,71,72,75,78,81,84,85,88,91,92,97,98,103,106,109,110,111,112,113,114,115,116,117,118,127,128,129,130", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,116,407,455,507,568,614,741,802,862,932,1065,1133,1262,1388,1450,1515,1583,1650,1773,1898,1965,2030,2095,2276,2397,2518,2584,2651,2861,2930,2996,3121,3247,3314,3440,3567,3692,3819,3884,4010,4133,4198,4406,4473,4653,4773,4893,4958,5020,5082,5144,5203,5263,5324,5385,5444,5819,8395,8527,11791", - "endLines": "2,10,11,12,13,14,18,19,20,21,24,25,28,31,32,33,34,35,38,41,42,43,44,49,52,55,56,57,62,63,64,67,70,71,74,77,80,83,84,87,90,91,96,97,102,105,108,109,110,111,112,113,114,115,116,117,126,127,128,129,130", - "endColumns": "60,11,47,51,60,45,11,60,59,69,11,67,11,11,61,64,67,66,11,11,66,64,64,11,11,11,65,66,11,68,65,11,11,66,11,11,11,11,64,11,11,64,11,66,11,11,11,64,61,61,61,58,59,60,60,58,11,2575,131,3263,107", - "endOffsets": "111,402,450,502,563,609,736,797,857,927,1060,1128,1257,1383,1445,1510,1578,1645,1768,1893,1960,2025,2090,2271,2392,2513,2579,2646,2856,2925,2991,3116,3242,3309,3435,3562,3687,3814,3879,4005,4128,4193,4401,4468,4648,4768,4888,4953,5015,5077,5139,5198,5258,5319,5380,5439,5814,8390,8522,11786,11894" - }, - "to": { - "startLines": "6,7,20,25,26,27,30,38,39,40,41,44,45,48,51,52,53,54,55,58,61,62,63,64,69,72,75,76,77,82,83,84,87,90,91,94,97,100,103,104,107,110,111,116,117,122,125,128,129,130,131,132,133,134,135,136,137,3768,3769,3770,4019", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "269,330,905,1161,1213,1274,1436,1755,1816,1876,1946,2079,2147,2276,2402,2464,2529,2597,2664,2787,2912,2979,3044,3109,3290,3411,3532,3598,3665,3875,3944,4010,4135,4261,4328,4454,4581,4706,4833,4898,5024,5147,5212,5420,5487,5667,5787,5907,5972,6034,6096,6158,6217,6277,6338,6399,6458,237773,240349,240481,259033", - "endLines": "6,14,20,25,26,27,33,38,39,40,43,44,47,50,51,52,53,54,57,60,61,62,63,68,71,74,75,76,81,82,83,86,89,90,93,96,99,102,103,106,109,110,115,116,121,124,127,128,129,130,131,132,133,134,135,136,145,3768,3769,3770,4019", - "endColumns": "60,11,47,51,60,45,11,60,59,69,11,67,11,11,61,64,67,66,11,11,66,64,64,11,11,11,65,66,11,68,65,11,11,66,11,11,11,11,64,11,11,64,11,66,11,11,11,64,61,61,61,58,59,60,60,58,11,2575,131,3263,107", - "endOffsets": "325,616,948,1208,1269,1315,1558,1811,1871,1941,2074,2142,2271,2397,2459,2524,2592,2659,2782,2907,2974,3039,3104,3285,3406,3527,3593,3660,3870,3939,4005,4130,4256,4323,4449,4576,4701,4828,4893,5019,5142,5207,5415,5482,5662,5782,5902,5967,6029,6091,6153,6212,6272,6333,6394,6453,6828,240344,240476,243740,259136" - } - }, - { - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\values\\dimens.xml", - "from": { - "startLines": "1,3,2,7,6", - "startColumns": "4,4,4,4,4", - "startOffsets": "16,105,58,226,177", - "endLines": "1,5,2,7,6", - "endColumns": "41,37,46,47,48", - "endOffsets": "53,172,100,269,221" - }, - "to": { - "startLines": "393,397,398,399,400", - "startColumns": "4,4,4,4,4", - "startOffsets": "23194,23399,23455,23502,23550", - "endColumns": "41,55,46,47,48", - "endOffsets": "23231,23450,23497,23545,23594" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values\\values.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1461,1462,1466,1470,1474,1479,1485,1492,1496,1500,1505,1509,1513,1517,1521,1525,1529,1535,1539,1545,1549,1555,1559,1564,1568,1571,1575,1581,1585,1591,1595,1601,1604,1608,1612,1616,1620,1624,1625,1626,1627,1630,1633,1636,1639,1643,1644,1645,1646,1647,1650,1652,1654,1656,1661,1662,1666,1672,1676,1677,1679,1690,1691,1695,1701,1705,1706,1707,1711,1738,1742,1743,1747,1775,1943,1969,2138,2164,2195,2203,2209,2223,2245,2250,2255,2265,2274,2283,2287,2294,2302,2309,2310,2319,2322,2325,2329,2333,2337,2340,2341,2345,2349,2359,2364,2371,2377,2378,2381,2385,2390,2392,2394,2397,2400,2402,2406,2409,2416,2419,2422,2426,2428,2432,2434,2436,2438,2442,2450,2458,2470,2476,2485,2488,2499,2502,2507,2508,2513,2571,2630,2631,2641,2650,2651,2653,2657,2660,2663,2666,2669,2672,2675,2678,2682,2685,2688,2691,2695,2698,2702,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2728,2730,2731,2732,2733,2734,2735,2736,2737,2739,2740,2742,2743,2745,2747,2748,2750,2751,2752,2753,2754,2755,2757,2758,2759,2760,2761,2762,2764,2766,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,2780,2782,2783,2784,2785,2786,2787,2789,2793,2797,2798,2799,2800,2801,2802,2803,2804,2806,2808,2810,2812,2814,2815,2816,2817,2819,2821,2823,2824,2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2837,2838,2839,2840,2842,2844,2845,2847,2848,2850,2852,2854,2855,2856,2857,2858,2859,2860,2861,2862,2863,2864,2865,2867,2868,2869,2870,2872,2873,2874,2875,2876,2878,2880,2882,2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,69,152,155,158,161,175,186,196,223,230,241,271,298,307,344,725,730,756,774,810,816,822,845,986,1006,1012,1016,1022,1059,1071,1098,1103,1169,1184,1249,1268,1294", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,160,205,254,295,350,409,471,552,613,688,764,841,919,1004,1086,1162,1238,1315,1393,1499,1605,1684,1764,1821,1879,1953,2028,2093,2159,2219,2280,2352,2425,2492,2560,2619,2678,2737,2796,2855,2909,2963,3016,3070,3124,3178,3232,3306,3385,3458,3532,3603,3675,3747,3820,3877,3935,4008,4082,4156,4231,4303,4376,4446,4517,4577,70911,70980,71049,71119,71193,71269,71333,71410,71486,71563,71628,71697,71774,71849,71918,71986,72063,72129,72190,72287,72352,72421,72520,72591,72650,72708,72765,72824,72888,72959,73031,73103,73175,73247,73314,73382,73450,73509,73572,73636,73726,73817,73877,73943,74010,74076,74146,74210,74263,74376,74434,74497,74562,74627,74702,74775,74847,74896,74957,75018,75079,75141,75205,75269,75333,75398,75461,75521,75582,75648,75707,75767,75829,75900,75960,76028,76114,76201,76291,76378,76466,76548,76631,76721,76812,76864,76922,76967,77033,77097,77154,77211,77265,77322,77370,77419,77470,77504,77551,77600,77646,77678,77742,77804,77864,77921,77995,78065,78143,78197,78267,78352,78400,78446,78517,78595,78673,78745,78819,78893,78967,79047,79120,79189,79261,79338,79399,79462,79528,79592,79663,79726,79791,79855,79916,79977,80029,80102,80176,80245,80320,80394,80468,80609,80679,80732,80810,80900,80988,81084,81174,81756,81845,82092,82373,82625,82910,83303,83780,84002,84224,84500,84727,84957,85187,85417,85647,85874,86293,86519,86944,87174,87602,87821,88104,88312,88443,88670,89096,89321,89748,89969,90394,90514,90790,91091,91415,91706,92020,92157,92288,92393,92635,92802,93006,93214,93485,93597,93709,93814,93931,94145,94291,94431,94517,94865,94953,95199,95617,95866,95948,96046,96663,96763,97015,97439,97694,97788,97877,98114,100166,100408,100510,100763,102947,113668,115184,126004,127532,129289,129915,130335,131396,132661,132917,133153,133700,134194,134799,134997,135577,136141,136516,136634,137172,137329,137525,137798,138054,138224,138365,138429,138711,138997,139673,139937,140275,140628,140722,140908,141214,141476,141601,141728,141967,142178,142297,142490,142667,143122,143303,143425,143684,143797,143984,144086,144193,144322,144597,145105,145601,146478,146772,147342,147491,148223,148395,148731,148823,149101,153445,157932,157994,158624,159238,159329,159442,159671,159831,159983,160154,160320,160489,160656,160819,161062,161232,161405,161576,161850,162049,162254,162584,162668,162764,162860,162958,163058,163160,163262,163364,163466,163568,163668,163764,163876,164005,164128,164259,164390,164488,164602,164696,164836,164970,165066,165178,165278,165394,165490,165602,165702,165842,165978,166142,166272,166430,166580,166721,166865,167000,167112,167262,167390,167518,167654,167786,167916,168046,168158,168298,168444,168588,168726,168792,168882,168958,169062,169152,169254,169362,169470,169570,169650,169742,169840,169950,170028,170134,170226,170330,170440,170562,170725,170882,170962,171062,171152,171262,171356,171462,171554,171654,171766,171880,171996,172112,172206,172320,172432,172534,172654,172776,172858,172962,173082,173208,173306,173400,173488,173600,173716,173838,173950,174125,174241,174327,174419,174531,174655,174722,174848,174916,175044,175188,175316,175385,175480,175595,175708,175807,175916,176027,176138,176239,176344,176444,176574,176665,176788,176882,176994,177080,177184,177280,177368,177486,177590,177694,177820,177908,178016,178116,178206,178316,178400,178502,178586,178640,178704,178810,178920,179004,4638,9782,9900,10015,10147,10862,11554,12071,13718,14103,14700,16299,17832,18220,20527,40045,40305,41697,42730,44743,45005,45361,46191,52973,54107,54401,54624,54951,57001,57649,59282,59552,63403,64004,67813,69028,70437", - "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1460,1461,1465,1469,1473,1478,1484,1491,1495,1499,1504,1508,1512,1516,1520,1524,1528,1534,1538,1544,1548,1554,1558,1563,1567,1570,1574,1580,1584,1590,1594,1600,1603,1607,1611,1615,1619,1623,1624,1625,1626,1629,1632,1635,1638,1642,1643,1644,1645,1646,1649,1651,1653,1655,1660,1661,1665,1671,1675,1676,1678,1689,1690,1694,1700,1704,1705,1706,1710,1737,1741,1742,1746,1774,1942,1968,2137,2163,2194,2202,2208,2222,2244,2249,2254,2264,2273,2282,2286,2293,2301,2308,2309,2318,2321,2324,2328,2332,2336,2339,2340,2344,2348,2358,2363,2370,2376,2377,2380,2384,2389,2391,2393,2396,2399,2401,2405,2408,2415,2418,2421,2425,2427,2431,2433,2435,2437,2441,2449,2457,2469,2475,2484,2487,2498,2501,2506,2507,2512,2570,2629,2630,2640,2649,2650,2652,2656,2659,2662,2665,2668,2671,2674,2677,2681,2684,2687,2690,2694,2697,2701,2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2727,2729,2730,2731,2732,2733,2734,2735,2736,2738,2739,2741,2742,2744,2746,2747,2749,2750,2751,2752,2753,2754,2756,2757,2758,2759,2760,2761,2763,2765,2767,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,2781,2782,2783,2784,2785,2786,2788,2792,2796,2797,2798,2799,2800,2801,2802,2803,2805,2807,2809,2811,2813,2814,2815,2816,2818,2820,2822,2823,2824,2825,2826,2827,2828,2829,2830,2831,2832,2833,2836,2837,2838,2839,2841,2843,2844,2846,2847,2849,2851,2853,2854,2855,2856,2857,2858,2859,2860,2861,2862,2863,2864,2866,2867,2868,2869,2871,2872,2873,2874,2875,2877,2879,2881,2883,2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,151,154,157,160,174,185,195,222,229,240,270,297,306,343,724,729,755,773,809,815,821,844,985,1005,1011,1015,1021,1058,1070,1097,1102,1168,1183,1248,1267,1293,1302", - "endColumns": "54,44,48,40,54,58,61,80,60,74,75,76,77,84,81,75,75,76,77,105,105,78,79,56,57,73,74,64,65,59,60,71,72,66,67,58,58,58,58,58,53,53,52,53,53,53,53,73,78,72,73,70,71,71,72,56,57,72,73,73,74,71,72,69,70,59,60,68,68,69,73,75,63,76,75,76,64,68,76,74,68,67,76,65,60,96,64,68,98,70,58,57,56,58,63,70,71,71,71,71,66,67,67,58,62,63,89,90,59,65,66,65,69,63,52,112,57,62,64,64,74,72,71,48,60,60,60,61,63,63,63,64,62,59,60,65,58,59,61,70,59,67,85,86,89,86,87,81,82,89,90,51,57,44,65,63,56,56,53,56,47,48,50,33,46,48,45,31,63,61,59,56,73,69,77,53,69,84,47,45,70,77,77,71,73,73,73,79,72,68,71,76,60,62,65,63,70,62,64,63,60,60,51,72,73,68,74,73,73,140,69,52,77,89,87,95,89,12,88,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,136,130,104,12,12,12,12,12,111,111,104,116,12,12,12,12,12,87,12,12,12,81,12,12,99,12,12,12,93,88,12,12,12,101,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,117,12,12,12,12,12,12,12,63,12,12,12,12,12,12,93,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,91,12,12,12,61,12,12,90,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,83,95,95,97,99,101,101,101,101,101,99,95,111,128,122,130,130,97,113,93,12,12,95,111,99,115,95,111,99,12,135,12,129,12,12,140,12,134,111,149,127,127,12,131,129,129,111,139,12,12,12,65,89,75,103,89,101,107,107,99,79,91,97,12,77,105,91,103,109,12,12,12,79,99,89,109,93,105,91,12,12,12,12,12,93,113,111,12,12,12,81,103,119,125,97,93,87,111,115,121,111,12,115,85,91,12,12,66,12,67,12,12,12,68,94,114,112,98,108,110,110,100,104,99,12,90,122,93,12,85,103,95,87,12,12,12,12,87,107,99,89,109,83,101,83,53,63,105,109,83,119,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24", - "endOffsets": "155,200,249,290,345,404,466,547,608,683,759,836,914,999,1081,1157,1233,1310,1388,1494,1600,1679,1759,1816,1874,1948,2023,2088,2154,2214,2275,2347,2420,2487,2555,2614,2673,2732,2791,2850,2904,2958,3011,3065,3119,3173,3227,3301,3380,3453,3527,3598,3670,3742,3815,3872,3930,4003,4077,4151,4226,4298,4371,4441,4512,4572,4633,70975,71044,71114,71188,71264,71328,71405,71481,71558,71623,71692,71769,71844,71913,71981,72058,72124,72185,72282,72347,72416,72515,72586,72645,72703,72760,72819,72883,72954,73026,73098,73170,73242,73309,73377,73445,73504,73567,73631,73721,73812,73872,73938,74005,74071,74141,74205,74258,74371,74429,74492,74557,74622,74697,74770,74842,74891,74952,75013,75074,75136,75200,75264,75328,75393,75456,75516,75577,75643,75702,75762,75824,75895,75955,76023,76109,76196,76286,76373,76461,76543,76626,76716,76807,76859,76917,76962,77028,77092,77149,77206,77260,77317,77365,77414,77465,77499,77546,77595,77641,77673,77737,77799,77859,77916,77990,78060,78138,78192,78262,78347,78395,78441,78512,78590,78668,78740,78814,78888,78962,79042,79115,79184,79256,79333,79394,79457,79523,79587,79658,79721,79786,79850,79911,79972,80024,80097,80171,80240,80315,80389,80463,80604,80674,80727,80805,80895,80983,81079,81169,81751,81840,82087,82368,82620,82905,83298,83775,83997,84219,84495,84722,84952,85182,85412,85642,85869,86288,86514,86939,87169,87597,87816,88099,88307,88438,88665,89091,89316,89743,89964,90389,90509,90785,91086,91410,91701,92015,92152,92283,92388,92630,92797,93001,93209,93480,93592,93704,93809,93926,94140,94286,94426,94512,94860,94948,95194,95612,95861,95943,96041,96658,96758,97010,97434,97689,97783,97872,98109,100161,100403,100505,100758,102942,113663,115179,125999,127527,129284,129910,130330,131391,132656,132912,133148,133695,134189,134794,134992,135572,136136,136511,136629,137167,137324,137520,137793,138049,138219,138360,138424,138706,138992,139668,139932,140270,140623,140717,140903,141209,141471,141596,141723,141962,142173,142292,142485,142662,143117,143298,143420,143679,143792,143979,144081,144188,144317,144592,145100,145596,146473,146767,147337,147486,148218,148390,148726,148818,149096,153440,157927,157989,158619,159233,159324,159437,159666,159826,159978,160149,160315,160484,160651,160814,161057,161227,161400,161571,161845,162044,162249,162579,162663,162759,162855,162953,163053,163155,163257,163359,163461,163563,163663,163759,163871,164000,164123,164254,164385,164483,164597,164691,164831,164965,165061,165173,165273,165389,165485,165597,165697,165837,165973,166137,166267,166425,166575,166716,166860,166995,167107,167257,167385,167513,167649,167781,167911,168041,168153,168293,168439,168583,168721,168787,168877,168953,169057,169147,169249,169357,169465,169565,169645,169737,169835,169945,170023,170129,170221,170325,170435,170557,170720,170877,170957,171057,171147,171257,171351,171457,171549,171649,171761,171875,171991,172107,172201,172315,172427,172529,172649,172771,172853,172957,173077,173203,173301,173395,173483,173595,173711,173833,173945,174120,174236,174322,174414,174526,174650,174717,174843,174911,175039,175183,175311,175380,175475,175590,175703,175802,175911,176022,176133,176234,176339,176439,176569,176660,176783,176877,176989,177075,177179,177275,177363,177481,177585,177689,177815,177903,178011,178111,178201,178311,178395,178497,178581,178635,178699,178805,178915,178999,179119,9777,9895,10010,10142,10857,11549,12066,13713,14098,14695,16294,17827,18215,20522,40040,40300,41692,42725,44738,45000,45356,46186,52968,54102,54396,54619,54946,56996,57644,59277,59547,63398,63999,67808,69023,70432,70906" - }, - "to": { - "startLines": "29,35,37,169,170,171,172,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,391,392,401,402,403,404,405,406,407,474,475,476,477,478,479,480,481,484,485,486,487,489,496,497,503,518,520,521,524,525,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,589,592,593,594,595,596,613,621,622,626,630,641,646,652,659,663,667,672,676,680,684,688,692,696,702,706,712,716,722,726,731,735,738,742,748,752,758,762,768,771,775,779,783,787,791,792,793,794,797,800,803,806,810,811,812,813,814,817,819,821,823,828,829,833,839,843,844,846,857,858,862,868,872,926,927,931,958,962,963,967,1217,1385,1411,1580,1606,1637,1645,1651,1665,1687,1692,1697,1707,1716,1725,1729,1736,1744,1751,1752,1761,1764,1767,1771,1775,1779,1782,1783,1787,1791,1801,1806,1813,1819,1820,1823,1827,1832,1834,1836,1839,1842,1844,1848,1851,1858,1861,1864,1868,1870,1874,1876,1878,1880,1884,1892,1900,1912,1918,1927,1930,1941,1944,1949,1950,2045,2103,2166,2167,2177,2186,2187,2189,2193,2196,2199,2202,2205,2208,2211,2214,2218,2221,2224,2227,2231,2234,2238,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2267,2269,2270,2271,2272,2273,2274,2275,2276,2278,2279,2281,2282,2284,2286,2287,2289,2290,2291,2292,2293,2294,2296,2297,2298,2299,2300,2450,2452,2454,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2470,2471,2472,2473,2474,2475,2477,2481,2550,2551,2552,2553,2554,2555,2556,2579,2581,2583,2585,2587,2589,2590,2591,2592,2594,2596,2598,2599,2600,2601,2602,2603,2604,2605,2606,2607,2608,2609,2612,2613,2614,2615,2617,2619,2620,2622,2623,2625,2627,2629,2630,2631,2632,2633,2634,2635,2636,2637,2638,2639,2640,2642,2643,2644,2645,2647,2648,2649,2650,2651,2653,2655,2657,2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2952,3035,3038,3041,3044,3058,3069,3079,3106,3113,3145,3175,3202,3211,3248,3649,3742,3871,4020,4056,4062,4076,4099,4240,4261,4267,4271,4307,4346,4358,4385,4390,4480,4515,4580,4599,4625", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "1381,1608,1706,8156,8197,8252,8311,8435,8516,8577,8652,8728,8805,8883,8968,9050,9126,9202,9279,9357,9463,9569,9648,9728,9785,10999,11073,11148,11213,11279,11339,11400,11472,11545,11612,11680,11739,11798,11857,11916,11975,12029,12083,12136,12190,12244,12298,13036,13110,13189,13262,13336,13407,13479,13551,13624,13681,13739,13812,13886,13960,14035,14107,14180,14250,14321,14381,14442,14511,14580,14650,14724,14800,14864,14941,15017,15094,15159,15228,15305,15380,15449,15517,15594,15660,15721,15818,15883,15952,16051,16122,16181,16239,16296,16355,16419,16490,16562,16634,16706,16778,16845,16913,16981,17040,17103,17167,17257,17348,17408,17474,17541,17607,17677,17741,17794,17907,17965,18028,18093,18158,18233,18306,18378,18427,18488,18549,18610,18672,18736,18800,18864,18929,18992,19052,19113,19179,19238,19298,19360,19431,19491,23021,23107,23599,23689,23776,23864,23946,24029,24119,28261,28313,28371,28416,28482,28546,28603,28660,28862,28919,28967,29016,29107,29440,29487,29771,30498,30578,30642,30832,30892,31513,31587,31657,31735,31789,31859,31944,31992,32038,32109,32187,32265,32337,32411,32485,32559,32639,32712,32781,32853,32930,32991,33054,33120,33184,33255,33318,33383,33447,33508,33569,33621,33694,33768,33837,33912,33986,34060,34201,36162,36347,36425,36515,36603,36699,37705,38287,38376,38623,38904,39570,39855,40248,40725,40947,41169,41445,41672,41902,42132,42362,42592,42819,43238,43464,43889,44119,44547,44766,45049,45257,45388,45615,46041,46266,46693,46914,47339,47459,47735,48036,48360,48651,48965,49102,49233,49338,49580,49747,49951,50159,50430,50542,50654,50759,50876,51090,51236,51376,51462,51810,51898,52144,52562,52811,52893,52991,53608,53708,53960,54384,54639,58466,58555,58792,60844,61086,61188,61441,79822,90543,92059,102879,104407,106164,106790,107210,108271,109536,109792,110028,110575,111069,111674,111872,112452,113016,113391,113509,114047,114204,114400,114673,114929,115099,115240,115304,115586,115872,116548,116812,117150,117503,117597,117783,118089,118351,118476,118603,118842,119053,119172,119365,119542,119997,120178,120300,120559,120672,120859,120961,121068,121197,121472,121980,122476,123353,123647,124217,124366,125098,125270,125606,125698,130403,134747,139578,139640,140270,140884,140975,141088,141317,141477,141629,141800,141966,142135,142302,142465,142708,142878,143051,143222,143496,143695,143900,144356,144440,144536,144632,144730,144830,144932,145034,145136,145238,145340,145440,145536,145648,145777,145900,146031,146162,146260,146374,146468,146608,146742,146838,146950,147050,147166,147262,147374,147474,147614,147750,147914,148044,148202,148352,148493,148637,148772,148884,149034,149162,149290,149426,149558,149688,149818,149930,158274,158420,158564,158702,158768,158858,158934,159038,159128,159230,159338,159446,159546,159626,159718,159816,159926,160004,160110,160202,160306,160416,160538,160701,165186,165266,165366,165456,165566,165660,165766,167464,167564,167676,167790,167906,168022,168116,168230,168342,168444,168564,168686,168768,168872,168992,169118,169216,169310,169398,169510,169626,169748,169860,170035,170151,170237,170329,170441,170565,170632,170758,170826,170954,171098,171226,171295,171390,171505,171618,171717,171826,171937,172048,172149,172254,172354,172484,172575,172698,172792,172904,172990,173094,173190,173278,173396,173500,173604,173730,173818,173926,174026,174116,174226,174310,174412,174496,174550,174614,174720,174830,174914,192002,197146,197264,197379,197511,198226,198918,199435,201082,201467,203115,204714,206247,206635,208942,229894,236381,249695,259141,261154,261416,263746,264576,271358,273059,273353,273576,275645,278030,278678,280311,280581,286361,289010,292819,294034,295443", - "endLines": "29,35,37,169,170,171,172,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,391,392,401,402,403,404,405,406,407,474,475,476,477,478,479,480,481,484,485,486,487,489,496,497,503,518,520,521,524,525,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,589,592,593,594,595,596,620,621,625,629,633,645,651,658,662,666,671,675,679,683,687,691,695,701,705,711,715,721,725,730,734,737,741,747,751,757,761,767,770,774,778,782,786,790,791,792,793,796,799,802,805,809,810,811,812,813,816,818,820,822,827,828,832,838,842,843,845,856,857,861,867,871,872,926,930,957,961,962,966,994,1384,1410,1579,1605,1636,1644,1650,1664,1686,1691,1696,1706,1715,1724,1728,1735,1743,1750,1751,1760,1763,1766,1770,1774,1778,1781,1782,1786,1790,1800,1805,1812,1818,1819,1822,1826,1831,1833,1835,1838,1841,1843,1847,1850,1857,1860,1863,1867,1869,1873,1875,1877,1879,1883,1891,1899,1911,1917,1926,1929,1940,1943,1948,1949,1954,2102,2161,2166,2176,2185,2186,2188,2192,2195,2198,2201,2204,2207,2210,2213,2217,2220,2223,2226,2230,2233,2237,2241,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2266,2268,2269,2270,2271,2272,2273,2274,2275,2277,2278,2280,2281,2283,2285,2286,2288,2289,2290,2291,2292,2293,2295,2296,2297,2298,2299,2300,2451,2453,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2469,2470,2471,2472,2473,2474,2476,2480,2484,2550,2551,2552,2553,2554,2555,2556,2580,2582,2584,2586,2588,2589,2590,2591,2593,2595,2597,2598,2599,2600,2601,2602,2603,2604,2605,2606,2607,2608,2611,2612,2613,2614,2616,2618,2619,2621,2622,2624,2626,2628,2629,2630,2631,2632,2633,2634,2635,2636,2637,2638,2639,2641,2642,2643,2644,2646,2647,2648,2649,2650,2652,2654,2656,2658,2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,3034,3037,3040,3043,3057,3068,3078,3105,3112,3123,3174,3201,3210,3247,3628,3653,3767,3888,4055,4061,4067,4098,4239,4259,4266,4270,4276,4343,4357,4384,4389,4455,4494,4579,4598,4624,4633", - "endColumns": "54,44,48,40,54,58,61,80,60,74,75,76,77,84,81,75,75,76,77,105,105,78,79,56,57,73,74,64,65,59,60,71,72,66,67,58,58,58,58,58,53,53,52,53,53,53,53,73,78,72,73,70,71,71,72,56,57,72,73,73,74,71,72,69,70,59,60,68,68,69,73,75,63,76,75,76,64,68,76,74,68,67,76,65,60,96,64,68,98,70,58,57,56,58,63,70,71,71,71,71,66,67,67,58,62,63,89,90,59,65,66,65,69,63,52,112,57,62,64,64,74,72,71,48,60,60,60,61,63,63,63,64,62,59,60,65,58,59,61,70,59,67,85,86,89,86,87,81,82,89,90,51,57,44,65,63,56,56,53,56,47,48,50,33,46,48,45,31,63,61,59,56,73,69,77,53,69,84,47,45,70,77,77,71,73,73,73,79,72,68,71,76,60,62,65,63,70,62,64,63,60,60,51,72,73,68,74,73,73,140,69,52,77,89,87,95,89,12,88,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,136,130,104,12,12,12,12,12,111,111,104,116,12,12,12,12,12,87,12,12,12,81,12,12,99,12,12,12,93,88,12,12,12,101,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,117,12,12,12,12,12,12,12,63,12,12,12,12,12,12,93,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,91,12,12,12,61,12,12,90,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,83,95,95,97,99,101,101,101,101,101,99,95,111,128,122,130,130,97,113,93,12,12,95,111,99,115,95,111,99,12,135,12,129,12,12,140,12,134,111,149,127,127,12,131,129,129,111,139,12,12,12,65,89,75,103,89,101,107,107,99,79,91,97,12,77,105,91,103,109,12,12,12,79,99,89,109,93,105,91,12,12,12,12,12,93,113,111,12,12,12,81,103,119,125,97,93,87,111,115,121,111,12,115,85,91,12,12,66,12,67,12,12,12,68,94,114,112,98,108,110,110,100,104,99,12,90,122,93,12,85,103,95,87,12,12,12,12,87,107,99,89,109,83,101,83,53,63,105,109,83,119,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24", - "endOffsets": "1431,1648,1750,8192,8247,8306,8368,8511,8572,8647,8723,8800,8878,8963,9045,9121,9197,9274,9352,9458,9564,9643,9723,9780,9838,11068,11143,11208,11274,11334,11395,11467,11540,11607,11675,11734,11793,11852,11911,11970,12024,12078,12131,12185,12239,12293,12347,13105,13184,13257,13331,13402,13474,13546,13619,13676,13734,13807,13881,13955,14030,14102,14175,14245,14316,14376,14437,14506,14575,14645,14719,14795,14859,14936,15012,15089,15154,15223,15300,15375,15444,15512,15589,15655,15716,15813,15878,15947,16046,16117,16176,16234,16291,16350,16414,16485,16557,16629,16701,16773,16840,16908,16976,17035,17098,17162,17252,17343,17403,17469,17536,17602,17672,17736,17789,17902,17960,18023,18088,18153,18228,18301,18373,18422,18483,18544,18605,18667,18731,18795,18859,18924,18987,19047,19108,19174,19233,19293,19355,19426,19486,19554,23102,23189,23684,23771,23859,23941,24024,24114,24205,28308,28366,28411,28477,28541,28598,28655,28709,28914,28962,29011,29062,29136,29482,29531,29812,30525,30637,30699,30887,30944,31582,31652,31730,31784,31854,31939,31987,32033,32104,32182,32260,32332,32406,32480,32554,32634,32707,32776,32848,32925,32986,33049,33115,33179,33250,33313,33378,33442,33503,33564,33616,33689,33763,33832,33907,33981,34055,34196,34266,36210,36420,36510,36598,36694,36784,38282,38371,38618,38899,39151,39850,40243,40720,40942,41164,41440,41667,41897,42127,42357,42587,42814,43233,43459,43884,44114,44542,44761,45044,45252,45383,45610,46036,46261,46688,46909,47334,47454,47730,48031,48355,48646,48960,49097,49228,49333,49575,49742,49946,50154,50425,50537,50649,50754,50871,51085,51231,51371,51457,51805,51893,52139,52557,52806,52888,52986,53603,53703,53955,54379,54634,54728,58550,58787,60839,61081,61183,61436,63620,90538,92054,102874,104402,106159,106785,107205,108266,109531,109787,110023,110570,111064,111669,111867,112447,113011,113386,113504,114042,114199,114395,114668,114924,115094,115235,115299,115581,115867,116543,116807,117145,117498,117592,117778,118084,118346,118471,118598,118837,119048,119167,119360,119537,119992,120173,120295,120554,120667,120854,120956,121063,121192,121467,121975,122471,123348,123642,124212,124361,125093,125265,125601,125693,125971,134742,139229,139635,140265,140879,140970,141083,141312,141472,141624,141795,141961,142130,142297,142460,142703,142873,143046,143217,143491,143690,143895,144225,144435,144531,144627,144725,144825,144927,145029,145131,145233,145335,145435,145531,145643,145772,145895,146026,146157,146255,146369,146463,146603,146737,146833,146945,147045,147161,147257,147369,147469,147609,147745,147909,148039,148197,148347,148488,148632,148767,148879,149029,149157,149285,149421,149553,149683,149813,149925,150065,158415,158559,158697,158763,158853,158929,159033,159123,159225,159333,159441,159541,159621,159713,159811,159921,159999,160105,160197,160301,160411,160533,160696,160853,165261,165361,165451,165561,165655,165761,165853,167559,167671,167785,167901,168017,168111,168225,168337,168439,168559,168681,168763,168867,168987,169113,169211,169305,169393,169505,169621,169743,169855,170030,170146,170232,170324,170436,170560,170627,170753,170821,170949,171093,171221,171290,171385,171500,171613,171712,171821,171932,172043,172144,172249,172349,172479,172570,172693,172787,172899,172985,173089,173185,173273,173391,173495,173599,173725,173813,173921,174021,174111,174221,174305,174407,174491,174545,174609,174715,174825,174909,175029,197141,197259,197374,197506,198221,198913,199430,201077,201462,202059,204709,206242,206630,208937,228455,230149,237768,250723,261149,261411,261767,264571,271353,272487,273348,273571,273898,277690,278673,280306,280576,284427,286957,292814,294029,295438,295912" - } - }, - { - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\values\\colors.xml", - "from": { - "startLines": "4,2,3", - "startColumns": "4,4,4", - "startOffsets": "153,55,102", - "endColumns": "45,46,50", - "endOffsets": "194,97,148" - }, - "to": { - "startLines": "196,197,198", - "startColumns": "4,4,4", - "startOffsets": "10092,10138,10185", - "endColumns": "45,46,50", - "endOffsets": "10133,10180,10231" - } - }, - { - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\values\\styles.xml", - "from": { - "startLines": "3,15,10,17,24,28,20,32", - "startColumns": "4,4,4,4,4,4,4,4", - "startOffsets": "54,525,374,617,857,984,729,1112", - "endLines": "8,15,13,17,26,30,22,34", - "endColumns": "12,90,12,80,12,12,12,12", - "endOffsets": "368,611,519,693,978,1106,851,1233" - }, - "to": { - "startLines": "601,607,608,612,2036,2039,2042,2242", - "startColumns": "4,4,4,4,4,4,4,4", - "startOffsets": "37066,37385,37475,37625,130023,130149,130276,144230", - "endLines": "606,607,611,612,2038,2041,2044,2244", - "endColumns": "12,89,12,79,12,12,12,12", - "endOffsets": "37380,37470,37620,37700,130144,130271,130398,144351" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\recyclerview-v7-28.0.0.aar\\d6e16f2b4f256229a87f783389106887\\res\\values\\values.xml", - "from": { - "startLines": "30,31,32,33,34,35,36,2", - "startColumns": "4,4,4,4,4,4,4,4", - "startOffsets": "1535,1594,1642,1698,1773,1849,1921,55", - "endLines": "30,31,32,33,34,35,36,29", - "endColumns": "58,47,55,74,75,71,65,24", - "endOffsets": "1589,1637,1693,1768,1844,1916,1982,1530" - }, - "to": { - "startLines": "394,395,396,408,409,410,490,4277", - "startColumns": "4,4,4,4,4,4,4,4", - "startOffsets": "23236,23295,23343,24210,24285,24361,29141,273903", - "endLines": "394,395,396,408,409,410,490,4304", - "endColumns": "58,47,55,74,75,71,65,24", - "endOffsets": "23290,23338,23394,24280,24356,24428,29202,275378" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\transition-28.0.0.aar\\83dbb9ccdea7ebbe8e380df93f21d851\\res\\values\\values.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11", - "startColumns": "4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,95,138,185,240,285,339,391,440,501", - "endColumns": "39,42,46,54,44,53,51,48,60,49", - "endOffsets": "90,133,180,235,280,334,386,435,496,546" - }, - "to": { - "startLines": "488,495,498,499,500,513,514,515,516,517", - "startColumns": "4,4,4,4,4,4,4,4,4,4", - "startOffsets": "29067,29397,29536,29583,29638,30232,30286,30338,30387,30448", - "endColumns": "39,42,46,54,44,53,51,48,60,49", - "endOffsets": "29102,29435,29578,29633,29678,30281,30333,30382,30443,30493" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\cardview-v7-28.0.0.aar\\3b87ab57366b6cf64018eb749db2a1b4\\res\\values\\values.xml", - "from": { - "startLines": "2,3,4,5,6,35,36,37,38,45,47,50,7", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,107,168,230,292,2179,2238,2295,2349,2763,2827,2953,356", - "endLines": "2,3,4,5,6,35,36,37,44,46,49,52,34", - "endColumns": "51,60,61,61,63,58,56,53,12,12,12,12,24", - "endOffsets": "102,163,225,287,351,2233,2290,2344,2758,2822,2948,3076,2174" - }, - "to": { - "startLines": "19,192,193,194,195,337,338,339,634,2028,2030,2033,3654", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "853,9843,9904,9966,10028,19559,19618,19675,39156,129705,129769,129895,230154", - "endLines": "19,192,193,194,195,337,338,339,640,2029,2032,2035,3681", - "endColumns": "51,60,61,61,63,58,56,53,12,12,12,12,24", - "endOffsets": "900,9899,9961,10023,10087,19613,19670,19724,39565,129764,129890,130018,231972" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\coordinatorlayout-28.0.0.aar\\c4bd9e34079f8fa4e6d0c7db3f4a75c4\\res\\values\\values.xml", - "from": { - "startLines": "2,102,3,13", - "startColumns": "4,4,4,4", - "startOffsets": "55,5935,116,724", - "endLines": "2,104,12,101", - "endColumns": "60,12,24,24", - "endOffsets": "111,6075,719,5930" - }, - "to": { - "startLines": "28,2949,3771,3781", - "startColumns": "4,4,4,4", - "startOffsets": "1320,191857,243745,244353", - "endLines": "28,2951,3780,3869", - "endColumns": "60,12,24,24", - "endOffsets": "1376,191997,244348,249559" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values\\values.xml", - "from": { - "startLines": "2,3,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,171,172,176,177,178,6,13,56,88,125", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,124,7725,7795,7863,7935,8005,8066,8140,8213,8274,8335,8397,8461,8523,8584,8652,8752,8812,8878,8951,9020,9077,9129,9191,9263,9339,9374,9409,9459,9520,9577,9611,9646,9681,9751,9822,9939,10140,10250,10451,10580,10652,319,617,3523,5588,7348", - "endLines": "2,3,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,170,171,175,176,177,178,12,55,87,124,131", - "endColumns": "68,62,69,67,71,69,60,73,72,60,60,61,63,61,60,67,99,59,65,72,68,56,51,61,71,75,34,34,49,60,56,33,34,34,69,70,116,12,109,12,128,71,66,24,24,24,24,24", - "endOffsets": "119,182,7790,7858,7930,8000,8061,8135,8208,8269,8330,8392,8456,8518,8579,8647,8747,8807,8873,8946,9015,9072,9124,9186,9258,9334,9369,9404,9454,9515,9572,9606,9641,9676,9746,9817,9934,10135,10245,10446,10575,10647,10714,612,3518,5583,7343,7720" - }, - "to": { - "startLines": "240,241,340,341,342,343,344,345,346,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,482,483,491,492,504,505,506,507,508,512,534,590,2301,2302,2306,2307,2311,2673,2674,3735,3899,3942,3975,4012", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "12904,12973,19729,19799,19867,19939,20009,20070,20144,27283,27344,27405,27467,27531,27593,27654,27722,27822,27882,27948,28021,28090,28147,28199,28714,28786,29207,29242,29817,29867,29928,29985,30019,30197,31443,36215,150070,150187,150388,150498,150699,175034,175106,236083,251723,254629,256896,258656", - "endLines": "240,241,340,341,342,343,344,345,346,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,482,483,491,492,504,505,506,507,508,512,534,590,2301,2305,2306,2310,2311,2673,2674,3741,3941,3973,4011,4018", - "endColumns": "68,62,69,67,71,69,60,73,72,60,60,61,63,61,60,67,99,59,65,72,68,56,51,61,71,75,34,34,49,60,56,33,34,34,69,70,116,12,109,12,128,71,66,24,24,24,24,24", - "endOffsets": "12968,13031,19794,19862,19934,20004,20065,20139,20212,27339,27400,27462,27526,27588,27649,27717,27817,27877,27943,28016,28085,28142,28194,28256,28781,28857,29237,29272,29862,29923,29980,30014,30049,30227,31508,36281,150182,150383,150493,150694,150823,175101,175168,236376,254624,256689,258651,259028" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\values\\values.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,345,346,347,352,353,357,363,367,368,369,370,381,382,383,387,393,397,398,399,400,430,450,496,526,546,566,612,616,620,634,675,683,693,694,695,696,697,700,701,704,707,708,711,715,720,728,736,745,753,757,765,773,781,789,797,806,815,823,832,835,837,842,844,849,853,857,858,863,864,865,866,867,868,870,871,876,877,878,879,880,881,882,884,888,892,896,900,901,902,903,904,905,906,907,908,911,915,918,922,930,937,946,950,965,973,976,985,990,1001,1009,1012,1021,1028,1029,1048,1051,1057,1060,1069,1072,1075,1078,1081,1084,1088,1091,1100,1103,1111,1116,1124,1129,1133,1134,1145,1152,1156,1160,1161,1165,1173,1177,1182,1187,55,56,57,76,82,92,96,97,98,141,149,150,158,159,160,161,167,168,169,170,171,172,173,174,175,198,217", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "100,156,216,277,332,385,443,491,540,585,638,696,756,814,860,920,973,1019,1069,1116,1174,1232,1291,1351,1413,1475,1537,1599,1661,1723,1784,1846,1908,1961,2023,2097,2160,2228,2309,2373,2439,2509,2579,2649,2719,2786,2849,2914,2980,3033,3109,3175,3262,18372,18426,18505,18583,18656,18721,18784,18850,18921,18992,19054,19123,19189,19256,19323,19379,19430,19483,19535,19589,19660,19723,19782,19844,19903,19976,20043,20103,20166,20241,20313,20384,20440,20511,20568,20625,20691,20755,20826,20883,20936,20999,21051,21109,21176,21242,21308,21389,21464,21520,21573,21634,21692,21742,21791,21840,21889,21951,22003,22048,22129,22183,22236,22290,22341,22390,22441,22502,22563,22625,22675,22716,22766,22814,22876,22927,22976,23045,23106,23162,23233,23298,23367,23418,23481,23551,23620,23690,23752,23822,23892,23967,24026,24084,24146,24191,24234,24281,24326,24377,24425,24491,24553,24616,24688,24745,24802,24862,24920,24990,25047,25192,25313,25417,25504,25656,25808,25956,26037,26115,26416,26582,26737,26839,27116,27209,27316,27659,27766,27995,28404,28636,28736,28841,28960,29583,29730,29849,30084,30499,30737,30849,30970,31103,33241,34757,38048,40182,41710,43254,46541,46787,47046,47850,49610,50060,50775,50848,50935,51020,51119,51314,51406,51579,51741,51836,52005,52248,52541,52950,53364,53824,54242,54483,54913,55348,55758,56180,56590,57047,57501,57917,58383,58565,58633,58977,59057,59413,59563,59707,59791,60156,60254,60362,60460,60570,60686,60812,60908,61285,61395,61519,61657,61767,61889,62017,62155,62317,62533,62689,62893,62977,63081,63175,63289,63401,63525,63621,63701,63890,64096,64289,64499,64931,65352,65777,65974,66922,67443,67566,68203,68424,69239,69708,69891,70487,70947,71052,72313,72463,72880,73045,73725,73884,74046,74201,74397,74564,74786,74946,75323,75482,75810,76027,76602,76952,77201,77298,78004,78442,78683,78872,79006,79197,79834,80084,80387,80602,3338,3636,3892,4389,4823,5480,5823,7362,7710,9607,9929,10060,10766,10903,11055,11257,11962,12082,13231,13798,13927,14060,14220,14395,14537,16324,18162", - "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,344,345,346,351,352,356,362,366,367,368,369,380,381,382,386,392,396,397,398,399,429,449,495,525,545,565,611,615,619,633,674,682,692,693,694,695,696,699,700,703,706,707,710,714,719,727,735,744,752,756,764,772,780,788,796,805,814,822,831,834,836,841,843,848,852,856,857,862,863,864,865,866,867,869,870,875,876,877,878,879,880,881,883,887,891,895,899,900,901,902,903,904,905,906,907,910,914,917,921,929,936,945,949,964,972,975,984,989,1000,1008,1011,1020,1027,1028,1047,1050,1056,1059,1068,1071,1074,1077,1080,1083,1087,1090,1099,1102,1110,1115,1123,1128,1132,1133,1144,1151,1155,1159,1160,1164,1172,1176,1181,1186,1195,55,56,75,81,91,95,96,97,140,148,149,157,158,159,160,166,167,168,169,170,171,172,173,174,197,216,217", - "endColumns": "55,59,60,54,52,57,47,48,44,52,57,59,57,45,59,52,45,49,46,57,57,58,59,61,61,61,61,61,61,60,61,61,52,61,73,62,67,80,63,65,69,69,69,69,66,62,64,65,52,75,65,86,75,53,78,77,72,64,62,65,70,70,61,68,65,66,66,55,50,52,51,53,70,62,58,61,58,72,66,59,62,74,71,70,55,70,56,56,65,63,70,56,52,62,51,57,66,65,65,80,74,55,52,60,57,49,48,48,48,61,51,44,80,53,52,53,50,48,50,60,60,61,49,40,49,47,61,50,48,68,60,55,70,64,68,50,62,69,68,69,61,69,69,74,58,57,61,44,42,46,44,50,47,65,61,62,71,56,56,59,57,69,56,144,120,103,86,151,151,147,80,77,300,165,154,101,10,92,106,10,106,10,10,10,99,104,118,10,146,118,10,10,10,111,120,132,10,10,10,10,10,10,10,10,10,10,10,10,10,72,86,84,98,10,91,10,10,94,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,83,10,97,107,97,109,115,10,95,10,109,123,137,109,121,127,10,10,10,10,10,83,103,93,113,111,123,95,79,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,104,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,96,10,10,10,10,133,10,10,10,10,10,10,297,255,90,243,367,188,1538,347,95,94,130,412,136,151,201,220,119,1148,566,128,132,159,174,141,125,457,209", - "endOffsets": "151,211,272,327,380,438,486,535,580,633,691,751,809,855,915,968,1014,1064,1111,1169,1227,1286,1346,1408,1470,1532,1594,1656,1718,1779,1841,1903,1956,2018,2092,2155,2223,2304,2368,2434,2504,2574,2644,2714,2781,2844,2909,2975,3028,3104,3170,3257,3333,18421,18500,18578,18651,18716,18779,18845,18916,18987,19049,19118,19184,19251,19318,19374,19425,19478,19530,19584,19655,19718,19777,19839,19898,19971,20038,20098,20161,20236,20308,20379,20435,20506,20563,20620,20686,20750,20821,20878,20931,20994,21046,21104,21171,21237,21303,21384,21459,21515,21568,21629,21687,21737,21786,21835,21884,21946,21998,22043,22124,22178,22231,22285,22336,22385,22436,22497,22558,22620,22670,22711,22761,22809,22871,22922,22971,23040,23101,23157,23228,23293,23362,23413,23476,23546,23615,23685,23747,23817,23887,23962,24021,24079,24141,24186,24229,24276,24321,24372,24420,24486,24548,24611,24683,24740,24797,24857,24915,24985,25042,25187,25308,25412,25499,25651,25803,25951,26032,26110,26411,26577,26732,26834,27111,27204,27311,27654,27761,27990,28399,28631,28731,28836,28955,29578,29725,29844,30079,30494,30732,30844,30965,31098,33236,34752,38043,40177,41705,43249,46536,46782,47041,47845,49605,50055,50770,50843,50930,51015,51114,51309,51401,51574,51736,51831,52000,52243,52536,52945,53359,53819,54237,54478,54908,55343,55753,56175,56585,57042,57496,57912,58378,58560,58628,58972,59052,59408,59558,59702,59786,60151,60249,60357,60455,60565,60681,60807,60903,61280,61390,61514,61652,61762,61884,62012,62150,62312,62528,62684,62888,62972,63076,63170,63284,63396,63520,63616,63696,63885,64091,64284,64494,64926,65347,65772,65969,66917,67438,67561,68198,68419,69234,69703,69886,70482,70942,71047,72308,72458,72875,73040,73720,73879,74041,74196,74392,74559,74781,74941,75318,75477,75805,76022,76597,76947,77196,77293,77999,78437,78678,78867,79001,79192,79829,80079,80382,80597,81178,3631,3887,4384,4818,5475,5818,7357,7705,9602,9924,10055,10761,10898,11050,11252,11957,12077,13226,13793,13922,14055,14215,14390,14532,16319,18157,18367" - }, - "to": { - "startLines": "15,16,17,18,21,22,23,24,34,36,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,173,199,200,201,202,203,204,205,206,207,208,209,232,233,234,235,236,237,238,239,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,493,494,501,502,509,510,511,519,522,523,526,527,528,529,530,531,532,533,576,577,578,579,580,581,582,583,584,585,586,587,588,597,873,874,875,880,881,885,891,895,896,897,898,909,910,911,915,921,925,995,996,997,1027,1047,1093,1123,1143,1163,1209,1213,1955,1969,2010,2018,2162,2163,2164,2165,2312,2315,2316,2319,2322,2323,2326,2330,2335,2343,2351,2360,2368,2372,2380,2388,2396,2404,2412,2421,2430,2438,2447,2485,2487,2492,2494,2499,2503,2507,2508,2513,2514,2515,2516,2517,2518,2520,2521,2526,2527,2528,2529,2530,2531,2532,2534,2538,2542,2546,2557,2558,2559,2560,2561,2562,2563,2564,2565,2568,2572,2575,2675,2683,2690,2699,2703,2718,2726,2729,2738,2743,2754,2762,2765,2774,2781,2782,2801,2804,2810,2813,2822,2825,2828,2831,2834,2837,2841,2844,2853,2856,2864,2869,2877,2882,2886,2887,2898,2905,2909,2913,2914,2918,2926,2930,2935,2940,3124,3125,3126,3629,3635,3645,3682,3683,3684,3727,3870,3889,3897,3898,3974,4068,4074,4075,4260,4305,4306,4344,4345,4456,4457,4495,4514", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "621,677,737,798,953,1006,1064,1112,1563,1653,6833,6891,6951,7009,7055,7115,7168,7214,7264,7311,7369,7427,7486,7546,7608,7670,7732,7794,7856,7918,7979,8041,8103,8373,10236,10310,10373,10441,10522,10586,10652,10722,10792,10862,10932,12352,12415,12480,12546,12599,12675,12741,12828,20217,20271,20350,20428,20501,20566,20629,20695,20766,20837,20899,20968,21034,21101,21168,21224,21275,21328,21380,21434,21505,21568,21627,21689,21748,21821,21888,21948,22011,22086,22158,22229,22285,22356,22413,22470,22536,22600,22671,22728,22781,22844,22896,22954,24433,24499,24565,24646,24721,24777,24830,24891,24949,24999,25048,25097,25146,25208,25260,25305,25386,25440,25493,25547,25598,25647,25698,25759,25820,25882,25932,25973,26023,26071,26133,26184,26233,26302,26363,26419,26490,26555,26624,26675,26738,26808,26877,26947,27009,27079,27149,27224,29277,29335,29683,29728,30054,30101,30146,30530,30704,30770,30949,31012,31084,31141,31198,31258,31316,31386,34370,34515,34636,34740,34827,34979,35131,35279,35360,35438,35739,35905,36060,36789,54733,54826,54933,55276,55383,55612,56021,56253,56353,56458,56577,57200,57347,57466,57701,58116,58354,63625,63746,63879,66017,67533,70824,72958,74486,76030,79317,79563,125976,126780,128540,128990,139234,139307,139394,139479,150828,151023,151115,151288,151450,151545,151714,151957,152250,152659,153073,153533,153951,154192,154622,155057,155467,155889,156299,156756,157210,157626,158092,160858,160926,161270,161350,161706,161856,162000,162084,162449,162547,162655,162753,162863,162979,163105,163201,163578,163688,163812,163950,164060,164182,164310,164448,164610,164826,164982,165858,165942,166046,166140,166254,166366,166490,166586,166666,166855,167061,167254,175173,175605,176026,176451,176648,177596,178117,178240,178877,179098,179913,180382,180565,181161,181621,181726,182987,183137,183554,183719,184399,184558,184720,184875,185071,185238,185460,185620,185997,186156,186484,186701,187276,187626,187875,187972,188678,189116,189357,189546,189680,189871,190508,190758,191061,191276,202064,202362,202618,228460,228894,229551,231977,233516,233864,235761,249564,250728,251434,251571,256694,261772,262477,262597,272492,275383,275512,277695,277855,284432,284574,286962,288800", - "endLines": "15,16,17,18,21,22,23,24,34,36,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,173,199,200,201,202,203,204,205,206,207,208,209,232,233,234,235,236,237,238,239,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,493,494,501,502,509,510,511,519,522,523,526,527,528,529,530,531,532,533,576,577,578,579,580,581,582,583,584,585,586,587,588,600,873,874,879,880,884,890,894,895,896,897,908,909,910,914,920,924,925,995,996,1026,1046,1092,1122,1142,1162,1208,1212,1216,1968,2009,2017,2027,2162,2163,2164,2165,2314,2315,2318,2321,2322,2325,2329,2334,2342,2350,2359,2367,2371,2379,2387,2395,2403,2411,2420,2429,2437,2446,2449,2486,2491,2493,2498,2502,2506,2507,2512,2513,2514,2515,2516,2517,2519,2520,2525,2526,2527,2528,2529,2530,2531,2533,2537,2541,2545,2549,2557,2558,2559,2560,2561,2562,2563,2564,2567,2571,2574,2578,2682,2689,2698,2702,2717,2725,2728,2737,2742,2753,2761,2764,2773,2780,2781,2800,2803,2809,2812,2821,2824,2827,2830,2833,2836,2840,2843,2852,2855,2863,2868,2876,2881,2885,2886,2897,2904,2908,2912,2913,2917,2925,2929,2934,2939,2948,3124,3125,3144,3634,3644,3648,3682,3683,3726,3734,3870,3896,3897,3898,3974,4073,4074,4075,4260,4305,4306,4344,4345,4456,4479,4513,4514", - "endColumns": "55,59,60,54,52,57,47,48,44,52,57,59,57,45,59,52,45,49,46,57,57,58,59,61,61,61,61,61,61,60,61,61,52,61,73,62,67,80,63,65,69,69,69,69,66,62,64,65,52,75,65,86,75,53,78,77,72,64,62,65,70,70,61,68,65,66,66,55,50,52,51,53,70,62,58,61,58,72,66,59,62,74,71,70,55,70,56,56,65,63,70,56,52,62,51,57,66,65,65,80,74,55,52,60,57,49,48,48,48,61,51,44,80,53,52,53,50,48,50,60,60,61,49,40,49,47,61,50,48,68,60,55,70,64,68,50,62,69,68,69,61,69,69,74,58,57,61,44,42,46,44,50,47,65,61,62,71,56,56,59,57,69,56,144,120,103,86,151,151,147,80,77,300,165,154,101,10,92,106,10,106,10,10,10,99,104,118,10,146,118,10,10,10,111,120,132,10,10,10,10,10,10,10,10,10,10,10,10,10,72,86,84,98,10,91,10,10,94,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,83,10,97,107,97,109,115,10,95,10,109,123,137,109,121,127,10,10,10,10,10,83,103,93,113,111,123,95,79,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,104,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,96,10,10,10,10,133,10,10,10,10,10,10,297,255,90,243,367,188,1538,347,95,94,130,412,136,151,201,220,119,1148,566,128,132,159,174,141,125,457,209", - "endOffsets": "672,732,793,848,1001,1059,1107,1156,1603,1701,6886,6946,7004,7050,7110,7163,7209,7259,7306,7364,7422,7481,7541,7603,7665,7727,7789,7851,7913,7974,8036,8098,8151,8430,10305,10368,10436,10517,10581,10647,10717,10787,10857,10927,10994,12410,12475,12541,12594,12670,12736,12823,12899,20266,20345,20423,20496,20561,20624,20690,20761,20832,20894,20963,21029,21096,21163,21219,21270,21323,21375,21429,21500,21563,21622,21684,21743,21816,21883,21943,22006,22081,22153,22224,22280,22351,22408,22465,22531,22595,22666,22723,22776,22839,22891,22949,23016,24494,24560,24641,24716,24772,24825,24886,24944,24994,25043,25092,25141,25203,25255,25300,25381,25435,25488,25542,25593,25642,25693,25754,25815,25877,25927,25968,26018,26066,26128,26179,26228,26297,26358,26414,26485,26550,26619,26670,26733,26803,26872,26942,27004,27074,27144,27219,27278,29330,29392,29723,29766,30096,30141,30192,30573,30765,30827,31007,31079,31136,31193,31253,31311,31381,31438,34510,34631,34735,34822,34974,35126,35274,35355,35433,35734,35900,36055,36157,37061,54821,54928,55271,55378,55607,56016,56248,56348,56453,56572,57195,57342,57461,57696,58111,58349,58461,63741,63874,66012,67528,70819,72953,74481,76025,79312,79558,79817,126775,128535,128985,129700,139302,139389,139474,139573,151018,151110,151283,151445,151540,151709,151952,152245,152654,153068,153528,153946,154187,154617,155052,155462,155884,156294,156751,157205,157621,158087,158269,160921,161265,161345,161701,161851,161995,162079,162444,162542,162650,162748,162858,162974,163100,163196,163573,163683,163807,163945,164055,164177,164305,164443,164605,164821,164977,165181,165937,166041,166135,166249,166361,166485,166581,166661,166850,167056,167249,167459,175600,176021,176446,176643,177591,178112,178235,178872,179093,179908,180377,180560,181156,181616,181721,182982,183132,183549,183714,184394,184553,184715,184870,185066,185233,185455,185615,185992,186151,186479,186696,187271,187621,187870,187967,188673,189111,189352,189541,189675,189866,190503,190753,191056,191271,191852,202357,202613,203110,228889,229546,229889,233511,233859,235756,236078,249690,251429,251566,251718,256891,262472,262592,263741,273054,275507,275640,277850,278025,284569,286356,288795,289005" - } - }, - { - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\values\\strings.xml", - "from": { - "startLines": "7,2,1,3", - "startColumns": "4,4,4,4", - "startOffsets": "219,62,16,115", - "endLines": "10,2,1,3", - "endColumns": "19,52,45,60", - "endOffsets": "333,110,57,171" - }, - "to": { - "startLines": "2,574,575,591", - "startColumns": "4,4,4,4", - "startOffsets": "150,34271,34324,36286", - "endLines": "5,574,575,591", - "endColumns": "19,52,45,60", - "endOffsets": "264,34319,34365,36342" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-pa_values-pa.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-pa\\values-pa.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,208,305,410,496,596,709,786,862,953,1046,1142,1236,1337,1430,1525,1619,1710,1801,1880,1981,2085,2182,2291,2390,2500,2659,2759", - "endColumns": "102,96,104,85,99,112,76,75,90,92,95,93,100,92,94,93,90,90,78,100,103,96,108,98,109,158,99,79", - "endOffsets": "203,300,405,491,591,704,781,857,948,1041,1137,1231,1332,1425,1520,1614,1705,1796,1875,1976,2080,2177,2286,2385,2495,2654,2754,2834" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-pa\\values-pa.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2839", - "endColumns": "100", - "endOffsets": "2935" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-ml_values-ml.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-ml\\values-ml.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2955", - "endColumns": "100", - "endOffsets": "3051" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ml\\values-ml.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,224,342,457,550,655,787,864,940,1031,1124,1226,1320,1421,1515,1610,1709,1800,1891,1973,2084,2190,2288,2402,2502,2613,2772,2873", - "endColumns": "118,117,114,92,104,131,76,75,90,92,101,93,100,93,94,98,90,90,81,110,105,97,113,99,110,158,100,81", - "endOffsets": "219,337,452,545,650,782,859,935,1026,1119,1221,1315,1416,1510,1605,1704,1795,1886,1968,2079,2185,2283,2397,2497,2608,2767,2868,2950" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-ne_values-ne.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-ne\\values-ne.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2988", - "endColumns": "100", - "endOffsets": "3084" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ne\\values-ne.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,210,314,422,513,620,747,841,931,1022,1115,1211,1305,1406,1499,1594,1688,1779,1870,1958,2068,2184,2287,2402,2504,2619,2790,2902", - "endColumns": "104,103,107,90,106,126,93,89,90,92,95,93,100,92,94,93,90,90,87,109,115,102,114,101,114,170,111,85", - "endOffsets": "205,309,417,508,615,742,836,926,1017,1110,1206,1300,1401,1494,1589,1683,1774,1865,1953,2063,2179,2282,2397,2499,2614,2785,2897,2983" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-bn_values-bn.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-bn\\values-bn.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,214,326,432,526,631,760,838,916,1007,1100,1195,1289,1390,1483,1578,1672,1763,1854,1941,2051,2159,2258,2368,2474,2587,2752,2857", - "endColumns": "108,111,105,93,104,128,77,77,90,92,94,93,100,92,94,93,90,90,86,109,107,98,109,105,112,164,104,81", - "endOffsets": "209,321,427,521,626,755,833,911,1002,1095,1190,1284,1385,1478,1573,1667,1758,1849,1936,2046,2154,2253,2363,2469,2582,2747,2852,2934" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-bn\\values-bn.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2939", - "endColumns": "100", - "endOffsets": "3035" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-km_values-km.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-km\\values-km.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2882", - "endColumns": "100", - "endOffsets": "2978" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-km\\values-km.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,208,308,420,507,611,729,806,883,974,1067,1163,1257,1358,1451,1546,1640,1731,1822,1905,2009,2114,2214,2324,2431,2539,2701,2799", - "endColumns": "102,99,111,86,103,117,76,76,90,92,95,93,100,92,94,93,90,90,82,103,104,99,109,106,107,161,97,82", - "endOffsets": "203,303,415,502,606,724,801,878,969,1062,1158,1252,1353,1446,1541,1635,1726,1817,1900,2004,2109,2209,2319,2426,2534,2696,2794,2877" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-sr_values-sr.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-sr\\values-sr.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,214,317,423,509,613,731,812,892,983,1076,1172,1266,1367,1460,1555,1660,1751,1842,1930,2035,2143,2244,2348,2456,2557,2724,2821", - "endColumns": "108,102,105,85,103,117,80,79,90,92,95,93,100,92,94,104,90,90,87,104,107,100,103,107,100,166,96,83", - "endOffsets": "209,312,418,504,608,726,807,887,978,1071,1167,1261,1362,1455,1550,1655,1746,1837,1925,2030,2138,2239,2343,2451,2552,2719,2816,2900" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-sr\\values-sr.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2905", - "endColumns": "100", - "endOffsets": "3001" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-el_values-el.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-el\\values-el.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2964", - "endColumns": "100", - "endOffsets": "3060" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-el\\values-el.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,223,334,451,536,641,767,855,941,1032,1125,1221,1315,1416,1509,1604,1701,1792,1883,1968,2079,2189,2291,2402,2511,2619,2779,2879", - "endColumns": "117,110,116,84,104,125,87,85,90,92,95,93,100,92,94,96,90,90,84,110,109,101,110,108,107,159,99,84", - "endOffsets": "218,329,446,531,636,762,850,936,1027,1120,1216,1310,1411,1504,1599,1696,1787,1878,1963,2074,2184,2286,2397,2506,2614,2774,2874,2959" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-ca_values-ca.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-ca\\values-ca.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2915", - "endColumns": "100", - "endOffsets": "3011" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ca\\values-ca.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,223,329,436,519,627,753,837,918,1009,1102,1196,1291,1390,1483,1576,1670,1761,1852,1935,2046,2155,2253,2363,2467,2575,2735,2834", - "endColumns": "117,105,106,82,107,125,83,80,90,92,93,94,98,92,92,93,90,90,82,110,108,97,109,103,107,159,98,80", - "endOffsets": "218,324,431,514,622,748,832,913,1004,1097,1191,1286,1385,1478,1571,1665,1756,1847,1930,2041,2150,2248,2358,2462,2570,2730,2829,2910" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-gl_values-gl.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-gl\\values-gl.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,217,329,437,522,624,750,834,915,1007,1101,1199,1293,1394,1488,1584,1679,1771,1863,1945,2052,2161,2260,2368,2472,2579,2738,2838", - "endColumns": "111,111,107,84,101,125,83,80,91,93,97,93,100,93,95,94,91,91,81,106,108,98,107,103,106,158,99,81", - "endOffsets": "212,324,432,517,619,745,829,910,1002,1096,1194,1288,1389,1483,1579,1674,1766,1858,1940,2047,2156,2255,2363,2467,2574,2733,2833,2915" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-gl\\values-gl.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2920", - "endColumns": "100", - "endOffsets": "3016" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-zh-rCN_values-zh-rCN.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-zh-rCN\\values-zh-rCN.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,201,296,396,478,575,681,757,833,924,1017,1115,1211,1306,1399,1494,1586,1677,1768,1846,1942,2038,2133,2230,2325,2423,2572,2666", - "endColumns": "95,94,99,81,96,105,75,75,90,92,97,95,94,92,94,91,90,90,77,95,95,94,96,94,97,148,93,77", - "endOffsets": "196,291,391,473,570,676,752,828,919,1012,1110,1206,1301,1394,1489,1581,1672,1763,1841,1937,2033,2128,2225,2320,2418,2567,2661,2739" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-zh-rCN\\values-zh-rCN.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2744", - "endColumns": "100", - "endOffsets": "2840" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-mr_values-mr.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-mr\\values-mr.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2887", - "endColumns": "100", - "endOffsets": "2983" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-mr\\values-mr.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,216,322,429,519,620,735,812,890,981,1074,1168,1265,1366,1459,1554,1651,1742,1833,1913,2025,2127,2223,2332,2433,2545,2702,2807", - "endColumns": "110,105,106,89,100,114,76,77,90,92,93,96,100,92,94,96,90,90,79,111,101,95,108,100,111,156,104,79", - "endOffsets": "211,317,424,514,615,730,807,885,976,1069,1163,1260,1361,1454,1549,1646,1737,1828,1908,2020,2122,2218,2327,2428,2540,2697,2802,2882" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-gu_values-gu.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-gu\\values-gu.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2882", - "endColumns": "100", - "endOffsets": "2978" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-gu\\values-gu.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,214,318,425,512,613,736,813,891,982,1075,1174,1268,1369,1462,1557,1654,1745,1836,1916,2022,2124,2221,2330,2429,2539,2699,2802", - "endColumns": "108,103,106,86,100,122,76,77,90,92,98,93,100,92,94,96,90,90,79,105,101,96,108,98,109,159,102,79", - "endOffsets": "209,313,420,507,608,731,808,886,977,1070,1169,1263,1364,1457,1552,1649,1740,1831,1911,2017,2119,2216,2325,2424,2534,2694,2797,2877" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-watch-v21_values-watch-v21.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-watch-v21\\values-watch-v21.xml", - "from": { - "startLines": "2,6,10", - "startColumns": "4,4,4", - "startOffsets": "55,271,499", - "endLines": "5,9,13", - "endColumns": "12,12,12", - "endOffsets": "266,494,724" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-or_values-or.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-or\\values-or.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2936", - "endColumns": "100", - "endOffsets": "3032" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-or\\values-or.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,224,334,441,527,631,751,828,905,996,1089,1186,1281,1382,1475,1570,1666,1757,1847,1929,2039,2144,2250,2361,2464,2582,2745,2847", - "endColumns": "118,109,106,85,103,119,76,76,90,92,96,94,100,92,94,95,90,89,81,109,104,105,110,102,117,162,101,88", - "endOffsets": "219,329,436,522,626,746,823,900,991,1084,1181,1276,1377,1470,1565,1661,1752,1842,1924,2034,2139,2245,2356,2459,2577,2740,2842,2931" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-ru_values-ru.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-ru\\values-ru.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2913", - "endColumns": "100", - "endOffsets": "3009" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ru\\values-ru.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,220,322,434,520,625,745,824,902,994,1088,1184,1277,1373,1467,1563,1658,1750,1842,1922,2028,2136,2234,2343,2449,2557,2732,2832", - "endColumns": "114,101,111,85,104,119,78,77,91,93,95,92,95,93,95,94,91,91,79,105,107,97,108,105,107,174,99,80", - "endOffsets": "215,317,429,515,620,740,819,897,989,1083,1179,1272,1368,1462,1558,1653,1745,1837,1917,2023,2131,2229,2338,2444,2552,2727,2827,2908" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-lt_values-lt.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-lt\\values-lt.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,221,322,435,522,631,752,834,915,1009,1105,1203,1299,1403,1499,1597,1700,1794,1888,1973,2082,2191,2291,2401,2505,2618,2794,2895", - "endColumns": "115,100,112,86,108,120,81,80,93,95,97,95,103,95,97,102,93,93,84,108,108,99,109,103,112,175,100,82", - "endOffsets": "216,317,430,517,626,747,829,910,1004,1100,1198,1294,1398,1494,1592,1695,1789,1883,1968,2077,2186,2286,2396,2500,2613,2789,2890,2973" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-lt\\values-lt.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2978", - "endColumns": "100", - "endOffsets": "3074" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-af_values-af.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-af\\values-af.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,209,309,415,500,603,721,797,874,965,1058,1154,1248,1348,1441,1536,1635,1730,1824,1905,2012,2115,2212,2320,2422,2524,2678,2776", - "endColumns": "103,99,105,84,102,117,75,76,90,92,95,93,99,92,94,98,94,93,80,106,102,96,107,101,101,153,97,79", - "endOffsets": "204,304,410,495,598,716,792,869,960,1053,1149,1243,1343,1436,1531,1630,1725,1819,1900,2007,2110,2207,2315,2417,2519,2673,2771,2851" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-af\\values-af.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2856", - "endColumns": "100", - "endOffsets": "2952" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-si_values-si.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-si\\values-si.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2903", - "endColumns": "100", - "endOffsets": "2999" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-si\\values-si.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,215,322,429,517,622,738,827,914,1005,1098,1193,1287,1388,1481,1576,1670,1761,1852,1936,2045,2150,2248,2358,2457,2563,2722,2821", - "endColumns": "109,106,106,87,104,115,88,86,90,92,94,93,100,92,94,93,90,90,83,108,104,97,109,98,105,158,98,81", - "endOffsets": "210,317,424,512,617,733,822,909,1000,1093,1188,1282,1383,1476,1571,1665,1756,1847,1931,2040,2145,2243,2353,2452,2558,2717,2816,2898" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-lo_values-lo.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-lo\\values-lo.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2836", - "endColumns": "100", - "endOffsets": "2932" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-lo\\values-lo.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,208,305,412,497,602,714,791,869,960,1053,1149,1243,1344,1437,1532,1626,1717,1808,1888,1995,2092,2190,2295,2398,2502,2659,2755", - "endColumns": "102,96,106,84,104,111,76,77,90,92,95,93,100,92,94,93,90,90,79,106,96,97,104,102,103,156,95,80", - "endOffsets": "203,300,407,492,597,709,786,864,955,1048,1144,1238,1339,1432,1527,1621,1712,1803,1883,1990,2087,2185,2290,2393,2497,2654,2750,2831" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-eu_values-eu.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-eu\\values-eu.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,214,312,422,508,614,738,825,909,1001,1095,1192,1286,1388,1482,1578,1675,1767,1860,1942,2051,2161,2260,2369,2475,2586,2757,2856", - "endColumns": "108,97,109,85,105,123,86,83,91,93,96,93,101,93,95,96,91,92,81,108,109,98,108,105,110,170,98,81", - "endOffsets": "209,307,417,503,609,733,820,904,996,1090,1187,1281,1383,1477,1573,1670,1762,1855,1937,2046,2156,2255,2364,2470,2581,2752,2851,2933" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-eu\\values-eu.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2938", - "endColumns": "100", - "endOffsets": "3034" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-hy_values-hy.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-hy\\values-hy.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,208,309,419,508,614,729,811,892,983,1076,1172,1266,1367,1460,1555,1649,1740,1831,1916,2023,2130,2229,2339,2446,2546,2703,2802", - "endColumns": "102,100,109,88,105,114,81,80,90,92,95,93,100,92,94,93,90,90,84,106,106,98,109,106,99,156,98,81", - "endOffsets": "203,304,414,503,609,724,806,887,978,1071,1167,1261,1362,1455,1550,1644,1735,1826,1911,2018,2125,2224,2334,2441,2541,2698,2797,2879" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-hy\\values-hy.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2884", - "endColumns": "100", - "endOffsets": "2980" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-as_values-as.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-as\\values-as.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2950", - "endColumns": "100", - "endOffsets": "3046" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-as\\values-as.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,312,419,515,617,736,816,896,987,1080,1173,1268,1368,1461,1558,1652,1743,1834,1923,2025,2140,2243,2352,2471,2591,2758,2861", - "endColumns": "107,98,106,95,101,118,79,79,90,92,92,94,99,92,96,93,90,90,88,101,114,102,108,118,119,166,102,88", - "endOffsets": "208,307,414,510,612,731,811,891,982,1075,1168,1263,1363,1456,1553,1647,1738,1829,1918,2020,2135,2238,2347,2466,2586,2753,2856,2945" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-v26_values-v26.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-v26\\values-v26.xml", - "from": { - "startLines": "2,3,4,8,12,16", - "startColumns": "4,4,4,4,4,4", - "startOffsets": "55,130,217,431,657,896", - "endLines": "2,3,7,11,15,16", - "endColumns": "74,86,12,12,12,92", - "endOffsets": "125,212,426,652,891,984" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-sw_values-sw.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-sw\\values-sw.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2883", - "endColumns": "100", - "endOffsets": "2979" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-sw\\values-sw.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,208,306,414,504,609,726,808,891,982,1075,1169,1263,1364,1457,1552,1647,1738,1830,1912,2013,2122,2221,2328,2437,2542,2704,2801", - "endColumns": "102,97,107,89,104,116,81,82,90,92,93,93,100,92,94,94,90,91,81,100,108,98,106,108,104,161,96,81", - "endOffsets": "203,301,409,499,604,721,803,886,977,1070,1164,1258,1359,1452,1547,1642,1733,1825,1907,2008,2117,2216,2323,2432,2537,2699,2796,2878" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-ta_values-ta.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ta\\values-ta.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,219,317,432,521,628,754,832,909,1009,1114,1210,1305,1412,1514,1618,1713,1815,1913,1995,2097,2201,2298,2408,2510,2617,2774,2874", - "endColumns": "113,97,114,88,106,125,77,76,99,104,95,94,106,101,103,94,101,97,81,101,103,96,109,101,106,156,99,79", - "endOffsets": "214,312,427,516,623,749,827,904,1004,1109,1205,1300,1407,1509,1613,1708,1810,1908,1990,2092,2196,2293,2403,2505,2612,2769,2869,2949" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-ta\\values-ta.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2954", - "endColumns": "100", - "endOffsets": "3050" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-et_values-et.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-et\\values-et.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2942", - "endColumns": "100", - "endOffsets": "3038" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-et\\values-et.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,222,329,440,526,628,745,825,903,995,1089,1194,1296,1406,1500,1601,1695,1787,1880,1963,2074,2179,2278,2388,2489,2592,2758,2860", - "endColumns": "116,106,110,85,101,116,79,77,91,93,104,101,109,93,100,93,91,92,82,110,104,98,109,100,102,165,101,81", - "endOffsets": "217,324,435,521,623,740,820,898,990,1084,1189,1291,1401,1495,1596,1690,1782,1875,1958,2069,2174,2273,2383,2484,2587,2753,2855,2937" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-bs_values-bs.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-bs\\values-bs.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,224,333,440,526,630,752,834,915,1006,1099,1195,1289,1390,1483,1578,1677,1768,1859,1945,2048,2153,2251,2356,2469,2572,2745,2842", - "endColumns": "118,108,106,85,103,121,81,80,90,92,95,93,100,92,94,98,90,90,85,102,104,97,104,112,102,172,96,83", - "endOffsets": "219,328,435,521,625,747,829,910,1001,1094,1190,1284,1385,1478,1573,1672,1763,1854,1940,2043,2148,2246,2351,2464,2567,2740,2837,2921" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-bs\\values-bs.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2926", - "endColumns": "100", - "endOffsets": "3022" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-watch-v20_values-watch-v20.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-watch-v20\\values-watch-v20.xml", - "from": { - "startLines": "2,5,8", - "startColumns": "4,4,4", - "startOffsets": "55,214,385", - "endLines": "4,7,10", - "endColumns": "12,12,12", - "endOffsets": "209,380,553" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-v22_values-v22.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-v22\\values-v22.xml", - "from": { - "startLines": "2,3,4,9", - "startColumns": "4,4,4,4", - "startOffsets": "55,130,217,553", - "endLines": "2,3,8,13", - "endColumns": "74,86,12,12", - "endOffsets": "125,212,548,896" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-cs_values-cs.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-cs\\values-cs.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2891", - "endColumns": "100", - "endOffsets": "2987" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-cs\\values-cs.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,212,314,423,509,614,731,812,893,984,1077,1173,1267,1362,1455,1550,1647,1738,1829,1913,2017,2126,2225,2331,2441,2548,2711,2809", - "endColumns": "106,101,108,85,104,116,80,80,90,92,95,93,94,92,94,96,90,90,83,103,108,98,105,109,106,162,97,81", - "endOffsets": "207,309,418,504,609,726,807,888,979,1072,1168,1262,1357,1450,1545,1642,1733,1824,1908,2012,2121,2220,2326,2436,2543,2706,2804,2886" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-hu_values-hu.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-hu\\values-hu.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,318,433,517,629,759,835,911,1002,1095,1191,1285,1386,1479,1574,1669,1760,1851,1934,2044,2155,2255,2366,2474,2593,2775,2878", - "endColumns": "107,104,114,83,111,129,75,75,90,92,95,93,100,92,94,94,90,90,82,109,110,99,110,107,118,181,102,82", - "endOffsets": "208,313,428,512,624,754,830,906,997,1090,1186,1280,1381,1474,1569,1664,1755,1846,1929,2039,2150,2250,2361,2469,2588,2770,2873,2956" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-hu\\values-hu.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2961", - "endColumns": "100", - "endOffsets": "3057" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-te_values-te.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-te\\values-te.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,219,328,439,529,634,759,841,923,1014,1107,1203,1297,1398,1491,1586,1681,1772,1863,1947,2060,2168,2267,2378,2480,2597,2763,2864", - "endColumns": "113,108,110,89,104,124,81,81,90,92,95,93,100,92,94,94,90,90,83,112,107,98,110,101,116,165,100,81", - "endOffsets": "214,323,434,524,629,754,836,918,1009,1102,1198,1292,1393,1486,1581,1676,1767,1858,1942,2055,2163,2262,2373,2475,2592,2758,2859,2941" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-te\\values-te.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2946", - "endColumns": "100", - "endOffsets": "3042" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-port_values-port.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-port\\values-port.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "55", - "endOffsets": "106" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-v17_values-v17.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-v17\\values-v17.xml", - "from": { - "startLines": "2,5,9,12,15,18,22,25,29,33,37,40,43,46,50,53,57", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,228,456,614,764,936,1161,1331,1559,1783,2025,2196,2370,2539,2812,3012,3216", - "endLines": "4,8,11,14,17,21,24,28,32,36,39,42,45,49,52,56,60", - "endColumns": "12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12", - "endOffsets": "223,451,609,759,931,1156,1326,1554,1778,2020,2191,2365,2534,2807,3007,3211,3540" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-fr-rCA_values-fr-rCA.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-fr-rCA\\values-fr-rCA.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,216,331,442,529,645,775,858,938,1029,1122,1221,1316,1417,1510,1603,1698,1789,1880,1976,2086,2198,2301,2412,2519,2621,2780,2879", - "endColumns": "110,114,110,86,115,129,82,79,90,92,98,94,100,92,92,94,90,90,95,109,111,102,110,106,101,158,98,85", - "endOffsets": "211,326,437,524,640,770,853,933,1024,1117,1216,1311,1412,1505,1598,1693,1784,1875,1971,2081,2193,2296,2407,2514,2616,2775,2874,2960" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-fr-rCA\\values-fr-rCA.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2965", - "endColumns": "100", - "endOffsets": "3061" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-zh-rHK_values-zh-rHK.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-zh-rHK\\values-zh-rHK.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2746", - "endColumns": "100", - "endOffsets": "2842" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-zh-rHK\\values-zh-rHK.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,200,293,393,475,572,680,756,832,924,1018,1110,1206,1302,1396,1492,1584,1676,1768,1846,1942,2038,2133,2230,2325,2423,2574,2668", - "endColumns": "94,92,99,81,96,107,75,75,91,93,91,95,95,93,95,91,91,91,77,95,95,94,96,94,97,150,93,77", - "endOffsets": "195,288,388,470,567,675,751,827,919,1013,1105,1201,1297,1391,1487,1579,1671,1763,1841,1937,2033,2128,2225,2320,2418,2569,2663,2741" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-en-rGB_values-en-rGB.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-en-rGB\\values-en-rGB.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2846", - "endColumns": "100", - "endOffsets": "2942" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-en-rGB\\values-en-rGB.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,209,309,417,501,601,716,793,869,960,1053,1149,1243,1344,1437,1532,1626,1717,1808,1890,1993,2097,2196,2301,2404,2508,2664,2764", - "endColumns": "103,99,107,83,99,114,76,75,90,92,95,93,100,92,94,93,90,90,81,102,103,98,104,102,103,155,99,81", - "endOffsets": "204,304,412,496,596,711,788,864,955,1048,1144,1238,1339,1432,1527,1621,1712,1803,1885,1988,2092,2191,2296,2399,2503,2659,2759,2841" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-be_values-be.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-be\\values-be.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,225,328,444,530,638,756,835,913,1005,1099,1195,1289,1385,1479,1575,1670,1762,1854,1937,2043,2149,2247,2355,2460,2565,2734,2834", - "endColumns": "119,102,115,85,107,117,78,77,91,93,95,93,95,93,95,94,91,91,82,105,105,97,107,104,104,168,99,80", - "endOffsets": "220,323,439,525,633,751,830,908,1000,1094,1190,1284,1380,1474,1570,1665,1757,1849,1932,2038,2144,2242,2350,2455,2560,2729,2829,2910" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-be\\values-be.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2915", - "endColumns": "100", - "endOffsets": "3011" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-v16_values-v16.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-v16\\values-v16.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "65", - "endOffsets": "116" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-v16\\values-v16.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endLines": "5", - "endColumns": "12", - "endOffsets": "223" - }, - "to": { - "startLines": "3", - "startColumns": "4", - "startOffsets": "121", - "endLines": "6", - "endColumns": "12", - "endOffsets": "289" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-zu_values-zu.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-zu\\values-zu.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,320,434,522,625,752,832,912,1003,1096,1190,1284,1385,1478,1573,1667,1758,1851,1937,2041,2147,2245,2352,2458,2564,2721,2817", - "endColumns": "107,106,113,87,102,126,79,79,90,92,93,93,100,92,94,93,90,92,85,103,105,97,106,105,105,156,95,80", - "endOffsets": "208,315,429,517,620,747,827,907,998,1091,1185,1279,1380,1473,1568,1662,1753,1846,1932,2036,2142,2240,2347,2453,2559,2716,2812,2893" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-zu\\values-zu.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2898", - "endColumns": "100", - "endOffsets": "2994" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-h720dp-v13_values-h720dp-v13.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-h720dp-v13\\values-h720dp-v13.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "66", - "endOffsets": "117" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-pt-rPT_values-pt-rPT.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-pt-rPT\\values-pt-rPT.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2949", - "endColumns": "100", - "endOffsets": "3045" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-pt-rPT\\values-pt-rPT.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,225,331,438,527,628,752,836,917,1009,1103,1201,1295,1395,1489,1585,1680,1772,1864,1951,2058,2170,2272,2380,2487,2594,2765,2864", - "endColumns": "119,105,106,88,100,123,83,80,91,93,97,93,99,93,95,94,91,91,86,106,111,101,107,106,106,170,98,84", - "endOffsets": "220,326,433,522,623,747,831,912,1004,1098,1196,1290,1390,1484,1580,1675,1767,1859,1946,2053,2165,2267,2375,2482,2589,2760,2859,2944" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-night-v8_values-night-v8.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-night-v8\\values-night-v8.xml", - "from": { - "startLines": "2,3,4,5,6,7,8", - "startColumns": "4,4,4,4,4,4,4", - "startOffsets": "55,125,209,293,389,491,593", - "endColumns": "69,83,83,95,101,101,93", - "endOffsets": "120,204,288,384,486,588,682" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-large-v4_values-large-v4.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-large-v4\\values-large-v4.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10", - "startColumns": "4,4,4,4,4,4,4,4,4", - "startOffsets": "55,114,185,256,326,396,464,532,636", - "endColumns": "58,70,70,69,69,67,67,103,115", - "endOffsets": "109,180,251,321,391,459,527,631,747" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\values-large-v4\\values-large-v4.xml", - "from": { - "startLines": "2,3", - "startColumns": "4,4", - "startOffsets": "55,177", - "endColumns": "121,133", - "endOffsets": "172,306" - }, - "to": { - "startLines": "11,12", - "startColumns": "4,4", - "startOffsets": "752,874", - "endColumns": "121,133", - "endOffsets": "869,1003" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-sv_values-sv.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-sv\\values-sv.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2863", - "endColumns": "100", - "endOffsets": "2959" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-sv\\values-sv.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,211,314,425,510,612,725,801,877,970,1065,1161,1255,1358,1453,1550,1648,1744,1837,1917,2023,2123,2219,2324,2426,2528,2682,2784", - "endColumns": "105,102,110,84,101,112,75,75,92,94,95,93,102,94,96,97,95,92,79,105,99,95,104,101,101,153,101,78", - "endOffsets": "206,309,420,505,607,720,796,872,965,1060,1156,1250,1353,1448,1545,1643,1739,1832,1912,2018,2118,2214,2319,2421,2523,2677,2779,2858" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-my_values-my.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-my\\values-my.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2979", - "endColumns": "100", - "endOffsets": "3075" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-my\\values-my.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,214,319,436,529,641,769,847,926,1017,1110,1206,1300,1401,1494,1589,1683,1774,1865,1951,2074,2186,2288,2414,2525,2635,2795,2895", - "endColumns": "108,104,116,92,111,127,77,78,90,92,95,93,100,92,94,93,90,90,85,122,111,101,125,110,109,159,99,83", - "endOffsets": "209,314,431,524,636,764,842,921,1012,1105,1201,1295,1396,1489,1584,1678,1769,1860,1946,2069,2181,2283,2409,2520,2630,2790,2890,2974" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-nl_values-nl.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-nl\\values-nl.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2921", - "endColumns": "100", - "endOffsets": "3017" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-nl\\values-nl.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,223,328,435,521,629,749,826,903,995,1089,1190,1284,1385,1479,1575,1670,1762,1854,1936,2047,2151,2250,2365,2478,2581,2736,2839", - "endColumns": "117,104,106,85,107,119,76,76,91,93,100,93,100,93,95,94,91,91,81,110,103,98,114,112,102,154,102,81", - "endOffsets": "218,323,430,516,624,744,821,898,990,1084,1185,1279,1380,1474,1570,1665,1757,1849,1931,2042,2146,2245,2360,2473,2576,2731,2834,2916" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-v25_values-v25.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-v25\\values-v25.xml", - "from": { - "startLines": "2,3,4,6", - "startColumns": "4,4,4,4", - "startOffsets": "55,126,209,308", - "endLines": "2,3,5,7", - "endColumns": "70,82,12,12", - "endOffsets": "121,204,303,414" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-fa_values-fa.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-fa\\values-fa.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2903", - "endColumns": "100", - "endOffsets": "2999" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-fa\\values-fa.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,215,318,429,513,616,731,810,888,981,1076,1172,1266,1369,1464,1561,1660,1753,1843,1924,2036,2139,2237,2347,2451,2560,2721,2822", - "endColumns": "109,102,110,83,102,114,78,77,92,94,95,93,102,94,96,98,92,89,80,111,102,97,109,103,108,160,100,80", - "endOffsets": "210,313,424,508,611,726,805,883,976,1071,1167,1261,1364,1459,1556,1655,1748,1838,1919,2031,2134,2232,2342,2446,2555,2716,2817,2898" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-ldltr-v21_values-ldltr-v21.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ldltr-v21\\values-ldltr-v21.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "112", - "endOffsets": "163" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-hdpi-v4_values-hdpi-v4.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-hdpi-v4\\values-hdpi-v4.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endLines": "6", - "endColumns": "13", - "endOffsets": "327" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-tr_values-tr.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-tr\\values-tr.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,210,309,421,506,612,732,811,887,978,1071,1164,1258,1356,1449,1551,1646,1737,1828,1907,2014,2119,2215,2322,2424,2532,2688,2786", - "endColumns": "104,98,111,84,105,119,78,75,90,92,92,93,97,92,101,94,90,90,78,106,104,95,106,101,107,155,97,78", - "endOffsets": "205,304,416,501,607,727,806,882,973,1066,1159,1253,1351,1444,1546,1641,1732,1823,1902,2009,2114,2210,2317,2419,2527,2683,2781,2860" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-tr\\values-tr.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2865", - "endColumns": "100", - "endOffsets": "2961" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-kk_values-kk.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-kk\\values-kk.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,217,320,430,515,621,740,821,901,992,1085,1181,1275,1376,1469,1564,1661,1752,1844,1925,2028,2133,2231,2338,2447,2547,2713,2812", - "endColumns": "111,102,109,84,105,118,80,79,90,92,95,93,100,92,94,96,90,91,80,102,104,97,106,108,99,165,98,80", - "endOffsets": "212,315,425,510,616,735,816,896,987,1080,1176,1270,1371,1464,1559,1656,1747,1839,1920,2023,2128,2226,2333,2442,2542,2708,2807,2888" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-kk\\values-kk.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2893", - "endColumns": "100", - "endOffsets": "2989" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-bg_values-bg.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-bg\\values-bg.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,220,327,432,518,623,744,823,901,992,1085,1181,1275,1376,1469,1564,1672,1763,1854,1937,2051,2160,2260,2374,2480,2588,2748,2847", - "endColumns": "114,106,104,85,104,120,78,77,90,92,95,93,100,92,94,107,90,90,82,113,108,99,113,105,107,159,98,82", - "endOffsets": "215,322,427,513,618,739,818,896,987,1080,1176,1270,1371,1464,1559,1667,1758,1849,1932,2046,2155,2255,2369,2475,2583,2743,2842,2925" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-bg\\values-bg.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2930", - "endColumns": "100", - "endOffsets": "3026" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-en-rIN_values-en-rIN.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-en-rIN\\values-en-rIN.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2846", - "endColumns": "100", - "endOffsets": "2942" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-en-rIN\\values-en-rIN.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,209,309,417,501,601,716,793,869,960,1053,1149,1243,1344,1437,1532,1626,1717,1808,1890,1993,2097,2196,2301,2404,2508,2664,2764", - "endColumns": "103,99,107,83,99,114,76,75,90,92,95,93,100,92,94,93,90,90,81,102,103,98,104,102,103,155,99,81", - "endOffsets": "204,304,412,496,596,711,788,864,955,1048,1144,1238,1339,1432,1527,1621,1712,1803,1885,1988,2092,2191,2296,2399,2503,2659,2759,2841" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-it_values-it.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-it\\values-it.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2906", - "endColumns": "100", - "endOffsets": "3002" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-it\\values-it.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,214,314,423,507,616,741,818,894,986,1080,1174,1268,1370,1464,1561,1667,1759,1851,1932,2038,2146,2244,2348,2453,2560,2723,2823", - "endColumns": "108,99,108,83,108,124,76,75,91,93,93,93,101,93,96,105,91,91,80,105,107,97,103,104,106,162,99,82", - "endOffsets": "209,309,418,502,611,736,813,889,981,1075,1169,1263,1365,1459,1556,1662,1754,1846,1927,2033,2141,2239,2343,2448,2555,2718,2818,2901" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-es_values-es.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-es\\values-es.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2924", - "endColumns": "100", - "endOffsets": "3020" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-es\\values-es.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,222,335,443,528,629,757,842,924,1016,1110,1208,1302,1403,1497,1593,1689,1781,1873,1955,2062,2162,2261,2369,2476,2583,2742,2842", - "endColumns": "116,112,107,84,100,127,84,81,91,93,97,93,100,93,95,95,91,91,81,106,99,98,107,106,106,158,99,81", - "endOffsets": "217,330,438,523,624,752,837,919,1011,1105,1203,1297,1398,1492,1588,1684,1776,1868,1950,2057,2157,2256,2364,2471,2578,2737,2837,2919" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-uk_values-uk.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-uk\\values-uk.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2900", - "endColumns": "100", - "endOffsets": "2996" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-uk\\values-uk.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,215,317,423,509,617,735,814,894,985,1078,1174,1268,1369,1462,1557,1652,1743,1834,1915,2021,2128,2226,2334,2440,2549,2719,2819", - "endColumns": "109,101,105,85,107,117,78,79,90,92,95,93,100,92,94,94,90,90,80,105,106,97,107,105,108,169,99,80", - "endOffsets": "210,312,418,504,612,730,809,889,980,1073,1169,1263,1364,1457,1552,1647,1738,1829,1910,2016,2123,2221,2329,2435,2544,2714,2814,2895" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-v21_values-v21.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\values-v21\\values-v21.xml", - "from": { - "startLines": "2,10,18,26", - "startColumns": "4,4,4,4", - "startOffsets": "55,484,910,1333", - "endLines": "9,17,25,33", - "endColumns": "10,10,10,10", - "endOffsets": "479,905,1328,1763" - }, - "to": { - "startLines": "267,275,283,291", - "startColumns": "4,4,4,4", - "startOffsets": "19758,20187,20613,21036", - "endLines": "274,282,290,298", - "endColumns": "10,10,10,10", - "endOffsets": "20182,20608,21031,21466" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-v21\\values-v21.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,13", - "startColumns": "4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,159,223,290,354,470,596,722,850,1022", - "endLines": "2,3,4,5,6,7,8,9,12,17", - "endColumns": "103,63,66,63,115,125,125,127,12,12", - "endOffsets": "154,218,285,349,465,591,717,845,1017,1355" - }, - "to": { - "startLines": "2,3,4,5,263,264,265,266,299,302", - "startColumns": "4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,159,223,290,19262,19378,19504,19630,21471,21643", - "endLines": "2,3,4,5,263,264,265,266,301,306", - "endColumns": "103,63,66,63,115,125,125,127,12,12", - "endOffsets": "154,218,285,349,19373,19499,19625,19753,21638,21976" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-v21\\values-v21.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,17,19,20,21,22,24,26,27,28,29,30,32,34,36,38,40,42,43,48,50,52,53,54,56,58,59,60,61,62,63,107,110,154,157,160,162,164,166,169,171,174,175,176,179,180,181,182,183,184,187,188,190,192,194,196,200,202,203,204,205,207,211,213,215,216,217,218,219,221,222,223,233,234,235,247", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,146,249,352,457,564,673,782,891,1000,1109,1216,1319,1438,1593,1748,1853,1974,2075,2222,2363,2466,2585,2692,2795,2950,3121,3270,3435,3592,3743,3862,4234,4383,4532,4644,4791,4944,5091,5166,5255,5342,5443,5546,8614,8799,11879,12076,12275,12398,12521,12634,12817,12948,13149,13238,13349,13582,13683,13778,13901,14030,14147,14324,14423,14558,14701,14836,14955,15156,15275,15368,15479,15535,15642,15837,15948,16081,16176,16267,16358,16475,16614,16685,16768,17448,17505,17563,18257", - "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,16,18,19,20,21,23,25,26,27,28,29,31,33,35,37,39,41,42,47,49,51,52,53,55,57,58,59,60,61,62,106,109,153,156,159,161,163,165,168,170,173,174,175,178,179,180,181,182,183,186,187,189,191,193,195,199,201,202,203,204,206,210,212,214,215,216,217,218,220,221,222,232,233,234,246,258", - "endColumns": "90,102,102,104,106,108,108,108,108,108,106,102,118,12,12,104,120,100,12,12,102,118,106,102,12,12,12,12,12,12,118,12,12,12,111,146,12,12,74,88,86,100,102,12,12,12,12,12,12,12,12,12,12,12,88,110,12,100,94,122,128,116,12,98,12,12,12,12,12,12,92,110,55,12,12,12,12,94,90,90,116,12,70,82,12,56,57,12,12", - "endOffsets": "141,244,347,452,559,668,777,886,995,1104,1211,1314,1433,1588,1743,1848,1969,2070,2217,2358,2461,2580,2687,2790,2945,3116,3265,3430,3587,3738,3857,4229,4378,4527,4639,4786,4939,5086,5161,5250,5337,5438,5541,8609,8794,11874,12071,12270,12393,12516,12629,12812,12943,13144,13233,13344,13577,13678,13773,13896,14025,14142,14319,14418,14553,14696,14831,14950,15151,15270,15363,15474,15530,15637,15832,15943,16076,16171,16262,16353,16470,16609,16680,16763,17443,17500,17558,18252,18958" - }, - "to": { - "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,21,23,24,25,26,28,30,31,32,33,34,36,38,40,42,44,46,47,52,54,56,57,58,60,62,63,64,65,66,67,111,114,158,161,164,166,168,170,173,175,178,179,180,183,184,185,186,187,188,191,192,194,196,198,200,204,206,207,208,209,211,215,217,219,220,221,222,223,225,226,227,237,238,239,251", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "354,445,548,651,756,863,972,1081,1190,1299,1408,1515,1618,1737,1892,2047,2152,2273,2374,2521,2662,2765,2884,2991,3094,3249,3420,3569,3734,3891,4042,4161,4533,4682,4831,4943,5090,5243,5390,5465,5554,5641,5742,5845,8913,9098,12178,12375,12574,12697,12820,12933,13116,13247,13448,13537,13648,13881,13982,14077,14200,14329,14446,14623,14722,14857,15000,15135,15254,15455,15574,15667,15778,15834,15941,16136,16247,16380,16475,16566,16657,16774,16913,16984,17067,17747,17804,17862,18556", - "endLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,23,24,25,27,29,30,31,32,33,35,37,39,41,43,45,46,51,53,55,56,57,59,61,62,63,64,65,66,110,113,157,160,163,165,167,169,172,174,177,178,179,182,183,184,185,186,187,190,191,193,195,197,199,203,205,206,207,208,210,214,216,218,219,220,221,222,224,225,226,236,237,238,250,262", - "endColumns": "90,102,102,104,106,108,108,108,108,108,106,102,118,12,12,104,120,100,12,12,102,118,106,102,12,12,12,12,12,12,118,12,12,12,111,146,12,12,74,88,86,100,102,12,12,12,12,12,12,12,12,12,12,12,88,110,12,100,94,122,128,116,12,98,12,12,12,12,12,12,92,110,55,12,12,12,12,94,90,90,116,12,70,82,12,56,57,12,12", - "endOffsets": "440,543,646,751,858,967,1076,1185,1294,1403,1510,1613,1732,1887,2042,2147,2268,2369,2516,2657,2760,2879,2986,3089,3244,3415,3564,3729,3886,4037,4156,4528,4677,4826,4938,5085,5238,5385,5460,5549,5636,5737,5840,8908,9093,12173,12370,12569,12692,12815,12928,13111,13242,13443,13532,13643,13876,13977,14072,14195,14324,14441,14618,14717,14852,14995,15130,15249,15450,15569,15662,15773,15829,15936,16131,16242,16375,16470,16561,16652,16769,16908,16979,17062,17742,17799,17857,18551,19257" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-b+sr+Latn_values-b+sr+Latn.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-b+sr+Latn\\values-b+sr+Latn.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2912", - "endColumns": "100", - "endOffsets": "3008" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-b+sr+Latn\\values-b+sr+Latn.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,214,318,424,510,614,732,814,895,986,1079,1175,1269,1370,1463,1558,1663,1754,1845,1933,2039,2147,2248,2353,2461,2562,2731,2828", - "endColumns": "108,103,105,85,103,117,81,80,90,92,95,93,100,92,94,104,90,90,87,105,107,100,104,107,100,168,96,83", - "endOffsets": "209,313,419,505,609,727,809,890,981,1074,1170,1264,1365,1458,1553,1658,1749,1840,1928,2034,2142,2243,2348,2456,2557,2726,2823,2907" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-sk_values-sk.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-sk\\values-sk.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2918", - "endColumns": "100", - "endOffsets": "3014" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-sk\\values-sk.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,212,312,423,509,617,735,816,897,988,1081,1180,1274,1375,1468,1563,1661,1752,1843,1927,2032,2141,2240,2346,2457,2566,2732,2830", - "endColumns": "106,99,110,85,107,117,80,80,90,92,98,93,100,92,94,97,90,90,83,104,108,98,105,110,108,165,97,87", - "endOffsets": "207,307,418,504,612,730,811,892,983,1076,1175,1269,1370,1463,1558,1656,1747,1838,1922,2027,2136,2235,2341,2452,2561,2727,2825,2913" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-ky_values-ky.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-ky\\values-ky.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2883", - "endColumns": "100", - "endOffsets": "2979" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ky\\values-ky.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,209,304,423,507,614,731,809,888,979,1072,1168,1262,1363,1456,1551,1646,1737,1828,1909,2019,2126,2224,2330,2437,2538,2699,2802", - "endColumns": "103,94,118,83,106,116,77,78,90,92,95,93,100,92,94,94,90,90,80,109,106,97,105,106,100,160,102,80", - "endOffsets": "204,299,418,502,609,726,804,883,974,1067,1163,1257,1358,1451,1546,1641,1732,1823,1904,2014,2121,2219,2325,2432,2533,2694,2797,2878" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-da_values-da.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-da\\values-da.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,208,307,419,502,602,715,792,869,960,1053,1149,1243,1338,1431,1526,1624,1715,1806,1885,1994,2102,2198,2312,2414,2515,2668,2765", - "endColumns": "102,98,111,82,99,112,76,76,90,92,95,93,94,92,94,97,90,90,78,108,107,95,113,101,100,152,96,78", - "endOffsets": "203,302,414,497,597,710,787,864,955,1048,1144,1238,1333,1426,1521,1619,1710,1801,1880,1989,2097,2193,2307,2409,2510,2663,2760,2839" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-da\\values-da.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2844", - "endColumns": "100", - "endOffsets": "2940" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-v23_values-v23.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-v23\\values-v23.xml", - "from": { - "startLines": "2,3,4,5,6,19,32,33,34,35,36", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,190,325,400,487,1277,2079,2206,2311,2426,2533", - "endLines": "2,3,4,5,18,31,32,33,34,35,36", - "endColumns": "134,134,74,86,12,12,126,104,114,106,112", - "endOffsets": "185,320,395,482,1272,2074,2201,2306,2421,2528,2641" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\cardview-v7-28.0.0.aar\\3b87ab57366b6cf64018eb749db2a1b4\\res\\values-v23\\values-v23.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endLines": "4", - "endColumns": "12", - "endOffsets": "200" - }, - "to": { - "startLines": "37", - "startColumns": "4", - "startOffsets": "2646", - "endLines": "39", - "endColumns": "12", - "endOffsets": "2791" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-xlarge-v4_values-xlarge-v4.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-xlarge-v4\\values-xlarge-v4.xml", - "from": { - "startLines": "2,3,4,5,6,7", - "startColumns": "4,4,4,4,4,4", - "startOffsets": "55,126,197,267,337,405", - "endColumns": "70,70,69,69,67,67", - "endOffsets": "121,192,262,332,400,468" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-vi_values-vi.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-vi\\values-vi.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2901", - "endColumns": "100", - "endOffsets": "2997" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-vi\\values-vi.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,219,327,436,520,623,742,819,896,987,1080,1176,1270,1371,1464,1559,1657,1748,1839,1923,2027,2136,2237,2342,2456,2561,2718,2817", - "endColumns": "113,107,108,83,102,118,76,76,90,92,95,93,100,92,94,97,90,90,83,103,108,100,104,113,104,156,98,83", - "endOffsets": "214,322,431,515,618,737,814,891,982,1075,1171,1265,1366,1459,1554,1652,1743,1834,1918,2022,2131,2232,2337,2451,2556,2713,2812,2896" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-lv_values-lv.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-lv\\values-lv.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "3076", - "endColumns": "100", - "endOffsets": "3172" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-lv\\values-lv.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,225,333,442,528,632,754,836,918,1028,1136,1243,1352,1464,1567,1679,1786,1891,1991,2076,2185,2297,2396,2507,2616,2721,2895,2994", - "endColumns": "119,107,108,85,103,121,81,81,109,107,106,108,111,102,111,106,104,99,84,108,111,98,110,108,104,173,98,81", - "endOffsets": "220,328,437,523,627,749,831,913,1023,1131,1238,1347,1459,1562,1674,1781,1886,1986,2071,2180,2292,2391,2502,2611,2716,2890,2989,3071" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-pt-rBR_values-pt-rBR.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-pt-rBR\\values-pt-rBR.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2929", - "endColumns": "100", - "endOffsets": "3025" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-pt-rBR\\values-pt-rBR.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,225,331,438,527,628,746,829,909,1000,1093,1189,1283,1384,1477,1572,1667,1758,1849,1936,2043,2155,2257,2365,2472,2582,2744,2844", - "endColumns": "119,105,106,88,100,117,82,79,90,92,95,93,100,92,94,94,90,90,86,106,111,101,107,106,109,161,99,84", - "endOffsets": "220,326,433,522,623,741,824,904,995,1088,1184,1278,1379,1472,1567,1662,1753,1844,1931,2038,2150,2252,2360,2467,2577,2739,2839,2924" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-en-rCA_values-en-rCA.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-en-rCA\\values-en-rCA.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2846", - "endColumns": "100", - "endOffsets": "2942" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-en-rCA\\values-en-rCA.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,209,309,417,501,601,716,793,869,960,1053,1149,1243,1344,1437,1532,1626,1717,1808,1890,1993,2097,2196,2301,2404,2508,2664,2764", - "endColumns": "103,99,107,83,99,114,76,75,90,92,95,93,100,92,94,93,90,90,81,102,103,98,104,102,103,155,99,81", - "endOffsets": "204,304,412,496,596,711,788,864,955,1048,1144,1238,1339,1432,1527,1621,1712,1803,1885,1988,2092,2191,2296,2399,2503,2659,2759,2841" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-ko_values-ko.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ko\\values-ko.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,200,294,396,478,576,682,761,837,928,1021,1113,1204,1305,1398,1493,1587,1678,1769,1849,1947,2042,2137,2237,2333,2432,2584,2678", - "endColumns": "94,93,101,81,97,105,78,75,90,92,91,90,100,92,94,93,90,90,79,97,94,94,99,95,98,151,93,77", - "endOffsets": "195,289,391,473,571,677,756,832,923,1016,1108,1199,1300,1393,1488,1582,1673,1764,1844,1942,2037,2132,2232,2328,2427,2579,2673,2751" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-ko\\values-ko.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2756", - "endColumns": "100", - "endOffsets": "2852" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-is_values-is.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-is\\values-is.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2865", - "endColumns": "100", - "endOffsets": "2961" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-is\\values-is.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,205,302,414,499,600,714,794,874,965,1058,1154,1248,1355,1448,1543,1638,1729,1823,1904,2014,2122,2220,2329,2428,2531,2686,2784", - "endColumns": "99,96,111,84,100,113,79,79,90,92,95,93,106,92,94,94,90,93,80,109,107,97,108,98,102,154,97,80", - "endOffsets": "200,297,409,494,595,709,789,869,960,1053,1149,1243,1350,1443,1538,1633,1724,1818,1899,2009,2117,2215,2324,2423,2526,2681,2779,2860" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-am_values-am.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-am\\values-am.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,207,306,412,498,601,714,792,870,961,1054,1147,1241,1342,1435,1530,1624,1715,1805,1884,1984,2084,2180,2283,2382,2489,2642,2738", - "endColumns": "101,98,105,85,102,112,77,77,90,92,92,93,100,92,94,93,90,89,78,99,99,95,102,98,106,152,95,78", - "endOffsets": "202,301,407,493,596,709,787,865,956,1049,1142,1236,1337,1430,1525,1619,1710,1800,1879,1979,2079,2175,2278,2377,2484,2637,2733,2812" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-am\\values-am.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2817", - "endColumns": "100", - "endOffsets": "2913" - } - } - ] - }, - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\values-ar_values-ar.arsc.flat", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ar\\values-ar.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,222,326,435,517,618,732,811,890,981,1074,1170,1264,1365,1458,1553,1647,1738,1832,1911,2016,2117,2213,2321,2424,2527,2682,2779", - "endColumns": "116,103,108,81,100,113,78,78,90,92,95,93,100,92,94,93,90,93,78,104,100,95,107,102,102,154,96,80", - "endOffsets": "217,321,430,512,613,727,806,885,976,1069,1165,1259,1360,1453,1548,1642,1733,1827,1906,2011,2112,2208,2316,2419,2522,2677,2774,2855" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-ar\\values-ar.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2860", - "endColumns": "100", - "endOffsets": "2956" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-af.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-af.json deleted file mode 100755 index c068480..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-af.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-af\\values-af.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-af\\values-af.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,209,309,415,500,603,721,797,874,965,1058,1154,1248,1348,1441,1536,1635,1730,1824,1905,2012,2115,2212,2320,2422,2524,2678,2776", - "endColumns": "103,99,105,84,102,117,75,76,90,92,95,93,99,92,94,98,94,93,80,106,102,96,107,101,101,153,97,79", - "endOffsets": "204,304,410,495,598,716,792,869,960,1053,1149,1243,1343,1436,1531,1630,1725,1819,1900,2007,2110,2207,2315,2417,2519,2673,2771,2851" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-af\\values-af.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2856", - "endColumns": "100", - "endOffsets": "2952" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-am.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-am.json deleted file mode 100755 index ce6f4c0..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-am.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-am\\values-am.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-am\\values-am.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,207,306,412,498,601,714,792,870,961,1054,1147,1241,1342,1435,1530,1624,1715,1805,1884,1984,2084,2180,2283,2382,2489,2642,2738", - "endColumns": "101,98,105,85,102,112,77,77,90,92,92,93,100,92,94,93,90,89,78,99,99,95,102,98,106,152,95,78", - "endOffsets": "202,301,407,493,596,709,787,865,956,1049,1142,1236,1337,1430,1525,1619,1710,1800,1879,1979,2079,2175,2278,2377,2484,2637,2733,2812" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-am\\values-am.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2817", - "endColumns": "100", - "endOffsets": "2913" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ar.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ar.json deleted file mode 100755 index a879b81..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ar.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-ar\\values-ar.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ar\\values-ar.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,222,326,435,517,618,732,811,890,981,1074,1170,1264,1365,1458,1553,1647,1738,1832,1911,2016,2117,2213,2321,2424,2527,2682,2779", - "endColumns": "116,103,108,81,100,113,78,78,90,92,95,93,100,92,94,93,90,93,78,104,100,95,107,102,102,154,96,80", - "endOffsets": "217,321,430,512,613,727,806,885,976,1069,1165,1259,1360,1453,1548,1642,1733,1827,1906,2011,2112,2208,2316,2419,2522,2677,2774,2855" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-ar\\values-ar.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2860", - "endColumns": "100", - "endOffsets": "2956" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-as.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-as.json deleted file mode 100755 index b6be2cf..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-as.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-as\\values-as.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-as\\values-as.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2950", - "endColumns": "100", - "endOffsets": "3046" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-as\\values-as.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,312,419,515,617,736,816,896,987,1080,1173,1268,1368,1461,1558,1652,1743,1834,1923,2025,2140,2243,2352,2471,2591,2758,2861", - "endColumns": "107,98,106,95,101,118,79,79,90,92,92,94,99,92,96,93,90,90,88,101,114,102,108,118,119,166,102,88", - "endOffsets": "208,307,414,510,612,731,811,891,982,1075,1168,1263,1363,1456,1553,1647,1738,1829,1918,2020,2135,2238,2347,2466,2586,2753,2856,2945" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-az.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-az.json deleted file mode 100755 index 22a8e19..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-az.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-az\\values-az.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-az\\values-az.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,312,424,512,619,733,814,893,984,1077,1172,1271,1372,1465,1560,1655,1746,1838,1923,2030,2137,2237,2346,2450,2560,2718,2820", - "endColumns": "107,98,111,87,106,113,80,78,90,92,94,98,100,92,94,94,90,91,84,106,106,99,108,103,109,157,101,82", - "endOffsets": "208,307,419,507,614,728,809,888,979,1072,1167,1266,1367,1460,1555,1650,1741,1833,1918,2025,2132,2232,2341,2445,2555,2713,2815,2898" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-az\\values-az.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2903", - "endColumns": "100", - "endOffsets": "2999" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-b+sr+Latn.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-b+sr+Latn.json deleted file mode 100755 index c971ac6..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-b+sr+Latn.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-b+sr+Latn\\values-b+sr+Latn.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-b+sr+Latn\\values-b+sr+Latn.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2912", - "endColumns": "100", - "endOffsets": "3008" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-b+sr+Latn\\values-b+sr+Latn.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,214,318,424,510,614,732,814,895,986,1079,1175,1269,1370,1463,1558,1663,1754,1845,1933,2039,2147,2248,2353,2461,2562,2731,2828", - "endColumns": "108,103,105,85,103,117,81,80,90,92,95,93,100,92,94,104,90,90,87,105,107,100,104,107,100,168,96,83", - "endOffsets": "209,313,419,505,609,727,809,890,981,1074,1170,1264,1365,1458,1553,1658,1749,1840,1928,2034,2142,2243,2348,2456,2557,2726,2823,2907" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-be.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-be.json deleted file mode 100755 index 3c08d37..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-be.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-be\\values-be.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-be\\values-be.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,225,328,444,530,638,756,835,913,1005,1099,1195,1289,1385,1479,1575,1670,1762,1854,1937,2043,2149,2247,2355,2460,2565,2734,2834", - "endColumns": "119,102,115,85,107,117,78,77,91,93,95,93,95,93,95,94,91,91,82,105,105,97,107,104,104,168,99,80", - "endOffsets": "220,323,439,525,633,751,830,908,1000,1094,1190,1284,1380,1474,1570,1665,1757,1849,1932,2038,2144,2242,2350,2455,2560,2729,2829,2910" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-be\\values-be.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2915", - "endColumns": "100", - "endOffsets": "3011" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-bg.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-bg.json deleted file mode 100755 index 74f2bbe..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-bg.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-bg\\values-bg.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-bg\\values-bg.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,220,327,432,518,623,744,823,901,992,1085,1181,1275,1376,1469,1564,1672,1763,1854,1937,2051,2160,2260,2374,2480,2588,2748,2847", - "endColumns": "114,106,104,85,104,120,78,77,90,92,95,93,100,92,94,107,90,90,82,113,108,99,113,105,107,159,98,82", - "endOffsets": "215,322,427,513,618,739,818,896,987,1080,1176,1270,1371,1464,1559,1667,1758,1849,1932,2046,2155,2255,2369,2475,2583,2743,2842,2925" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-bg\\values-bg.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2930", - "endColumns": "100", - "endOffsets": "3026" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-bn.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-bn.json deleted file mode 100755 index 1bb51b8..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-bn.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-bn\\values-bn.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-bn\\values-bn.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,214,326,432,526,631,760,838,916,1007,1100,1195,1289,1390,1483,1578,1672,1763,1854,1941,2051,2159,2258,2368,2474,2587,2752,2857", - "endColumns": "108,111,105,93,104,128,77,77,90,92,94,93,100,92,94,93,90,90,86,109,107,98,109,105,112,164,104,81", - "endOffsets": "209,321,427,521,626,755,833,911,1002,1095,1190,1284,1385,1478,1573,1667,1758,1849,1936,2046,2154,2253,2363,2469,2582,2747,2852,2934" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-bn\\values-bn.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2939", - "endColumns": "100", - "endOffsets": "3035" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-bs.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-bs.json deleted file mode 100755 index 7523f1e..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-bs.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-bs\\values-bs.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-bs\\values-bs.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,224,333,440,526,630,752,834,915,1006,1099,1195,1289,1390,1483,1578,1677,1768,1859,1945,2048,2153,2251,2356,2469,2572,2745,2842", - "endColumns": "118,108,106,85,103,121,81,80,90,92,95,93,100,92,94,98,90,90,85,102,104,97,104,112,102,172,96,83", - "endOffsets": "219,328,435,521,625,747,829,910,1001,1094,1190,1284,1385,1478,1573,1672,1763,1854,1940,2043,2148,2246,2351,2464,2567,2740,2837,2921" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-bs\\values-bs.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2926", - "endColumns": "100", - "endOffsets": "3022" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ca.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ca.json deleted file mode 100755 index 428016b..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ca.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-ca\\values-ca.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-ca\\values-ca.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2915", - "endColumns": "100", - "endOffsets": "3011" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ca\\values-ca.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,223,329,436,519,627,753,837,918,1009,1102,1196,1291,1390,1483,1576,1670,1761,1852,1935,2046,2155,2253,2363,2467,2575,2735,2834", - "endColumns": "117,105,106,82,107,125,83,80,90,92,93,94,98,92,92,93,90,90,82,110,108,97,109,103,107,159,98,80", - "endOffsets": "218,324,431,514,622,748,832,913,1004,1097,1191,1286,1385,1478,1571,1665,1756,1847,1930,2041,2150,2248,2358,2462,2570,2730,2829,2910" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-cs.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-cs.json deleted file mode 100755 index 0dc8236..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-cs.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-cs\\values-cs.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-cs\\values-cs.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2891", - "endColumns": "100", - "endOffsets": "2987" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-cs\\values-cs.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,212,314,423,509,614,731,812,893,984,1077,1173,1267,1362,1455,1550,1647,1738,1829,1913,2017,2126,2225,2331,2441,2548,2711,2809", - "endColumns": "106,101,108,85,104,116,80,80,90,92,95,93,94,92,94,96,90,90,83,103,108,98,105,109,106,162,97,81", - "endOffsets": "207,309,418,504,609,726,807,888,979,1072,1168,1262,1357,1450,1545,1642,1733,1824,1908,2012,2121,2220,2326,2436,2543,2706,2804,2886" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-da.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-da.json deleted file mode 100755 index 41abfa2..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-da.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-da\\values-da.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-da\\values-da.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,208,307,419,502,602,715,792,869,960,1053,1149,1243,1338,1431,1526,1624,1715,1806,1885,1994,2102,2198,2312,2414,2515,2668,2765", - "endColumns": "102,98,111,82,99,112,76,76,90,92,95,93,94,92,94,97,90,90,78,108,107,95,113,101,100,152,96,78", - "endOffsets": "203,302,414,497,597,710,787,864,955,1048,1144,1238,1333,1426,1521,1619,1710,1801,1880,1989,2097,2193,2307,2409,2510,2663,2760,2839" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-da\\values-da.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2844", - "endColumns": "100", - "endOffsets": "2940" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-de.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-de.json deleted file mode 100755 index 1d7e3c0..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-de.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-de\\values-de.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-de\\values-de.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2925", - "endColumns": "100", - "endOffsets": "3021" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-de\\values-de.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,210,308,420,506,611,726,803,879,971,1065,1162,1263,1371,1471,1575,1675,1773,1870,1952,2063,2166,2265,2376,2478,2585,2741,2843", - "endColumns": "104,97,111,85,104,114,76,75,91,93,96,100,107,99,103,99,97,96,81,110,102,98,110,101,106,155,101,81", - "endOffsets": "205,303,415,501,606,721,798,874,966,1060,1157,1258,1366,1466,1570,1670,1768,1865,1947,2058,2161,2260,2371,2473,2580,2736,2838,2920" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-el.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-el.json deleted file mode 100755 index 0d15fd2..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-el.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-el\\values-el.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-el\\values-el.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2964", - "endColumns": "100", - "endOffsets": "3060" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-el\\values-el.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,223,334,451,536,641,767,855,941,1032,1125,1221,1315,1416,1509,1604,1701,1792,1883,1968,2079,2189,2291,2402,2511,2619,2779,2879", - "endColumns": "117,110,116,84,104,125,87,85,90,92,95,93,100,92,94,96,90,90,84,110,109,101,110,108,107,159,99,84", - "endOffsets": "218,329,446,531,636,762,850,936,1027,1120,1216,1310,1411,1504,1599,1696,1787,1878,1963,2074,2184,2286,2397,2506,2614,2774,2874,2959" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-en-rAU.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-en-rAU.json deleted file mode 100755 index 4a9ebb2..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-en-rAU.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-en-rAU\\values-en-rAU.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-en-rAU\\values-en-rAU.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,209,309,417,501,601,716,793,869,960,1053,1149,1243,1344,1437,1532,1626,1717,1808,1890,1993,2097,2196,2301,2404,2508,2664,2764", - "endColumns": "103,99,107,83,99,114,76,75,90,92,95,93,100,92,94,93,90,90,81,102,103,98,104,102,103,155,99,81", - "endOffsets": "204,304,412,496,596,711,788,864,955,1048,1144,1238,1339,1432,1527,1621,1712,1803,1885,1988,2092,2191,2296,2399,2503,2659,2759,2841" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-en-rAU\\values-en-rAU.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2846", - "endColumns": "100", - "endOffsets": "2942" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-en-rCA.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-en-rCA.json deleted file mode 100755 index 5a9daf7..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-en-rCA.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-en-rCA\\values-en-rCA.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-en-rCA\\values-en-rCA.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2846", - "endColumns": "100", - "endOffsets": "2942" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-en-rCA\\values-en-rCA.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,209,309,417,501,601,716,793,869,960,1053,1149,1243,1344,1437,1532,1626,1717,1808,1890,1993,2097,2196,2301,2404,2508,2664,2764", - "endColumns": "103,99,107,83,99,114,76,75,90,92,95,93,100,92,94,93,90,90,81,102,103,98,104,102,103,155,99,81", - "endOffsets": "204,304,412,496,596,711,788,864,955,1048,1144,1238,1339,1432,1527,1621,1712,1803,1885,1988,2092,2191,2296,2399,2503,2659,2759,2841" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-en-rGB.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-en-rGB.json deleted file mode 100755 index 6750986..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-en-rGB.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-en-rGB\\values-en-rGB.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-en-rGB\\values-en-rGB.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2846", - "endColumns": "100", - "endOffsets": "2942" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-en-rGB\\values-en-rGB.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,209,309,417,501,601,716,793,869,960,1053,1149,1243,1344,1437,1532,1626,1717,1808,1890,1993,2097,2196,2301,2404,2508,2664,2764", - "endColumns": "103,99,107,83,99,114,76,75,90,92,95,93,100,92,94,93,90,90,81,102,103,98,104,102,103,155,99,81", - "endOffsets": "204,304,412,496,596,711,788,864,955,1048,1144,1238,1339,1432,1527,1621,1712,1803,1885,1988,2092,2191,2296,2399,2503,2659,2759,2841" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-en-rIN.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-en-rIN.json deleted file mode 100755 index d6f9863..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-en-rIN.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-en-rIN\\values-en-rIN.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-en-rIN\\values-en-rIN.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2846", - "endColumns": "100", - "endOffsets": "2942" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-en-rIN\\values-en-rIN.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,209,309,417,501,601,716,793,869,960,1053,1149,1243,1344,1437,1532,1626,1717,1808,1890,1993,2097,2196,2301,2404,2508,2664,2764", - "endColumns": "103,99,107,83,99,114,76,75,90,92,95,93,100,92,94,93,90,90,81,102,103,98,104,102,103,155,99,81", - "endOffsets": "204,304,412,496,596,711,788,864,955,1048,1144,1238,1339,1432,1527,1621,1712,1803,1885,1988,2092,2191,2296,2399,2503,2659,2759,2841" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-en-rXC.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-en-rXC.json deleted file mode 100755 index c2f215d..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-en-rXC.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-en-rXC\\values-en-rXC.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-en-rXC\\values-en-rXC.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "202", - "endOffsets": "253" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "5682", - "endColumns": "202", - "endOffsets": "5880" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-en-rXC\\values-en-rXC.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,310,510,719,904,1106,1321,1494,1671,1862,2055,2253,2449,2652,2847,3044,3239,3432,3623,3807,4011,4216,4417,4624,4826,5031,5303,5503", - "endColumns": "204,199,208,184,201,214,172,176,190,192,197,195,202,194,196,194,192,190,183,203,204,200,206,201,204,271,199,178", - "endOffsets": "305,505,714,899,1101,1316,1489,1666,1857,2050,2248,2444,2647,2842,3039,3234,3427,3618,3802,4006,4211,4412,4619,4821,5026,5298,5498,5677" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-es-rUS.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-es-rUS.json deleted file mode 100755 index b4f98e8..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-es-rUS.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-es-rUS\\values-es-rUS.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-es-rUS\\values-es-rUS.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,225,334,442,527,628,751,836,918,1009,1102,1198,1292,1392,1485,1584,1680,1771,1862,1944,2056,2156,2257,2365,2472,2579,2738,2838", - "endColumns": "119,108,107,84,100,122,84,81,90,92,95,93,99,92,98,95,90,90,81,111,99,100,107,106,106,158,99,81", - "endOffsets": "220,329,437,522,623,746,831,913,1004,1097,1193,1287,1387,1480,1579,1675,1766,1857,1939,2051,2151,2252,2360,2467,2574,2733,2833,2915" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-es-rUS\\values-es-rUS.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2920", - "endColumns": "100", - "endOffsets": "3016" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-es.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-es.json deleted file mode 100755 index 7e555da..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-es.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-es\\values-es.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-es\\values-es.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2924", - "endColumns": "100", - "endOffsets": "3020" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-es\\values-es.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,222,335,443,528,629,757,842,924,1016,1110,1208,1302,1403,1497,1593,1689,1781,1873,1955,2062,2162,2261,2369,2476,2583,2742,2842", - "endColumns": "116,112,107,84,100,127,84,81,91,93,97,93,100,93,95,95,91,91,81,106,99,98,107,106,106,158,99,81", - "endOffsets": "217,330,438,523,624,752,837,919,1011,1105,1203,1297,1398,1492,1588,1684,1776,1868,1950,2057,2157,2256,2364,2471,2578,2737,2837,2919" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-et.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-et.json deleted file mode 100755 index f7db603..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-et.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-et\\values-et.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-et\\values-et.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2942", - "endColumns": "100", - "endOffsets": "3038" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-et\\values-et.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,222,329,440,526,628,745,825,903,995,1089,1194,1296,1406,1500,1601,1695,1787,1880,1963,2074,2179,2278,2388,2489,2592,2758,2860", - "endColumns": "116,106,110,85,101,116,79,77,91,93,104,101,109,93,100,93,91,92,82,110,104,98,109,100,102,165,101,81", - "endOffsets": "217,324,435,521,623,740,820,898,990,1084,1189,1291,1401,1495,1596,1690,1782,1875,1958,2069,2174,2273,2383,2484,2587,2753,2855,2937" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-eu.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-eu.json deleted file mode 100755 index 15d7478..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-eu.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-eu\\values-eu.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-eu\\values-eu.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,214,312,422,508,614,738,825,909,1001,1095,1192,1286,1388,1482,1578,1675,1767,1860,1942,2051,2161,2260,2369,2475,2586,2757,2856", - "endColumns": "108,97,109,85,105,123,86,83,91,93,96,93,101,93,95,96,91,92,81,108,109,98,108,105,110,170,98,81", - "endOffsets": "209,307,417,503,609,733,820,904,996,1090,1187,1281,1383,1477,1573,1670,1762,1855,1937,2046,2156,2255,2364,2470,2581,2752,2851,2933" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-eu\\values-eu.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2938", - "endColumns": "100", - "endOffsets": "3034" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-fa.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-fa.json deleted file mode 100755 index d53c910..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-fa.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-fa\\values-fa.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-fa\\values-fa.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2903", - "endColumns": "100", - "endOffsets": "2999" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-fa\\values-fa.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,215,318,429,513,616,731,810,888,981,1076,1172,1266,1369,1464,1561,1660,1753,1843,1924,2036,2139,2237,2347,2451,2560,2721,2822", - "endColumns": "109,102,110,83,102,114,78,77,92,94,95,93,102,94,96,98,92,89,80,111,102,97,109,103,108,160,100,80", - "endOffsets": "210,313,424,508,611,726,805,883,976,1071,1167,1261,1364,1459,1556,1655,1748,1838,1919,2031,2134,2232,2342,2446,2555,2716,2817,2898" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-fi.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-fi.json deleted file mode 100755 index 046c520..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-fi.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-fi\\values-fi.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-fi\\values-fi.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2872", - "endColumns": "100", - "endOffsets": "2968" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-fi\\values-fi.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,313,414,500,605,723,810,892,983,1076,1172,1266,1361,1454,1550,1649,1740,1834,1914,2021,2124,2221,2327,2426,2530,2693,2792", - "endColumns": "107,99,100,85,104,117,86,81,90,92,95,93,94,92,95,98,90,93,79,106,102,96,105,98,103,162,98,79", - "endOffsets": "208,308,409,495,600,718,805,887,978,1071,1167,1261,1356,1449,1545,1644,1735,1829,1909,2016,2119,2216,2322,2421,2525,2688,2787,2867" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-fr-rCA.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-fr-rCA.json deleted file mode 100755 index 1d5580d..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-fr-rCA.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-fr-rCA\\values-fr-rCA.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-fr-rCA\\values-fr-rCA.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,216,331,442,529,645,775,858,938,1029,1122,1221,1316,1417,1510,1603,1698,1789,1880,1976,2086,2198,2301,2412,2519,2621,2780,2879", - "endColumns": "110,114,110,86,115,129,82,79,90,92,98,94,100,92,92,94,90,90,95,109,111,102,110,106,101,158,98,85", - "endOffsets": "211,326,437,524,640,770,853,933,1024,1117,1216,1311,1412,1505,1598,1693,1784,1875,1971,2081,2193,2296,2407,2514,2616,2775,2874,2960" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-fr-rCA\\values-fr-rCA.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2965", - "endColumns": "100", - "endOffsets": "3061" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-fr.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-fr.json deleted file mode 100755 index 0bf513c..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-fr.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-fr\\values-fr.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-fr\\values-fr.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2945", - "endColumns": "100", - "endOffsets": "3041" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-fr\\values-fr.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,216,331,442,524,630,760,843,923,1014,1107,1206,1301,1402,1495,1588,1683,1774,1865,1951,2061,2173,2276,2387,2494,2601,2760,2859", - "endColumns": "110,114,110,81,105,129,82,79,90,92,98,94,100,92,92,94,90,90,85,109,111,102,110,106,106,158,98,85", - "endOffsets": "211,326,437,519,625,755,838,918,1009,1102,1201,1296,1397,1490,1583,1678,1769,1860,1946,2056,2168,2271,2382,2489,2596,2755,2854,2940" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-gl.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-gl.json deleted file mode 100755 index dff807f..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-gl.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-gl\\values-gl.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-gl\\values-gl.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,217,329,437,522,624,750,834,915,1007,1101,1199,1293,1394,1488,1584,1679,1771,1863,1945,2052,2161,2260,2368,2472,2579,2738,2838", - "endColumns": "111,111,107,84,101,125,83,80,91,93,97,93,100,93,95,94,91,91,81,106,108,98,107,103,106,158,99,81", - "endOffsets": "212,324,432,517,619,745,829,910,1002,1096,1194,1288,1389,1483,1579,1674,1766,1858,1940,2047,2156,2255,2363,2467,2574,2733,2833,2915" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-gl\\values-gl.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2920", - "endColumns": "100", - "endOffsets": "3016" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-gu.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-gu.json deleted file mode 100755 index 07008b9..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-gu.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-gu\\values-gu.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-gu\\values-gu.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2882", - "endColumns": "100", - "endOffsets": "2978" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-gu\\values-gu.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,214,318,425,512,613,736,813,891,982,1075,1174,1268,1369,1462,1557,1654,1745,1836,1916,2022,2124,2221,2330,2429,2539,2699,2802", - "endColumns": "108,103,106,86,100,122,76,77,90,92,98,93,100,92,94,96,90,90,79,105,101,96,108,98,109,159,102,79", - "endOffsets": "209,313,420,507,608,731,808,886,977,1070,1169,1263,1364,1457,1552,1649,1740,1831,1911,2017,2119,2216,2325,2424,2534,2694,2797,2877" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-h720dp-v13.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-h720dp-v13.json deleted file mode 100755 index 6130bd2..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-h720dp-v13.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-h720dp-v13\\values-h720dp-v13.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-h720dp-v13\\values-h720dp-v13.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "66", - "endOffsets": "117" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-hdpi-v4.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-hdpi-v4.json deleted file mode 100755 index 773afaa..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-hdpi-v4.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-hdpi-v4\\values-hdpi-v4.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-hdpi-v4\\values-hdpi-v4.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endLines": "6", - "endColumns": "13", - "endOffsets": "327" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-hi.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-hi.json deleted file mode 100755 index 026b87f..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-hi.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-hi\\values-hi.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-hi\\values-hi.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,211,308,418,504,606,728,805,883,974,1067,1163,1257,1358,1451,1546,1640,1731,1822,1912,2021,2124,2226,2336,2437,2549,2711,2812", - "endColumns": "105,96,109,85,101,121,76,77,90,92,95,93,100,92,94,93,90,90,89,108,102,101,109,100,111,161,100,79", - "endOffsets": "206,303,413,499,601,723,800,878,969,1062,1158,1252,1353,1446,1541,1635,1726,1817,1907,2016,2119,2221,2331,2432,2544,2706,2807,2887" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-hi\\values-hi.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2892", - "endColumns": "100", - "endOffsets": "2988" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-hr.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-hr.json deleted file mode 100755 index 5df172c..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-hr.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-hr\\values-hr.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-hr\\values-hr.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2926", - "endColumns": "100", - "endOffsets": "3022" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-hr\\values-hr.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,210,307,417,503,607,726,810,893,984,1077,1173,1267,1368,1461,1556,1655,1746,1837,1923,2027,2140,2246,2351,2464,2571,2740,2837", - "endColumns": "104,96,109,85,103,118,83,82,90,92,95,93,100,92,94,98,90,90,85,103,112,105,104,112,106,168,96,88", - "endOffsets": "205,302,412,498,602,721,805,888,979,1072,1168,1262,1363,1456,1551,1650,1741,1832,1918,2022,2135,2241,2346,2459,2566,2735,2832,2921" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-hu.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-hu.json deleted file mode 100755 index 3bce19e..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-hu.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-hu\\values-hu.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-hu\\values-hu.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,318,433,517,629,759,835,911,1002,1095,1191,1285,1386,1479,1574,1669,1760,1851,1934,2044,2155,2255,2366,2474,2593,2775,2878", - "endColumns": "107,104,114,83,111,129,75,75,90,92,95,93,100,92,94,94,90,90,82,109,110,99,110,107,118,181,102,82", - "endOffsets": "208,313,428,512,624,754,830,906,997,1090,1186,1280,1381,1474,1569,1664,1755,1846,1929,2039,2150,2250,2361,2469,2588,2770,2873,2956" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-hu\\values-hu.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2961", - "endColumns": "100", - "endOffsets": "3057" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-hy.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-hy.json deleted file mode 100755 index c33a0dd..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-hy.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-hy\\values-hy.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-hy\\values-hy.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,208,309,419,508,614,729,811,892,983,1076,1172,1266,1367,1460,1555,1649,1740,1831,1916,2023,2130,2229,2339,2446,2546,2703,2802", - "endColumns": "102,100,109,88,105,114,81,80,90,92,95,93,100,92,94,93,90,90,84,106,106,98,109,106,99,156,98,81", - "endOffsets": "203,304,414,503,609,724,806,887,978,1071,1167,1261,1362,1455,1550,1644,1735,1826,1911,2018,2125,2224,2334,2441,2541,2698,2797,2879" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-hy\\values-hy.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2884", - "endColumns": "100", - "endOffsets": "2980" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-in.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-in.json deleted file mode 100755 index 77b32a0..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-in.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-in\\values-in.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-in\\values-in.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,215,317,422,509,613,729,811,890,981,1074,1170,1264,1365,1458,1553,1647,1738,1829,1915,2018,2127,2228,2332,2440,2548,2704,2803", - "endColumns": "109,101,104,86,103,115,81,78,90,92,95,93,100,92,94,93,90,90,85,102,108,100,103,107,107,155,98,83", - "endOffsets": "210,312,417,504,608,724,806,885,976,1069,1165,1259,1360,1453,1548,1642,1733,1824,1910,2013,2122,2223,2327,2435,2543,2699,2798,2882" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-in\\values-in.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2887", - "endColumns": "100", - "endOffsets": "2983" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-is.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-is.json deleted file mode 100755 index 790fac7..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-is.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-is\\values-is.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-is\\values-is.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2865", - "endColumns": "100", - "endOffsets": "2961" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-is\\values-is.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,205,302,414,499,600,714,794,874,965,1058,1154,1248,1355,1448,1543,1638,1729,1823,1904,2014,2122,2220,2329,2428,2531,2686,2784", - "endColumns": "99,96,111,84,100,113,79,79,90,92,95,93,106,92,94,94,90,93,80,109,107,97,108,98,102,154,97,80", - "endOffsets": "200,297,409,494,595,709,789,869,960,1053,1149,1243,1350,1443,1538,1633,1724,1818,1899,2009,2117,2215,2324,2423,2526,2681,2779,2860" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-it.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-it.json deleted file mode 100755 index d345bcc..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-it.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-it\\values-it.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-it\\values-it.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2906", - "endColumns": "100", - "endOffsets": "3002" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-it\\values-it.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,214,314,423,507,616,741,818,894,986,1080,1174,1268,1370,1464,1561,1667,1759,1851,1932,2038,2146,2244,2348,2453,2560,2723,2823", - "endColumns": "108,99,108,83,108,124,76,75,91,93,93,93,101,93,96,105,91,91,80,105,107,97,103,104,106,162,99,82", - "endOffsets": "209,309,418,502,611,736,813,889,981,1075,1169,1263,1365,1459,1556,1662,1754,1846,1927,2033,2141,2239,2343,2448,2555,2718,2818,2901" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-iw.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-iw.json deleted file mode 100755 index b3aab1a..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-iw.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-iw\\values-iw.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-iw\\values-iw.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,209,308,416,500,600,714,792,870,961,1055,1151,1245,1346,1439,1534,1631,1722,1814,1895,1997,2101,2199,2302,2403,2503,2655,2751", - "endColumns": "103,98,107,83,99,113,77,77,90,93,95,93,100,92,94,96,90,91,80,101,103,97,102,100,99,151,95,80", - "endOffsets": "204,303,411,495,595,709,787,865,956,1050,1146,1240,1341,1434,1529,1626,1717,1809,1890,1992,2096,2194,2297,2398,2498,2650,2746,2827" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-iw\\values-iw.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2832", - "endColumns": "100", - "endOffsets": "2928" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ja.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ja.json deleted file mode 100755 index fac4f25..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ja.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-ja\\values-ja.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ja\\values-ja.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,202,295,400,482,580,688,765,841,932,1025,1121,1215,1316,1409,1504,1598,1689,1780,1858,1960,2059,2154,2257,2352,2448,2596,2693", - "endColumns": "96,92,104,81,97,107,76,75,90,92,95,93,100,92,94,93,90,90,77,101,98,94,102,94,95,147,96,77", - "endOffsets": "197,290,395,477,575,683,760,836,927,1020,1116,1210,1311,1404,1499,1593,1684,1775,1853,1955,2054,2149,2252,2347,2443,2591,2688,2766" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-ja\\values-ja.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2771", - "endColumns": "100", - "endOffsets": "2867" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ka.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ka.json deleted file mode 100755 index 670ec79..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ka.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-ka\\values-ka.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-ka\\values-ka.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2899", - "endColumns": "100", - "endOffsets": "2995" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ka\\values-ka.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,214,318,429,517,622,735,819,901,992,1085,1180,1276,1377,1470,1565,1659,1750,1841,1924,2037,2144,2242,2355,2459,2563,2720,2818", - "endColumns": "108,103,110,87,104,112,83,81,90,92,94,95,100,92,94,93,90,90,82,112,106,97,112,103,103,156,97,80", - "endOffsets": "209,313,424,512,617,730,814,896,987,1080,1175,1271,1372,1465,1560,1654,1745,1836,1919,2032,2139,2237,2350,2454,2558,2715,2813,2894" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-kk.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-kk.json deleted file mode 100755 index 784e3b7..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-kk.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-kk\\values-kk.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-kk\\values-kk.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,217,320,430,515,621,740,821,901,992,1085,1181,1275,1376,1469,1564,1661,1752,1844,1925,2028,2133,2231,2338,2447,2547,2713,2812", - "endColumns": "111,102,109,84,105,118,80,79,90,92,95,93,100,92,94,96,90,91,80,102,104,97,106,108,99,165,98,80", - "endOffsets": "212,315,425,510,616,735,816,896,987,1080,1176,1270,1371,1464,1559,1656,1747,1839,1920,2023,2128,2226,2333,2442,2542,2708,2807,2888" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-kk\\values-kk.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2893", - "endColumns": "100", - "endOffsets": "2989" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-km.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-km.json deleted file mode 100755 index 2e575b5..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-km.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-km\\values-km.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-km\\values-km.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2882", - "endColumns": "100", - "endOffsets": "2978" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-km\\values-km.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,208,308,420,507,611,729,806,883,974,1067,1163,1257,1358,1451,1546,1640,1731,1822,1905,2009,2114,2214,2324,2431,2539,2701,2799", - "endColumns": "102,99,111,86,103,117,76,76,90,92,95,93,100,92,94,93,90,90,82,103,104,99,109,106,107,161,97,82", - "endOffsets": "203,303,415,502,606,724,801,878,969,1062,1158,1252,1353,1446,1541,1635,1726,1817,1900,2004,2109,2209,2319,2426,2534,2696,2794,2877" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-kn.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-kn.json deleted file mode 100755 index cb28ace..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-kn.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-kn\\values-kn.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-kn\\values-kn.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2948", - "endColumns": "100", - "endOffsets": "3044" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-kn\\values-kn.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,223,335,448,536,643,770,847,924,1015,1108,1204,1298,1399,1492,1587,1681,1772,1863,1945,2061,2172,2271,2384,2488,2602,2766,2866", - "endColumns": "117,111,112,87,106,126,76,76,90,92,95,93,100,92,94,93,90,90,81,115,110,98,112,103,113,163,99,81", - "endOffsets": "218,330,443,531,638,765,842,919,1010,1103,1199,1293,1394,1487,1582,1676,1767,1858,1940,2056,2167,2266,2379,2483,2597,2761,2861,2943" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ko.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ko.json deleted file mode 100755 index adfbefa..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ko.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-ko\\values-ko.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ko\\values-ko.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,200,294,396,478,576,682,761,837,928,1021,1113,1204,1305,1398,1493,1587,1678,1769,1849,1947,2042,2137,2237,2333,2432,2584,2678", - "endColumns": "94,93,101,81,97,105,78,75,90,92,91,90,100,92,94,93,90,90,79,97,94,94,99,95,98,151,93,77", - "endOffsets": "195,289,391,473,571,677,756,832,923,1016,1108,1199,1300,1393,1488,1582,1673,1764,1844,1942,2037,2132,2232,2328,2427,2579,2673,2751" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-ko\\values-ko.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2756", - "endColumns": "100", - "endOffsets": "2852" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ky.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ky.json deleted file mode 100755 index 6019bb6..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ky.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-ky\\values-ky.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-ky\\values-ky.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2883", - "endColumns": "100", - "endOffsets": "2979" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ky\\values-ky.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,209,304,423,507,614,731,809,888,979,1072,1168,1262,1363,1456,1551,1646,1737,1828,1909,2019,2126,2224,2330,2437,2538,2699,2802", - "endColumns": "103,94,118,83,106,116,77,78,90,92,95,93,100,92,94,94,90,90,80,109,106,97,105,106,100,160,102,80", - "endOffsets": "204,299,418,502,609,726,804,883,974,1067,1163,1257,1358,1451,1546,1641,1732,1823,1904,2014,2121,2219,2325,2432,2533,2694,2797,2878" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-land.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-land.json deleted file mode 100755 index ec43543..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-land.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-land\\values-land.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-land\\values-land.xml", - "from": { - "startLines": "2,3,4", - "startColumns": "4,4,4", - "startOffsets": "55,125,196", - "endColumns": "69,70,67", - "endOffsets": "120,191,259" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\values-land\\values-land.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endLines": "5", - "endColumns": "10", - "endOffsets": "222" - }, - "to": { - "startLines": "5", - "startColumns": "4", - "startOffsets": "264", - "endLines": "8", - "endColumns": "10", - "endOffsets": "431" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-large-v4.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-large-v4.json deleted file mode 100755 index 3ba3639..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-large-v4.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-large-v4\\values-large-v4.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-large-v4\\values-large-v4.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10", - "startColumns": "4,4,4,4,4,4,4,4,4", - "startOffsets": "55,114,185,256,326,396,464,532,636", - "endColumns": "58,70,70,69,69,67,67,103,115", - "endOffsets": "109,180,251,321,391,459,527,631,747" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\values-large-v4\\values-large-v4.xml", - "from": { - "startLines": "2,3", - "startColumns": "4,4", - "startOffsets": "55,177", - "endColumns": "121,133", - "endOffsets": "172,306" - }, - "to": { - "startLines": "11,12", - "startColumns": "4,4", - "startOffsets": "752,874", - "endColumns": "121,133", - "endOffsets": "869,1003" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ldltr-v21.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ldltr-v21.json deleted file mode 100755 index 2b9b22a..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ldltr-v21.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-ldltr-v21\\values-ldltr-v21.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ldltr-v21\\values-ldltr-v21.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "112", - "endOffsets": "163" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-lo.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-lo.json deleted file mode 100755 index 046c3bb..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-lo.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-lo\\values-lo.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-lo\\values-lo.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2836", - "endColumns": "100", - "endOffsets": "2932" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-lo\\values-lo.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,208,305,412,497,602,714,791,869,960,1053,1149,1243,1344,1437,1532,1626,1717,1808,1888,1995,2092,2190,2295,2398,2502,2659,2755", - "endColumns": "102,96,106,84,104,111,76,77,90,92,95,93,100,92,94,93,90,90,79,106,96,97,104,102,103,156,95,80", - "endOffsets": "203,300,407,492,597,709,786,864,955,1048,1144,1238,1339,1432,1527,1621,1712,1803,1883,1990,2087,2185,2290,2393,2497,2654,2750,2831" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-lt.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-lt.json deleted file mode 100755 index 246bcff..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-lt.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-lt\\values-lt.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-lt\\values-lt.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,221,322,435,522,631,752,834,915,1009,1105,1203,1299,1403,1499,1597,1700,1794,1888,1973,2082,2191,2291,2401,2505,2618,2794,2895", - "endColumns": "115,100,112,86,108,120,81,80,93,95,97,95,103,95,97,102,93,93,84,108,108,99,109,103,112,175,100,82", - "endOffsets": "216,317,430,517,626,747,829,910,1004,1100,1198,1294,1398,1494,1592,1695,1789,1883,1968,2077,2186,2286,2396,2500,2613,2789,2890,2973" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-lt\\values-lt.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2978", - "endColumns": "100", - "endOffsets": "3074" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-lv.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-lv.json deleted file mode 100755 index c020cf7..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-lv.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-lv\\values-lv.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-lv\\values-lv.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "3076", - "endColumns": "100", - "endOffsets": "3172" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-lv\\values-lv.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,225,333,442,528,632,754,836,918,1028,1136,1243,1352,1464,1567,1679,1786,1891,1991,2076,2185,2297,2396,2507,2616,2721,2895,2994", - "endColumns": "119,107,108,85,103,121,81,81,109,107,106,108,111,102,111,106,104,99,84,108,111,98,110,108,104,173,98,81", - "endOffsets": "220,328,437,523,627,749,831,913,1023,1131,1238,1347,1459,1562,1674,1781,1886,1986,2071,2180,2292,2391,2502,2611,2716,2890,2989,3071" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-mk.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-mk.json deleted file mode 100755 index 1fa68cb..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-mk.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-mk\\values-mk.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-mk\\values-mk.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,317,425,511,616,735,818,900,997,1096,1193,1293,1400,1499,1600,1696,1793,1884,1971,2077,2184,2285,2392,2503,2607,2763,2861", - "endColumns": "107,103,107,85,104,118,82,81,96,98,96,99,106,98,100,95,96,90,86,105,106,100,106,110,103,155,97,83", - "endOffsets": "208,312,420,506,611,730,813,895,992,1091,1188,1288,1395,1494,1595,1691,1788,1879,1966,2072,2179,2280,2387,2498,2602,2758,2856,2940" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-mk\\values-mk.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2945", - "endColumns": "100", - "endOffsets": "3041" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ml.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ml.json deleted file mode 100755 index c664c95..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ml.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-ml\\values-ml.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-ml\\values-ml.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2955", - "endColumns": "100", - "endOffsets": "3051" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ml\\values-ml.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,224,342,457,550,655,787,864,940,1031,1124,1226,1320,1421,1515,1610,1709,1800,1891,1973,2084,2190,2288,2402,2502,2613,2772,2873", - "endColumns": "118,117,114,92,104,131,76,75,90,92,101,93,100,93,94,98,90,90,81,110,105,97,113,99,110,158,100,81", - "endOffsets": "219,337,452,545,650,782,859,935,1026,1119,1221,1315,1416,1510,1605,1704,1795,1886,1968,2079,2185,2283,2397,2497,2608,2767,2868,2950" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-mn.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-mn.json deleted file mode 100755 index 60c997f..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-mn.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-mn\\values-mn.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-mn\\values-mn.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,218,318,431,518,624,736,818,900,991,1084,1180,1276,1374,1467,1562,1654,1745,1835,1917,2026,2130,2227,2335,2436,2539,2698,2795", - "endColumns": "112,99,112,86,105,111,81,81,90,92,95,95,97,92,94,91,90,89,81,108,103,96,107,100,102,158,96,80", - "endOffsets": "213,313,426,513,619,731,813,895,986,1079,1175,1271,1369,1462,1557,1649,1740,1830,1912,2021,2125,2222,2330,2431,2534,2693,2790,2871" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-mn\\values-mn.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2876", - "endColumns": "100", - "endOffsets": "2972" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-mr.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-mr.json deleted file mode 100755 index 0fc95fd..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-mr.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-mr\\values-mr.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-mr\\values-mr.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2887", - "endColumns": "100", - "endOffsets": "2983" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-mr\\values-mr.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,216,322,429,519,620,735,812,890,981,1074,1168,1265,1366,1459,1554,1651,1742,1833,1913,2025,2127,2223,2332,2433,2545,2702,2807", - "endColumns": "110,105,106,89,100,114,76,77,90,92,93,96,100,92,94,96,90,90,79,111,101,95,108,100,111,156,104,79", - "endOffsets": "211,317,424,514,615,730,807,885,976,1069,1163,1260,1361,1454,1549,1646,1737,1828,1908,2020,2122,2218,2327,2428,2540,2697,2802,2882" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ms.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ms.json deleted file mode 100755 index c80dcbd..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ms.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-ms\\values-ms.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-ms\\values-ms.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2881", - "endColumns": "100", - "endOffsets": "2977" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ms\\values-ms.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,216,321,429,516,620,731,809,888,979,1072,1167,1261,1360,1453,1548,1642,1733,1824,1904,2016,2125,2222,2331,2434,2541,2700,2801", - "endColumns": "110,104,107,86,103,110,77,78,90,92,94,93,98,92,94,93,90,90,79,111,108,96,108,102,106,158,100,79", - "endOffsets": "211,316,424,511,615,726,804,883,974,1067,1162,1256,1355,1448,1543,1637,1728,1819,1899,2011,2120,2217,2326,2429,2536,2695,2796,2876" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-my.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-my.json deleted file mode 100755 index 68dd033..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-my.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-my\\values-my.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-my\\values-my.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2979", - "endColumns": "100", - "endOffsets": "3075" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-my\\values-my.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,214,319,436,529,641,769,847,926,1017,1110,1206,1300,1401,1494,1589,1683,1774,1865,1951,2074,2186,2288,2414,2525,2635,2795,2895", - "endColumns": "108,104,116,92,111,127,77,78,90,92,95,93,100,92,94,93,90,90,85,122,111,101,125,110,109,159,99,83", - "endOffsets": "209,314,431,524,636,764,842,921,1012,1105,1201,1295,1396,1489,1584,1678,1769,1860,1946,2069,2181,2283,2409,2520,2630,2790,2890,2974" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-nb.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-nb.json deleted file mode 100755 index 1905024..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-nb.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-nb\\values-nb.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-nb\\values-nb.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,308,422,508,608,721,797,873,964,1057,1153,1247,1348,1441,1536,1634,1725,1816,1896,1999,2098,2194,2298,2396,2497,2650,2747", - "endColumns": "107,94,113,85,99,112,75,75,90,92,95,93,100,92,94,97,90,90,79,102,98,95,103,97,100,152,96,78", - "endOffsets": "208,303,417,503,603,716,792,868,959,1052,1148,1242,1343,1436,1531,1629,1720,1811,1891,1994,2093,2189,2293,2391,2492,2645,2742,2821" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-nb\\values-nb.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2826", - "endColumns": "100", - "endOffsets": "2922" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ne.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ne.json deleted file mode 100755 index 5a4faf2..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ne.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-ne\\values-ne.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-ne\\values-ne.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2988", - "endColumns": "100", - "endOffsets": "3084" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ne\\values-ne.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,210,314,422,513,620,747,841,931,1022,1115,1211,1305,1406,1499,1594,1688,1779,1870,1958,2068,2184,2287,2402,2504,2619,2790,2902", - "endColumns": "104,103,107,90,106,126,93,89,90,92,95,93,100,92,94,93,90,90,87,109,115,102,114,101,114,170,111,85", - "endOffsets": "205,309,417,508,615,742,836,926,1017,1110,1206,1300,1401,1494,1589,1683,1774,1865,1953,2063,2179,2282,2397,2499,2614,2785,2897,2983" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-night-v8.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-night-v8.json deleted file mode 100755 index 4d7baff..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-night-v8.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-night-v8\\values-night-v8.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-night-v8\\values-night-v8.xml", - "from": { - "startLines": "2,3,4,5,6,7,8", - "startColumns": "4,4,4,4,4,4,4", - "startOffsets": "55,125,209,293,389,491,593", - "endColumns": "69,83,83,95,101,101,93", - "endOffsets": "120,204,288,384,486,588,682" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-nl.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-nl.json deleted file mode 100755 index aa0d460..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-nl.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-nl\\values-nl.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-nl\\values-nl.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2921", - "endColumns": "100", - "endOffsets": "3017" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-nl\\values-nl.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,223,328,435,521,629,749,826,903,995,1089,1190,1284,1385,1479,1575,1670,1762,1854,1936,2047,2151,2250,2365,2478,2581,2736,2839", - "endColumns": "117,104,106,85,107,119,76,76,91,93,100,93,100,93,95,94,91,91,81,110,103,98,114,112,102,154,102,81", - "endOffsets": "218,323,430,516,624,744,821,898,990,1084,1185,1279,1380,1474,1570,1665,1757,1849,1931,2042,2146,2245,2360,2473,2576,2731,2834,2916" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-or.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-or.json deleted file mode 100755 index 1fbbaa5..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-or.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-or\\values-or.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-or\\values-or.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2936", - "endColumns": "100", - "endOffsets": "3032" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-or\\values-or.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,224,334,441,527,631,751,828,905,996,1089,1186,1281,1382,1475,1570,1666,1757,1847,1929,2039,2144,2250,2361,2464,2582,2745,2847", - "endColumns": "118,109,106,85,103,119,76,76,90,92,96,94,100,92,94,95,90,89,81,109,104,105,110,102,117,162,101,88", - "endOffsets": "219,329,436,522,626,746,823,900,991,1084,1181,1276,1377,1470,1565,1661,1752,1842,1924,2034,2139,2245,2356,2459,2577,2740,2842,2931" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-pa.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-pa.json deleted file mode 100755 index 01dc6b3..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-pa.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-pa\\values-pa.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-pa\\values-pa.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,208,305,410,496,596,709,786,862,953,1046,1142,1236,1337,1430,1525,1619,1710,1801,1880,1981,2085,2182,2291,2390,2500,2659,2759", - "endColumns": "102,96,104,85,99,112,76,75,90,92,95,93,100,92,94,93,90,90,78,100,103,96,108,98,109,158,99,79", - "endOffsets": "203,300,405,491,591,704,781,857,948,1041,1137,1231,1332,1425,1520,1614,1705,1796,1875,1976,2080,2177,2286,2385,2495,2654,2754,2834" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-pa\\values-pa.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2839", - "endColumns": "100", - "endOffsets": "2935" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-pl.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-pl.json deleted file mode 100755 index 3be51a1..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-pl.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-pl\\values-pl.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-pl\\values-pl.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,221,323,431,517,626,745,823,900,991,1084,1180,1274,1376,1469,1564,1659,1750,1841,1923,2032,2141,2240,2349,2460,2568,2731,2827", - "endColumns": "115,101,107,85,108,118,77,76,90,92,95,93,101,92,94,94,90,90,81,108,108,98,108,110,107,162,95,81", - "endOffsets": "216,318,426,512,621,740,818,895,986,1079,1175,1269,1371,1464,1559,1654,1745,1836,1918,2027,2136,2235,2344,2455,2563,2726,2822,2904" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-pl\\values-pl.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2909", - "endColumns": "100", - "endOffsets": "3005" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-port.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-port.json deleted file mode 100755 index 3c72717..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-port.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-port\\values-port.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-port\\values-port.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "55", - "endOffsets": "106" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-pt-rBR.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-pt-rBR.json deleted file mode 100755 index 602323e..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-pt-rBR.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-pt-rBR\\values-pt-rBR.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-pt-rBR\\values-pt-rBR.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2929", - "endColumns": "100", - "endOffsets": "3025" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-pt-rBR\\values-pt-rBR.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,225,331,438,527,628,746,829,909,1000,1093,1189,1283,1384,1477,1572,1667,1758,1849,1936,2043,2155,2257,2365,2472,2582,2744,2844", - "endColumns": "119,105,106,88,100,117,82,79,90,92,95,93,100,92,94,94,90,90,86,106,111,101,107,106,109,161,99,84", - "endOffsets": "220,326,433,522,623,741,824,904,995,1088,1184,1278,1379,1472,1567,1662,1753,1844,1931,2038,2150,2252,2360,2467,2577,2739,2839,2924" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-pt-rPT.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-pt-rPT.json deleted file mode 100755 index e35de8d..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-pt-rPT.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-pt-rPT\\values-pt-rPT.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-pt-rPT\\values-pt-rPT.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2949", - "endColumns": "100", - "endOffsets": "3045" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-pt-rPT\\values-pt-rPT.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,225,331,438,527,628,752,836,917,1009,1103,1201,1295,1395,1489,1585,1680,1772,1864,1951,2058,2170,2272,2380,2487,2594,2765,2864", - "endColumns": "119,105,106,88,100,123,83,80,91,93,97,93,99,93,95,94,91,91,86,106,111,101,107,106,106,170,98,84", - "endOffsets": "220,326,433,522,623,747,831,912,1004,1098,1196,1290,1390,1484,1580,1675,1767,1859,1946,2053,2165,2267,2375,2482,2589,2760,2859,2944" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-pt.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-pt.json deleted file mode 100755 index db262cc..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-pt.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-pt\\values-pt.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-pt\\values-pt.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2929", - "endColumns": "100", - "endOffsets": "3025" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-pt\\values-pt.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,225,331,438,527,628,746,829,909,1000,1093,1189,1283,1384,1477,1572,1667,1758,1849,1936,2043,2155,2257,2365,2472,2582,2744,2844", - "endColumns": "119,105,106,88,100,117,82,79,90,92,95,93,100,92,94,94,90,90,86,106,111,101,107,106,109,161,99,84", - "endOffsets": "220,326,433,522,623,741,824,904,995,1088,1184,1278,1379,1472,1567,1662,1753,1844,1931,2038,2150,2252,2360,2467,2577,2739,2839,2924" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ro.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ro.json deleted file mode 100755 index 53b9c24..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ro.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-ro\\values-ro.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ro\\values-ro.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,226,330,443,531,643,764,849,930,1021,1114,1210,1304,1404,1497,1592,1687,1778,1870,1953,2065,2178,2278,2392,2497,2603,2767,2870", - "endColumns": "120,103,112,87,111,120,84,80,90,92,95,93,99,92,94,94,90,91,82,111,112,99,113,104,105,163,102,82", - "endOffsets": "221,325,438,526,638,759,844,925,1016,1109,1205,1299,1399,1492,1587,1682,1773,1865,1948,2060,2173,2273,2387,2492,2598,2762,2865,2948" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-ro\\values-ro.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2953", - "endColumns": "100", - "endOffsets": "3049" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ru.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ru.json deleted file mode 100755 index e678416..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ru.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-ru\\values-ru.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-ru\\values-ru.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2913", - "endColumns": "100", - "endOffsets": "3009" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ru\\values-ru.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,220,322,434,520,625,745,824,902,994,1088,1184,1277,1373,1467,1563,1658,1750,1842,1922,2028,2136,2234,2343,2449,2557,2732,2832", - "endColumns": "114,101,111,85,104,119,78,77,91,93,95,92,95,93,95,94,91,91,79,105,107,97,108,105,107,174,99,80", - "endOffsets": "215,317,429,515,620,740,819,897,989,1083,1179,1272,1368,1462,1558,1653,1745,1837,1917,2023,2131,2229,2338,2444,2552,2727,2827,2908" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-si.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-si.json deleted file mode 100755 index e34c19a..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-si.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-si\\values-si.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-si\\values-si.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2903", - "endColumns": "100", - "endOffsets": "2999" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-si\\values-si.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,215,322,429,517,622,738,827,914,1005,1098,1193,1287,1388,1481,1576,1670,1761,1852,1936,2045,2150,2248,2358,2457,2563,2722,2821", - "endColumns": "109,106,106,87,104,115,88,86,90,92,94,93,100,92,94,93,90,90,83,108,104,97,109,98,105,158,98,81", - "endOffsets": "210,317,424,512,617,733,822,909,1000,1093,1188,1282,1383,1476,1571,1665,1756,1847,1931,2040,2145,2243,2353,2452,2558,2717,2816,2898" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-sk.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-sk.json deleted file mode 100755 index cd467ea..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-sk.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-sk\\values-sk.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-sk\\values-sk.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2918", - "endColumns": "100", - "endOffsets": "3014" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-sk\\values-sk.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,212,312,423,509,617,735,816,897,988,1081,1180,1274,1375,1468,1563,1661,1752,1843,1927,2032,2141,2240,2346,2457,2566,2732,2830", - "endColumns": "106,99,110,85,107,117,80,80,90,92,98,93,100,92,94,97,90,90,83,104,108,98,105,110,108,165,97,87", - "endOffsets": "207,307,418,504,612,730,811,892,983,1076,1175,1269,1370,1463,1558,1656,1747,1838,1922,2027,2136,2235,2341,2452,2561,2727,2825,2913" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-sl.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-sl.json deleted file mode 100755 index 690c70b..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-sl.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-sl\\values-sl.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-sl\\values-sl.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2936", - "endColumns": "100", - "endOffsets": "3032" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-sl\\values-sl.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,212,319,427,514,617,736,821,905,997,1091,1187,1281,1377,1471,1567,1667,1759,1851,1935,2043,2152,2252,2365,2472,2576,2756,2853", - "endColumns": "106,106,107,86,102,118,84,83,91,93,95,93,95,93,95,99,91,91,83,107,108,99,112,106,103,179,96,82", - "endOffsets": "207,314,422,509,612,731,816,900,992,1086,1182,1276,1372,1466,1562,1662,1754,1846,1930,2038,2147,2247,2360,2467,2571,2751,2848,2931" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-sq.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-sq.json deleted file mode 100755 index 5927076..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-sq.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-sq\\values-sq.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-sq\\values-sq.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2907", - "endColumns": "100", - "endOffsets": "3003" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-sq\\values-sq.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,219,319,431,518,628,751,832,911,1002,1095,1191,1285,1387,1480,1575,1672,1763,1856,1939,2045,2150,2248,2354,2457,2573,2727,2826", - "endColumns": "113,99,111,86,109,122,80,78,90,92,95,93,101,92,94,96,90,92,82,105,104,97,105,102,115,153,98,80", - "endOffsets": "214,314,426,513,623,746,827,906,997,1090,1186,1280,1382,1475,1570,1667,1758,1851,1934,2040,2145,2243,2349,2452,2568,2722,2821,2902" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-sr.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-sr.json deleted file mode 100755 index 9c26fe4..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-sr.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-sr\\values-sr.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-sr\\values-sr.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,214,317,423,509,613,731,812,892,983,1076,1172,1266,1367,1460,1555,1660,1751,1842,1930,2035,2143,2244,2348,2456,2557,2724,2821", - "endColumns": "108,102,105,85,103,117,80,79,90,92,95,93,100,92,94,104,90,90,87,104,107,100,103,107,100,166,96,83", - "endOffsets": "209,312,418,504,608,726,807,887,978,1071,1167,1261,1362,1455,1550,1655,1746,1837,1925,2030,2138,2239,2343,2451,2552,2719,2816,2900" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-sr\\values-sr.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2905", - "endColumns": "100", - "endOffsets": "3001" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-sv.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-sv.json deleted file mode 100755 index 6bfeef7..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-sv.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-sv\\values-sv.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-sv\\values-sv.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2863", - "endColumns": "100", - "endOffsets": "2959" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-sv\\values-sv.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,211,314,425,510,612,725,801,877,970,1065,1161,1255,1358,1453,1550,1648,1744,1837,1917,2023,2123,2219,2324,2426,2528,2682,2784", - "endColumns": "105,102,110,84,101,112,75,75,92,94,95,93,102,94,96,97,95,92,79,105,99,95,104,101,101,153,101,78", - "endOffsets": "206,309,420,505,607,720,796,872,965,1060,1156,1250,1353,1448,1545,1643,1739,1832,1912,2018,2118,2214,2319,2421,2523,2677,2779,2858" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-sw.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-sw.json deleted file mode 100755 index 6e08da6..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-sw.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-sw\\values-sw.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-sw\\values-sw.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2883", - "endColumns": "100", - "endOffsets": "2979" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-sw\\values-sw.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,208,306,414,504,609,726,808,891,982,1075,1169,1263,1364,1457,1552,1647,1738,1830,1912,2013,2122,2221,2328,2437,2542,2704,2801", - "endColumns": "102,97,107,89,104,116,81,82,90,92,93,93,100,92,94,94,90,91,81,100,108,98,106,108,104,161,96,81", - "endOffsets": "203,301,409,499,604,721,803,886,977,1070,1164,1258,1359,1452,1547,1642,1733,1825,1907,2008,2117,2216,2323,2432,2537,2699,2796,2878" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-sw600dp-v13.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-sw600dp-v13.json deleted file mode 100755 index b64ce1c..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-sw600dp-v13.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-sw600dp-v13\\values-sw600dp-v13.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-sw600dp-v13\\values-sw600dp-v13.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9", - "startColumns": "4,4,4,4,4,4,4,4", - "startOffsets": "55,124,193,263,337,413,472,543", - "endColumns": "68,68,69,73,75,58,70,67", - "endOffsets": "119,188,258,332,408,467,538,606" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\values-sw600dp-v13\\values-sw600dp-v13.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,10,11,12", - "startColumns": "4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,115,185,256,328,386,444,553,617,680", - "endLines": "2,3,4,5,6,7,9,10,11,15", - "endColumns": "59,69,70,71,57,57,10,63,62,10", - "endOffsets": "110,180,251,323,381,439,548,612,675,847" - }, - "to": { - "startLines": "10,11,12,13,14,15,16,18,19,20", - "startColumns": "4,4,4,4,4,4,4,4,4,4", - "startOffsets": "611,671,741,812,884,942,1000,1109,1173,1236", - "endLines": "10,11,12,13,14,15,17,18,19,23", - "endColumns": "59,69,70,71,57,57,10,63,62,10", - "endOffsets": "666,736,807,879,937,995,1104,1168,1231,1403" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ta.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ta.json deleted file mode 100755 index 1058dcd..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ta.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-ta\\values-ta.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ta\\values-ta.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,219,317,432,521,628,754,832,909,1009,1114,1210,1305,1412,1514,1618,1713,1815,1913,1995,2097,2201,2298,2408,2510,2617,2774,2874", - "endColumns": "113,97,114,88,106,125,77,76,99,104,95,94,106,101,103,94,101,97,81,101,103,96,109,101,106,156,99,79", - "endOffsets": "214,312,427,516,623,749,827,904,1004,1109,1205,1300,1407,1509,1613,1708,1810,1908,1990,2092,2196,2293,2403,2505,2612,2769,2869,2949" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-ta\\values-ta.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2954", - "endColumns": "100", - "endOffsets": "3050" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-te.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-te.json deleted file mode 100755 index ad7d720..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-te.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-te\\values-te.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-te\\values-te.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,219,328,439,529,634,759,841,923,1014,1107,1203,1297,1398,1491,1586,1681,1772,1863,1947,2060,2168,2267,2378,2480,2597,2763,2864", - "endColumns": "113,108,110,89,104,124,81,81,90,92,95,93,100,92,94,94,90,90,83,112,107,98,110,101,116,165,100,81", - "endOffsets": "214,323,434,524,629,754,836,918,1009,1102,1198,1292,1393,1486,1581,1676,1767,1858,1942,2055,2163,2262,2373,2475,2592,2758,2859,2941" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-te\\values-te.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2946", - "endColumns": "100", - "endOffsets": "3042" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-th.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-th.json deleted file mode 100755 index a12e185..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-th.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-th\\values-th.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-th\\values-th.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2845", - "endColumns": "100", - "endOffsets": "2941" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-th\\values-th.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,210,308,416,505,607,717,794,872,963,1056,1152,1246,1347,1440,1535,1629,1720,1811,1892,2000,2104,2202,2310,2415,2516,2669,2764", - "endColumns": "104,97,107,88,101,109,76,77,90,92,95,93,100,92,94,93,90,90,80,107,103,97,107,104,100,152,94,80", - "endOffsets": "205,303,411,500,602,712,789,867,958,1051,1147,1241,1342,1435,1530,1624,1715,1806,1887,1995,2099,2197,2305,2410,2511,2664,2759,2840" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-tl.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-tl.json deleted file mode 100755 index fb5f5d7..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-tl.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-tl\\values-tl.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-tl\\values-tl.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2949", - "endColumns": "100", - "endOffsets": "3045" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-tl\\values-tl.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,224,332,449,537,643,764,843,921,1012,1105,1201,1295,1396,1489,1584,1678,1769,1860,1944,2053,2164,2265,2375,2492,2600,2763,2865", - "endColumns": "118,107,116,87,105,120,78,77,90,92,95,93,100,92,94,93,90,90,83,108,110,100,109,116,107,162,101,83", - "endOffsets": "219,327,444,532,638,759,838,916,1007,1100,1196,1290,1391,1484,1579,1673,1764,1855,1939,2048,2159,2260,2370,2487,2595,2758,2860,2944" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-tr.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-tr.json deleted file mode 100755 index cab358a..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-tr.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-tr\\values-tr.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-tr\\values-tr.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,210,309,421,506,612,732,811,887,978,1071,1164,1258,1356,1449,1551,1646,1737,1828,1907,2014,2119,2215,2322,2424,2532,2688,2786", - "endColumns": "104,98,111,84,105,119,78,75,90,92,92,93,97,92,101,94,90,90,78,106,104,95,106,101,107,155,97,78", - "endOffsets": "205,304,416,501,607,727,806,882,973,1066,1159,1253,1351,1444,1546,1641,1732,1823,1902,2009,2114,2210,2317,2419,2527,2683,2781,2860" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-tr\\values-tr.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2865", - "endColumns": "100", - "endOffsets": "2961" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-uk.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-uk.json deleted file mode 100755 index 1043306..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-uk.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-uk\\values-uk.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-uk\\values-uk.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2900", - "endColumns": "100", - "endOffsets": "2996" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-uk\\values-uk.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,215,317,423,509,617,735,814,894,985,1078,1174,1268,1369,1462,1557,1652,1743,1834,1915,2021,2128,2226,2334,2440,2549,2719,2819", - "endColumns": "109,101,105,85,107,117,78,79,90,92,95,93,100,92,94,94,90,90,80,105,106,97,107,105,108,169,99,80", - "endOffsets": "210,312,418,504,612,730,809,889,980,1073,1169,1263,1364,1457,1552,1647,1738,1829,1910,2016,2123,2221,2329,2435,2544,2714,2814,2895" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ur.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ur.json deleted file mode 100755 index f498622..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-ur.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-ur\\values-ur.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-ur\\values-ur.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2904", - "endColumns": "100", - "endOffsets": "3000" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-ur\\values-ur.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,215,321,430,516,620,740,816,892,984,1078,1174,1268,1370,1464,1560,1654,1746,1838,1923,2031,2140,2242,2353,2453,2561,2726,2824", - "endColumns": "109,105,108,85,103,119,75,75,91,93,95,93,101,93,95,93,91,91,84,107,108,101,110,99,107,164,97,79", - "endOffsets": "210,316,425,511,615,735,811,887,979,1073,1169,1263,1365,1459,1555,1649,1741,1833,1918,2026,2135,2237,2348,2448,2556,2721,2819,2899" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-uz.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-uz.json deleted file mode 100755 index b62b848..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-uz.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-uz\\values-uz.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-uz\\values-uz.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,210,314,428,514,614,730,810,889,980,1073,1169,1263,1358,1451,1546,1641,1732,1824,1908,2017,2124,2225,2333,2438,2545,2706,2805", - "endColumns": "104,103,113,85,99,115,79,78,90,92,95,93,94,92,94,94,90,91,83,108,106,100,107,104,106,160,98,83", - "endOffsets": "205,309,423,509,609,725,805,884,975,1068,1164,1258,1353,1446,1541,1636,1727,1819,1903,2012,2119,2220,2328,2433,2540,2701,2800,2884" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-uz\\values-uz.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2889", - "endColumns": "100", - "endOffsets": "2985" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v16.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v16.json deleted file mode 100755 index b012d5f..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v16.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-v16\\values-v16.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-v16\\values-v16.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "65", - "endOffsets": "116" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-v16\\values-v16.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endLines": "5", - "endColumns": "12", - "endOffsets": "223" - }, - "to": { - "startLines": "3", - "startColumns": "4", - "startOffsets": "121", - "endLines": "6", - "endColumns": "12", - "endOffsets": "289" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v17.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v17.json deleted file mode 100755 index 778307b..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v17.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-v17\\values-v17.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-v17\\values-v17.xml", - "from": { - "startLines": "2,5,9,12,15,18,22,25,29,33,37,40,43,46,50,53,57", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,228,456,614,764,936,1161,1331,1559,1783,2025,2196,2370,2539,2812,3012,3216", - "endLines": "4,8,11,14,17,21,24,28,32,36,39,42,45,49,52,56,60", - "endColumns": "12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12", - "endOffsets": "223,451,609,759,931,1156,1326,1554,1778,2020,2191,2365,2534,2807,3007,3211,3540" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v18.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v18.json deleted file mode 100755 index ed9f160..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v18.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-v18\\values-v18.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-v18\\values-v18.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "48", - "endOffsets": "99" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v21.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v21.json deleted file mode 100755 index 04a23b0..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v21.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-v21\\values-v21.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\values-v21\\values-v21.xml", - "from": { - "startLines": "2,10,18,26", - "startColumns": "4,4,4,4", - "startOffsets": "55,484,910,1333", - "endLines": "9,17,25,33", - "endColumns": "10,10,10,10", - "endOffsets": "479,905,1328,1763" - }, - "to": { - "startLines": "267,275,283,291", - "startColumns": "4,4,4,4", - "startOffsets": "19758,20187,20613,21036", - "endLines": "274,282,290,298", - "endColumns": "10,10,10,10", - "endOffsets": "20182,20608,21031,21466" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-v21\\values-v21.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,13", - "startColumns": "4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,159,223,290,354,470,596,722,850,1022", - "endLines": "2,3,4,5,6,7,8,9,12,17", - "endColumns": "103,63,66,63,115,125,125,127,12,12", - "endOffsets": "154,218,285,349,465,591,717,845,1017,1355" - }, - "to": { - "startLines": "2,3,4,5,263,264,265,266,299,302", - "startColumns": "4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,159,223,290,19262,19378,19504,19630,21471,21643", - "endLines": "2,3,4,5,263,264,265,266,301,306", - "endColumns": "103,63,66,63,115,125,125,127,12,12", - "endOffsets": "154,218,285,349,19373,19499,19625,19753,21638,21976" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-v21\\values-v21.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,17,19,20,21,22,24,26,27,28,29,30,32,34,36,38,40,42,43,48,50,52,53,54,56,58,59,60,61,62,63,107,110,154,157,160,162,164,166,169,171,174,175,176,179,180,181,182,183,184,187,188,190,192,194,196,200,202,203,204,205,207,211,213,215,216,217,218,219,221,222,223,233,234,235,247", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,146,249,352,457,564,673,782,891,1000,1109,1216,1319,1438,1593,1748,1853,1974,2075,2222,2363,2466,2585,2692,2795,2950,3121,3270,3435,3592,3743,3862,4234,4383,4532,4644,4791,4944,5091,5166,5255,5342,5443,5546,8614,8799,11879,12076,12275,12398,12521,12634,12817,12948,13149,13238,13349,13582,13683,13778,13901,14030,14147,14324,14423,14558,14701,14836,14955,15156,15275,15368,15479,15535,15642,15837,15948,16081,16176,16267,16358,16475,16614,16685,16768,17448,17505,17563,18257", - "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,16,18,19,20,21,23,25,26,27,28,29,31,33,35,37,39,41,42,47,49,51,52,53,55,57,58,59,60,61,62,106,109,153,156,159,161,163,165,168,170,173,174,175,178,179,180,181,182,183,186,187,189,191,193,195,199,201,202,203,204,206,210,212,214,215,216,217,218,220,221,222,232,233,234,246,258", - "endColumns": "90,102,102,104,106,108,108,108,108,108,106,102,118,12,12,104,120,100,12,12,102,118,106,102,12,12,12,12,12,12,118,12,12,12,111,146,12,12,74,88,86,100,102,12,12,12,12,12,12,12,12,12,12,12,88,110,12,100,94,122,128,116,12,98,12,12,12,12,12,12,92,110,55,12,12,12,12,94,90,90,116,12,70,82,12,56,57,12,12", - "endOffsets": "141,244,347,452,559,668,777,886,995,1104,1211,1314,1433,1588,1743,1848,1969,2070,2217,2358,2461,2580,2687,2790,2945,3116,3265,3430,3587,3738,3857,4229,4378,4527,4639,4786,4939,5086,5161,5250,5337,5438,5541,8609,8794,11874,12071,12270,12393,12516,12629,12812,12943,13144,13233,13344,13577,13678,13773,13896,14025,14142,14319,14418,14553,14696,14831,14950,15151,15270,15363,15474,15530,15637,15832,15943,16076,16171,16262,16353,16470,16609,16680,16763,17443,17500,17558,18252,18958" - }, - "to": { - "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,21,23,24,25,26,28,30,31,32,33,34,36,38,40,42,44,46,47,52,54,56,57,58,60,62,63,64,65,66,67,111,114,158,161,164,166,168,170,173,175,178,179,180,183,184,185,186,187,188,191,192,194,196,198,200,204,206,207,208,209,211,215,217,219,220,221,222,223,225,226,227,237,238,239,251", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "354,445,548,651,756,863,972,1081,1190,1299,1408,1515,1618,1737,1892,2047,2152,2273,2374,2521,2662,2765,2884,2991,3094,3249,3420,3569,3734,3891,4042,4161,4533,4682,4831,4943,5090,5243,5390,5465,5554,5641,5742,5845,8913,9098,12178,12375,12574,12697,12820,12933,13116,13247,13448,13537,13648,13881,13982,14077,14200,14329,14446,14623,14722,14857,15000,15135,15254,15455,15574,15667,15778,15834,15941,16136,16247,16380,16475,16566,16657,16774,16913,16984,17067,17747,17804,17862,18556", - "endLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,23,24,25,27,29,30,31,32,33,35,37,39,41,43,45,46,51,53,55,56,57,59,61,62,63,64,65,66,110,113,157,160,163,165,167,169,172,174,177,178,179,182,183,184,185,186,187,190,191,193,195,197,199,203,205,206,207,208,210,214,216,218,219,220,221,222,224,225,226,236,237,238,250,262", - "endColumns": "90,102,102,104,106,108,108,108,108,108,106,102,118,12,12,104,120,100,12,12,102,118,106,102,12,12,12,12,12,12,118,12,12,12,111,146,12,12,74,88,86,100,102,12,12,12,12,12,12,12,12,12,12,12,88,110,12,100,94,122,128,116,12,98,12,12,12,12,12,12,92,110,55,12,12,12,12,94,90,90,116,12,70,82,12,56,57,12,12", - "endOffsets": "440,543,646,751,858,967,1076,1185,1294,1403,1510,1613,1732,1887,2042,2147,2268,2369,2516,2657,2760,2879,2986,3089,3244,3415,3564,3729,3886,4037,4156,4528,4677,4826,4938,5085,5238,5385,5460,5549,5636,5737,5840,8908,9093,12173,12370,12569,12692,12815,12928,13111,13242,13443,13532,13643,13876,13977,14072,14195,14324,14441,14618,14717,14852,14995,15130,15249,15450,15569,15662,15773,15829,15936,16131,16242,16375,16470,16561,16652,16769,16908,16979,17062,17742,17799,17857,18551,19257" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v22.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v22.json deleted file mode 100755 index 677a5d5..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v22.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-v22\\values-v22.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-v22\\values-v22.xml", - "from": { - "startLines": "2,3,4,9", - "startColumns": "4,4,4,4", - "startOffsets": "55,130,217,553", - "endLines": "2,3,8,13", - "endColumns": "74,86,12,12", - "endOffsets": "125,212,548,896" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v23.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v23.json deleted file mode 100755 index 84964e6..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v23.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-v23\\values-v23.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-v23\\values-v23.xml", - "from": { - "startLines": "2,3,4,5,6,19,32,33,34,35,36", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,190,325,400,487,1277,2079,2206,2311,2426,2533", - "endLines": "2,3,4,5,18,31,32,33,34,35,36", - "endColumns": "134,134,74,86,12,12,126,104,114,106,112", - "endOffsets": "185,320,395,482,1272,2074,2201,2306,2421,2528,2641" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\cardview-v7-28.0.0.aar\\3b87ab57366b6cf64018eb749db2a1b4\\res\\values-v23\\values-v23.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endLines": "4", - "endColumns": "12", - "endOffsets": "200" - }, - "to": { - "startLines": "37", - "startColumns": "4", - "startOffsets": "2646", - "endLines": "39", - "endColumns": "12", - "endOffsets": "2791" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v24.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v24.json deleted file mode 100755 index a79f7ff..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v24.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-v24\\values-v24.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-v24\\values-v24.xml", - "from": { - "startLines": "2,3", - "startColumns": "4,4", - "startOffsets": "55,212", - "endColumns": "156,134", - "endOffsets": "207,342" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v25.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v25.json deleted file mode 100755 index 159e3e3..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v25.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-v25\\values-v25.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-v25\\values-v25.xml", - "from": { - "startLines": "2,3,4,6", - "startColumns": "4,4,4,4", - "startOffsets": "55,126,209,308", - "endLines": "2,3,5,7", - "endColumns": "70,82,12,12", - "endOffsets": "121,204,303,414" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v26.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v26.json deleted file mode 100755 index 69e5f8a..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v26.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-v26\\values-v26.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-v26\\values-v26.xml", - "from": { - "startLines": "2,3,4,8,12,16", - "startColumns": "4,4,4,4,4,4", - "startOffsets": "55,130,217,431,657,896", - "endLines": "2,3,7,11,15,16", - "endColumns": "74,86,12,12,12,92", - "endOffsets": "125,212,426,652,891,984" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v28.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v28.json deleted file mode 100755 index 8a504e2..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-v28.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-v28\\values-v28.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-v28\\values-v28.xml", - "from": { - "startLines": "2,3,4,8", - "startColumns": "4,4,4,4", - "startOffsets": "55,130,217,447", - "endLines": "2,3,7,11", - "endColumns": "74,86,12,12", - "endOffsets": "125,212,442,684" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-vi.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-vi.json deleted file mode 100755 index efc4d39..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-vi.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-vi\\values-vi.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-vi\\values-vi.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2901", - "endColumns": "100", - "endOffsets": "2997" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-vi\\values-vi.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,219,327,436,520,623,742,819,896,987,1080,1176,1270,1371,1464,1559,1657,1748,1839,1923,2027,2136,2237,2342,2456,2561,2718,2817", - "endColumns": "113,107,108,83,102,118,76,76,90,92,95,93,100,92,94,97,90,90,83,103,108,100,104,113,104,156,98,83", - "endOffsets": "214,322,431,515,618,737,814,891,982,1075,1171,1265,1366,1459,1554,1652,1743,1834,1918,2022,2131,2232,2337,2451,2556,2713,2812,2896" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-watch-v20.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-watch-v20.json deleted file mode 100755 index 42681b0..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-watch-v20.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-watch-v20\\values-watch-v20.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-watch-v20\\values-watch-v20.xml", - "from": { - "startLines": "2,5,8", - "startColumns": "4,4,4", - "startOffsets": "55,214,385", - "endLines": "4,7,10", - "endColumns": "12,12,12", - "endOffsets": "209,380,553" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-watch-v21.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-watch-v21.json deleted file mode 100755 index 2f62331..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-watch-v21.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-watch-v21\\values-watch-v21.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-watch-v21\\values-watch-v21.xml", - "from": { - "startLines": "2,6,10", - "startColumns": "4,4,4", - "startOffsets": "55,271,499", - "endLines": "5,9,13", - "endColumns": "12,12,12", - "endOffsets": "266,494,724" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-xlarge-v4.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-xlarge-v4.json deleted file mode 100755 index 036d992..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-xlarge-v4.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-xlarge-v4\\values-xlarge-v4.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-xlarge-v4\\values-xlarge-v4.xml", - "from": { - "startLines": "2,3,4,5,6,7", - "startColumns": "4,4,4,4,4,4", - "startOffsets": "55,126,197,267,337,405", - "endColumns": "70,70,69,69,67,67", - "endOffsets": "121,192,262,332,400,468" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-zh-rCN.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-zh-rCN.json deleted file mode 100755 index 9401c3e..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-zh-rCN.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-zh-rCN\\values-zh-rCN.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-zh-rCN\\values-zh-rCN.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,201,296,396,478,575,681,757,833,924,1017,1115,1211,1306,1399,1494,1586,1677,1768,1846,1942,2038,2133,2230,2325,2423,2572,2666", - "endColumns": "95,94,99,81,96,105,75,75,90,92,97,95,94,92,94,91,90,90,77,95,95,94,96,94,97,148,93,77", - "endOffsets": "196,291,391,473,570,676,752,828,919,1012,1110,1206,1301,1394,1489,1581,1672,1763,1841,1937,2033,2128,2225,2320,2418,2567,2661,2739" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-zh-rCN\\values-zh-rCN.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2744", - "endColumns": "100", - "endOffsets": "2840" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-zh-rHK.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-zh-rHK.json deleted file mode 100755 index 1896a60..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-zh-rHK.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-zh-rHK\\values-zh-rHK.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-zh-rHK\\values-zh-rHK.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2746", - "endColumns": "100", - "endOffsets": "2842" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-zh-rHK\\values-zh-rHK.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,200,293,393,475,572,680,756,832,924,1018,1110,1206,1302,1396,1492,1584,1676,1768,1846,1942,2038,2133,2230,2325,2423,2574,2668", - "endColumns": "94,92,99,81,96,107,75,75,91,93,91,95,95,93,95,91,91,91,77,95,95,94,96,94,97,150,93,77", - "endOffsets": "195,288,388,470,567,675,751,827,919,1013,1105,1201,1297,1391,1487,1579,1671,1763,1841,1937,2033,2128,2225,2320,2418,2569,2663,2741" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-zh-rTW.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-zh-rTW.json deleted file mode 100755 index 589dabe..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-zh-rTW.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-zh-rTW\\values-zh-rTW.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-zh-rTW\\values-zh-rTW.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,200,293,393,475,572,680,756,832,924,1018,1116,1212,1308,1402,1498,1590,1682,1774,1852,1948,2044,2139,2236,2331,2431,2581,2675", - "endColumns": "94,92,99,81,96,107,75,75,91,93,97,95,95,93,95,91,91,91,77,95,95,94,96,94,99,149,93,77", - "endOffsets": "195,288,388,470,567,675,751,827,919,1013,1111,1207,1303,1397,1493,1585,1677,1769,1847,1943,2039,2134,2231,2326,2426,2576,2670,2748" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-zh-rTW\\values-zh-rTW.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2753", - "endColumns": "100", - "endOffsets": "2849" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-zu.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-zu.json deleted file mode 100755 index 4b59785..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values-zu.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values-zu\\values-zu.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values-zu\\values-zu.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,320,434,522,625,752,832,912,1003,1096,1190,1284,1385,1478,1573,1667,1758,1851,1937,2041,2147,2245,2352,2458,2564,2721,2817", - "endColumns": "107,106,113,87,102,126,79,79,90,92,93,93,100,92,94,93,90,92,85,103,105,97,106,105,105,156,95,80", - "endOffsets": "208,315,429,517,620,747,827,907,998,1091,1185,1279,1380,1473,1568,1662,1753,1846,1932,2036,2142,2240,2347,2453,2559,2716,2812,2893" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values-zu\\values-zu.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2898", - "endColumns": "100", - "endOffsets": "2994" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values.json b/code/Android App/build/intermediates/blame/res/debug/multi-v2/values.json deleted file mode 100755 index bbf3127..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/multi-v2/values.json +++ /dev/null @@ -1,232 +0,0 @@ -{ - "logs": [ - { - "outputFile": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental\\mergeDebugResources\\merged.dir\\values\\values.xml", - "map": [ - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\constraint-layout-1.1.3.aar\\78c302b72b1c55c024ab2e374fc3bb28\\res\\values\\values.xml", - "from": { - "startLines": "2,3,11,12,13,14,15,19,20,21,22,25,26,29,32,33,34,35,36,39,42,43,44,45,50,53,56,57,58,63,64,65,68,71,72,75,78,81,84,85,88,91,92,97,98,103,106,109,110,111,112,113,114,115,116,117,118,127,128,129,130", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,116,407,455,507,568,614,741,802,862,932,1065,1133,1262,1388,1450,1515,1583,1650,1773,1898,1965,2030,2095,2276,2397,2518,2584,2651,2861,2930,2996,3121,3247,3314,3440,3567,3692,3819,3884,4010,4133,4198,4406,4473,4653,4773,4893,4958,5020,5082,5144,5203,5263,5324,5385,5444,5819,8395,8527,11791", - "endLines": "2,10,11,12,13,14,18,19,20,21,24,25,28,31,32,33,34,35,38,41,42,43,44,49,52,55,56,57,62,63,64,67,70,71,74,77,80,83,84,87,90,91,96,97,102,105,108,109,110,111,112,113,114,115,116,117,126,127,128,129,130", - "endColumns": "60,11,47,51,60,45,11,60,59,69,11,67,11,11,61,64,67,66,11,11,66,64,64,11,11,11,65,66,11,68,65,11,11,66,11,11,11,11,64,11,11,64,11,66,11,11,11,64,61,61,61,58,59,60,60,58,11,2575,131,3263,107", - "endOffsets": "111,402,450,502,563,609,736,797,857,927,1060,1128,1257,1383,1445,1510,1578,1645,1768,1893,1960,2025,2090,2271,2392,2513,2579,2646,2856,2925,2991,3116,3242,3309,3435,3562,3687,3814,3879,4005,4128,4193,4401,4468,4648,4768,4888,4953,5015,5077,5139,5198,5258,5319,5380,5439,5814,8390,8522,11786,11894" - }, - "to": { - "startLines": "6,7,20,25,26,27,30,38,39,40,41,44,45,48,51,52,53,54,55,58,61,62,63,64,69,72,75,76,77,82,83,84,87,90,91,94,97,100,103,104,107,110,111,116,117,122,125,128,129,130,131,132,133,134,135,136,137,3768,3769,3770,4019", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "269,330,905,1161,1213,1274,1436,1755,1816,1876,1946,2079,2147,2276,2402,2464,2529,2597,2664,2787,2912,2979,3044,3109,3290,3411,3532,3598,3665,3875,3944,4010,4135,4261,4328,4454,4581,4706,4833,4898,5024,5147,5212,5420,5487,5667,5787,5907,5972,6034,6096,6158,6217,6277,6338,6399,6458,237773,240349,240481,259033", - "endLines": "6,14,20,25,26,27,33,38,39,40,43,44,47,50,51,52,53,54,57,60,61,62,63,68,71,74,75,76,81,82,83,86,89,90,93,96,99,102,103,106,109,110,115,116,121,124,127,128,129,130,131,132,133,134,135,136,145,3768,3769,3770,4019", - "endColumns": "60,11,47,51,60,45,11,60,59,69,11,67,11,11,61,64,67,66,11,11,66,64,64,11,11,11,65,66,11,68,65,11,11,66,11,11,11,11,64,11,11,64,11,66,11,11,11,64,61,61,61,58,59,60,60,58,11,2575,131,3263,107", - "endOffsets": "325,616,948,1208,1269,1315,1558,1811,1871,1941,2074,2142,2271,2397,2459,2524,2592,2659,2782,2907,2974,3039,3104,3285,3406,3527,3593,3660,3870,3939,4005,4130,4256,4323,4449,4576,4701,4828,4893,5019,5142,5207,5415,5482,5662,5782,5902,5967,6029,6091,6153,6212,6272,6333,6394,6453,6828,240344,240476,243740,259136" - } - }, - { - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\values\\dimens.xml", - "from": { - "startLines": "1,3,2,7,6", - "startColumns": "4,4,4,4,4", - "startOffsets": "16,105,58,226,177", - "endLines": "1,5,2,7,6", - "endColumns": "41,37,46,47,48", - "endOffsets": "53,172,100,269,221" - }, - "to": { - "startLines": "393,397,398,399,400", - "startColumns": "4,4,4,4,4", - "startOffsets": "23194,23399,23455,23502,23550", - "endColumns": "41,55,46,47,48", - "endOffsets": "23231,23450,23497,23545,23594" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\values\\values.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1461,1462,1466,1470,1474,1479,1485,1492,1496,1500,1505,1509,1513,1517,1521,1525,1529,1535,1539,1545,1549,1555,1559,1564,1568,1571,1575,1581,1585,1591,1595,1601,1604,1608,1612,1616,1620,1624,1625,1626,1627,1630,1633,1636,1639,1643,1644,1645,1646,1647,1650,1652,1654,1656,1661,1662,1666,1672,1676,1677,1679,1690,1691,1695,1701,1705,1706,1707,1711,1738,1742,1743,1747,1775,1943,1969,2138,2164,2195,2203,2209,2223,2245,2250,2255,2265,2274,2283,2287,2294,2302,2309,2310,2319,2322,2325,2329,2333,2337,2340,2341,2345,2349,2359,2364,2371,2377,2378,2381,2385,2390,2392,2394,2397,2400,2402,2406,2409,2416,2419,2422,2426,2428,2432,2434,2436,2438,2442,2450,2458,2470,2476,2485,2488,2499,2502,2507,2508,2513,2571,2630,2631,2641,2650,2651,2653,2657,2660,2663,2666,2669,2672,2675,2678,2682,2685,2688,2691,2695,2698,2702,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2728,2730,2731,2732,2733,2734,2735,2736,2737,2739,2740,2742,2743,2745,2747,2748,2750,2751,2752,2753,2754,2755,2757,2758,2759,2760,2761,2762,2764,2766,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,2780,2782,2783,2784,2785,2786,2787,2789,2793,2797,2798,2799,2800,2801,2802,2803,2804,2806,2808,2810,2812,2814,2815,2816,2817,2819,2821,2823,2824,2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2837,2838,2839,2840,2842,2844,2845,2847,2848,2850,2852,2854,2855,2856,2857,2858,2859,2860,2861,2862,2863,2864,2865,2867,2868,2869,2870,2872,2873,2874,2875,2876,2878,2880,2882,2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,69,152,155,158,161,175,186,196,223,230,241,271,298,307,344,725,730,756,774,810,816,822,845,986,1006,1012,1016,1022,1059,1071,1098,1103,1169,1184,1249,1268,1294", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,160,205,254,295,350,409,471,552,613,688,764,841,919,1004,1086,1162,1238,1315,1393,1499,1605,1684,1764,1821,1879,1953,2028,2093,2159,2219,2280,2352,2425,2492,2560,2619,2678,2737,2796,2855,2909,2963,3016,3070,3124,3178,3232,3306,3385,3458,3532,3603,3675,3747,3820,3877,3935,4008,4082,4156,4231,4303,4376,4446,4517,4577,70911,70980,71049,71119,71193,71269,71333,71410,71486,71563,71628,71697,71774,71849,71918,71986,72063,72129,72190,72287,72352,72421,72520,72591,72650,72708,72765,72824,72888,72959,73031,73103,73175,73247,73314,73382,73450,73509,73572,73636,73726,73817,73877,73943,74010,74076,74146,74210,74263,74376,74434,74497,74562,74627,74702,74775,74847,74896,74957,75018,75079,75141,75205,75269,75333,75398,75461,75521,75582,75648,75707,75767,75829,75900,75960,76028,76114,76201,76291,76378,76466,76548,76631,76721,76812,76864,76922,76967,77033,77097,77154,77211,77265,77322,77370,77419,77470,77504,77551,77600,77646,77678,77742,77804,77864,77921,77995,78065,78143,78197,78267,78352,78400,78446,78517,78595,78673,78745,78819,78893,78967,79047,79120,79189,79261,79338,79399,79462,79528,79592,79663,79726,79791,79855,79916,79977,80029,80102,80176,80245,80320,80394,80468,80609,80679,80732,80810,80900,80988,81084,81174,81756,81845,82092,82373,82625,82910,83303,83780,84002,84224,84500,84727,84957,85187,85417,85647,85874,86293,86519,86944,87174,87602,87821,88104,88312,88443,88670,89096,89321,89748,89969,90394,90514,90790,91091,91415,91706,92020,92157,92288,92393,92635,92802,93006,93214,93485,93597,93709,93814,93931,94145,94291,94431,94517,94865,94953,95199,95617,95866,95948,96046,96663,96763,97015,97439,97694,97788,97877,98114,100166,100408,100510,100763,102947,113668,115184,126004,127532,129289,129915,130335,131396,132661,132917,133153,133700,134194,134799,134997,135577,136141,136516,136634,137172,137329,137525,137798,138054,138224,138365,138429,138711,138997,139673,139937,140275,140628,140722,140908,141214,141476,141601,141728,141967,142178,142297,142490,142667,143122,143303,143425,143684,143797,143984,144086,144193,144322,144597,145105,145601,146478,146772,147342,147491,148223,148395,148731,148823,149101,153445,157932,157994,158624,159238,159329,159442,159671,159831,159983,160154,160320,160489,160656,160819,161062,161232,161405,161576,161850,162049,162254,162584,162668,162764,162860,162958,163058,163160,163262,163364,163466,163568,163668,163764,163876,164005,164128,164259,164390,164488,164602,164696,164836,164970,165066,165178,165278,165394,165490,165602,165702,165842,165978,166142,166272,166430,166580,166721,166865,167000,167112,167262,167390,167518,167654,167786,167916,168046,168158,168298,168444,168588,168726,168792,168882,168958,169062,169152,169254,169362,169470,169570,169650,169742,169840,169950,170028,170134,170226,170330,170440,170562,170725,170882,170962,171062,171152,171262,171356,171462,171554,171654,171766,171880,171996,172112,172206,172320,172432,172534,172654,172776,172858,172962,173082,173208,173306,173400,173488,173600,173716,173838,173950,174125,174241,174327,174419,174531,174655,174722,174848,174916,175044,175188,175316,175385,175480,175595,175708,175807,175916,176027,176138,176239,176344,176444,176574,176665,176788,176882,176994,177080,177184,177280,177368,177486,177590,177694,177820,177908,178016,178116,178206,178316,178400,178502,178586,178640,178704,178810,178920,179004,4638,9782,9900,10015,10147,10862,11554,12071,13718,14103,14700,16299,17832,18220,20527,40045,40305,41697,42730,44743,45005,45361,46191,52973,54107,54401,54624,54951,57001,57649,59282,59552,63403,64004,67813,69028,70437", - "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1460,1461,1465,1469,1473,1478,1484,1491,1495,1499,1504,1508,1512,1516,1520,1524,1528,1534,1538,1544,1548,1554,1558,1563,1567,1570,1574,1580,1584,1590,1594,1600,1603,1607,1611,1615,1619,1623,1624,1625,1626,1629,1632,1635,1638,1642,1643,1644,1645,1646,1649,1651,1653,1655,1660,1661,1665,1671,1675,1676,1678,1689,1690,1694,1700,1704,1705,1706,1710,1737,1741,1742,1746,1774,1942,1968,2137,2163,2194,2202,2208,2222,2244,2249,2254,2264,2273,2282,2286,2293,2301,2308,2309,2318,2321,2324,2328,2332,2336,2339,2340,2344,2348,2358,2363,2370,2376,2377,2380,2384,2389,2391,2393,2396,2399,2401,2405,2408,2415,2418,2421,2425,2427,2431,2433,2435,2437,2441,2449,2457,2469,2475,2484,2487,2498,2501,2506,2507,2512,2570,2629,2630,2640,2649,2650,2652,2656,2659,2662,2665,2668,2671,2674,2677,2681,2684,2687,2690,2694,2697,2701,2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2727,2729,2730,2731,2732,2733,2734,2735,2736,2738,2739,2741,2742,2744,2746,2747,2749,2750,2751,2752,2753,2754,2756,2757,2758,2759,2760,2761,2763,2765,2767,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,2781,2782,2783,2784,2785,2786,2788,2792,2796,2797,2798,2799,2800,2801,2802,2803,2805,2807,2809,2811,2813,2814,2815,2816,2818,2820,2822,2823,2824,2825,2826,2827,2828,2829,2830,2831,2832,2833,2836,2837,2838,2839,2841,2843,2844,2846,2847,2849,2851,2853,2854,2855,2856,2857,2858,2859,2860,2861,2862,2863,2864,2866,2867,2868,2869,2871,2872,2873,2874,2875,2877,2879,2881,2883,2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,151,154,157,160,174,185,195,222,229,240,270,297,306,343,724,729,755,773,809,815,821,844,985,1005,1011,1015,1021,1058,1070,1097,1102,1168,1183,1248,1267,1293,1302", - "endColumns": "54,44,48,40,54,58,61,80,60,74,75,76,77,84,81,75,75,76,77,105,105,78,79,56,57,73,74,64,65,59,60,71,72,66,67,58,58,58,58,58,53,53,52,53,53,53,53,73,78,72,73,70,71,71,72,56,57,72,73,73,74,71,72,69,70,59,60,68,68,69,73,75,63,76,75,76,64,68,76,74,68,67,76,65,60,96,64,68,98,70,58,57,56,58,63,70,71,71,71,71,66,67,67,58,62,63,89,90,59,65,66,65,69,63,52,112,57,62,64,64,74,72,71,48,60,60,60,61,63,63,63,64,62,59,60,65,58,59,61,70,59,67,85,86,89,86,87,81,82,89,90,51,57,44,65,63,56,56,53,56,47,48,50,33,46,48,45,31,63,61,59,56,73,69,77,53,69,84,47,45,70,77,77,71,73,73,73,79,72,68,71,76,60,62,65,63,70,62,64,63,60,60,51,72,73,68,74,73,73,140,69,52,77,89,87,95,89,12,88,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,136,130,104,12,12,12,12,12,111,111,104,116,12,12,12,12,12,87,12,12,12,81,12,12,99,12,12,12,93,88,12,12,12,101,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,117,12,12,12,12,12,12,12,63,12,12,12,12,12,12,93,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,91,12,12,12,61,12,12,90,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,83,95,95,97,99,101,101,101,101,101,99,95,111,128,122,130,130,97,113,93,12,12,95,111,99,115,95,111,99,12,135,12,129,12,12,140,12,134,111,149,127,127,12,131,129,129,111,139,12,12,12,65,89,75,103,89,101,107,107,99,79,91,97,12,77,105,91,103,109,12,12,12,79,99,89,109,93,105,91,12,12,12,12,12,93,113,111,12,12,12,81,103,119,125,97,93,87,111,115,121,111,12,115,85,91,12,12,66,12,67,12,12,12,68,94,114,112,98,108,110,110,100,104,99,12,90,122,93,12,85,103,95,87,12,12,12,12,87,107,99,89,109,83,101,83,53,63,105,109,83,119,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24", - "endOffsets": "155,200,249,290,345,404,466,547,608,683,759,836,914,999,1081,1157,1233,1310,1388,1494,1600,1679,1759,1816,1874,1948,2023,2088,2154,2214,2275,2347,2420,2487,2555,2614,2673,2732,2791,2850,2904,2958,3011,3065,3119,3173,3227,3301,3380,3453,3527,3598,3670,3742,3815,3872,3930,4003,4077,4151,4226,4298,4371,4441,4512,4572,4633,70975,71044,71114,71188,71264,71328,71405,71481,71558,71623,71692,71769,71844,71913,71981,72058,72124,72185,72282,72347,72416,72515,72586,72645,72703,72760,72819,72883,72954,73026,73098,73170,73242,73309,73377,73445,73504,73567,73631,73721,73812,73872,73938,74005,74071,74141,74205,74258,74371,74429,74492,74557,74622,74697,74770,74842,74891,74952,75013,75074,75136,75200,75264,75328,75393,75456,75516,75577,75643,75702,75762,75824,75895,75955,76023,76109,76196,76286,76373,76461,76543,76626,76716,76807,76859,76917,76962,77028,77092,77149,77206,77260,77317,77365,77414,77465,77499,77546,77595,77641,77673,77737,77799,77859,77916,77990,78060,78138,78192,78262,78347,78395,78441,78512,78590,78668,78740,78814,78888,78962,79042,79115,79184,79256,79333,79394,79457,79523,79587,79658,79721,79786,79850,79911,79972,80024,80097,80171,80240,80315,80389,80463,80604,80674,80727,80805,80895,80983,81079,81169,81751,81840,82087,82368,82620,82905,83298,83775,83997,84219,84495,84722,84952,85182,85412,85642,85869,86288,86514,86939,87169,87597,87816,88099,88307,88438,88665,89091,89316,89743,89964,90389,90509,90785,91086,91410,91701,92015,92152,92283,92388,92630,92797,93001,93209,93480,93592,93704,93809,93926,94140,94286,94426,94512,94860,94948,95194,95612,95861,95943,96041,96658,96758,97010,97434,97689,97783,97872,98109,100161,100403,100505,100758,102942,113663,115179,125999,127527,129284,129910,130330,131391,132656,132912,133148,133695,134189,134794,134992,135572,136136,136511,136629,137167,137324,137520,137793,138049,138219,138360,138424,138706,138992,139668,139932,140270,140623,140717,140903,141209,141471,141596,141723,141962,142173,142292,142485,142662,143117,143298,143420,143679,143792,143979,144081,144188,144317,144592,145100,145596,146473,146767,147337,147486,148218,148390,148726,148818,149096,153440,157927,157989,158619,159233,159324,159437,159666,159826,159978,160149,160315,160484,160651,160814,161057,161227,161400,161571,161845,162044,162249,162579,162663,162759,162855,162953,163053,163155,163257,163359,163461,163563,163663,163759,163871,164000,164123,164254,164385,164483,164597,164691,164831,164965,165061,165173,165273,165389,165485,165597,165697,165837,165973,166137,166267,166425,166575,166716,166860,166995,167107,167257,167385,167513,167649,167781,167911,168041,168153,168293,168439,168583,168721,168787,168877,168953,169057,169147,169249,169357,169465,169565,169645,169737,169835,169945,170023,170129,170221,170325,170435,170557,170720,170877,170957,171057,171147,171257,171351,171457,171549,171649,171761,171875,171991,172107,172201,172315,172427,172529,172649,172771,172853,172957,173077,173203,173301,173395,173483,173595,173711,173833,173945,174120,174236,174322,174414,174526,174650,174717,174843,174911,175039,175183,175311,175380,175475,175590,175703,175802,175911,176022,176133,176234,176339,176439,176569,176660,176783,176877,176989,177075,177179,177275,177363,177481,177585,177689,177815,177903,178011,178111,178201,178311,178395,178497,178581,178635,178699,178805,178915,178999,179119,9777,9895,10010,10142,10857,11549,12066,13713,14098,14695,16294,17827,18215,20522,40040,40300,41692,42725,44738,45000,45356,46186,52968,54102,54396,54619,54946,56996,57644,59277,59547,63398,63999,67808,69023,70432,70906" - }, - "to": { - "startLines": "29,35,37,169,170,171,172,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,391,392,401,402,403,404,405,406,407,474,475,476,477,478,479,480,481,484,485,486,487,489,496,497,503,518,520,521,524,525,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,589,592,593,594,595,596,613,621,622,626,630,641,646,652,659,663,667,672,676,680,684,688,692,696,702,706,712,716,722,726,731,735,738,742,748,752,758,762,768,771,775,779,783,787,791,792,793,794,797,800,803,806,810,811,812,813,814,817,819,821,823,828,829,833,839,843,844,846,857,858,862,868,872,926,927,931,958,962,963,967,1217,1385,1411,1580,1606,1637,1645,1651,1665,1687,1692,1697,1707,1716,1725,1729,1736,1744,1751,1752,1761,1764,1767,1771,1775,1779,1782,1783,1787,1791,1801,1806,1813,1819,1820,1823,1827,1832,1834,1836,1839,1842,1844,1848,1851,1858,1861,1864,1868,1870,1874,1876,1878,1880,1884,1892,1900,1912,1918,1927,1930,1941,1944,1949,1950,2045,2103,2166,2167,2177,2186,2187,2189,2193,2196,2199,2202,2205,2208,2211,2214,2218,2221,2224,2227,2231,2234,2238,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2267,2269,2270,2271,2272,2273,2274,2275,2276,2278,2279,2281,2282,2284,2286,2287,2289,2290,2291,2292,2293,2294,2296,2297,2298,2299,2300,2450,2452,2454,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2470,2471,2472,2473,2474,2475,2477,2481,2550,2551,2552,2553,2554,2555,2556,2579,2581,2583,2585,2587,2589,2590,2591,2592,2594,2596,2598,2599,2600,2601,2602,2603,2604,2605,2606,2607,2608,2609,2612,2613,2614,2615,2617,2619,2620,2622,2623,2625,2627,2629,2630,2631,2632,2633,2634,2635,2636,2637,2638,2639,2640,2642,2643,2644,2645,2647,2648,2649,2650,2651,2653,2655,2657,2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2952,3035,3038,3041,3044,3058,3069,3079,3106,3113,3145,3175,3202,3211,3248,3649,3742,3871,4020,4056,4062,4076,4099,4240,4261,4267,4271,4307,4346,4358,4385,4390,4480,4515,4580,4599,4625", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "1381,1608,1706,8156,8197,8252,8311,8435,8516,8577,8652,8728,8805,8883,8968,9050,9126,9202,9279,9357,9463,9569,9648,9728,9785,10999,11073,11148,11213,11279,11339,11400,11472,11545,11612,11680,11739,11798,11857,11916,11975,12029,12083,12136,12190,12244,12298,13036,13110,13189,13262,13336,13407,13479,13551,13624,13681,13739,13812,13886,13960,14035,14107,14180,14250,14321,14381,14442,14511,14580,14650,14724,14800,14864,14941,15017,15094,15159,15228,15305,15380,15449,15517,15594,15660,15721,15818,15883,15952,16051,16122,16181,16239,16296,16355,16419,16490,16562,16634,16706,16778,16845,16913,16981,17040,17103,17167,17257,17348,17408,17474,17541,17607,17677,17741,17794,17907,17965,18028,18093,18158,18233,18306,18378,18427,18488,18549,18610,18672,18736,18800,18864,18929,18992,19052,19113,19179,19238,19298,19360,19431,19491,23021,23107,23599,23689,23776,23864,23946,24029,24119,28261,28313,28371,28416,28482,28546,28603,28660,28862,28919,28967,29016,29107,29440,29487,29771,30498,30578,30642,30832,30892,31513,31587,31657,31735,31789,31859,31944,31992,32038,32109,32187,32265,32337,32411,32485,32559,32639,32712,32781,32853,32930,32991,33054,33120,33184,33255,33318,33383,33447,33508,33569,33621,33694,33768,33837,33912,33986,34060,34201,36162,36347,36425,36515,36603,36699,37705,38287,38376,38623,38904,39570,39855,40248,40725,40947,41169,41445,41672,41902,42132,42362,42592,42819,43238,43464,43889,44119,44547,44766,45049,45257,45388,45615,46041,46266,46693,46914,47339,47459,47735,48036,48360,48651,48965,49102,49233,49338,49580,49747,49951,50159,50430,50542,50654,50759,50876,51090,51236,51376,51462,51810,51898,52144,52562,52811,52893,52991,53608,53708,53960,54384,54639,58466,58555,58792,60844,61086,61188,61441,79822,90543,92059,102879,104407,106164,106790,107210,108271,109536,109792,110028,110575,111069,111674,111872,112452,113016,113391,113509,114047,114204,114400,114673,114929,115099,115240,115304,115586,115872,116548,116812,117150,117503,117597,117783,118089,118351,118476,118603,118842,119053,119172,119365,119542,119997,120178,120300,120559,120672,120859,120961,121068,121197,121472,121980,122476,123353,123647,124217,124366,125098,125270,125606,125698,130403,134747,139578,139640,140270,140884,140975,141088,141317,141477,141629,141800,141966,142135,142302,142465,142708,142878,143051,143222,143496,143695,143900,144356,144440,144536,144632,144730,144830,144932,145034,145136,145238,145340,145440,145536,145648,145777,145900,146031,146162,146260,146374,146468,146608,146742,146838,146950,147050,147166,147262,147374,147474,147614,147750,147914,148044,148202,148352,148493,148637,148772,148884,149034,149162,149290,149426,149558,149688,149818,149930,158274,158420,158564,158702,158768,158858,158934,159038,159128,159230,159338,159446,159546,159626,159718,159816,159926,160004,160110,160202,160306,160416,160538,160701,165186,165266,165366,165456,165566,165660,165766,167464,167564,167676,167790,167906,168022,168116,168230,168342,168444,168564,168686,168768,168872,168992,169118,169216,169310,169398,169510,169626,169748,169860,170035,170151,170237,170329,170441,170565,170632,170758,170826,170954,171098,171226,171295,171390,171505,171618,171717,171826,171937,172048,172149,172254,172354,172484,172575,172698,172792,172904,172990,173094,173190,173278,173396,173500,173604,173730,173818,173926,174026,174116,174226,174310,174412,174496,174550,174614,174720,174830,174914,192002,197146,197264,197379,197511,198226,198918,199435,201082,201467,203115,204714,206247,206635,208942,229894,236381,249695,259141,261154,261416,263746,264576,271358,273059,273353,273576,275645,278030,278678,280311,280581,286361,289010,292819,294034,295443", - "endLines": "29,35,37,169,170,171,172,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,391,392,401,402,403,404,405,406,407,474,475,476,477,478,479,480,481,484,485,486,487,489,496,497,503,518,520,521,524,525,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,589,592,593,594,595,596,620,621,625,629,633,645,651,658,662,666,671,675,679,683,687,691,695,701,705,711,715,721,725,730,734,737,741,747,751,757,761,767,770,774,778,782,786,790,791,792,793,796,799,802,805,809,810,811,812,813,816,818,820,822,827,828,832,838,842,843,845,856,857,861,867,871,872,926,930,957,961,962,966,994,1384,1410,1579,1605,1636,1644,1650,1664,1686,1691,1696,1706,1715,1724,1728,1735,1743,1750,1751,1760,1763,1766,1770,1774,1778,1781,1782,1786,1790,1800,1805,1812,1818,1819,1822,1826,1831,1833,1835,1838,1841,1843,1847,1850,1857,1860,1863,1867,1869,1873,1875,1877,1879,1883,1891,1899,1911,1917,1926,1929,1940,1943,1948,1949,1954,2102,2161,2166,2176,2185,2186,2188,2192,2195,2198,2201,2204,2207,2210,2213,2217,2220,2223,2226,2230,2233,2237,2241,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2266,2268,2269,2270,2271,2272,2273,2274,2275,2277,2278,2280,2281,2283,2285,2286,2288,2289,2290,2291,2292,2293,2295,2296,2297,2298,2299,2300,2451,2453,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2469,2470,2471,2472,2473,2474,2476,2480,2484,2550,2551,2552,2553,2554,2555,2556,2580,2582,2584,2586,2588,2589,2590,2591,2593,2595,2597,2598,2599,2600,2601,2602,2603,2604,2605,2606,2607,2608,2611,2612,2613,2614,2616,2618,2619,2621,2622,2624,2626,2628,2629,2630,2631,2632,2633,2634,2635,2636,2637,2638,2639,2641,2642,2643,2644,2646,2647,2648,2649,2650,2652,2654,2656,2658,2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,3034,3037,3040,3043,3057,3068,3078,3105,3112,3123,3174,3201,3210,3247,3628,3653,3767,3888,4055,4061,4067,4098,4239,4259,4266,4270,4276,4343,4357,4384,4389,4455,4494,4579,4598,4624,4633", - "endColumns": "54,44,48,40,54,58,61,80,60,74,75,76,77,84,81,75,75,76,77,105,105,78,79,56,57,73,74,64,65,59,60,71,72,66,67,58,58,58,58,58,53,53,52,53,53,53,53,73,78,72,73,70,71,71,72,56,57,72,73,73,74,71,72,69,70,59,60,68,68,69,73,75,63,76,75,76,64,68,76,74,68,67,76,65,60,96,64,68,98,70,58,57,56,58,63,70,71,71,71,71,66,67,67,58,62,63,89,90,59,65,66,65,69,63,52,112,57,62,64,64,74,72,71,48,60,60,60,61,63,63,63,64,62,59,60,65,58,59,61,70,59,67,85,86,89,86,87,81,82,89,90,51,57,44,65,63,56,56,53,56,47,48,50,33,46,48,45,31,63,61,59,56,73,69,77,53,69,84,47,45,70,77,77,71,73,73,73,79,72,68,71,76,60,62,65,63,70,62,64,63,60,60,51,72,73,68,74,73,73,140,69,52,77,89,87,95,89,12,88,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,136,130,104,12,12,12,12,12,111,111,104,116,12,12,12,12,12,87,12,12,12,81,12,12,99,12,12,12,93,88,12,12,12,101,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,117,12,12,12,12,12,12,12,63,12,12,12,12,12,12,93,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,91,12,12,12,61,12,12,90,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,83,95,95,97,99,101,101,101,101,101,99,95,111,128,122,130,130,97,113,93,12,12,95,111,99,115,95,111,99,12,135,12,129,12,12,140,12,134,111,149,127,127,12,131,129,129,111,139,12,12,12,65,89,75,103,89,101,107,107,99,79,91,97,12,77,105,91,103,109,12,12,12,79,99,89,109,93,105,91,12,12,12,12,12,93,113,111,12,12,12,81,103,119,125,97,93,87,111,115,121,111,12,115,85,91,12,12,66,12,67,12,12,12,68,94,114,112,98,108,110,110,100,104,99,12,90,122,93,12,85,103,95,87,12,12,12,12,87,107,99,89,109,83,101,83,53,63,105,109,83,119,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24", - "endOffsets": "1431,1648,1750,8192,8247,8306,8368,8511,8572,8647,8723,8800,8878,8963,9045,9121,9197,9274,9352,9458,9564,9643,9723,9780,9838,11068,11143,11208,11274,11334,11395,11467,11540,11607,11675,11734,11793,11852,11911,11970,12024,12078,12131,12185,12239,12293,12347,13105,13184,13257,13331,13402,13474,13546,13619,13676,13734,13807,13881,13955,14030,14102,14175,14245,14316,14376,14437,14506,14575,14645,14719,14795,14859,14936,15012,15089,15154,15223,15300,15375,15444,15512,15589,15655,15716,15813,15878,15947,16046,16117,16176,16234,16291,16350,16414,16485,16557,16629,16701,16773,16840,16908,16976,17035,17098,17162,17252,17343,17403,17469,17536,17602,17672,17736,17789,17902,17960,18023,18088,18153,18228,18301,18373,18422,18483,18544,18605,18667,18731,18795,18859,18924,18987,19047,19108,19174,19233,19293,19355,19426,19486,19554,23102,23189,23684,23771,23859,23941,24024,24114,24205,28308,28366,28411,28477,28541,28598,28655,28709,28914,28962,29011,29062,29136,29482,29531,29812,30525,30637,30699,30887,30944,31582,31652,31730,31784,31854,31939,31987,32033,32104,32182,32260,32332,32406,32480,32554,32634,32707,32776,32848,32925,32986,33049,33115,33179,33250,33313,33378,33442,33503,33564,33616,33689,33763,33832,33907,33981,34055,34196,34266,36210,36420,36510,36598,36694,36784,38282,38371,38618,38899,39151,39850,40243,40720,40942,41164,41440,41667,41897,42127,42357,42587,42814,43233,43459,43884,44114,44542,44761,45044,45252,45383,45610,46036,46261,46688,46909,47334,47454,47730,48031,48355,48646,48960,49097,49228,49333,49575,49742,49946,50154,50425,50537,50649,50754,50871,51085,51231,51371,51457,51805,51893,52139,52557,52806,52888,52986,53603,53703,53955,54379,54634,54728,58550,58787,60839,61081,61183,61436,63620,90538,92054,102874,104402,106159,106785,107205,108266,109531,109787,110023,110570,111064,111669,111867,112447,113011,113386,113504,114042,114199,114395,114668,114924,115094,115235,115299,115581,115867,116543,116807,117145,117498,117592,117778,118084,118346,118471,118598,118837,119048,119167,119360,119537,119992,120173,120295,120554,120667,120854,120956,121063,121192,121467,121975,122471,123348,123642,124212,124361,125093,125265,125601,125693,125971,134742,139229,139635,140265,140879,140970,141083,141312,141472,141624,141795,141961,142130,142297,142460,142703,142873,143046,143217,143491,143690,143895,144225,144435,144531,144627,144725,144825,144927,145029,145131,145233,145335,145435,145531,145643,145772,145895,146026,146157,146255,146369,146463,146603,146737,146833,146945,147045,147161,147257,147369,147469,147609,147745,147909,148039,148197,148347,148488,148632,148767,148879,149029,149157,149285,149421,149553,149683,149813,149925,150065,158415,158559,158697,158763,158853,158929,159033,159123,159225,159333,159441,159541,159621,159713,159811,159921,159999,160105,160197,160301,160411,160533,160696,160853,165261,165361,165451,165561,165655,165761,165853,167559,167671,167785,167901,168017,168111,168225,168337,168439,168559,168681,168763,168867,168987,169113,169211,169305,169393,169505,169621,169743,169855,170030,170146,170232,170324,170436,170560,170627,170753,170821,170949,171093,171221,171290,171385,171500,171613,171712,171821,171932,172043,172144,172249,172349,172479,172570,172693,172787,172899,172985,173089,173185,173273,173391,173495,173599,173725,173813,173921,174021,174111,174221,174305,174407,174491,174545,174609,174715,174825,174909,175029,197141,197259,197374,197506,198221,198913,199430,201077,201462,202059,204709,206242,206630,208937,228455,230149,237768,250723,261149,261411,261767,264571,271353,272487,273348,273571,273898,277690,278673,280306,280576,284427,286957,292814,294029,295438,295912" - } - }, - { - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\values\\colors.xml", - "from": { - "startLines": "4,2,3", - "startColumns": "4,4,4", - "startOffsets": "153,55,102", - "endColumns": "45,46,50", - "endOffsets": "194,97,148" - }, - "to": { - "startLines": "196,197,198", - "startColumns": "4,4,4", - "startOffsets": "10092,10138,10185", - "endColumns": "45,46,50", - "endOffsets": "10133,10180,10231" - } - }, - { - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\values\\styles.xml", - "from": { - "startLines": "3,15,10,17,24,28,20,32", - "startColumns": "4,4,4,4,4,4,4,4", - "startOffsets": "54,525,374,617,857,984,729,1112", - "endLines": "8,15,13,17,26,30,22,34", - "endColumns": "12,90,12,80,12,12,12,12", - "endOffsets": "368,611,519,693,978,1106,851,1233" - }, - "to": { - "startLines": "601,607,608,612,2036,2039,2042,2242", - "startColumns": "4,4,4,4,4,4,4,4", - "startOffsets": "37066,37385,37475,37625,130023,130149,130276,144230", - "endLines": "606,607,611,612,2038,2041,2044,2244", - "endColumns": "12,89,12,79,12,12,12,12", - "endOffsets": "37380,37470,37620,37700,130144,130271,130398,144351" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\recyclerview-v7-28.0.0.aar\\d6e16f2b4f256229a87f783389106887\\res\\values\\values.xml", - "from": { - "startLines": "30,31,32,33,34,35,36,2", - "startColumns": "4,4,4,4,4,4,4,4", - "startOffsets": "1535,1594,1642,1698,1773,1849,1921,55", - "endLines": "30,31,32,33,34,35,36,29", - "endColumns": "58,47,55,74,75,71,65,24", - "endOffsets": "1589,1637,1693,1768,1844,1916,1982,1530" - }, - "to": { - "startLines": "394,395,396,408,409,410,490,4277", - "startColumns": "4,4,4,4,4,4,4,4", - "startOffsets": "23236,23295,23343,24210,24285,24361,29141,273903", - "endLines": "394,395,396,408,409,410,490,4304", - "endColumns": "58,47,55,74,75,71,65,24", - "endOffsets": "23290,23338,23394,24280,24356,24428,29202,275378" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\transition-28.0.0.aar\\83dbb9ccdea7ebbe8e380df93f21d851\\res\\values\\values.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11", - "startColumns": "4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,95,138,185,240,285,339,391,440,501", - "endColumns": "39,42,46,54,44,53,51,48,60,49", - "endOffsets": "90,133,180,235,280,334,386,435,496,546" - }, - "to": { - "startLines": "488,495,498,499,500,513,514,515,516,517", - "startColumns": "4,4,4,4,4,4,4,4,4,4", - "startOffsets": "29067,29397,29536,29583,29638,30232,30286,30338,30387,30448", - "endColumns": "39,42,46,54,44,53,51,48,60,49", - "endOffsets": "29102,29435,29578,29633,29678,30281,30333,30382,30443,30493" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\cardview-v7-28.0.0.aar\\3b87ab57366b6cf64018eb749db2a1b4\\res\\values\\values.xml", - "from": { - "startLines": "2,3,4,5,6,35,36,37,38,45,47,50,7", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,107,168,230,292,2179,2238,2295,2349,2763,2827,2953,356", - "endLines": "2,3,4,5,6,35,36,37,44,46,49,52,34", - "endColumns": "51,60,61,61,63,58,56,53,12,12,12,12,24", - "endOffsets": "102,163,225,287,351,2233,2290,2344,2758,2822,2948,3076,2174" - }, - "to": { - "startLines": "19,192,193,194,195,337,338,339,634,2028,2030,2033,3654", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "853,9843,9904,9966,10028,19559,19618,19675,39156,129705,129769,129895,230154", - "endLines": "19,192,193,194,195,337,338,339,640,2029,2032,2035,3681", - "endColumns": "51,60,61,61,63,58,56,53,12,12,12,12,24", - "endOffsets": "900,9899,9961,10023,10087,19613,19670,19724,39565,129764,129890,130018,231972" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\coordinatorlayout-28.0.0.aar\\c4bd9e34079f8fa4e6d0c7db3f4a75c4\\res\\values\\values.xml", - "from": { - "startLines": "2,102,3,13", - "startColumns": "4,4,4,4", - "startOffsets": "55,5935,116,724", - "endLines": "2,104,12,101", - "endColumns": "60,12,24,24", - "endOffsets": "111,6075,719,5930" - }, - "to": { - "startLines": "28,2949,3771,3781", - "startColumns": "4,4,4,4", - "startOffsets": "1320,191857,243745,244353", - "endLines": "28,2951,3780,3869", - "endColumns": "60,12,24,24", - "endOffsets": "1376,191997,244348,249559" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\values\\values.xml", - "from": { - "startLines": "2,3,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,171,172,176,177,178,6,13,56,88,125", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,124,7725,7795,7863,7935,8005,8066,8140,8213,8274,8335,8397,8461,8523,8584,8652,8752,8812,8878,8951,9020,9077,9129,9191,9263,9339,9374,9409,9459,9520,9577,9611,9646,9681,9751,9822,9939,10140,10250,10451,10580,10652,319,617,3523,5588,7348", - "endLines": "2,3,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,170,171,175,176,177,178,12,55,87,124,131", - "endColumns": "68,62,69,67,71,69,60,73,72,60,60,61,63,61,60,67,99,59,65,72,68,56,51,61,71,75,34,34,49,60,56,33,34,34,69,70,116,12,109,12,128,71,66,24,24,24,24,24", - "endOffsets": "119,182,7790,7858,7930,8000,8061,8135,8208,8269,8330,8392,8456,8518,8579,8647,8747,8807,8873,8946,9015,9072,9124,9186,9258,9334,9369,9404,9454,9515,9572,9606,9641,9676,9746,9817,9934,10135,10245,10446,10575,10647,10714,612,3518,5583,7343,7720" - }, - "to": { - "startLines": "240,241,340,341,342,343,344,345,346,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,482,483,491,492,504,505,506,507,508,512,534,590,2301,2302,2306,2307,2311,2673,2674,3735,3899,3942,3975,4012", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "12904,12973,19729,19799,19867,19939,20009,20070,20144,27283,27344,27405,27467,27531,27593,27654,27722,27822,27882,27948,28021,28090,28147,28199,28714,28786,29207,29242,29817,29867,29928,29985,30019,30197,31443,36215,150070,150187,150388,150498,150699,175034,175106,236083,251723,254629,256896,258656", - "endLines": "240,241,340,341,342,343,344,345,346,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,482,483,491,492,504,505,506,507,508,512,534,590,2301,2305,2306,2310,2311,2673,2674,3741,3941,3973,4011,4018", - "endColumns": "68,62,69,67,71,69,60,73,72,60,60,61,63,61,60,67,99,59,65,72,68,56,51,61,71,75,34,34,49,60,56,33,34,34,69,70,116,12,109,12,128,71,66,24,24,24,24,24", - "endOffsets": "12968,13031,19794,19862,19934,20004,20065,20139,20212,27339,27400,27462,27526,27588,27649,27717,27817,27877,27943,28016,28085,28142,28194,28256,28781,28857,29237,29272,29862,29923,29980,30014,30049,30227,31508,36281,150182,150383,150493,150694,150823,175101,175168,236376,254624,256689,258651,259028" - } - }, - { - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\values\\values.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,345,346,347,352,353,357,363,367,368,369,370,381,382,383,387,393,397,398,399,400,430,450,496,526,546,566,612,616,620,634,675,683,693,694,695,696,697,700,701,704,707,708,711,715,720,728,736,745,753,757,765,773,781,789,797,806,815,823,832,835,837,842,844,849,853,857,858,863,864,865,866,867,868,870,871,876,877,878,879,880,881,882,884,888,892,896,900,901,902,903,904,905,906,907,908,911,915,918,922,930,937,946,950,965,973,976,985,990,1001,1009,1012,1021,1028,1029,1048,1051,1057,1060,1069,1072,1075,1078,1081,1084,1088,1091,1100,1103,1111,1116,1124,1129,1133,1134,1145,1152,1156,1160,1161,1165,1173,1177,1182,1187,55,56,57,76,82,92,96,97,98,141,149,150,158,159,160,161,167,168,169,170,171,172,173,174,175,198,217", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "100,156,216,277,332,385,443,491,540,585,638,696,756,814,860,920,973,1019,1069,1116,1174,1232,1291,1351,1413,1475,1537,1599,1661,1723,1784,1846,1908,1961,2023,2097,2160,2228,2309,2373,2439,2509,2579,2649,2719,2786,2849,2914,2980,3033,3109,3175,3262,18372,18426,18505,18583,18656,18721,18784,18850,18921,18992,19054,19123,19189,19256,19323,19379,19430,19483,19535,19589,19660,19723,19782,19844,19903,19976,20043,20103,20166,20241,20313,20384,20440,20511,20568,20625,20691,20755,20826,20883,20936,20999,21051,21109,21176,21242,21308,21389,21464,21520,21573,21634,21692,21742,21791,21840,21889,21951,22003,22048,22129,22183,22236,22290,22341,22390,22441,22502,22563,22625,22675,22716,22766,22814,22876,22927,22976,23045,23106,23162,23233,23298,23367,23418,23481,23551,23620,23690,23752,23822,23892,23967,24026,24084,24146,24191,24234,24281,24326,24377,24425,24491,24553,24616,24688,24745,24802,24862,24920,24990,25047,25192,25313,25417,25504,25656,25808,25956,26037,26115,26416,26582,26737,26839,27116,27209,27316,27659,27766,27995,28404,28636,28736,28841,28960,29583,29730,29849,30084,30499,30737,30849,30970,31103,33241,34757,38048,40182,41710,43254,46541,46787,47046,47850,49610,50060,50775,50848,50935,51020,51119,51314,51406,51579,51741,51836,52005,52248,52541,52950,53364,53824,54242,54483,54913,55348,55758,56180,56590,57047,57501,57917,58383,58565,58633,58977,59057,59413,59563,59707,59791,60156,60254,60362,60460,60570,60686,60812,60908,61285,61395,61519,61657,61767,61889,62017,62155,62317,62533,62689,62893,62977,63081,63175,63289,63401,63525,63621,63701,63890,64096,64289,64499,64931,65352,65777,65974,66922,67443,67566,68203,68424,69239,69708,69891,70487,70947,71052,72313,72463,72880,73045,73725,73884,74046,74201,74397,74564,74786,74946,75323,75482,75810,76027,76602,76952,77201,77298,78004,78442,78683,78872,79006,79197,79834,80084,80387,80602,3338,3636,3892,4389,4823,5480,5823,7362,7710,9607,9929,10060,10766,10903,11055,11257,11962,12082,13231,13798,13927,14060,14220,14395,14537,16324,18162", - "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,344,345,346,351,352,356,362,366,367,368,369,380,381,382,386,392,396,397,398,399,429,449,495,525,545,565,611,615,619,633,674,682,692,693,694,695,696,699,700,703,706,707,710,714,719,727,735,744,752,756,764,772,780,788,796,805,814,822,831,834,836,841,843,848,852,856,857,862,863,864,865,866,867,869,870,875,876,877,878,879,880,881,883,887,891,895,899,900,901,902,903,904,905,906,907,910,914,917,921,929,936,945,949,964,972,975,984,989,1000,1008,1011,1020,1027,1028,1047,1050,1056,1059,1068,1071,1074,1077,1080,1083,1087,1090,1099,1102,1110,1115,1123,1128,1132,1133,1144,1151,1155,1159,1160,1164,1172,1176,1181,1186,1195,55,56,75,81,91,95,96,97,140,148,149,157,158,159,160,166,167,168,169,170,171,172,173,174,197,216,217", - "endColumns": "55,59,60,54,52,57,47,48,44,52,57,59,57,45,59,52,45,49,46,57,57,58,59,61,61,61,61,61,61,60,61,61,52,61,73,62,67,80,63,65,69,69,69,69,66,62,64,65,52,75,65,86,75,53,78,77,72,64,62,65,70,70,61,68,65,66,66,55,50,52,51,53,70,62,58,61,58,72,66,59,62,74,71,70,55,70,56,56,65,63,70,56,52,62,51,57,66,65,65,80,74,55,52,60,57,49,48,48,48,61,51,44,80,53,52,53,50,48,50,60,60,61,49,40,49,47,61,50,48,68,60,55,70,64,68,50,62,69,68,69,61,69,69,74,58,57,61,44,42,46,44,50,47,65,61,62,71,56,56,59,57,69,56,144,120,103,86,151,151,147,80,77,300,165,154,101,10,92,106,10,106,10,10,10,99,104,118,10,146,118,10,10,10,111,120,132,10,10,10,10,10,10,10,10,10,10,10,10,10,72,86,84,98,10,91,10,10,94,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,83,10,97,107,97,109,115,10,95,10,109,123,137,109,121,127,10,10,10,10,10,83,103,93,113,111,123,95,79,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,104,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,96,10,10,10,10,133,10,10,10,10,10,10,297,255,90,243,367,188,1538,347,95,94,130,412,136,151,201,220,119,1148,566,128,132,159,174,141,125,457,209", - "endOffsets": "151,211,272,327,380,438,486,535,580,633,691,751,809,855,915,968,1014,1064,1111,1169,1227,1286,1346,1408,1470,1532,1594,1656,1718,1779,1841,1903,1956,2018,2092,2155,2223,2304,2368,2434,2504,2574,2644,2714,2781,2844,2909,2975,3028,3104,3170,3257,3333,18421,18500,18578,18651,18716,18779,18845,18916,18987,19049,19118,19184,19251,19318,19374,19425,19478,19530,19584,19655,19718,19777,19839,19898,19971,20038,20098,20161,20236,20308,20379,20435,20506,20563,20620,20686,20750,20821,20878,20931,20994,21046,21104,21171,21237,21303,21384,21459,21515,21568,21629,21687,21737,21786,21835,21884,21946,21998,22043,22124,22178,22231,22285,22336,22385,22436,22497,22558,22620,22670,22711,22761,22809,22871,22922,22971,23040,23101,23157,23228,23293,23362,23413,23476,23546,23615,23685,23747,23817,23887,23962,24021,24079,24141,24186,24229,24276,24321,24372,24420,24486,24548,24611,24683,24740,24797,24857,24915,24985,25042,25187,25308,25412,25499,25651,25803,25951,26032,26110,26411,26577,26732,26834,27111,27204,27311,27654,27761,27990,28399,28631,28731,28836,28955,29578,29725,29844,30079,30494,30732,30844,30965,31098,33236,34752,38043,40177,41705,43249,46536,46782,47041,47845,49605,50055,50770,50843,50930,51015,51114,51309,51401,51574,51736,51831,52000,52243,52536,52945,53359,53819,54237,54478,54908,55343,55753,56175,56585,57042,57496,57912,58378,58560,58628,58972,59052,59408,59558,59702,59786,60151,60249,60357,60455,60565,60681,60807,60903,61280,61390,61514,61652,61762,61884,62012,62150,62312,62528,62684,62888,62972,63076,63170,63284,63396,63520,63616,63696,63885,64091,64284,64494,64926,65347,65772,65969,66917,67438,67561,68198,68419,69234,69703,69886,70482,70942,71047,72308,72458,72875,73040,73720,73879,74041,74196,74392,74559,74781,74941,75318,75477,75805,76022,76597,76947,77196,77293,77999,78437,78678,78867,79001,79192,79829,80079,80382,80597,81178,3631,3887,4384,4818,5475,5818,7357,7705,9602,9924,10055,10761,10898,11050,11252,11957,12077,13226,13793,13922,14055,14215,14390,14532,16319,18157,18367" - }, - "to": { - "startLines": "15,16,17,18,21,22,23,24,34,36,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,173,199,200,201,202,203,204,205,206,207,208,209,232,233,234,235,236,237,238,239,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,493,494,501,502,509,510,511,519,522,523,526,527,528,529,530,531,532,533,576,577,578,579,580,581,582,583,584,585,586,587,588,597,873,874,875,880,881,885,891,895,896,897,898,909,910,911,915,921,925,995,996,997,1027,1047,1093,1123,1143,1163,1209,1213,1955,1969,2010,2018,2162,2163,2164,2165,2312,2315,2316,2319,2322,2323,2326,2330,2335,2343,2351,2360,2368,2372,2380,2388,2396,2404,2412,2421,2430,2438,2447,2485,2487,2492,2494,2499,2503,2507,2508,2513,2514,2515,2516,2517,2518,2520,2521,2526,2527,2528,2529,2530,2531,2532,2534,2538,2542,2546,2557,2558,2559,2560,2561,2562,2563,2564,2565,2568,2572,2575,2675,2683,2690,2699,2703,2718,2726,2729,2738,2743,2754,2762,2765,2774,2781,2782,2801,2804,2810,2813,2822,2825,2828,2831,2834,2837,2841,2844,2853,2856,2864,2869,2877,2882,2886,2887,2898,2905,2909,2913,2914,2918,2926,2930,2935,2940,3124,3125,3126,3629,3635,3645,3682,3683,3684,3727,3870,3889,3897,3898,3974,4068,4074,4075,4260,4305,4306,4344,4345,4456,4457,4495,4514", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "621,677,737,798,953,1006,1064,1112,1563,1653,6833,6891,6951,7009,7055,7115,7168,7214,7264,7311,7369,7427,7486,7546,7608,7670,7732,7794,7856,7918,7979,8041,8103,8373,10236,10310,10373,10441,10522,10586,10652,10722,10792,10862,10932,12352,12415,12480,12546,12599,12675,12741,12828,20217,20271,20350,20428,20501,20566,20629,20695,20766,20837,20899,20968,21034,21101,21168,21224,21275,21328,21380,21434,21505,21568,21627,21689,21748,21821,21888,21948,22011,22086,22158,22229,22285,22356,22413,22470,22536,22600,22671,22728,22781,22844,22896,22954,24433,24499,24565,24646,24721,24777,24830,24891,24949,24999,25048,25097,25146,25208,25260,25305,25386,25440,25493,25547,25598,25647,25698,25759,25820,25882,25932,25973,26023,26071,26133,26184,26233,26302,26363,26419,26490,26555,26624,26675,26738,26808,26877,26947,27009,27079,27149,27224,29277,29335,29683,29728,30054,30101,30146,30530,30704,30770,30949,31012,31084,31141,31198,31258,31316,31386,34370,34515,34636,34740,34827,34979,35131,35279,35360,35438,35739,35905,36060,36789,54733,54826,54933,55276,55383,55612,56021,56253,56353,56458,56577,57200,57347,57466,57701,58116,58354,63625,63746,63879,66017,67533,70824,72958,74486,76030,79317,79563,125976,126780,128540,128990,139234,139307,139394,139479,150828,151023,151115,151288,151450,151545,151714,151957,152250,152659,153073,153533,153951,154192,154622,155057,155467,155889,156299,156756,157210,157626,158092,160858,160926,161270,161350,161706,161856,162000,162084,162449,162547,162655,162753,162863,162979,163105,163201,163578,163688,163812,163950,164060,164182,164310,164448,164610,164826,164982,165858,165942,166046,166140,166254,166366,166490,166586,166666,166855,167061,167254,175173,175605,176026,176451,176648,177596,178117,178240,178877,179098,179913,180382,180565,181161,181621,181726,182987,183137,183554,183719,184399,184558,184720,184875,185071,185238,185460,185620,185997,186156,186484,186701,187276,187626,187875,187972,188678,189116,189357,189546,189680,189871,190508,190758,191061,191276,202064,202362,202618,228460,228894,229551,231977,233516,233864,235761,249564,250728,251434,251571,256694,261772,262477,262597,272492,275383,275512,277695,277855,284432,284574,286962,288800", - "endLines": "15,16,17,18,21,22,23,24,34,36,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,173,199,200,201,202,203,204,205,206,207,208,209,232,233,234,235,236,237,238,239,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,493,494,501,502,509,510,511,519,522,523,526,527,528,529,530,531,532,533,576,577,578,579,580,581,582,583,584,585,586,587,588,600,873,874,879,880,884,890,894,895,896,897,908,909,910,914,920,924,925,995,996,1026,1046,1092,1122,1142,1162,1208,1212,1216,1968,2009,2017,2027,2162,2163,2164,2165,2314,2315,2318,2321,2322,2325,2329,2334,2342,2350,2359,2367,2371,2379,2387,2395,2403,2411,2420,2429,2437,2446,2449,2486,2491,2493,2498,2502,2506,2507,2512,2513,2514,2515,2516,2517,2519,2520,2525,2526,2527,2528,2529,2530,2531,2533,2537,2541,2545,2549,2557,2558,2559,2560,2561,2562,2563,2564,2567,2571,2574,2578,2682,2689,2698,2702,2717,2725,2728,2737,2742,2753,2761,2764,2773,2780,2781,2800,2803,2809,2812,2821,2824,2827,2830,2833,2836,2840,2843,2852,2855,2863,2868,2876,2881,2885,2886,2897,2904,2908,2912,2913,2917,2925,2929,2934,2939,2948,3124,3125,3144,3634,3644,3648,3682,3683,3726,3734,3870,3896,3897,3898,3974,4073,4074,4075,4260,4305,4306,4344,4345,4456,4479,4513,4514", - "endColumns": "55,59,60,54,52,57,47,48,44,52,57,59,57,45,59,52,45,49,46,57,57,58,59,61,61,61,61,61,61,60,61,61,52,61,73,62,67,80,63,65,69,69,69,69,66,62,64,65,52,75,65,86,75,53,78,77,72,64,62,65,70,70,61,68,65,66,66,55,50,52,51,53,70,62,58,61,58,72,66,59,62,74,71,70,55,70,56,56,65,63,70,56,52,62,51,57,66,65,65,80,74,55,52,60,57,49,48,48,48,61,51,44,80,53,52,53,50,48,50,60,60,61,49,40,49,47,61,50,48,68,60,55,70,64,68,50,62,69,68,69,61,69,69,74,58,57,61,44,42,46,44,50,47,65,61,62,71,56,56,59,57,69,56,144,120,103,86,151,151,147,80,77,300,165,154,101,10,92,106,10,106,10,10,10,99,104,118,10,146,118,10,10,10,111,120,132,10,10,10,10,10,10,10,10,10,10,10,10,10,72,86,84,98,10,91,10,10,94,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,83,10,97,107,97,109,115,10,95,10,109,123,137,109,121,127,10,10,10,10,10,83,103,93,113,111,123,95,79,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,104,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,96,10,10,10,10,133,10,10,10,10,10,10,297,255,90,243,367,188,1538,347,95,94,130,412,136,151,201,220,119,1148,566,128,132,159,174,141,125,457,209", - "endOffsets": "672,732,793,848,1001,1059,1107,1156,1603,1701,6886,6946,7004,7050,7110,7163,7209,7259,7306,7364,7422,7481,7541,7603,7665,7727,7789,7851,7913,7974,8036,8098,8151,8430,10305,10368,10436,10517,10581,10647,10717,10787,10857,10927,10994,12410,12475,12541,12594,12670,12736,12823,12899,20266,20345,20423,20496,20561,20624,20690,20761,20832,20894,20963,21029,21096,21163,21219,21270,21323,21375,21429,21500,21563,21622,21684,21743,21816,21883,21943,22006,22081,22153,22224,22280,22351,22408,22465,22531,22595,22666,22723,22776,22839,22891,22949,23016,24494,24560,24641,24716,24772,24825,24886,24944,24994,25043,25092,25141,25203,25255,25300,25381,25435,25488,25542,25593,25642,25693,25754,25815,25877,25927,25968,26018,26066,26128,26179,26228,26297,26358,26414,26485,26550,26619,26670,26733,26803,26872,26942,27004,27074,27144,27219,27278,29330,29392,29723,29766,30096,30141,30192,30573,30765,30827,31007,31079,31136,31193,31253,31311,31381,31438,34510,34631,34735,34822,34974,35126,35274,35355,35433,35734,35900,36055,36157,37061,54821,54928,55271,55378,55607,56016,56248,56348,56453,56572,57195,57342,57461,57696,58111,58349,58461,63741,63874,66012,67528,70819,72953,74481,76025,79312,79558,79817,126775,128535,128985,129700,139302,139389,139474,139573,151018,151110,151283,151445,151540,151709,151952,152245,152654,153068,153528,153946,154187,154617,155052,155462,155884,156294,156751,157205,157621,158087,158269,160921,161265,161345,161701,161851,161995,162079,162444,162542,162650,162748,162858,162974,163100,163196,163573,163683,163807,163945,164055,164177,164305,164443,164605,164821,164977,165181,165937,166041,166135,166249,166361,166485,166581,166661,166850,167056,167249,167459,175600,176021,176446,176643,177591,178112,178235,178872,179093,179908,180377,180560,181156,181616,181721,182982,183132,183549,183714,184394,184553,184715,184870,185066,185233,185455,185615,185992,186151,186479,186696,187271,187621,187870,187967,188673,189111,189352,189541,189675,189866,190503,190753,191056,191271,191852,202357,202613,203110,228889,229546,229889,233511,233859,235756,236078,249690,251429,251566,251718,256891,262472,262592,263741,273054,275507,275640,277850,278025,284569,286356,288795,289005" - } - }, - { - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\values\\strings.xml", - "from": { - "startLines": "7,2,1,3", - "startColumns": "4,4,4,4", - "startOffsets": "219,62,16,115", - "endLines": "10,2,1,3", - "endColumns": "19,52,45,60", - "endOffsets": "333,110,57,171" - }, - "to": { - "startLines": "2,574,575,591", - "startColumns": "4,4,4,4", - "startOffsets": "150,34271,34324,36286", - "endLines": "5,574,575,591", - "endColumns": "19,52,45,60", - "endOffsets": "264,34319,34365,36342" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/code/Android App/build/intermediates/blame/res/debug/single/debug.json b/code/Android App/build/intermediates/blame/res/debug/single/debug.json deleted file mode 100755 index 6ebb5ac..0000000 --- a/code/Android App/build/intermediates/blame/res/debug/single/debug.json +++ /dev/null @@ -1,1982 +0,0 @@ -[ - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_chip_text_color.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_chip_text_color.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\animator_mtrl_fab_transformation_sheet_collapse_spec.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\animator\\mtrl_fab_transformation_sheet_collapse_spec.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_notify_panel_notification_icon_bg.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-xhdpi-v4\\notify_panel_notification_icon_bg.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_ic_menu_selectall_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_ic_menu_selectall_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_btn_check_to_on_mtrl_015.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_navigation_item_separator.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_navigation_item_separator.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_action_menu_layout.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_action_menu_layout.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_design_ic_visibility.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-mdpi-v4\\design_ic_visibility.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_notification_bg_normal_pressed.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-mdpi-v4\\notification_bg_normal_pressed.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_design_ic_visibility_off.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-xhdpi-v4\\design_ic_visibility_off.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_layout_snackbar.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_layout_snackbar.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_text_input_password_icon.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_text_input_password_icon.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_ic_mtrl_chip_checked_circle.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable\\ic_mtrl_chip_checked_circle.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\mipmap-xxxhdpi_ic_launcher_round.png.flat", - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\mipmap-xxxhdpi\\ic_launcher_round.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_ic_search_api_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_ic_search_api_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout-watch-v20_abc_alert_dialog_button_bar_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout-watch-v20\\abc_alert_dialog_button_bar_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_design_tint_password_toggle.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\design_tint_password_toggle.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_ic_star_black_36dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_ic_star_black_36dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_design_ic_visibility.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-xhdpi-v4\\design_ic_visibility.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-v21_abc_btn_colored_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-v21\\abc_btn_colored_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_ic_star_black_48dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_ic_star_black_48dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_ic_menu_paste_mtrl_am_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_ic_menu_paste_mtrl_am_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_ic_arrow_drop_right_black_24dp.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_ic_arrow_drop_right_black_24dp.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_btn_stroke_color_selector.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_btn_stroke_color_selector.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\animator-v21_design_appbar_state_list_animator.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\animator-v21\\design_appbar_state_list_animator.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_navigation_menu.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_navigation_menu.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi_ic_launcher_background.png.flat", - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\generated\\res\\pngs\\debug\\drawable-xxxhdpi\\ic_launcher_background.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-v21_avd_hide_password.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-v21\\avd_hide_password.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_text_cursor_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_text_cursor_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_text_select_handle_right_mtrl_dark.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_text_select_handle_right_mtrl_dark.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_list_menu_item_checkbox.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_list_menu_item_checkbox.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_ic_menu_copy_mtrl_am_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_ic_menu_copy_mtrl_am_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_text_select_handle_right_mtrl_dark.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_text_select_handle_right_mtrl_dark.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_background_cache_hint_selector_material_light.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_background_cache_hint_selector_material_light.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_tint_switch_track.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_tint_switch_track.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_text_select_handle_middle_mtrl_dark.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_text_select_handle_middle_mtrl_dark.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_primary_text_disable_only_material_dark.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_primary_text_disable_only_material_dark.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-v21_abc_action_bar_item_background_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-v21\\abc_action_bar_item_background_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_ic_menu_paste_mtrl_am_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_ic_menu_paste_mtrl_am_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_ic_commit_search_api_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_popup_background_mtrl_mult.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_popup_background_mtrl_mult.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_design_ic_visibility.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-xxxhdpi-v4\\design_ic_visibility.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_ic_star_half_black_36dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_ic_star_half_black_36dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_textfield_search_default_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_text_select_handle_left_mtrl_dark.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_text_select_handle_left_mtrl_dark.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_notification_bg_low.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable\\notification_bg_low.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_notification_bg_low_pressed.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-xhdpi-v4\\notification_bg_low_pressed.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_ab_share_pack_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_ab_share_pack_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_scrubber_control_to_pressed_mtrl_005.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\interpolator_mtrl_fast_out_slow_in.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\interpolator\\mtrl_fast_out_slow_in.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_ic_menu_selectall_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_ic_menu_selectall_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-mdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-mdpi-v17\\abc_spinner_mtrl_am_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\mipmap-xxhdpi_ic_launcher.png.flat", - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\mipmap-xxhdpi\\ic_launcher.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_btn_switch_to_on_mtrl_00001.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_textfield_activated_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_list_selector_disabled_holo_dark.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_list_selector_disabled_holo_dark.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color-v23_abc_tint_edittext.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color-v23\\abc_tint_edittext.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_list_longpressed_holo.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_list_longpressed_holo.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_list_selector_holo_dark.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_list_selector_holo_dark.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_chip_close_icon_tint.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_chip_close_icon_tint.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_tab_indicator_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\animator_design_fab_hide_motion_spec.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\animator\\design_fab_hide_motion_spec.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_notification_bg.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable\\notification_bg.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\interpolator-v21_mtrl_fast_out_slow_in.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\interpolator-v21\\mtrl_fast_out_slow_in.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_ic_star_black_16dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_ic_star_black_16dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_list_pressed_holo_light.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_list_pressed_holo_light.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_ic_clear_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_ic_clear_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_design_snackbar_background.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable\\design_snackbar_background.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_layout_tab_icon.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_layout_tab_icon.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_textfield_default_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_text_select_handle_right_mtrl_light.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_text_select_handle_right_mtrl_light.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\mipmap-hdpi_ic_launcher_round.png.flat", - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\mipmap-hdpi\\ic_launcher_round.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_textfield_search_activated_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\interpolator-v21_mtrl_linear_out_slow_in.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\interpolator-v21\\mtrl_linear_out_slow_in.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_tabs_icon_color_selector_colored.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_tabs_icon_color_selector_colored.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_btn_check_to_on_mtrl_000.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\animator_mtrl_fab_hide_motion_spec.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\animator\\mtrl_fab_hide_motion_spec.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_alert_dialog_title_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_alert_dialog_title_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_primary_text_material_dark.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_primary_text_material_dark.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_tab_indicator_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-v21_design_bottom_navigation_item_background.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-v21\\design_bottom_navigation_item_background.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_btn_radio_to_on_mtrl_000.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_abc_slide_in_bottom.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\anim\\abc_slide_in_bottom.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_tooltip_frame_light.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\tooltip_frame_light.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\animator_mtrl_fab_transformation_sheet_expand_spec.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\animator\\mtrl_fab_transformation_sheet_expand_spec.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_ic_menu_copy_mtrl_am_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_ic_menu_copy_mtrl_am_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_notification_bg_low_normal.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-hdpi-v4\\notification_bg_low_normal.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_btn_radio_to_on_mtrl_015.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_ic_menu_selectall_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_ic_menu_selectall_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_mtrl_layout_snackbar.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\mtrl_layout_snackbar.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_btn_switch_to_on_mtrl_00001.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color-v21_abc_btn_colored_borderless_text_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color-v21\\abc_btn_colored_borderless_text_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_btn_radio_to_on_mtrl_000.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_abc_fade_in.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\anim\\abc_fade_in.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_design_ic_visibility_off.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-xxxhdpi-v4\\design_ic_visibility_off.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_list_menu_item_icon.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_list_menu_item_icon.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_ic_mtrl_chip_checked_black.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable\\ic_mtrl_chip_checked_black.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_btn_ripple_color.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_btn_ripple_color.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_bottom_navigation_item.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_bottom_navigation_item.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-v24_ic_launcher_foreground.xml.flat", - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\drawable-v24\\ic_launcher_foreground.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_hint_foreground_material_light.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_hint_foreground_material_light.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_notification_bg_normal_pressed.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-xhdpi-v4\\notification_bg_normal_pressed.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-v21_design_password_eye.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-v21\\design_password_eye.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_text_select_handle_left_mtrl_light.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_text_select_handle_left_mtrl_light.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_btn_check_to_on_mtrl_000.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_cab_background_top_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_cab_background_top_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_text_select_handle_right_mtrl_dark.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_text_select_handle_right_mtrl_dark.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_ic_voice_search_api_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_ic_voice_search_api_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_activity_chooser_view_list_item.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_activity_chooser_view_list_item.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout-v21_notification_template_icon_group.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\layout-v21\\notification_template_icon_group.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_popup_background_mtrl_mult.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_popup_background_mtrl_mult.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_notification_template_part_time.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\layout\\notification_template_part_time.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_ic_menu_paste_mtrl_am_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_ic_menu_paste_mtrl_am_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_menu_hardkey_panel_mtrl_mult.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_menu_hardkey_panel_mtrl_mult.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_bottom_nav_item_tint.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_bottom_nav_item_tint.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_select_dialog_singlechoice_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\select_dialog_singlechoice_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_seekbar_track_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_seekbar_track_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-hdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-hdpi-v17\\abc_spinner_mtrl_am_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_text_select_handle_middle_mtrl_light.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_text_select_handle_middle_mtrl_light.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color-v23_abc_tint_spinner.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color-v23\\abc_tint_spinner.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_btn_check_to_on_mtrl_000.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_popup_background_mtrl_mult.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_popup_background_mtrl_mult.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_tint_seek_thumb.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_tint_seek_thumb.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_btn_switch_to_on_mtrl_00012.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_cab_background_top_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_cab_background_top_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_switch_thumb_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_switch_thumb_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_edit_text_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_edit_text_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color-v23_abc_tint_seek_thumb.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color-v23\\abc_tint_seek_thumb.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\mipmap-mdpi_ic_launcher.png.flat", - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\mipmap-mdpi\\ic_launcher.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-xhdpi-v17_abc_ic_menu_cut_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-xhdpi-v17\\abc_ic_menu_cut_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_switch_track_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_design_snackbar_in.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\anim\\design_snackbar_in.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_ic_star_half_black_48dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_ic_star_half_black_48dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_list_divider_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_ic_menu_cut_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_ic_menu_cut_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_design_ic_visibility.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-xxhdpi-v4\\design_ic_visibility.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_scrubber_control_to_pressed_mtrl_000.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-hdpi-v17_abc_ic_menu_cut_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-hdpi-v17\\abc_ic_menu_cut_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-xxxhdpi-v17_abc_ic_menu_cut_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-xxxhdpi-v17\\abc_ic_menu_cut_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\interpolator_mtrl_linear_out_slow_in.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\interpolator\\mtrl_linear_out_slow_in.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_abc_popup_enter.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\anim\\abc_popup_enter.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_list_menu_item_radio.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_list_menu_item_radio.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_list_pressed_holo_dark.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_list_pressed_holo_dark.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_content_main.xml.flat", - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\layout\\content_main.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_select_dialog_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_select_dialog_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_btn_radio_to_on_mtrl_015.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_ic_star_half_black_48dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_ic_star_half_black_48dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color-v23_abc_btn_colored_borderless_text_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color-v23\\abc_btn_colored_borderless_text_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_notification_bg_low_normal.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-mdpi-v4\\notification_bg_low_normal.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_navigation_item.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_navigation_item.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-v21_avd_show_password.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-v21\\avd_show_password.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_tooltip.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_tooltip.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_scrubber_control_to_pressed_mtrl_000.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_ic_menu_copy_mtrl_am_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_ic_menu_copy_mtrl_am_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_design_password_eye.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable\\design_password_eye.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_list_menu_item_layout.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_list_menu_item_layout.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_btn_check_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_btn_check_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_dialog_title_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_dialog_title_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_tab_indicator_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\animator_mtrl_chip_state_list_anim.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\animator\\mtrl_chip_state_list_anim.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_notification_bg_low_pressed.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-mdpi-v4\\notification_bg_low_pressed.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi_ic_launcher_background.png.flat", - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\generated\\res\\pngs\\debug\\drawable-xxhdpi\\ic_launcher_background.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_design_fab_background.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable\\design_fab_background.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_btn_colored_borderless_text_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_btn_colored_borderless_text_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_ic_menu_paste_mtrl_am_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_ic_menu_paste_mtrl_am_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_text_select_handle_left_mtrl_light.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_text_select_handle_left_mtrl_light.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_ic_star_half_black_16dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_ic_star_half_black_16dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\mipmap-anydpi-v26_ic_launcher.xml.flat", - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\mipmap-anydpi-v26\\ic_launcher.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\mipmap-xhdpi_ic_launcher_round.png.flat", - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\mipmap-xhdpi\\ic_launcher_round.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_switch_track_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_activity_settings.xml.flat", - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\layout\\activity_settings.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_switch_track_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_notification_action_tombstone.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\layout\\notification_action_tombstone.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_ic_star_black_36dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_ic_star_black_36dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\mipmap-hdpi_ic_launcher.png.flat", - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\mipmap-hdpi\\ic_launcher.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_list_longpressed_holo.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_list_longpressed_holo.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_list_focused_holo.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_list_focused_holo.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_mtrl_tabs_default_indicator.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable\\mtrl_tabs_default_indicator.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_textfield_search_default_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_list_selector_background_transition_holo_light.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_list_selector_background_transition_holo_light.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_btn_switch_to_on_mtrl_00012.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_item_background_holo_light.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_item_background_holo_light.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_btn_check_to_on_mtrl_000.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_spinner_mtrl_am_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_btn_radio_to_on_mtrl_000.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi_ic_launcher_background.png.flat", - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\generated\\res\\pngs\\debug\\drawable-xhdpi\\ic_launcher_background.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_ratingbar_small_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_ratingbar_small_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_spinner_mtrl_am_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_btn_text_btn_ripple_color.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_btn_text_btn_ripple_color.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_textfield_search_activated_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_cab_background_internal_bg.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_cab_background_internal_bg.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_tint_default.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_tint_default.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_text_select_handle_right_mtrl_light.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_text_select_handle_right_mtrl_light.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_textfield_default_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_ic_mtrl_chip_close_circle.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable\\ic_mtrl_chip_close_circle.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color-v23_abc_tint_btn_checkable.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color-v23\\abc_tint_btn_checkable.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_bottom_nav_colored_item_tint.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_bottom_nav_colored_item_tint.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_navigation_item_subheader.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_navigation_item_subheader.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_btn_radio_to_on_mtrl_000.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_ic_commit_search_api_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_textfield_search_activated_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_list_divider_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_action_menu_item_layout.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_action_menu_item_layout.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_search_url_text.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_search_url_text.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_text_select_handle_middle_mtrl_dark.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_text_select_handle_middle_mtrl_dark.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_popup_menu_header_item_layout.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_popup_menu_header_item_layout.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_tabs_legacy_text_color_selector.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_tabs_legacy_text_color_selector.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_expanded_menu_layout.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_expanded_menu_layout.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_scrubber_control_off_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_scrubber_control_off_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_scrubber_control_to_pressed_mtrl_000.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_abc_slide_in_top.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\anim\\abc_slide_in_top.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_seekbar_thumb_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_seekbar_thumb_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_text_select_handle_left_mtrl_dark.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_text_select_handle_left_mtrl_dark.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_tab_indicator_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_scrubber_track_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_scrubber_track_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-xxxhdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-xxxhdpi-v17\\abc_spinner_mtrl_am_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_list_selector_disabled_holo_dark.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_list_selector_disabled_holo_dark.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_menu_hardkey_panel_mtrl_mult.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_menu_hardkey_panel_mtrl_mult.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_ic_ab_back_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_ic_ab_back_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_ic_star_half_black_48dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_ic_star_half_black_48dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_textfield_search_default_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_ic_star_half_black_48dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_ic_star_half_black_48dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\interpolator_mtrl_fast_out_linear_in.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\interpolator\\mtrl_fast_out_linear_in.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_ic_star_black_16dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_ic_star_black_16dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_tabs_icon_color_selector.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_tabs_icon_color_selector.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_action_mode_close_item_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_action_mode_close_item_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_btn_switch_to_on_mtrl_00012.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_notification_bg_low_normal.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-xhdpi-v4\\notification_bg_low_normal.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_list_selector_holo_light.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_list_selector_holo_light.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_search_view.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_search_view.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_mtrl_layout_snackbar_include.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\mtrl_layout_snackbar_include.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_abc_slide_out_top.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\anim\\abc_slide_out_top.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_text_select_handle_middle_mtrl_light.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_text_select_handle_middle_mtrl_light.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\animator_mtrl_fab_show_motion_spec.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\animator\\mtrl_fab_show_motion_spec.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_list_selector_disabled_holo_light.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_list_selector_disabled_holo_light.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_btn_radio_to_on_mtrl_000.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-watch-v20_abc_dialog_material_background.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-watch-v20\\abc_dialog_material_background.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_notification_bg_normal.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-xhdpi-v4\\notification_bg_normal.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_btn_check_to_on_mtrl_000.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_ic_star_half_black_36dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_ic_star_half_black_36dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_btn_default_mtrl_shape.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_btn_default_mtrl_shape.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_ic_menu_overflow_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_ic_menu_overflow_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color-v23_abc_tint_switch_track.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color-v23\\abc_tint_switch_track.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_list_selector_disabled_holo_dark.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_list_selector_disabled_holo_dark.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_text_select_handle_middle_mtrl_light.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_text_select_handle_middle_mtrl_light.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_abc_tooltip_enter.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\anim\\abc_tooltip_enter.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_text_select_handle_middle_mtrl_dark.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_text_select_handle_middle_mtrl_dark.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_list_pressed_holo_dark.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_list_pressed_holo_dark.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-v21_abc_dialog_material_background.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-v21\\abc_dialog_material_background.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_screen_toolbar.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_screen_toolbar.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout-v16_notification_template_custom_big.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\layout-v16\\notification_template_custom_big.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_ic_star_black_36dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_ic_star_black_36dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_design_bottom_sheet_slide_out.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\anim\\design_bottom_sheet_slide_out.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_list_pressed_holo_dark.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_list_pressed_holo_dark.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_popup_background_mtrl_mult.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_popup_background_mtrl_mult.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_spinner_mtrl_am_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_ic_menu_cut_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_ic_menu_cut_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_ic_star_half_black_16dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_ic_star_half_black_16dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_text_select_handle_right_mtrl_light.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_text_select_handle_right_mtrl_light.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout-v26_abc_screen_toolbar.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout-v26\\abc_screen_toolbar.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_list_pressed_holo_light.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_list_pressed_holo_light.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_tab_indicator_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_btn_check_to_on_mtrl_015.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_notification_bg_normal.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-hdpi-v4\\notification_bg_normal.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_ab_share_pack_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_ab_share_pack_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_text_select_handle_middle_mtrl_dark.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_text_select_handle_middle_mtrl_dark.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_bottom_sheet_dialog.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_bottom_sheet_dialog.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_list_selector_disabled_holo_dark.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_list_selector_disabled_holo_dark.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_dialog_material_background.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_dialog_material_background.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-anydpi-v21_ic_launcher_background.xml.flat", - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\generated\\res\\pngs\\debug\\drawable-anydpi-v21\\ic_launcher_background.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_btn_check_to_on_mtrl_015.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_design_snackbar_out.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\anim\\design_snackbar_out.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_ic_menu_copy_mtrl_am_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_ic_menu_copy_mtrl_am_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_cab_background_top_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_cab_background_top_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_content_settings.xml.flat", - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\layout\\content_settings.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_ic_star_black_48dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_ic_star_black_48dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_action_bar_title_item.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_action_bar_title_item.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_search_dropdown_item_icons_2line.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_search_dropdown_item_icons_2line.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_screen_simple.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_screen_simple.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_ic_star_half_black_16dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_ic_star_half_black_16dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_ab_share_pack_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_ab_share_pack_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_notification_template_part_chronometer.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\layout\\notification_template_part_chronometer.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-v21_notification_action_background.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-v21\\notification_action_background.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_support_simple_spinner_dropdown_item.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\support_simple_spinner_dropdown_item.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_alert_dialog_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_alert_dialog_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_btn_switch_to_on_mtrl_00001.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_scrubber_control_to_pressed_mtrl_000.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_ic_star_black_48dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_ic_star_black_48dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_design_ic_visibility_off.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-hdpi-v4\\design_ic_visibility_off.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_design_error.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\design_error.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_text_select_handle_right_mtrl_dark.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_text_select_handle_right_mtrl_dark.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_navigation_item_header.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_navigation_item_header.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_spinner_mtrl_am_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_text_select_handle_right_mtrl_light.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_text_select_handle_right_mtrl_light.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_scrubber_control_to_pressed_mtrl_005.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_notification_bg_normal_pressed.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-hdpi-v4\\notification_bg_normal_pressed.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_spinner_mtrl_am_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_abc_grow_fade_in_from_bottom.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\anim\\abc_grow_fade_in_from_bottom.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_ic_commit_search_api_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_ic_star_black_16dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_ic_star_black_16dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_scrubber_primary_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_scrubber_primary_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout-v21_notification_action_tombstone.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\layout-v21\\notification_action_tombstone.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_textfield_default_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_text_select_handle_right_mtrl_dark.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_text_select_handle_right_mtrl_dark.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-v23_abc_control_background_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-v23\\abc_control_background_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_cab_background_top_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_cab_background_top_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-anydpi-v21_design_ic_visibility.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-anydpi-v21\\design_ic_visibility.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-xxhdpi-v17_abc_ic_menu_cut_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-xxhdpi-v17\\abc_ic_menu_cut_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_scrubber_control_off_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_scrubber_control_off_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_btn_radio_to_on_mtrl_015.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_textfield_search_default_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\animator_mtrl_btn_unelevated_state_list_anim.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\animator\\mtrl_btn_unelevated_state_list_anim.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_select_dialog_multichoice_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\select_dialog_multichoice_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_btn_check_to_on_mtrl_015.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_list_pressed_holo_light.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_list_pressed_holo_light.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_scrubber_control_to_pressed_mtrl_005.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_ic_star_black_16dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_ic_star_black_16dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_notify_panel_notification_icon_bg.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-mdpi-v4\\notify_panel_notification_icon_bg.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_btn_text_color_selector.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_btn_text_color_selector.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_ratingbar_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_ratingbar_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_ic_star_black_48dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_ic_star_black_48dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_textfield_search_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_textfield_search_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_list_longpressed_holo.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_list_longpressed_holo.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_btn_radio_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_btn_radio_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_text_btn_text_color_selector.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_text_btn_text_color_selector.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_btn_check_to_on_mtrl_015.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color-v23_abc_color_highlight_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color-v23\\abc_color_highlight_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_ic_star_half_black_16dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_ic_star_half_black_16dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_text_select_handle_left_mtrl_light.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_text_select_handle_left_mtrl_light.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_tint_spinner.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_tint_spinner.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_scrubber_track_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_scrubber_track_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-xxxhdpi-v17_abc_ic_menu_copy_mtrl_am_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-xxxhdpi-v17\\abc_ic_menu_copy_mtrl_am_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\mipmap-xxxhdpi_ic_launcher.png.flat", - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\mipmap-xxxhdpi\\ic_launcher.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_tint_edittext.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_tint_edittext.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_tab_indicator_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_tab_indicator_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_notification_bg_normal.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-mdpi-v4\\notification_bg_normal.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_list_divider_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_ic_star_half_black_16dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_ic_star_half_black_16dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_list_focused_holo.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_list_focused_holo.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_text_select_handle_middle_mtrl_light.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_text_select_handle_middle_mtrl_light.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\mipmap-anydpi-v26_ic_launcher_round.xml.flat", - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\mipmap-anydpi-v26\\ic_launcher_round.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_primary_text_disable_only_material_light.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_primary_text_disable_only_material_light.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_switch_thumb_material_light.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\switch_thumb_material_light.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_text_select_handle_left_mtrl_light.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_text_select_handle_left_mtrl_light.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_spinner_textfield_background_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_spinner_textfield_background_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_list_selector_disabled_holo_light.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_list_selector_disabled_holo_light.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\mipmap-mdpi_ic_launcher_round.png.flat", - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\mipmap-mdpi\\ic_launcher_round.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_ic_menu_selectall_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_ic_menu_selectall_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout-watch-v20_abc_alert_dialog_title_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout-watch-v20\\abc_alert_dialog_title_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout-sw600dp-v13_mtrl_layout_snackbar.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout-sw600dp-v13\\mtrl_layout_snackbar.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_scrubber_control_to_pressed_mtrl_000.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_notification_icon_background.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable\\notification_icon_background.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_activity_chooser_view.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_activity_chooser_view.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_vector_test.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_vector_test.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_ic_menu_cut_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_ic_menu_cut_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_scrubber_primary_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_scrubber_primary_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_tabs_ripple_color.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_tabs_ripple_color.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_layout_tab_text.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_layout_tab_text.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_tooltip_frame_dark.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\tooltip_frame_dark.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_btn_colored_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_btn_colored_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_textfield_activated_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_design_bottom_navigation_item_background.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable\\design_bottom_navigation_item_background.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-hdpi-v17_abc_ic_menu_copy_mtrl_am_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-hdpi-v17\\abc_ic_menu_copy_mtrl_am_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_list_selector_disabled_holo_light.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_list_selector_disabled_holo_light.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_list_focused_holo.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_list_focused_holo.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_textfield_activated_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_ic_commit_search_api_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-xhdpi-v17_abc_ic_menu_copy_mtrl_am_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-xhdpi-v17\\abc_ic_menu_copy_mtrl_am_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\menu_menu_main.xml.flat", - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\menu\\menu_main.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_notification_template_icon_group.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\layout\\notification_template_icon_group.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_list_pressed_holo_dark.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_list_pressed_holo_dark.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color-v23_design_tint_password_toggle.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color-v23\\design_tint_password_toggle.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_ic_star_black_36dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_ic_star_black_36dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_select_dialog_item_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\select_dialog_item_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_btn_switch_to_on_mtrl_00001.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_text_select_handle_left_mtrl_light.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_text_select_handle_left_mtrl_light.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_btn_colored_text_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_btn_colored_text_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_textfield_activated_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_btn_switch_to_on_mtrl_00012.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_scrubber_primary_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_scrubber_primary_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_abc_slide_out_bottom.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\anim\\abc_slide_out_bottom.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_list_longpressed_holo.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_list_longpressed_holo.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-v21_abc_edit_text_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-v21\\abc_edit_text_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\animator_mtrl_btn_state_list_anim.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\animator\\mtrl_btn_state_list_anim.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_ic_menu_share_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_ic_menu_share_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_item_background_holo_dark.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_item_background_holo_dark.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_scrubber_control_off_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_scrubber_control_off_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-anydpi-v21_design_ic_visibility_off.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-anydpi-v21\\design_ic_visibility_off.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_design_bottom_sheet_slide_in.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\anim\\design_bottom_sheet_slide_in.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-xxhdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-xxhdpi-v17\\abc_spinner_mtrl_am_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_ic_menu_share_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_ic_menu_share_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_btn_borderless_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_btn_borderless_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_design_ic_visibility_off.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-xxhdpi-v4\\design_ic_visibility_off.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldpi_ic_launcher_background.png.flat", - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\generated\\res\\pngs\\debug\\drawable-ldpi\\ic_launcher_background.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_ic_menu_share_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_ic_menu_share_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_list_focused_holo.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_list_focused_holo.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_action_bar_up_container.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_action_bar_up_container.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_tabs_colored_ripple_color.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_tabs_colored_ripple_color.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_menu_hardkey_panel_mtrl_mult.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_menu_hardkey_panel_mtrl_mult.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_scrubber_control_to_pressed_mtrl_005.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_text_select_handle_left_mtrl_dark.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_text_select_handle_left_mtrl_dark.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_btn_radio_to_on_mtrl_015.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_fab_ripple_color.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_fab_ripple_color.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_screen_simple_overlay_action_mode.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_screen_simple_overlay_action_mode.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_ic_menu_cut_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_ic_menu_cut_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_ic_star_half_black_36dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_ic_star_half_black_36dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_ic_star_black_36dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_ic_star_black_36dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_abc_popup_exit.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\anim\\abc_popup_exit.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color-v23_abc_tint_default.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color-v23\\abc_tint_default.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_text_select_handle_left_mtrl_dark.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_text_select_handle_left_mtrl_dark.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_secondary_text_material_light.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_secondary_text_material_light.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim-v21_design_bottom_sheet_slide_in.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\anim-v21\\design_bottom_sheet_slide_in.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_scrubber_control_off_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_scrubber_control_off_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_popup_menu_item_layout.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_popup_menu_item_layout.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_btn_radio_to_on_mtrl_015.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\mipmap-xxhdpi_ic_launcher_round.png.flat", - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\mipmap-xxhdpi\\ic_launcher_round.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_text_select_handle_left_mtrl_dark.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_text_select_handle_left_mtrl_dark.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\mipmap-xhdpi_ic_launcher.png.flat", - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\mipmap-xhdpi\\ic_launcher.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_ratingbar_indicator_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_ratingbar_indicator_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-mdpi-v17_abc_ic_menu_copy_mtrl_am_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-mdpi-v17\\abc_ic_menu_copy_mtrl_am_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_scrubber_track_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_scrubber_track_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_list_selector_background_transition_holo_dark.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_list_selector_background_transition_holo_dark.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_switch_thumb_material_dark.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\switch_thumb_material_dark.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_ic_star_half_black_36dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_ic_star_half_black_36dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_textfield_search_activated_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\interpolator-v21_mtrl_fast_out_linear_in.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\interpolator-v21\\mtrl_fast_out_linear_in.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color-v23_abc_btn_colored_text_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color-v23\\abc_btn_colored_text_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_scrubber_track_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_scrubber_track_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_abc_tooltip_exit.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\anim\\abc_tooltip_exit.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_design_ic_visibility.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-hdpi-v4\\design_ic_visibility.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_list_selector_disabled_holo_light.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_list_selector_disabled_holo_light.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_navigation_empty_icon.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable\\navigation_empty_icon.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_ic_menu_share_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_ic_menu_share_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_notify_panel_notification_icon_bg.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-hdpi-v4\\notify_panel_notification_icon_bg.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim-v21_design_bottom_sheet_slide_out.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\anim-v21\\design_bottom_sheet_slide_out.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_secondary_text_material_dark.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_secondary_text_material_dark.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_ic_star_half_black_48dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_ic_star_half_black_48dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_design_ic_visibility_off.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-mdpi-v4\\design_ic_visibility_off.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\interpolator_mtrl_linear.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\interpolator\\mtrl_linear.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout-v21_notification_action.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\layout-v21\\notification_action.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_layout_snackbar_include.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_layout_snackbar_include.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_action_mode_bar.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_action_mode_bar.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_navigation_menu_item.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_navigation_menu_item.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-xxhdpi-v17_abc_ic_menu_copy_mtrl_am_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-xxhdpi-v17\\abc_ic_menu_copy_mtrl_am_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_abc_shrink_fade_out_from_bottom.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\anim\\abc_shrink_fade_out_from_bottom.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_notification_template_custom_big.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\layout\\notification_template_custom_big.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_scrubber_control_to_pressed_mtrl_005.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_ic_star_half_black_36dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_ic_star_half_black_36dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_primary_text_material_light.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_primary_text_material_light.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-mdpi-v17_abc_ic_menu_cut_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-mdpi-v17\\abc_ic_menu_cut_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_alert_dialog_button_bar_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_alert_dialog_button_bar_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_ic_menu_cut_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_ic_menu_cut_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_ic_star_black_16dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_ic_star_black_16dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_ic_go_search_api_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_ic_go_search_api_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_notification_bg_low_pressed.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-hdpi-v4\\notification_bg_low_pressed.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\animator_design_fab_show_motion_spec.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\animator\\design_fab_show_motion_spec.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_btn_bg_color_selector.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_btn_bg_color_selector.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_notification_tile_bg.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable\\notification_tile_bg.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi_ic_launcher_background.png.flat", - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\generated\\res\\pngs\\debug\\drawable-hdpi\\ic_launcher_background.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_list_pressed_holo_light.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_list_pressed_holo_light.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_chip_ripple_color.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_chip_ripple_color.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_scrubber_primary_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_scrubber_primary_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-xhdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-xhdpi-v17\\abc_spinner_mtrl_am_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_cab_background_top_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_cab_background_top_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_cascading_menu_item_layout.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_cascading_menu_item_layout.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_text_select_handle_right_mtrl_light.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_text_select_handle_right_mtrl_light.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_ic_menu_paste_mtrl_am_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_ic_menu_paste_mtrl_am_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_list_divider_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_list_divider_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout-sw600dp-v13_design_layout_snackbar.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout-sw600dp-v13\\design_layout_snackbar.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_screen_content_include.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_screen_content_include.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_switch_track_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_btn_switch_to_on_mtrl_00001.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-v21_abc_list_divider_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-v21\\abc_list_divider_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_ab_share_pack_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_ab_share_pack_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_seekbar_tick_mark_material.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_seekbar_tick_mark_material.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_textfield_default_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_tint_btn_checkable.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_tint_btn_checkable.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_ic_menu_share_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_ic_menu_share_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_list_divider_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_menu_hardkey_panel_mtrl_mult.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_menu_hardkey_panel_mtrl_mult.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_abc_fade_out.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\anim\\abc_fade_out.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_chip_background_color.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_chip_background_color.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_background_cache_hint_selector_material_dark.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_background_cache_hint_selector_material_dark.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_menu_item_action_area.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_menu_item_action_area.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_ic_menu_copy_mtrl_am_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_ic_menu_copy_mtrl_am_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_notification_action.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\layout\\notification_action.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_mtrl_snackbar_background.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable\\mtrl_snackbar_background.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_switch_track_mtrl_alpha.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi_ic_launcher_background.png.flat", - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\generated\\res\\pngs\\debug\\drawable-mdpi\\ic_launcher_background.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_ic_star_black_48dp.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_ic_star_black_48dp.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_hint_foreground_material_dark.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_hint_foreground_material_dark.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_ic_menu_selectall_mtrl_alpha.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_ic_menu_selectall_mtrl_alpha.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_activity_main.xml.flat", - "source": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\layout\\activity_main.xml" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_btn_switch_to_on_mtrl_00012.9.png" - }, - { - "merged": "C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout-v21_notification_template_custom_big.xml.flat", - "source": "C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\layout-v21\\notification_template_custom_big.xml" - } -] \ No newline at end of file diff --git a/code/Android App/build/intermediates/build-info/debug/build-info.xml b/code/Android App/build/intermediates/build-info/debug/build-info.xml deleted file mode 100755 index c2b0ff6..0000000 --- a/code/Android App/build/intermediates/build-info/debug/build-info.xml +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/code/Android App/build/intermediates/bundle_manifest/debug/processDebugManifest/bundle-manifest/AndroidManifest.xml b/code/Android App/build/intermediates/bundle_manifest/debug/processDebugManifest/bundle-manifest/AndroidManifest.xml deleted file mode 100755 index c428d5f..0000000 --- a/code/Android App/build/intermediates/bundle_manifest/debug/processDebugManifest/bundle-manifest/AndroidManifest.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/code/Android App/build/intermediates/bundle_manifest/debug/processDebugManifest/bundle-manifest/output.json b/code/Android App/build/intermediates/bundle_manifest/debug/processDebugManifest/bundle-manifest/output.json deleted file mode 100755 index 5bf5592..0000000 --- a/code/Android App/build/intermediates/bundle_manifest/debug/processDebugManifest/bundle-manifest/output.json +++ /dev/null @@ -1 +0,0 @@ -[{"outputType":{"type":"BUNDLE_MANIFEST"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-debug.apk","fullName":"debug","baseName":"debug"},"path":"AndroidManifest.xml","properties":{"packageId":"com.scriptor","split":"","minSdkVersion":"15"}}] \ No newline at end of file diff --git a/code/Android App/build/intermediates/compatible_screen_manifest/debug/createDebugCompatibleScreenManifests/out/output.json b/code/Android App/build/intermediates/compatible_screen_manifest/debug/createDebugCompatibleScreenManifests/out/output.json deleted file mode 100755 index 0637a08..0000000 --- a/code/Android App/build/intermediates/compatible_screen_manifest/debug/createDebugCompatibleScreenManifests/out/output.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/code/Android App/build/intermediates/dex/debug/mergeDexDebug/out/classes.dex b/code/Android App/build/intermediates/dex/debug/mergeDexDebug/out/classes.dex deleted file mode 100755 index 6e7b527..0000000 Binary files a/code/Android App/build/intermediates/dex/debug/mergeDexDebug/out/classes.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/external_libs_dex/debug/mergeExtDexDebug/out/classes.dex b/code/Android App/build/intermediates/external_libs_dex/debug/mergeExtDexDebug/out/classes.dex deleted file mode 100755 index b7edd85..0000000 Binary files a/code/Android App/build/intermediates/external_libs_dex/debug/mergeExtDexDebug/out/classes.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-runtime-classes/debug/instant-run.jar b/code/Android App/build/intermediates/incremental-runtime-classes/debug/instant-run.jar deleted file mode 100755 index f397075..0000000 Binary files a/code/Android App/build/intermediates/incremental-runtime-classes/debug/instant-run.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/arch/core/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/arch/core/R.class deleted file mode 100755 index f74ab6f..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/arch/core/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/arch/lifecycle/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/arch/lifecycle/R.class deleted file mode 100755 index c52407b..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/arch/lifecycle/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/arch/lifecycle/livedata/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/arch/lifecycle/livedata/R.class deleted file mode 100755 index 80ab4ab..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/arch/lifecycle/livedata/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/arch/lifecycle/livedata/core/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/arch/lifecycle/livedata/core/R.class deleted file mode 100755 index 85462a4..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/arch/lifecycle/livedata/core/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/arch/lifecycle/viewmodel/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/arch/lifecycle/viewmodel/R.class deleted file mode 100755 index 53678cf..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/arch/lifecycle/viewmodel/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$attr.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$attr.class deleted file mode 100755 index 39dadfb..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$color.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$color.class deleted file mode 100755 index 2e9a066..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$dimen.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$dimen.class deleted file mode 100755 index a2b44d7..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$drawable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$drawable.class deleted file mode 100755 index 514746a..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$id.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$id.class deleted file mode 100755 index c84f040..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$integer.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$integer.class deleted file mode 100755 index a0f398d..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$layout.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$layout.class deleted file mode 100755 index 2a6ff44..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$string.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$string.class deleted file mode 100755 index 2fb1b65..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$style.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$style.class deleted file mode 100755 index aeca33e..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$styleable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$styleable.class deleted file mode 100755 index 345f7ab..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R.class deleted file mode 100755 index 0874dd7..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/asynclayoutinflater/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$attr.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$attr.class deleted file mode 100755 index 196b27e..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$color.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$color.class deleted file mode 100755 index 616f58f..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$dimen.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$dimen.class deleted file mode 100755 index abf2ed4..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$drawable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$drawable.class deleted file mode 100755 index 3d60819..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$id.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$id.class deleted file mode 100755 index c4b2468..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$integer.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$integer.class deleted file mode 100755 index b6596a8..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$layout.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$layout.class deleted file mode 100755 index 5297a3e..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$string.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$string.class deleted file mode 100755 index 3cc2fec..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$style.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$style.class deleted file mode 100755 index f292e7f..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$styleable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$styleable.class deleted file mode 100755 index 446d0a8..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R.class deleted file mode 100755 index 57ad7c8..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/compat/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/constraint/R$attr.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/constraint/R$attr.class deleted file mode 100755 index e4ee068..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/constraint/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/constraint/R$id.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/constraint/R$id.class deleted file mode 100755 index a51a6f1..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/constraint/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/constraint/R$styleable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/constraint/R$styleable.class deleted file mode 100755 index 7da88e3..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/constraint/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/constraint/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/constraint/R.class deleted file mode 100755 index 237278c..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/constraint/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$attr.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$attr.class deleted file mode 100755 index 6313118..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$color.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$color.class deleted file mode 100755 index f867707..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$dimen.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$dimen.class deleted file mode 100755 index e3770ae..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$drawable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$drawable.class deleted file mode 100755 index e3a0e58..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$id.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$id.class deleted file mode 100755 index dae400f..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$integer.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$integer.class deleted file mode 100755 index 6647fd8..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$layout.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$layout.class deleted file mode 100755 index eed28af..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$string.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$string.class deleted file mode 100755 index 96343be..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$style.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$style.class deleted file mode 100755 index 4813ed8..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$styleable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$styleable.class deleted file mode 100755 index 469323d..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R.class deleted file mode 100755 index 8fbdcbb..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coordinatorlayout/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$attr.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$attr.class deleted file mode 100755 index 5d1d245..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$color.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$color.class deleted file mode 100755 index d6f1bb6..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$dimen.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$dimen.class deleted file mode 100755 index ae5b0ca..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$drawable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$drawable.class deleted file mode 100755 index 6fe94b0..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$id.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$id.class deleted file mode 100755 index 9c8f312..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$integer.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$integer.class deleted file mode 100755 index 2717f23..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$layout.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$layout.class deleted file mode 100755 index 1abb971..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$string.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$string.class deleted file mode 100755 index ce71049..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$style.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$style.class deleted file mode 100755 index 6a4bf04..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$styleable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$styleable.class deleted file mode 100755 index 30d59ab..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R.class deleted file mode 100755 index 120ef93..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreui/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$attr.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$attr.class deleted file mode 100755 index 9dc48f3..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$color.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$color.class deleted file mode 100755 index 4d2dbb0..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$dimen.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$dimen.class deleted file mode 100755 index 550daf7..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$drawable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$drawable.class deleted file mode 100755 index 76a4337..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$id.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$id.class deleted file mode 100755 index 998bb0e..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$integer.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$integer.class deleted file mode 100755 index 7534c58..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$layout.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$layout.class deleted file mode 100755 index 58f06b5..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$string.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$string.class deleted file mode 100755 index c4be0d6..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$style.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$style.class deleted file mode 100755 index 1468bdf..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$styleable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$styleable.class deleted file mode 100755 index 8b6cc31..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R.class deleted file mode 100755 index a92c243..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/coreutils/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/cursoradapter/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/cursoradapter/R.class deleted file mode 100755 index f9da80e..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/cursoradapter/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$attr.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$attr.class deleted file mode 100755 index d28e3e2..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$color.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$color.class deleted file mode 100755 index c53736f..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$dimen.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$dimen.class deleted file mode 100755 index 2338981..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$drawable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$drawable.class deleted file mode 100755 index 84216bc..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$id.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$id.class deleted file mode 100755 index 96b9fac..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$integer.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$integer.class deleted file mode 100755 index c67e4f8..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$layout.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$layout.class deleted file mode 100755 index 9e44720..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$string.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$string.class deleted file mode 100755 index 5bfbf9e..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$style.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$style.class deleted file mode 100755 index 131a48d..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$styleable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$styleable.class deleted file mode 100755 index 4294c06..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R.class deleted file mode 100755 index e47774a..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/customview/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$anim.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$anim.class deleted file mode 100755 index 20db283..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$anim.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$animator.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$animator.class deleted file mode 100755 index 84f5c88..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$animator.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$attr.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$attr.class deleted file mode 100755 index e1d77af..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$bool.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$bool.class deleted file mode 100755 index 3092f59..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$bool.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$color.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$color.class deleted file mode 100755 index e3f2a8f..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$dimen.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$dimen.class deleted file mode 100755 index acfb746..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$drawable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$drawable.class deleted file mode 100755 index e1a6547..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$id.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$id.class deleted file mode 100755 index 02a7978..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$integer.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$integer.class deleted file mode 100755 index 1937648..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$interpolator.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$interpolator.class deleted file mode 100755 index 34e1744..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$interpolator.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$layout.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$layout.class deleted file mode 100755 index 11608d9..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$string.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$string.class deleted file mode 100755 index fa2d93c..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$style.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$style.class deleted file mode 100755 index 8c2567d..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$styleable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$styleable.class deleted file mode 100755 index a0bbba8..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R.class deleted file mode 100755 index d3ada39..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/design/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/documentfile/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/documentfile/R.class deleted file mode 100755 index 8808028..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/documentfile/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$attr.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$attr.class deleted file mode 100755 index 6f3432e..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$color.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$color.class deleted file mode 100755 index 1b47111..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$dimen.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$dimen.class deleted file mode 100755 index 21aa3b3..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$drawable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$drawable.class deleted file mode 100755 index efa7e94..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$id.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$id.class deleted file mode 100755 index f7b6937..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$integer.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$integer.class deleted file mode 100755 index 77253ca..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$layout.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$layout.class deleted file mode 100755 index 701db2b..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$string.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$string.class deleted file mode 100755 index 1d4f378..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$style.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$style.class deleted file mode 100755 index 0f8bbc7..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$styleable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$styleable.class deleted file mode 100755 index 718d9b1..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R.class deleted file mode 100755 index ce9c72a..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/drawerlayout/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$attr.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$attr.class deleted file mode 100755 index 7d89f92..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$color.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$color.class deleted file mode 100755 index 20f010a..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$dimen.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$dimen.class deleted file mode 100755 index 3c31a78..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$drawable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$drawable.class deleted file mode 100755 index e99f0d4..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$id.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$id.class deleted file mode 100755 index b501812..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$integer.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$integer.class deleted file mode 100755 index ff3240a..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$layout.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$layout.class deleted file mode 100755 index 24af21d..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$string.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$string.class deleted file mode 100755 index 62a8352..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$style.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$style.class deleted file mode 100755 index 64d8ed3..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$styleable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$styleable.class deleted file mode 100755 index 4dc3949..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R.class deleted file mode 100755 index 030d8ce..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/fragment/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$attr.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$attr.class deleted file mode 100755 index 3a17d54..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$color.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$color.class deleted file mode 100755 index f0cbe41..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$dimen.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$dimen.class deleted file mode 100755 index 3ca1f4b..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$drawable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$drawable.class deleted file mode 100755 index 914ba1e..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$id.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$id.class deleted file mode 100755 index b120e4d..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$integer.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$integer.class deleted file mode 100755 index 5682edc..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$layout.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$layout.class deleted file mode 100755 index 7ac4e51..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$string.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$string.class deleted file mode 100755 index ffb5a42..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$style.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$style.class deleted file mode 100755 index 26f5b7a..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$styleable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$styleable.class deleted file mode 100755 index 2b37487..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R.class deleted file mode 100755 index 0219482..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/graphics/drawable/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/interpolator/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/interpolator/R.class deleted file mode 100755 index 0a83688..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/interpolator/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$attr.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$attr.class deleted file mode 100755 index df8a07c..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$color.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$color.class deleted file mode 100755 index ce2065e..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$dimen.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$dimen.class deleted file mode 100755 index e017d28..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$drawable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$drawable.class deleted file mode 100755 index 28a805a..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$id.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$id.class deleted file mode 100755 index 09d42f8..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$integer.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$integer.class deleted file mode 100755 index 5f71633..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$layout.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$layout.class deleted file mode 100755 index f34db2d..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$string.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$string.class deleted file mode 100755 index c6f18b7..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$style.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$style.class deleted file mode 100755 index f5e4d4d..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$styleable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$styleable.class deleted file mode 100755 index 5db0853..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R.class deleted file mode 100755 index 70da916..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/loader/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/localbroadcastmanager/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/localbroadcastmanager/R.class deleted file mode 100755 index a29b974..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/localbroadcastmanager/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/print/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/print/R.class deleted file mode 100755 index b8761d9..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/print/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$attr.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$attr.class deleted file mode 100755 index a04f67b..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$color.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$color.class deleted file mode 100755 index 1312866..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$dimen.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$dimen.class deleted file mode 100755 index a531fe4..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$drawable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$drawable.class deleted file mode 100755 index c1d5d0a..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$id.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$id.class deleted file mode 100755 index 958cba9..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$integer.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$integer.class deleted file mode 100755 index dccad09..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$layout.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$layout.class deleted file mode 100755 index 1aabfb5..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$string.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$string.class deleted file mode 100755 index 8a494ea..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$style.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$style.class deleted file mode 100755 index 841d660..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$styleable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$styleable.class deleted file mode 100755 index 201bc95..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R.class deleted file mode 100755 index 155b8a9..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/slidingpanelayout/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$attr.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$attr.class deleted file mode 100755 index c8b6066..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$color.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$color.class deleted file mode 100755 index 12b7876..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$dimen.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$dimen.class deleted file mode 100755 index a23a55a..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$drawable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$drawable.class deleted file mode 100755 index f4874a4..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$id.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$id.class deleted file mode 100755 index 841a5bd..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$integer.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$integer.class deleted file mode 100755 index 6a71362..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$layout.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$layout.class deleted file mode 100755 index 39eb317..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$string.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$string.class deleted file mode 100755 index 11e50b7..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$style.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$style.class deleted file mode 100755 index b2b5d33..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$styleable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$styleable.class deleted file mode 100755 index 527f746..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R.class deleted file mode 100755 index 069da82..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/swiperefreshlayout/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$attr.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$attr.class deleted file mode 100755 index 9159a65..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$color.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$color.class deleted file mode 100755 index ea65d10..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$dimen.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$dimen.class deleted file mode 100755 index 44c0d8f..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$drawable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$drawable.class deleted file mode 100755 index 2f08b95..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$id.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$id.class deleted file mode 100755 index 3983f98..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$integer.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$integer.class deleted file mode 100755 index e53fb28..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$layout.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$layout.class deleted file mode 100755 index 0375edd..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$string.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$string.class deleted file mode 100755 index 61e5dcd..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$style.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$style.class deleted file mode 100755 index 1ce25c5..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$styleable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$styleable.class deleted file mode 100755 index 9cb7778..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R.class deleted file mode 100755 index 889270a..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/transition/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$anim.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$anim.class deleted file mode 100755 index 1ab5b25..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$anim.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$attr.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$attr.class deleted file mode 100755 index b74e8d1..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$bool.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$bool.class deleted file mode 100755 index 921bfae..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$bool.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$color.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$color.class deleted file mode 100755 index 00e4d1d..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$dimen.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$dimen.class deleted file mode 100755 index eb76120..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$drawable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$drawable.class deleted file mode 100755 index 579c285..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$id.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$id.class deleted file mode 100755 index e673dee..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$integer.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$integer.class deleted file mode 100755 index 415e124..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$layout.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$layout.class deleted file mode 100755 index 1eaa2fc..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$string.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$string.class deleted file mode 100755 index 751c9f7..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$style.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$style.class deleted file mode 100755 index 6e4cd80..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$styleable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$styleable.class deleted file mode 100755 index 96a18be..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R.class deleted file mode 100755 index c2e3955..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/appcompat/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/cardview/R$attr.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/cardview/R$attr.class deleted file mode 100755 index be164b8..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/cardview/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/cardview/R$color.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/cardview/R$color.class deleted file mode 100755 index 66468f9..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/cardview/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/cardview/R$dimen.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/cardview/R$dimen.class deleted file mode 100755 index 4d19b1a..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/cardview/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/cardview/R$style.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/cardview/R$style.class deleted file mode 100755 index 964af87..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/cardview/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/cardview/R$styleable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/cardview/R$styleable.class deleted file mode 100755 index 79a2892..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/cardview/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/cardview/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/cardview/R.class deleted file mode 100755 index 18455b8..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/cardview/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$attr.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$attr.class deleted file mode 100755 index aff1355..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$color.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$color.class deleted file mode 100755 index b90abfd..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$dimen.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$dimen.class deleted file mode 100755 index f3a6868..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$drawable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$drawable.class deleted file mode 100755 index 28cd8be..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$id.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$id.class deleted file mode 100755 index fe202ee..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$integer.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$integer.class deleted file mode 100755 index ae89370..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$layout.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$layout.class deleted file mode 100755 index 023729e..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$string.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$string.class deleted file mode 100755 index 0e64a0e..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$style.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$style.class deleted file mode 100755 index 899d603..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$styleable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$styleable.class deleted file mode 100755 index 9c1648e..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R.class deleted file mode 100755 index 9796eb9..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/recyclerview/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$attr.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$attr.class deleted file mode 100755 index 8a87fa9..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$color.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$color.class deleted file mode 100755 index cf47beb..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$dimen.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$dimen.class deleted file mode 100755 index 4d8702c..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$drawable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$drawable.class deleted file mode 100755 index 2ea9a91..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$id.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$id.class deleted file mode 100755 index f8991c9..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$integer.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$integer.class deleted file mode 100755 index 0b92dea..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$layout.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$layout.class deleted file mode 100755 index 733fb59..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$string.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$string.class deleted file mode 100755 index fe3a314..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$style.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$style.class deleted file mode 100755 index 2e6f257..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$styleable.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$styleable.class deleted file mode 100755 index b95e2d8..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R.class deleted file mode 100755 index 4785c9b..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/android/support/v7/viewpager/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/androidx/versionedparcelable/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/androidx/versionedparcelable/R.class deleted file mode 100755 index 79a4038..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/androidx/versionedparcelable/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/BuildConfig.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/BuildConfig.class deleted file mode 100755 index 321b34c..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/BuildConfig.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/Church.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/Church.class deleted file mode 100755 index 567374d..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/Church.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/MainActivity$1.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/MainActivity$1.class deleted file mode 100755 index fa1dfeb..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/MainActivity$1.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/MainActivity.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/MainActivity.class deleted file mode 100755 index 7a454e7..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/MainActivity.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$anim.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$anim.class deleted file mode 100755 index da905dd..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$anim.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$animator.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$animator.class deleted file mode 100755 index c8d6b65..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$animator.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$array.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$array.class deleted file mode 100755 index eb17369..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$array.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$attr.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$attr.class deleted file mode 100755 index 2bf2e29..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$bool.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$bool.class deleted file mode 100755 index 429ea8e..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$bool.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$color.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$color.class deleted file mode 100755 index 160abbe..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$dimen.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$dimen.class deleted file mode 100755 index 04fe9c6..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$drawable.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$drawable.class deleted file mode 100755 index d345435..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$id.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$id.class deleted file mode 100755 index 119b67c..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$integer.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$integer.class deleted file mode 100755 index 06f7732..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$interpolator.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$interpolator.class deleted file mode 100755 index 9c80c79..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$interpolator.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$layout.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$layout.class deleted file mode 100755 index 659a317..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$menu.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$menu.class deleted file mode 100755 index 5b9d613..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$menu.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$mipmap.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$mipmap.class deleted file mode 100755 index 0221244..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$mipmap.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$string.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$string.class deleted file mode 100755 index 114fce3..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$style.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$style.class deleted file mode 100755 index 4e0a074..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$styleable.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$styleable.class deleted file mode 100755 index 3da0bb7..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R.class deleted file mode 100755 index 84178e9..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/Settings$1.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/Settings$1.class deleted file mode 100755 index 54abfd4..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/Settings$1.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/Settings$2.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/Settings$2.class deleted file mode 100755 index 0da6f1b..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/Settings$2.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/Settings$3.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/Settings$3.class deleted file mode 100755 index b2ec4dd..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/Settings$3.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/Settings$4.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/Settings$4.class deleted file mode 100755 index 47f9ff1..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/Settings$4.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/Settings.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/Settings.class deleted file mode 100755 index 3389354..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/Settings.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/Song.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/Song.class deleted file mode 100755 index bf5be11..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/Song.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/songRequest.class b/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/songRequest.class deleted file mode 100755 index 9ebaedb..0000000 Binary files a/code/Android App/build/intermediates/incremental-verifier/debug/com/scriptor/songRequest.class and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/merge-state b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/merge-state deleted file mode 100755 index e216c49..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/merge-state and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/0PKaq+bQoN43QNDYwxAvTXYWnvA= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/0PKaq+bQoN43QNDYwxAvTXYWnvA= deleted file mode 100755 index 2b56acd..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/0PKaq+bQoN43QNDYwxAvTXYWnvA= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/1PYFADqypG00VyPdgfQVSq8tiuY= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/1PYFADqypG00VyPdgfQVSq8tiuY= deleted file mode 100755 index 264eaeb..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/1PYFADqypG00VyPdgfQVSq8tiuY= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/2EcA14dVBm3FhQ2ntzypZFFzomE= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/2EcA14dVBm3FhQ2ntzypZFFzomE= deleted file mode 100755 index b178df1..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/2EcA14dVBm3FhQ2ntzypZFFzomE= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/733NQJQYoVdignV_jMc11xT0Pw0= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/733NQJQYoVdignV_jMc11xT0Pw0= deleted file mode 100755 index 06e914d..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/733NQJQYoVdignV_jMc11xT0Pw0= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/9mLKqXdv2RJZFG+azYf8wAuIOB4= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/9mLKqXdv2RJZFG+azYf8wAuIOB4= deleted file mode 100755 index a19a2a5..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/9mLKqXdv2RJZFG+azYf8wAuIOB4= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/D1NCA5F+9OwUxW07OhZax2TQmO4= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/D1NCA5F+9OwUxW07OhZax2TQmO4= deleted file mode 100755 index b12b287..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/D1NCA5F+9OwUxW07OhZax2TQmO4= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/ElLQkLuiJLN5xh1J+WNd9w_dRTg= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/ElLQkLuiJLN5xh1J+WNd9w_dRTg= deleted file mode 100755 index 6bb2c49..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/ElLQkLuiJLN5xh1J+WNd9w_dRTg= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/FbZZU_697Mmav93MPm31SVNeiyc= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/FbZZU_697Mmav93MPm31SVNeiyc= deleted file mode 100755 index 4e97c26..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/FbZZU_697Mmav93MPm31SVNeiyc= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/HGDQKCXD0ORK16CZq_DFSjYLC68= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/HGDQKCXD0ORK16CZq_DFSjYLC68= deleted file mode 100755 index e9e7608..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/HGDQKCXD0ORK16CZq_DFSjYLC68= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/HIY8Lh7hBB1szHpsPdTDGEZPjk4= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/HIY8Lh7hBB1szHpsPdTDGEZPjk4= deleted file mode 100755 index 2dae2f9..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/HIY8Lh7hBB1szHpsPdTDGEZPjk4= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/JVc_wtMAvoD9c9O4p1JFCmtbo_w= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/JVc_wtMAvoD9c9O4p1JFCmtbo_w= deleted file mode 100755 index 27924dd..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/JVc_wtMAvoD9c9O4p1JFCmtbo_w= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Kg4jb8j7cWPaaROxqC2vXRDEDXE= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Kg4jb8j7cWPaaROxqC2vXRDEDXE= deleted file mode 100755 index 083d96b..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Kg4jb8j7cWPaaROxqC2vXRDEDXE= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/NtjjMet71eLH1CPj+FkREOXCfZw= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/NtjjMet71eLH1CPj+FkREOXCfZw= deleted file mode 100755 index 2365cb9..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/NtjjMet71eLH1CPj+FkREOXCfZw= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/TxAj1lcMkjraVlxO9P+JyTmHwZo= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/TxAj1lcMkjraVlxO9P+JyTmHwZo= deleted file mode 100755 index e49acf7..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/TxAj1lcMkjraVlxO9P+JyTmHwZo= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/UrBjZH08+rXLaFHAGW6PRhpgKhc= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/UrBjZH08+rXLaFHAGW6PRhpgKhc= deleted file mode 100755 index 32d47c0..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/UrBjZH08+rXLaFHAGW6PRhpgKhc= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/VdbYM00XPGojM3IkMOXeQu8F92Y= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/VdbYM00XPGojM3IkMOXeQu8F92Y= deleted file mode 100755 index c063f2b..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/VdbYM00XPGojM3IkMOXeQu8F92Y= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/WoErYfbgwlCxc060+3yLO5ZYuiE= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/WoErYfbgwlCxc060+3yLO5ZYuiE= deleted file mode 100755 index d0dcd9c..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/WoErYfbgwlCxc060+3yLO5ZYuiE= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/X6LoSc1P8n8KMbqnzx2Yj_GySNQ= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/X6LoSc1P8n8KMbqnzx2Yj_GySNQ= deleted file mode 100755 index 483b42c..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/X6LoSc1P8n8KMbqnzx2Yj_GySNQ= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/YbSZGRXRNLbiUS4PeABX23JT+fw= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/YbSZGRXRNLbiUS4PeABX23JT+fw= deleted file mode 100755 index b6ac9fe..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/YbSZGRXRNLbiUS4PeABX23JT+fw= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/YiKglz+SOkbC8PavZLxDLhpg4P0= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/YiKglz+SOkbC8PavZLxDLhpg4P0= deleted file mode 100755 index 0fb7130..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/YiKglz+SOkbC8PavZLxDLhpg4P0= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/ZX5WNxL1fuGrMND9HEefNgBtCtE= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/ZX5WNxL1fuGrMND9HEefNgBtCtE= deleted file mode 100755 index 8d3e763..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/ZX5WNxL1fuGrMND9HEefNgBtCtE= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/_JGcxgzrO_6Rk2V115U4kNB4x3w= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/_JGcxgzrO_6Rk2V115U4kNB4x3w= deleted file mode 100755 index 5954c16..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/_JGcxgzrO_6Rk2V115U4kNB4x3w= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/fx0Ospzfdbpoi5pWzUwQibm1uq0= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/fx0Ospzfdbpoi5pWzUwQibm1uq0= deleted file mode 100755 index a69b1ec..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/fx0Ospzfdbpoi5pWzUwQibm1uq0= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/h+Un_yzAShVlBZ9f0VS3JKYKke0= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/h+Un_yzAShVlBZ9f0VS3JKYKke0= deleted file mode 100755 index 865488d..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/h+Un_yzAShVlBZ9f0VS3JKYKke0= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/hD6nraZL4eEABhMLLwcsxv2525o= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/hD6nraZL4eEABhMLLwcsxv2525o= deleted file mode 100755 index feebff2..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/hD6nraZL4eEABhMLLwcsxv2525o= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/j5CUB__6Z7cuklz3lMKA4WYcjBM= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/j5CUB__6Z7cuklz3lMKA4WYcjBM= deleted file mode 100755 index e27d24a..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/j5CUB__6Z7cuklz3lMKA4WYcjBM= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/lm+xGW5qC7e4BK6C29uleXJvMaA= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/lm+xGW5qC7e4BK6C29uleXJvMaA= deleted file mode 100755 index 3c086f3..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/lm+xGW5qC7e4BK6C29uleXJvMaA= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/o2Kng7h2LI+eYVCXJyJW3EuP8VE= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/o2Kng7h2LI+eYVCXJyJW3EuP8VE= deleted file mode 100755 index e7159a9..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/o2Kng7h2LI+eYVCXJyJW3EuP8VE= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/pPGNzkyT0XxkwABdFYEenm70G7E= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/pPGNzkyT0XxkwABdFYEenm70G7E= deleted file mode 100755 index c3f7927..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/pPGNzkyT0XxkwABdFYEenm70G7E= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/pubUXXBaH5ZKwpcg6UhNPKbQgII= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/pubUXXBaH5ZKwpcg6UhNPKbQgII= deleted file mode 100755 index 25547cc..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/pubUXXBaH5ZKwpcg6UhNPKbQgII= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/rM6gZufPKHh1hyNz6EvODo2orj4= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/rM6gZufPKHh1hyNz6EvODo2orj4= deleted file mode 100755 index 87586a5..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/rM6gZufPKHh1hyNz6EvODo2orj4= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/sMUIWTj2t7iJ3cXjpQnnzR_7JE8= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/sMUIWTj2t7iJ3cXjpQnnzR_7JE8= deleted file mode 100755 index f61d762..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/sMUIWTj2t7iJ3cXjpQnnzR_7JE8= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/uejRe7CZFpXmv_DlD1VBnKLo0O0= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/uejRe7CZFpXmv_DlD1VBnKLo0O0= deleted file mode 100755 index 1c79806..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/uejRe7CZFpXmv_DlD1VBnKLo0O0= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/vZkc2dUZdzttls1ATl0wgNnN4_4= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/vZkc2dUZdzttls1ATl0wgNnN4_4= deleted file mode 100755 index 33675e2..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/vZkc2dUZdzttls1ATl0wgNnN4_4= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/yZ0n0osW9g+Q_vmtt5tn1Yru_qk= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/yZ0n0osW9g+Q_vmtt5tn1Yru_qk= deleted file mode 100755 index 1423435..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/yZ0n0osW9g+Q_vmtt5tn1Yru_qk= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/yrlxzHw+yHjYg11iiloAU4Ui5Os= b/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/yrlxzHw+yHjYg11iiloAU4Ui5Os= deleted file mode 100755 index 371b441..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/yrlxzHw+yHjYg11iiloAU4Ui5Os= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/merge-state b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/merge-state deleted file mode 100755 index 901d5f8..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/merge-state and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/0PKaq+bQoN43QNDYwxAvTXYWnvA= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/0PKaq+bQoN43QNDYwxAvTXYWnvA= deleted file mode 100755 index 2b56acd..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/0PKaq+bQoN43QNDYwxAvTXYWnvA= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/1PYFADqypG00VyPdgfQVSq8tiuY= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/1PYFADqypG00VyPdgfQVSq8tiuY= deleted file mode 100755 index 264eaeb..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/1PYFADqypG00VyPdgfQVSq8tiuY= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/2EcA14dVBm3FhQ2ntzypZFFzomE= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/2EcA14dVBm3FhQ2ntzypZFFzomE= deleted file mode 100755 index b178df1..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/2EcA14dVBm3FhQ2ntzypZFFzomE= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/733NQJQYoVdignV_jMc11xT0Pw0= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/733NQJQYoVdignV_jMc11xT0Pw0= deleted file mode 100755 index 06e914d..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/733NQJQYoVdignV_jMc11xT0Pw0= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/9mLKqXdv2RJZFG+azYf8wAuIOB4= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/9mLKqXdv2RJZFG+azYf8wAuIOB4= deleted file mode 100755 index a19a2a5..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/9mLKqXdv2RJZFG+azYf8wAuIOB4= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/D1NCA5F+9OwUxW07OhZax2TQmO4= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/D1NCA5F+9OwUxW07OhZax2TQmO4= deleted file mode 100755 index b12b287..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/D1NCA5F+9OwUxW07OhZax2TQmO4= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/ElLQkLuiJLN5xh1J+WNd9w_dRTg= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/ElLQkLuiJLN5xh1J+WNd9w_dRTg= deleted file mode 100755 index 6bb2c49..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/ElLQkLuiJLN5xh1J+WNd9w_dRTg= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/FbZZU_697Mmav93MPm31SVNeiyc= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/FbZZU_697Mmav93MPm31SVNeiyc= deleted file mode 100755 index 4e97c26..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/FbZZU_697Mmav93MPm31SVNeiyc= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/HGDQKCXD0ORK16CZq_DFSjYLC68= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/HGDQKCXD0ORK16CZq_DFSjYLC68= deleted file mode 100755 index e9e7608..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/HGDQKCXD0ORK16CZq_DFSjYLC68= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/HIY8Lh7hBB1szHpsPdTDGEZPjk4= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/HIY8Lh7hBB1szHpsPdTDGEZPjk4= deleted file mode 100755 index 2dae2f9..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/HIY8Lh7hBB1szHpsPdTDGEZPjk4= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/JVc_wtMAvoD9c9O4p1JFCmtbo_w= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/JVc_wtMAvoD9c9O4p1JFCmtbo_w= deleted file mode 100755 index 27924dd..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/JVc_wtMAvoD9c9O4p1JFCmtbo_w= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/Kg4jb8j7cWPaaROxqC2vXRDEDXE= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/Kg4jb8j7cWPaaROxqC2vXRDEDXE= deleted file mode 100755 index 083d96b..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/Kg4jb8j7cWPaaROxqC2vXRDEDXE= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/NtjjMet71eLH1CPj+FkREOXCfZw= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/NtjjMet71eLH1CPj+FkREOXCfZw= deleted file mode 100755 index 2365cb9..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/NtjjMet71eLH1CPj+FkREOXCfZw= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/TxAj1lcMkjraVlxO9P+JyTmHwZo= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/TxAj1lcMkjraVlxO9P+JyTmHwZo= deleted file mode 100755 index e49acf7..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/TxAj1lcMkjraVlxO9P+JyTmHwZo= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/UrBjZH08+rXLaFHAGW6PRhpgKhc= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/UrBjZH08+rXLaFHAGW6PRhpgKhc= deleted file mode 100755 index 32d47c0..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/UrBjZH08+rXLaFHAGW6PRhpgKhc= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/VdbYM00XPGojM3IkMOXeQu8F92Y= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/VdbYM00XPGojM3IkMOXeQu8F92Y= deleted file mode 100755 index c063f2b..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/VdbYM00XPGojM3IkMOXeQu8F92Y= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/WoErYfbgwlCxc060+3yLO5ZYuiE= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/WoErYfbgwlCxc060+3yLO5ZYuiE= deleted file mode 100755 index d0dcd9c..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/WoErYfbgwlCxc060+3yLO5ZYuiE= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/X6LoSc1P8n8KMbqnzx2Yj_GySNQ= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/X6LoSc1P8n8KMbqnzx2Yj_GySNQ= deleted file mode 100755 index 483b42c..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/X6LoSc1P8n8KMbqnzx2Yj_GySNQ= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/YbSZGRXRNLbiUS4PeABX23JT+fw= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/YbSZGRXRNLbiUS4PeABX23JT+fw= deleted file mode 100755 index b6ac9fe..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/YbSZGRXRNLbiUS4PeABX23JT+fw= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/YiKglz+SOkbC8PavZLxDLhpg4P0= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/YiKglz+SOkbC8PavZLxDLhpg4P0= deleted file mode 100755 index 0fb7130..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/YiKglz+SOkbC8PavZLxDLhpg4P0= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/ZX5WNxL1fuGrMND9HEefNgBtCtE= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/ZX5WNxL1fuGrMND9HEefNgBtCtE= deleted file mode 100755 index 8d3e763..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/ZX5WNxL1fuGrMND9HEefNgBtCtE= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/_JGcxgzrO_6Rk2V115U4kNB4x3w= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/_JGcxgzrO_6Rk2V115U4kNB4x3w= deleted file mode 100755 index 5954c16..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/_JGcxgzrO_6Rk2V115U4kNB4x3w= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/fx0Ospzfdbpoi5pWzUwQibm1uq0= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/fx0Ospzfdbpoi5pWzUwQibm1uq0= deleted file mode 100755 index a69b1ec..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/fx0Ospzfdbpoi5pWzUwQibm1uq0= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/h+Un_yzAShVlBZ9f0VS3JKYKke0= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/h+Un_yzAShVlBZ9f0VS3JKYKke0= deleted file mode 100755 index 865488d..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/h+Un_yzAShVlBZ9f0VS3JKYKke0= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/hD6nraZL4eEABhMLLwcsxv2525o= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/hD6nraZL4eEABhMLLwcsxv2525o= deleted file mode 100755 index feebff2..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/hD6nraZL4eEABhMLLwcsxv2525o= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/j5CUB__6Z7cuklz3lMKA4WYcjBM= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/j5CUB__6Z7cuklz3lMKA4WYcjBM= deleted file mode 100755 index e27d24a..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/j5CUB__6Z7cuklz3lMKA4WYcjBM= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/lm+xGW5qC7e4BK6C29uleXJvMaA= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/lm+xGW5qC7e4BK6C29uleXJvMaA= deleted file mode 100755 index 3c086f3..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/lm+xGW5qC7e4BK6C29uleXJvMaA= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/o2Kng7h2LI+eYVCXJyJW3EuP8VE= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/o2Kng7h2LI+eYVCXJyJW3EuP8VE= deleted file mode 100755 index e7159a9..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/o2Kng7h2LI+eYVCXJyJW3EuP8VE= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/pPGNzkyT0XxkwABdFYEenm70G7E= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/pPGNzkyT0XxkwABdFYEenm70G7E= deleted file mode 100755 index c3f7927..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/pPGNzkyT0XxkwABdFYEenm70G7E= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/pubUXXBaH5ZKwpcg6UhNPKbQgII= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/pubUXXBaH5ZKwpcg6UhNPKbQgII= deleted file mode 100755 index 25547cc..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/pubUXXBaH5ZKwpcg6UhNPKbQgII= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/rM6gZufPKHh1hyNz6EvODo2orj4= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/rM6gZufPKHh1hyNz6EvODo2orj4= deleted file mode 100755 index 87586a5..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/rM6gZufPKHh1hyNz6EvODo2orj4= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/sMUIWTj2t7iJ3cXjpQnnzR_7JE8= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/sMUIWTj2t7iJ3cXjpQnnzR_7JE8= deleted file mode 100755 index f61d762..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/sMUIWTj2t7iJ3cXjpQnnzR_7JE8= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/uejRe7CZFpXmv_DlD1VBnKLo0O0= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/uejRe7CZFpXmv_DlD1VBnKLo0O0= deleted file mode 100755 index 1c79806..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/uejRe7CZFpXmv_DlD1VBnKLo0O0= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/vZkc2dUZdzttls1ATl0wgNnN4_4= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/vZkc2dUZdzttls1ATl0wgNnN4_4= deleted file mode 100755 index 33675e2..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/vZkc2dUZdzttls1ATl0wgNnN4_4= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/yZ0n0osW9g+Q_vmtt5tn1Yru_qk= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/yZ0n0osW9g+Q_vmtt5tn1Yru_qk= deleted file mode 100755 index 1423435..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/yZ0n0osW9g+Q_vmtt5tn1Yru_qk= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/yrlxzHw+yHjYg11iiloAU4Ui5Os= b/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/yrlxzHw+yHjYg11iiloAU4Ui5Os= deleted file mode 100755 index 371b441..0000000 Binary files a/code/Android App/build/intermediates/incremental/debug-mergeJniLibs/zip-cache/yrlxzHw+yHjYg11iiloAU4Ui5Os= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/ir_dep/debug/dependencies/AndroidManifest.xml b/code/Android App/build/intermediates/incremental/ir_dep/debug/dependencies/AndroidManifest.xml deleted file mode 100755 index 3fa470b..0000000 --- a/code/Android App/build/intermediates/incremental/ir_dep/debug/dependencies/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/code/Android App/build/intermediates/incremental/ir_dep/debug/package_dependencies/dex-renamer-state.txt b/code/Android App/build/intermediates/incremental/ir_dep/debug/package_dependencies/dex-renamer-state.txt deleted file mode 100755 index 537d3cc..0000000 --- a/code/Android App/build/intermediates/incremental/ir_dep/debug/package_dependencies/dex-renamer-state.txt +++ /dev/null @@ -1,4 +0,0 @@ -#Mon Mar 18 20:10:33 EDT 2019 -base.0=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\10 -path.0=classes.dex -renamed.0=classes.dex diff --git a/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_0/dex-renamer-state.txt b/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_0/dex-renamer-state.txt deleted file mode 100755 index 52732eb..0000000 --- a/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_0/dex-renamer-state.txt +++ /dev/null @@ -1,4 +0,0 @@ -#Mon Mar 18 20:10:36 EDT 2019 -base.0=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\0 -path.0=classes.dex -renamed.0=classes.dex diff --git a/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_1/dex-renamer-state.txt b/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_1/dex-renamer-state.txt deleted file mode 100755 index fe2f3f8..0000000 --- a/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_1/dex-renamer-state.txt +++ /dev/null @@ -1,4 +0,0 @@ -#Mon Mar 18 20:10:36 EDT 2019 -base.0=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\1 -path.0=classes.dex -renamed.0=classes.dex diff --git a/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_2/dex-renamer-state.txt b/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_2/dex-renamer-state.txt deleted file mode 100755 index 6a94871..0000000 --- a/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_2/dex-renamer-state.txt +++ /dev/null @@ -1,4 +0,0 @@ -#Mon Mar 18 20:10:36 EDT 2019 -base.0=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\2 -path.0=classes.dex -renamed.0=classes.dex diff --git a/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_3/dex-renamer-state.txt b/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_3/dex-renamer-state.txt deleted file mode 100755 index d038bf8..0000000 --- a/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_3/dex-renamer-state.txt +++ /dev/null @@ -1,4 +0,0 @@ -#Mon Mar 18 20:51:17 EDT 2019 -base.0=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\3 -path.0=classes.dex -renamed.0=classes.dex diff --git a/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_4/dex-renamer-state.txt b/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_4/dex-renamer-state.txt deleted file mode 100755 index 98c5883..0000000 --- a/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_4/dex-renamer-state.txt +++ /dev/null @@ -1,4 +0,0 @@ -#Mon Mar 18 20:10:36 EDT 2019 -base.0=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\4 -path.0=classes.dex -renamed.0=classes.dex diff --git a/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_5/dex-renamer-state.txt b/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_5/dex-renamer-state.txt deleted file mode 100755 index 74e47e9..0000000 --- a/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_5/dex-renamer-state.txt +++ /dev/null @@ -1,4 +0,0 @@ -#Mon Mar 18 20:10:36 EDT 2019 -base.0=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\5 -path.0=classes.dex -renamed.0=classes.dex diff --git a/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_6/dex-renamer-state.txt b/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_6/dex-renamer-state.txt deleted file mode 100755 index 286d88c..0000000 --- a/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_6/dex-renamer-state.txt +++ /dev/null @@ -1,4 +0,0 @@ -#Mon Mar 18 20:10:36 EDT 2019 -base.0=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\6 -path.0=classes.dex -renamed.0=classes.dex diff --git a/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_7/dex-renamer-state.txt b/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_7/dex-renamer-state.txt deleted file mode 100755 index 848dcb5..0000000 --- a/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_7/dex-renamer-state.txt +++ /dev/null @@ -1,4 +0,0 @@ -#Mon Mar 18 20:10:36 EDT 2019 -base.0=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\7 -path.0=classes.dex -renamed.0=classes.dex diff --git a/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_8/dex-renamer-state.txt b/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_8/dex-renamer-state.txt deleted file mode 100755 index 81b3072..0000000 --- a/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_8/dex-renamer-state.txt +++ /dev/null @@ -1,4 +0,0 @@ -#Mon Mar 18 20:10:36 EDT 2019 -base.0=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\8 -path.0=classes.dex -renamed.0=classes.dex diff --git a/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_9/dex-renamer-state.txt b/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_9/dex-renamer-state.txt deleted file mode 100755 index e0df426..0000000 --- a/code/Android App/build/intermediates/incremental/ir_slices/debug/package_slice_9/dex-renamer-state.txt +++ /dev/null @@ -1,4 +0,0 @@ -#Mon Mar 18 20:10:36 EDT 2019 -base.0=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\9 -path.0=classes.dex -renamed.0=classes.dex diff --git a/code/Android App/build/intermediates/incremental/mergeDebugAssets/merger.xml b/code/Android App/build/intermediates/incremental/mergeDebugAssets/merger.xml deleted file mode 100755 index f3abf6e..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugAssets/merger.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml b/code/Android App/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml deleted file mode 100755 index 821eb0a..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/compile-file-map.properties b/code/Android App/build/intermediates/incremental/mergeDebugResources/compile-file-map.properties deleted file mode 100755 index ed73a1e..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/compile-file-map.properties +++ /dev/null @@ -1,496 +0,0 @@ -#Mon Mar 18 19:54:16 EDT 2019 -C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\generated\\res\\pngs\\debug\\drawable-xxxhdpi\\ic_launcher_background.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi_ic_launcher_background.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_btn_text_color_selector.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_btn_text_color_selector.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_text_btn_text_color_selector.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_text_btn_text_color_selector.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_ic_ab_back_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_ic_ab_back_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_cab_background_top_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_cab_background_top_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\layout-v21\\notification_template_custom_big.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout-v21_notification_template_custom_big.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_scrubber_primary_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_scrubber_primary_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_scrubber_control_to_pressed_mtrl_005.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_btn_switch_to_on_mtrl_00012.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_text_select_handle_middle_mtrl_dark.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_text_select_handle_middle_mtrl_dark.png.flat -C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\generated\\res\\pngs\\debug\\drawable-hdpi\\ic_launcher_background.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi_ic_launcher_background.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\tooltip_frame_dark.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_tooltip_frame_dark.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-v21\\abc_action_bar_item_background_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-v21_abc_action_bar_item_background_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\mtrl_layout_snackbar.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_mtrl_layout_snackbar.xml.flat -C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\mipmap-anydpi-v26\\ic_launcher_round.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\mipmap-anydpi-v26_ic_launcher_round.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_text_select_handle_middle_mtrl_dark.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_text_select_handle_middle_mtrl_dark.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_ic_star_black_48dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_ic_star_black_48dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\anim\\abc_popup_enter.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_abc_popup_enter.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_tabs_legacy_text_color_selector.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_tabs_legacy_text_color_selector.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\anim-v21\\design_bottom_sheet_slide_in.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim-v21_design_bottom_sheet_slide_in.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_action_menu_layout.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_action_menu_layout.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout-sw600dp-v13\\mtrl_layout_snackbar.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout-sw600dp-v13_mtrl_layout_snackbar.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color-v23\\abc_tint_seek_thumb.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color-v23_abc_tint_seek_thumb.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-hdpi-v4\\design_ic_visibility.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_design_ic_visibility.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_layout_snackbar.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_layout_snackbar.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_tab_indicator_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_primary_text_material_light.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_primary_text_material_light.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_dialog_material_background.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_dialog_material_background.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_action_mode_close_item_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_action_mode_close_item_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_text_select_handle_left_mtrl_dark.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_text_select_handle_left_mtrl_dark.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_list_selector_background_transition_holo_light.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_list_selector_background_transition_holo_light.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_hint_foreground_material_dark.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_hint_foreground_material_dark.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-mdpi-v17\\abc_ic_menu_cut_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-mdpi-v17_abc_ic_menu_cut_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_tab_indicator_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_ic_menu_cut_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_ic_menu_cut_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\layout-v16\\notification_template_custom_big.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout-v16_notification_template_custom_big.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-watch-v20\\abc_dialog_material_background.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-watch-v20_abc_dialog_material_background.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_alert_dialog_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_alert_dialog_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_navigation_item_separator.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_navigation_item_separator.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_ic_menu_paste_mtrl_am_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_ic_menu_paste_mtrl_am_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_ic_menu_paste_mtrl_am_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_ic_menu_paste_mtrl_am_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_tabs_colored_ripple_color.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_tabs_colored_ripple_color.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_list_focused_holo.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_list_focused_holo.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_text_select_handle_left_mtrl_light.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_text_select_handle_left_mtrl_light.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_ic_commit_search_api_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_text_cursor_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_text_cursor_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_tint_btn_checkable.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_tint_btn_checkable.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_btn_switch_to_on_mtrl_00012.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_vector_test.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_vector_test.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_btn_check_to_on_mtrl_000.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_primary_text_disable_only_material_light.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_primary_text_disable_only_material_light.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_ic_menu_cut_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_ic_menu_cut_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_list_pressed_holo_light.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_list_pressed_holo_light.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_list_divider_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_tabs_ripple_color.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_tabs_ripple_color.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_ic_menu_share_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_ic_menu_share_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_popup_background_mtrl_mult.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_popup_background_mtrl_mult.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_dialog_title_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_dialog_title_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-hdpi-v4\\notification_bg_low_normal.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_notification_bg_low_normal.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\animator\\mtrl_fab_hide_motion_spec.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\animator_mtrl_fab_hide_motion_spec.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-mdpi-v4\\notification_bg_low_normal.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_notification_bg_low_normal.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-mdpi-v4\\design_ic_visibility_off.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_design_ic_visibility_off.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_ic_menu_selectall_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_ic_menu_selectall_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-xhdpi-v4\\notify_panel_notification_icon_bg.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_notify_panel_notification_icon_bg.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-v21\\abc_edit_text_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-v21_abc_edit_text_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_layout_tab_icon.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_layout_tab_icon.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_ic_star_half_black_36dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_ic_star_half_black_36dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout-sw600dp-v13\\design_layout_snackbar.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout-sw600dp-v13_design_layout_snackbar.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_list_selector_disabled_holo_light.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_list_selector_disabled_holo_light.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_btn_switch_to_on_mtrl_00001.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\select_dialog_multichoice_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_select_dialog_multichoice_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout-watch-v20\\abc_alert_dialog_button_bar_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout-watch-v20_abc_alert_dialog_button_bar_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_list_pressed_holo_dark.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_list_pressed_holo_dark.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_list_longpressed_holo.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_list_longpressed_holo.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color-v23\\abc_btn_colored_text_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color-v23_abc_btn_colored_text_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color-v23\\abc_color_highlight_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color-v23_abc_color_highlight_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_scrubber_control_to_pressed_mtrl_005.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_scrubber_control_off_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_scrubber_control_off_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_list_menu_item_radio.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_list_menu_item_radio.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_ic_menu_selectall_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_ic_menu_selectall_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-mdpi-v4\\design_ic_visibility.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_design_ic_visibility.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_navigation_item.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_navigation_item.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\anim\\abc_tooltip_exit.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_abc_tooltip_exit.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_popup_background_mtrl_mult.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_popup_background_mtrl_mult.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_textfield_search_activated_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_scrubber_track_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_scrubber_track_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_text_select_handle_left_mtrl_dark.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_text_select_handle_left_mtrl_dark.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\animator\\mtrl_btn_state_list_anim.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\animator_mtrl_btn_state_list_anim.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-hdpi-v4\\notify_panel_notification_icon_bg.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_notify_panel_notification_icon_bg.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_cab_background_top_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_cab_background_top_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_textfield_search_activated_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_ic_menu_copy_mtrl_am_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_ic_menu_copy_mtrl_am_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_btn_radio_to_on_mtrl_015.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_list_menu_item_layout.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_list_menu_item_layout.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_ic_star_black_36dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_ic_star_black_36dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\layout\\notification_template_part_time.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_notification_template_part_time.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_textfield_activated_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_secondary_text_material_light.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_secondary_text_material_light.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_ic_clear_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_ic_clear_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_ic_menu_selectall_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_ic_menu_selectall_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_scrubber_control_to_pressed_mtrl_005.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_btn_check_to_on_mtrl_015.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_action_bar_title_item.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_action_bar_title_item.xml.flat -C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\generated\\res\\pngs\\debug\\drawable-ldpi\\ic_launcher_background.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldpi_ic_launcher_background.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_textfield_default_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\layout\\notification_template_custom_big.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_notification_template_custom_big.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_text_select_handle_middle_mtrl_dark.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_text_select_handle_middle_mtrl_dark.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable\\notification_tile_bg.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_notification_tile_bg.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_list_selector_disabled_holo_dark.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_list_selector_disabled_holo_dark.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_btn_colored_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_btn_colored_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-v23\\abc_control_background_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-v23_abc_control_background_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_spinner_mtrl_am_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_alert_dialog_button_bar_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_alert_dialog_button_bar_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\layout\\notification_action_tombstone.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_notification_action_tombstone.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable\\navigation_empty_icon.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_navigation_empty_icon.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_ratingbar_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_ratingbar_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color-v23\\design_tint_password_toggle.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color-v23_design_tint_password_toggle.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable\\ic_mtrl_chip_checked_black.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_ic_mtrl_chip_checked_black.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_text_select_handle_left_mtrl_dark.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_text_select_handle_left_mtrl_dark.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_action_mode_bar.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_action_mode_bar.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_text_select_handle_right_mtrl_dark.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_text_select_handle_right_mtrl_dark.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_navigation_item_subheader.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_navigation_item_subheader.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_btn_radio_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_btn_radio_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_chip_ripple_color.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_chip_ripple_color.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_ab_share_pack_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_ab_share_pack_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_ab_share_pack_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_ab_share_pack_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_btn_radio_to_on_mtrl_000.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat -C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\mipmap-anydpi-v26\\ic_launcher.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\mipmap-anydpi-v26_ic_launcher.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\anim\\abc_grow_fade_in_from_bottom.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_abc_grow_fade_in_from_bottom.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_cascading_menu_item_layout.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_cascading_menu_item_layout.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_btn_borderless_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_btn_borderless_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_tab_indicator_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_ic_star_black_16dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_ic_star_black_16dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_item_background_holo_dark.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_item_background_holo_dark.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_btn_switch_to_on_mtrl_00012.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_textfield_default_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_popup_menu_item_layout.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_popup_menu_item_layout.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-mdpi-v4\\notify_panel_notification_icon_bg.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_notify_panel_notification_icon_bg.png.flat -C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\mipmap-xxxhdpi\\ic_launcher.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\mipmap-xxxhdpi_ic_launcher.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_ic_menu_overflow_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_ic_menu_overflow_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_ic_menu_paste_mtrl_am_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_ic_menu_paste_mtrl_am_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_text_select_handle_middle_mtrl_light.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_text_select_handle_middle_mtrl_light.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_background_cache_hint_selector_material_light.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_background_cache_hint_selector_material_light.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_menu_hardkey_panel_mtrl_mult.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_menu_hardkey_panel_mtrl_mult.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_scrubber_control_to_pressed_mtrl_000.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\mtrl_layout_snackbar_include.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_mtrl_layout_snackbar_include.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_switch_track_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_ic_star_half_black_16dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_ic_star_half_black_16dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_seekbar_track_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_seekbar_track_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_screen_simple.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_screen_simple.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\layout-v21\\notification_template_icon_group.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout-v21_notification_template_icon_group.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_list_longpressed_holo.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_list_longpressed_holo.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_layout_tab_text.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_layout_tab_text.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_textfield_activated_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_list_pressed_holo_dark.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_list_pressed_holo_dark.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_list_pressed_holo_dark.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_list_pressed_holo_dark.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-xxxhdpi-v17\\abc_spinner_mtrl_am_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-xxxhdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_btn_switch_to_on_mtrl_00001.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_background_cache_hint_selector_material_dark.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_background_cache_hint_selector_material_dark.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable\\mtrl_tabs_default_indicator.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_mtrl_tabs_default_indicator.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-anydpi-v21\\design_ic_visibility.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-anydpi-v21_design_ic_visibility.xml.flat -C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\generated\\res\\pngs\\debug\\drawable-anydpi-v21\\ic_launcher_background.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-anydpi-v21_ic_launcher_background.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color-v23\\abc_tint_default.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color-v23_abc_tint_default.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-xxxhdpi-v4\\design_ic_visibility.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_design_ic_visibility.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_activity_chooser_view.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_activity_chooser_view.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_tint_switch_track.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_tint_switch_track.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_cab_background_internal_bg.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_cab_background_internal_bg.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_ratingbar_indicator_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_ratingbar_indicator_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_screen_toolbar.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_screen_toolbar.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_tint_spinner.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_tint_spinner.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-xhdpi-v4\\design_ic_visibility.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_design_ic_visibility.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_text_select_handle_right_mtrl_dark.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_text_select_handle_right_mtrl_dark.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable\\design_fab_background.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_design_fab_background.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-v21\\avd_show_password.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-v21_avd_show_password.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_list_selector_disabled_holo_light.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_list_selector_disabled_holo_light.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_menu_hardkey_panel_mtrl_mult.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_menu_hardkey_panel_mtrl_mult.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\switch_thumb_material_light.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_switch_thumb_material_light.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_spinner_mtrl_am_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_spinner_mtrl_am_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat -C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\mipmap-mdpi\\ic_launcher_round.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\mipmap-mdpi_ic_launcher_round.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_btn_check_to_on_mtrl_015.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_btn_check_to_on_mtrl_015.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_ic_star_black_36dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_ic_star_black_36dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_scrubber_control_to_pressed_mtrl_000.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_scrubber_track_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_scrubber_track_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_list_selector_holo_dark.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_list_selector_holo_dark.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_btn_switch_to_on_mtrl_00012.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_primary_text_disable_only_material_dark.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_primary_text_disable_only_material_dark.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\design_tint_password_toggle.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_design_tint_password_toggle.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\anim\\abc_shrink_fade_out_from_bottom.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_abc_shrink_fade_out_from_bottom.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_primary_text_material_dark.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_primary_text_material_dark.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_list_menu_item_icon.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_list_menu_item_icon.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_text_select_handle_right_mtrl_light.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_text_select_handle_right_mtrl_light.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\interpolator\\mtrl_fast_out_slow_in.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\interpolator_mtrl_fast_out_slow_in.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_btn_check_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_btn_check_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_ic_commit_search_api_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\layout\\activity_settings.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_activity_settings.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\animator\\design_fab_show_motion_spec.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\animator_design_fab_show_motion_spec.xml.flat -C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\layout\\content_settings.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_content_settings.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_ic_star_half_black_16dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_ic_star_half_black_16dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_ic_menu_copy_mtrl_am_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_ic_menu_copy_mtrl_am_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\switch_thumb_material_dark.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_switch_thumb_material_dark.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_ic_go_search_api_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_ic_go_search_api_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\anim\\abc_slide_out_top.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_abc_slide_out_top.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_ic_star_black_16dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_ic_star_black_16dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\tooltip_frame_light.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_tooltip_frame_light.xml.flat -C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\generated\\res\\pngs\\debug\\drawable-xhdpi\\ic_launcher_background.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi_ic_launcher_background.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_tooltip.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_tooltip.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_text_select_handle_right_mtrl_dark.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_text_select_handle_right_mtrl_dark.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_select_dialog_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_select_dialog_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_search_url_text.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_search_url_text.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_chip_text_color.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_chip_text_color.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color-v23\\abc_tint_spinner.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color-v23_abc_tint_spinner.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_list_focused_holo.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_list_focused_holo.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_btn_switch_to_on_mtrl_00001.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_btn_radio_to_on_mtrl_000.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_btn_check_to_on_mtrl_000.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_btn_radio_to_on_mtrl_000.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_textfield_default_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_bottom_navigation_item.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_bottom_navigation_item.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_ic_star_half_black_48dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_ic_star_half_black_48dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_list_pressed_holo_light.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_list_pressed_holo_light.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_textfield_search_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_textfield_search_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color-v23\\abc_tint_edittext.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color-v23_abc_tint_edittext.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\anim\\design_snackbar_out.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_design_snackbar_out.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_list_divider_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_switch_thumb_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_switch_thumb_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_ic_search_api_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_ic_search_api_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_list_longpressed_holo.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_list_longpressed_holo.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout-v26\\abc_screen_toolbar.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout-v26_abc_screen_toolbar.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_ic_menu_paste_mtrl_am_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_ic_menu_paste_mtrl_am_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_ic_star_half_black_16dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_ic_star_half_black_16dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_ic_star_black_16dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_ic_star_black_16dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_scrubber_control_to_pressed_mtrl_005.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_scrubber_control_off_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_scrubber_control_off_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color-v23\\abc_tint_switch_track.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color-v23_abc_tint_switch_track.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_tabs_icon_color_selector_colored.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_tabs_icon_color_selector_colored.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_ab_share_pack_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_ab_share_pack_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-xxhdpi-v17\\abc_ic_menu_copy_mtrl_am_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-xxhdpi-v17_abc_ic_menu_copy_mtrl_am_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_textfield_search_default_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable\\design_bottom_navigation_item_background.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_design_bottom_navigation_item_background.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_text_select_handle_left_mtrl_dark.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_text_select_handle_left_mtrl_dark.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_action_menu_item_layout.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_action_menu_item_layout.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-v21\\avd_hide_password.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-v21_avd_hide_password.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_bottom_sheet_dialog.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_bottom_sheet_dialog.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_action_bar_up_container.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_action_bar_up_container.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable\\notification_bg_low.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_notification_bg_low.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_cab_background_top_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_cab_background_top_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_list_selector_background_transition_holo_dark.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_list_selector_background_transition_holo_dark.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_scrubber_control_to_pressed_mtrl_000.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\anim\\design_snackbar_in.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_design_snackbar_in.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_seekbar_tick_mark_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_seekbar_tick_mark_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_screen_content_include.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_screen_content_include.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_text_select_handle_middle_mtrl_dark.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_text_select_handle_middle_mtrl_dark.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\layout\\notification_template_icon_group.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_notification_template_icon_group.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_switch_track_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_menu_hardkey_panel_mtrl_mult.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_menu_hardkey_panel_mtrl_mult.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_btn_radio_to_on_mtrl_015.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-xhdpi-v17\\abc_spinner_mtrl_am_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-xhdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-hdpi-v17\\abc_ic_menu_cut_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-hdpi-v17_abc_ic_menu_cut_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_ratingbar_small_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_ratingbar_small_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-mdpi-v4\\notification_bg_normal_pressed.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_notification_bg_normal_pressed.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_ic_star_black_16dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_ic_star_black_16dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_popup_menu_header_item_layout.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_popup_menu_header_item_layout.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_cab_background_top_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_cab_background_top_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_chip_close_icon_tint.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_chip_close_icon_tint.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_text_select_handle_right_mtrl_light.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_text_select_handle_right_mtrl_light.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\interpolator-v21\\mtrl_linear_out_slow_in.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\interpolator-v21_mtrl_linear_out_slow_in.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\animator\\mtrl_chip_state_list_anim.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\animator_mtrl_chip_state_list_anim.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-xxhdpi-v17\\abc_ic_menu_cut_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-xxhdpi-v17_abc_ic_menu_cut_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_spinner_mtrl_am_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_ic_menu_paste_mtrl_am_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_ic_menu_paste_mtrl_am_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\select_dialog_singlechoice_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_select_dialog_singlechoice_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-mdpi-v4\\notification_bg_normal.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_notification_bg_normal.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\design_error.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_design_error.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_switch_track_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\mipmap-hdpi\\ic_launcher_round.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\mipmap-hdpi_ic_launcher_round.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-xxxhdpi-v17\\abc_ic_menu_copy_mtrl_am_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-xxxhdpi-v17_abc_ic_menu_copy_mtrl_am_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_list_selector_disabled_holo_dark.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_list_selector_disabled_holo_dark.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color-v21\\abc_btn_colored_borderless_text_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color-v21_abc_btn_colored_borderless_text_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\animator\\mtrl_fab_show_motion_spec.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\animator_mtrl_fab_show_motion_spec.xml.flat -C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\menu\\menu_main.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\menu_menu_main.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_list_divider_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-v21\\abc_dialog_material_background.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-v21_abc_dialog_material_background.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_tint_edittext.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_tint_edittext.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_scrubber_control_to_pressed_mtrl_000.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\layout-v21\\notification_action_tombstone.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout-v21_notification_action_tombstone.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_ic_star_black_48dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_ic_star_black_48dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_scrubber_track_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_scrubber_track_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_list_pressed_holo_dark.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_list_pressed_holo_dark.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\layout\\notification_template_part_chronometer.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_notification_template_part_chronometer.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-hdpi-v17\\abc_ic_menu_copy_mtrl_am_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-hdpi-v17_abc_ic_menu_copy_mtrl_am_alpha.png.flat -C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\mipmap-xhdpi\\ic_launcher.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\mipmap-xhdpi_ic_launcher.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\anim\\abc_fade_in.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_abc_fade_in.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\anim\\design_bottom_sheet_slide_in.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_design_bottom_sheet_slide_in.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\interpolator\\mtrl_linear.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\interpolator_mtrl_linear.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_text_select_handle_right_mtrl_dark.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_text_select_handle_right_mtrl_dark.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_switch_track_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_btn_text_btn_ripple_color.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_btn_text_btn_ripple_color.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_tint_seek_thumb.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_tint_seek_thumb.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-xxhdpi-v4\\design_ic_visibility.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_design_ic_visibility.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_ic_star_half_black_48dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_ic_star_half_black_48dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_ic_star_half_black_48dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_ic_star_half_black_48dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_ic_star_half_black_36dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_ic_star_half_black_36dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-xhdpi-v4\\notification_bg_normal_pressed.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_notification_bg_normal_pressed.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_list_selector_holo_light.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_list_selector_holo_light.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\support_simple_spinner_dropdown_item.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_support_simple_spinner_dropdown_item.xml.flat -C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\layout\\content_main.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_content_main.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\anim\\abc_slide_in_bottom.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_abc_slide_in_bottom.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color-v23\\abc_btn_colored_borderless_text_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color-v23_abc_btn_colored_borderless_text_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_search_dropdown_item_icons_2line.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_search_dropdown_item_icons_2line.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-xhdpi-v4\\design_ic_visibility_off.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_design_ic_visibility_off.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_btn_colored_text_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_btn_colored_text_material.xml.flat -C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\mipmap-xxhdpi\\ic_launcher.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\mipmap-xxhdpi_ic_launcher.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_bottom_nav_item_tint.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_bottom_nav_item_tint.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_layout_snackbar_include.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_layout_snackbar_include.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\anim\\abc_popup_exit.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_abc_popup_exit.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_textfield_activated_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_btn_check_to_on_mtrl_015.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-v21\\notification_action_background.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-v21_notification_action_background.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_popup_background_mtrl_mult.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_popup_background_mtrl_mult.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_textfield_search_activated_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_list_selector_disabled_holo_dark.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_list_selector_disabled_holo_dark.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\interpolator\\mtrl_linear_out_slow_in.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\interpolator_mtrl_linear_out_slow_in.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\animator\\mtrl_btn_unelevated_state_list_anim.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\animator_mtrl_btn_unelevated_state_list_anim.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_ic_star_black_16dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_ic_star_black_16dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-hdpi-v4\\design_ic_visibility_off.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_design_ic_visibility_off.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-v21\\abc_btn_colored_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-v21_abc_btn_colored_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable\\ic_mtrl_chip_checked_circle.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_ic_mtrl_chip_checked_circle.xml.flat -C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\mipmap-xxhdpi\\ic_launcher_round.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\mipmap-xxhdpi_ic_launcher_round.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_text_select_handle_left_mtrl_light.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_text_select_handle_left_mtrl_light.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_ic_menu_selectall_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_ic_menu_selectall_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_list_selector_disabled_holo_light.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_list_selector_disabled_holo_light.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_text_select_handle_left_mtrl_light.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_text_select_handle_left_mtrl_light.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_scrubber_primary_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_scrubber_primary_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_btn_radio_to_on_mtrl_000.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat -C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\generated\\res\\pngs\\debug\\drawable-xxhdpi\\ic_launcher_background.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi_ic_launcher_background.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_list_pressed_holo_light.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_list_pressed_holo_light.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\animator\\design_fab_hide_motion_spec.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\animator_design_fab_hide_motion_spec.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_ic_menu_share_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_ic_menu_share_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_scrubber_control_off_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_scrubber_control_off_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_ic_star_black_48dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_ic_star_black_48dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-xhdpi-v4\\notification_bg_low_normal.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_notification_bg_low_normal.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_ic_menu_cut_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_ic_menu_cut_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\mipmap-mdpi\\ic_launcher.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\mipmap-mdpi_ic_launcher.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_btn_check_to_on_mtrl_000.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_text_select_handle_left_mtrl_dark.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_text_select_handle_left_mtrl_dark.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-mdpi-v4\\notification_bg_low_pressed.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_notification_bg_low_pressed.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_list_selector_disabled_holo_dark.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_list_selector_disabled_holo_dark.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_text_input_password_icon.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_text_input_password_icon.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_tab_indicator_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_tab_indicator_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\anim\\abc_tooltip_enter.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_abc_tooltip_enter.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_list_pressed_holo_light.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_list_pressed_holo_light.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable\\design_password_eye.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_design_password_eye.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_textfield_default_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-xxhdpi-v4\\design_ic_visibility_off.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_design_ic_visibility_off.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\animator\\mtrl_fab_transformation_sheet_expand_spec.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\animator_mtrl_fab_transformation_sheet_expand_spec.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_textfield_search_activated_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_btn_colored_borderless_text_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_btn_colored_borderless_text_material.xml.flat -C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\layout\\activity_main.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_activity_main.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_ic_star_half_black_36dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_ic_star_half_black_36dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-v21\\design_bottom_navigation_item_background.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-v21_design_bottom_navigation_item_background.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_ic_star_half_black_36dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_ic_star_half_black_36dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-v21\\abc_list_divider_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-v21_abc_list_divider_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_activity_chooser_view_list_item.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_activity_chooser_view_list_item.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-hdpi-v4\\notification_bg_low_pressed.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_notification_bg_low_pressed.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_btn_bg_color_selector.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_btn_bg_color_selector.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_ic_star_half_black_48dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_ic_star_half_black_48dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\anim\\abc_slide_out_bottom.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_abc_slide_out_bottom.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_tab_indicator_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_navigation_menu.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_navigation_menu.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-xhdpi-v17\\abc_ic_menu_copy_mtrl_am_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-xhdpi-v17_abc_ic_menu_copy_mtrl_am_alpha.png.flat -C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\mipmap-xxxhdpi\\ic_launcher_round.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\mipmap-xxxhdpi_ic_launcher_round.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-anydpi-v21\\design_ic_visibility_off.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-anydpi-v21_design_ic_visibility_off.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_edit_text_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_edit_text_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-hdpi-v4\\notification_bg_normal.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_notification_bg_normal.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_fab_ripple_color.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_fab_ripple_color.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_tab_indicator_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_btn_switch_to_on_mtrl_00001.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_alert_dialog_title_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_alert_dialog_title_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_text_select_handle_middle_mtrl_light.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_text_select_handle_middle_mtrl_light.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\layout\\notification_action.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_notification_action.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\interpolator\\mtrl_fast_out_linear_in.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\interpolator_mtrl_fast_out_linear_in.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_spinner_mtrl_am_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_textfield_search_default_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_btn_radio_to_on_mtrl_015.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_ic_commit_search_api_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\mipmap-hdpi\\ic_launcher.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\mipmap-hdpi_ic_launcher.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable\\design_snackbar_background.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_design_snackbar_background.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_expanded_menu_layout.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_expanded_menu_layout.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_menu_hardkey_panel_mtrl_mult.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_menu_hardkey_panel_mtrl_mult.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-xxhdpi-v17\\abc_spinner_mtrl_am_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-xxhdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_ic_menu_share_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_ic_menu_share_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_ic_star_black_48dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_ic_star_black_48dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-xhdpi-v4\\notification_bg_low_pressed.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_notification_bg_low_pressed.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_menu_item_action_area.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_menu_item_action_area.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-xxxhdpi-v17\\abc_ic_menu_cut_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-xxxhdpi-v17_abc_ic_menu_cut_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\animator-v21\\design_appbar_state_list_animator.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\animator-v21_design_appbar_state_list_animator.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-xhdpi-v4\\notification_bg_normal.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_notification_bg_normal.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_ic_voice_search_api_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_ic_voice_search_api_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_scrubber_control_to_pressed_mtrl_000.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\anim\\abc_slide_in_top.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_abc_slide_in_top.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_navigation_item_header.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_navigation_item_header.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_tabs_icon_color_selector.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_tabs_icon_color_selector.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_screen_simple_overlay_action_mode.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_screen_simple_overlay_action_mode.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_seekbar_thumb_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_seekbar_thumb_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_text_select_handle_right_mtrl_light.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_text_select_handle_right_mtrl_light.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_ic_star_black_36dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_ic_star_black_36dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_bottom_nav_colored_item_tint.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_bottom_nav_colored_item_tint.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_scrubber_control_off_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_scrubber_control_off_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-v21\\design_password_eye.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-v21_design_password_eye.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\layout\\design_navigation_menu_item.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_design_navigation_menu_item.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_ic_menu_share_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_ic_menu_share_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-hdpi-v17\\abc_spinner_mtrl_am_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-hdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_ic_menu_share_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_ic_menu_share_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-mdpi-v17\\abc_spinner_mtrl_am_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-mdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_ic_menu_cut_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_ic_menu_cut_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_list_selector_disabled_holo_light.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_list_selector_disabled_holo_light.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_text_select_handle_left_mtrl_light.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_text_select_handle_left_mtrl_light.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_ic_star_half_black_16dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_ic_star_half_black_16dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_text_select_handle_middle_mtrl_light.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_text_select_handle_middle_mtrl_light.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_spinner_textfield_background_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_spinner_textfield_background_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_btn_check_to_on_mtrl_000.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_btn_check_to_on_mtrl_000.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable\\notification_icon_background.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_notification_icon_background.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-xhdpi-v17\\abc_ic_menu_cut_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-xhdpi-v17_abc_ic_menu_cut_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_chip_background_color.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_chip_background_color.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_popup_background_mtrl_mult.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_popup_background_mtrl_mult.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_cab_background_top_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_cab_background_top_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_list_divider_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_scrubber_track_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_scrubber_track_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_ic_menu_copy_mtrl_am_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_ic_menu_copy_mtrl_am_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_secondary_text_material_dark.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_secondary_text_material_dark.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable\\ic_mtrl_chip_close_circle.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_ic_mtrl_chip_close_circle.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_ic_star_half_black_36dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_ic_star_half_black_36dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_scrubber_primary_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_scrubber_primary_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_ic_menu_copy_mtrl_am_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_ic_menu_copy_mtrl_am_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_ic_menu_copy_mtrl_am_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_ic_menu_copy_mtrl_am_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_textfield_search_default_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_list_focused_holo.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_list_focused_holo.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\anim\\abc_fade_out.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_abc_fade_out.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_ic_menu_selectall_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_ic_menu_selectall_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout-watch-v20\\abc_alert_dialog_title_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout-watch-v20_abc_alert_dialog_title_material.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\interpolator-v21\\mtrl_fast_out_slow_in.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\interpolator-v21_mtrl_fast_out_slow_in.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable\\notification_bg.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_notification_bg.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\animator\\mtrl_fab_transformation_sheet_collapse_spec.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\animator_mtrl_fab_transformation_sheet_collapse_spec.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_ic_star_black_48dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_ic_star_black_48dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable-xxxhdpi-v4\\design_ic_visibility_off.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_design_ic_visibility_off.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_scrubber_primary_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_scrubber_primary_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_ic_commit_search_api_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color-v23\\abc_tint_btn_checkable.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color-v23_abc_tint_btn_checkable.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_text_select_handle_right_mtrl_dark.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_text_select_handle_right_mtrl_dark.png.flat -C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\generated\\res\\pngs\\debug\\drawable-mdpi\\ic_launcher_background.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi_ic_launcher_background.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_btn_radio_to_on_mtrl_015.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-ldrtl-mdpi-v17\\abc_ic_menu_copy_mtrl_am_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-ldrtl-mdpi-v17_abc_ic_menu_copy_mtrl_am_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_ic_star_black_36dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_ic_star_black_36dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_btn_check_to_on_mtrl_015.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_btn_radio_to_on_mtrl_015.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_ab_share_pack_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_ab_share_pack_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_btn_switch_to_on_mtrl_00012.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\drawable\\mtrl_snackbar_background.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_mtrl_snackbar_background.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\select_dialog_item_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_select_dialog_item_material.xml.flat -C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\drawable-v24\\ic_launcher_foreground.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-v24_ic_launcher_foreground.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_scrubber_control_to_pressed_mtrl_005.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_textfield_search_default_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\interpolator-v21\\mtrl_fast_out_linear_in.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\interpolator-v21_mtrl_fast_out_linear_in.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_item_background_holo_light.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_item_background_holo_light.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_search_view.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_search_view.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_list_focused_holo.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_list_focused_holo.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_tint_default.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_tint_default.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\anim-v21\\design_bottom_sheet_slide_out.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim-v21_design_bottom_sheet_slide_out.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_btn_stroke_color_selector.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_btn_stroke_color_selector.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_switch_track_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\color\\mtrl_btn_ripple_color.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_mtrl_btn_ripple_color.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\drawable-hdpi-v4\\notification_bg_normal_pressed.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_notification_bg_normal_pressed.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xhdpi-v4\\abc_text_select_handle_middle_mtrl_light.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xhdpi-v4_abc_text_select_handle_middle_mtrl_light.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\res\\layout-v21\\notification_action.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout-v21_notification_action.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_ic_arrow_drop_right_black_24dp.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_ic_arrow_drop_right_black_24dp.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_ic_star_half_black_48dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_ic_star_half_black_48dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_list_divider_material.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_list_divider_material.xml.flat -C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\src\\main\\res\\mipmap-xhdpi\\ic_launcher_round.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\mipmap-xhdpi_ic_launcher_round.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxhdpi-v4\\abc_btn_switch_to_on_mtrl_00001.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxhdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_ic_menu_cut_mtrl_alpha.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_ic_menu_cut_mtrl_alpha.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_text_select_handle_right_mtrl_light.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_text_select_handle_right_mtrl_light.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_text_select_handle_left_mtrl_light.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_text_select_handle_left_mtrl_light.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_textfield_activated_mtrl_alpha.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable\\abc_btn_default_mtrl_shape.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable_abc_btn_default_mtrl_shape.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-xxxhdpi-v4\\abc_btn_radio_to_on_mtrl_000.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-xxxhdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\color\\abc_hint_foreground_material_light.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\color_abc_hint_foreground_material_light.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\res\\anim\\design_bottom_sheet_slide_out.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\anim_design_bottom_sheet_slide_out.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_ic_star_half_black_16dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_ic_star_half_black_16dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\layout\\abc_list_menu_item_checkbox.xml=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\layout_abc_list_menu_item_checkbox.xml.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_ic_star_black_36dp.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_ic_star_black_36dp.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-mdpi-v4\\abc_list_longpressed_holo.9.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-mdpi-v4_abc_list_longpressed_holo.9.png.flat -C\:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\res\\drawable-hdpi-v4\\abc_text_select_handle_right_mtrl_light.png=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\res\\merged\\debug\\drawable-hdpi-v4_abc_text_select_handle_right_mtrl_light.png.flat diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-af/values-af.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-af/values-af.xml deleted file mode 100755 index d8fe69b..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-af/values-af.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Navigeer tuis" - "Navigeer op" - "Nog opsies" - "Klaar" - "Sien alles" - "Kies \'n program" - "AF" - "AAN" - "Alt+" - "Ctrl+" - "delete" - "enter" - "Funksie+" - "Meta+" - "Shift+" - "spasiebalk" - "Simbool+" - "Kieslys+" - "Soek …" - "Vee navraag uit" - "Soeknavraag" - "Soek" - "Dien navraag in" - "Stemsoektog" - "Deel met" - "Deel met %s" - "Vou in" - "Soek" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-am/values-am.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-am/values-am.xml deleted file mode 100755 index 1029135..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-am/values-am.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "ወደ መነሻ ይዳስሱ" - "ወደ ላይ ይዳስሱ" - "ተጨማሪ አማራጮች" - "ተከናውኗል" - "ሁሉንም ይመልከቱ" - "መተግበሪያ ይምረጡ" - "ጠፍቷል" - "በርቷል" - "Alt+" - "Ctrl+" - "ሰርዝ" - "enter" - "Function+" - "Meta+" - "Shift+" - "space" - "Sym+" - "ምናሌ+" - "ፈልግ…" - "መጠይቅ አጽዳ" - "የፍለጋ ጥያቄ" - "ፍለጋ" - "መጠይቅ ያስረክቡ" - "የድምፅ ፍለጋ" - "ከሚከተለው ጋር ያጋሩ" - "ከ%s ጋር አጋራ" - "ሰብስብ" - "ፈልግ" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ar/values-ar.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ar/values-ar.xml deleted file mode 100755 index e7fb419..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ar/values-ar.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "التنقل إلى الشاشة الرئيسية" - "التنقل إلى أعلى" - "خيارات إضافية" - "تم" - "عرض الكل" - "اختيار تطبيق" - "إيقاف" - "تشغيل" - "Alt+" - "Ctrl+" - "delete" - "enter" - "Function+" - "Meta+" - "Shift+" - "space" - "Sym+" - "القائمة+" - "بحث…" - "محو طلب البحث" - "طلب البحث" - "بحث" - "إرسال طلب البحث" - "البحث الصوتي" - "مشاركة مع" - "مشاركة مع %s" - "تصغير" - "البحث" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-as/values-as.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-as/values-as.xml deleted file mode 100755 index 2287e53..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-as/values-as.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "গৃহ পৃষ্ঠালৈ যাওক" - "ওপৰলৈ যাওক" - "অধিক বিকল্প" - "সম্পন্ন কৰা হ\'ল" - "সকলো চাওক" - "এটা এপ্ বাছনি কৰক" - "অফ কৰক" - "অন কৰক" - "Alt+" - "CTRL+" - "মচক" - "এণ্টাৰ" - "ফাংশ্বন+" - "মেটা+" - "শ্বিফ্ট+" - "স্পেচ" - "Sym+" - "মেনু+" - "অনুসন্ধান কৰক…" - "প্ৰশ্ন মচক" - "সন্ধান কৰিব খোজা প্ৰশ্ন" - "সন্ধান কৰক" - "প্ৰশ্ন দাখিল কৰক" - "কণ্ঠধ্বনিৰ যোগেৰে সন্ধান কৰক" - "ইয়াৰ জৰিয়তে শ্বেয়াৰ কৰক" - "%sৰ জৰিয়তে শ্বেয়াৰ কৰক" - "সংকুচিত কৰক" - "অনুসন্ধান কৰক" - "৯৯৯+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-az/values-az.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-az/values-az.xml deleted file mode 100755 index 8bbbd5b..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-az/values-az.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Evə naviqasiya et" - "Yuxarı get" - "Digər variantlar" - "Hazırdır" - "Hamısına baxın" - "Tətbiq seçin" - "DEAKTİV" - "AKTİV" - "Alt+" - "Ctrl+" - "silin" - "daxil olun" - "Funksiya+" - "Meta+" - "Shift+" - "kosmos" - "Sym+" - "Menyu+" - "Axtarış..." - "Sorğunu təmizlə" - "Axtarış sorğusu" - "Axtarış" - "Sorğunu göndərin" - "Səsli axtarış" - "Bununla paylaşın" - "%s ilə paylaşın" - "Yığışdırın" - "Axtarış" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-b+sr+Latn/values-b+sr+Latn.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-b+sr+Latn/values-b+sr+Latn.xml deleted file mode 100755 index 77f07c2..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-b+sr+Latn/values-b+sr+Latn.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Odlazak na Početnu" - "Kretanje nagore" - "Još opcija" - "Gotovo" - "Prikaži sve" - "Izbor aplikacije" - "ISKLJUČI" - "UKLJUČI" - "Alt+" - "Ctrl+" - "delete" - "enter" - "Function+" - "Meta+" - "Shift+" - "taster za razmak" - "Sym+" - "Menu+" - "Pretražite..." - "Brisanje upita" - "Upit za pretragu" - "Pretraga" - "Slanje upita" - "Glasovna pretraga" - "Deli sa" - "Deljenje sa aplikacijom %s" - "Skupi" - "Pretraži" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-be/values-be.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-be/values-be.xml deleted file mode 100755 index a0019be..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-be/values-be.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Перайсці на галоўную старонку" - "Перайсці ўверх" - "Дадатковыя параметры" - "Гатова" - "Прагледзець усё" - "Выбраць праграму" - "ВЫКЛ." - "УКЛ." - "Alt +" - "Ctrl +" - "Delete" - "Enter" - "Fn +" - "Meta +" - "Shift +" - "Прабел" - "Sym +" - "Меню +" - "Пошук..." - "Выдалiць запыт" - "Запыт на пошук" - "Пошук" - "Адправіць запыт" - "Галасавы пошук" - "Абагуліць з" - "Абагуліць праз праграму %s" - "Згарнуць" - "Пошук" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-bg/values-bg.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-bg/values-bg.xml deleted file mode 100755 index ce1cb44..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-bg/values-bg.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Придвижване към „Начало“" - "Придвижване нагоре" - "Още опции" - "Готово" - "Вижте всички" - "Изберете приложение" - "ИЗКЛ." - "ВКЛ." - "Alt+" - "Ctrl+" - "delete" - "enter" - "Function+" - "Meta+" - "Shift+" - "клавиша за интервал" - "Sym+" - "Menu+" - "Търсете…" - "Изчистване на заявката" - "Заявка за търсене" - "Търсене" - "Изпращане на заявката" - "Гласово търсене" - "Споделяне със:" - "Споделяне със: %s" - "Свиване" - "Търсене" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-bn/values-bn.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-bn/values-bn.xml deleted file mode 100755 index b9e182a..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-bn/values-bn.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "হোম এ নেভিগেট করুন" - "উপরের দিকে নেভিগেট করুন" - "আরও বিকল্প" - "সম্পন্ন হয়েছে" - "সবগুলো দেখুন" - "একটি অ্যাপ্লিকেশান বেছে নিন" - "বন্ধ" - "চালু" - "Alt+" - "Ctrl+" - "মুছুন" - "enter" - "Function+" - "Meta+" - "Shift+" - "স্পেস" - "Sym+" - "মেনু+" - "অনুসন্ধান..." - "ক্যোয়ারী সাফ করুন" - "ক্যোয়ারী খুঁজুন" - "খুঁজুন" - "ক্যোয়ারী জমা দিন" - "ভয়েস অনুসন্ধান" - "এর সাথে শেয়ার করুন" - "%s এর সাথে শেয়ার করুন" - "সঙ্কুচিত করুন" - "খুঁজুন" - "৯৯৯+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-bs/values-bs.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-bs/values-bs.xml deleted file mode 100755 index bc8630d..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-bs/values-bs.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Vrati se na početnu stranicu" - "Navigiraj prema gore" - "Više opcija" - "Gotovo" - "Prikaži sve" - "Odaberite aplikaciju" - "ISKLJUČI" - "UKLJUČI" - "Alt+" - "Ctrl+" - "delete" - "enter" - "Function+" - "Meta+" - "Shift+" - "razmaknica" - "Sym+" - "Menu+" - "Pretraži..." - "Obriši upit" - "Pretraži upit" - "Traži" - "Pošalji upit" - "Glasovno pretraživanje" - "Dijeli sa" - "Dijeli koristeći aplikaciju %s" - "Skupi" - "Pretraži" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ca/values-ca.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ca/values-ca.xml deleted file mode 100755 index 833039e..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ca/values-ca.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Navega a la pàgina d\'inici" - "Navega cap a dalt" - "Més opcions" - "Fet" - "Mostra\'ls tots" - "Selecciona una aplicació" - "DESACTIVAT" - "ACTIVAT" - "Alt+" - "Ctrl+" - "Supr" - "Retorn" - "Funció+" - "Meta+" - "Maj+" - "Espai" - "Sym+" - "Menú+" - "Cerca..." - "Esborra la consulta" - "Consulta de cerca" - "Cerca" - "Envia la consulta" - "Cerca per veu" - "Comparteix amb" - "Comparteix amb %s" - "Replega" - "Cerca" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-cs/values-cs.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-cs/values-cs.xml deleted file mode 100755 index a5878ca..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-cs/values-cs.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Přejít na plochu" - "Přejít nahoru" - "Více možností" - "Hotovo" - "Zobrazit vše" - "Vybrat aplikaci" - "VYPNUTO" - "ZAPNUTO" - "Alt+" - "Ctrl+" - "delete" - "enter" - "Fn+" - "Meta+" - "Shift+" - "mezerník" - "Sym+" - "Menu+" - "Vyhledat…" - "Smazat dotaz" - "Vyhledávací dotaz" - "Hledat" - "Odeslat dotaz" - "Hlasové vyhledávání" - "Sdílet pomocí" - "Sdílet s aplikací %s" - "Sbalit" - "Hledat" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-da/values-da.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-da/values-da.xml deleted file mode 100755 index 7ae28b4..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-da/values-da.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Naviger hjem" - "Naviger op" - "Flere muligheder" - "Luk" - "Se alle" - "Vælg en app" - "FRA" - "TIL" - "Alt+" - "Ctrl+" - "delete" - "enter" - "Fn+" - "Meta+" - "Shift+" - "mellemrum" - "Sym+" - "Menu+" - "Søg…" - "Ryd forespørgslen" - "Søgeforespørgsel" - "Søg" - "Indsend forespørgslen" - "Talesøgning" - "Del med" - "Del med %s" - "Skjul" - "Søg" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-de/values-de.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-de/values-de.xml deleted file mode 100755 index d2f8510..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-de/values-de.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Zur Startseite" - "Nach oben" - "Weitere Optionen" - "Fertig" - "Alle ansehen" - "App auswählen" - "Aus" - "An" - "Alt +" - "Strg +" - "Löschen" - "Eingabetaste" - "Funktionstaste +" - "Meta-Taste +" - "Umschalttaste +" - "Leertaste +" - "Sym-Taste +" - "Menütaste +" - "Suchen…" - "Suchanfrage löschen" - "Suchanfrage" - "Suchen" - "Suchanfrage senden" - "Sprachsuche" - "Freigeben für" - "Mit %s teilen" - "Minimieren" - "Suchen" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-el/values-el.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-el/values-el.xml deleted file mode 100755 index de7398c..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-el/values-el.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Πλοήγηση στην αρχική σελίδα" - "Πλοήγηση προς τα επάνω" - "Περισσότερες επιλογές" - "Τέλος" - "Προβολή όλων" - "Επιλέξτε κάποια εφαρμογή" - "ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ" - "ΕΝΕΡΓΟΠΟΙΗΣΗ" - "Alt+" - "Ctrl+" - "delete" - "enter" - "Function+" - "Meta+" - "Shift+" - "διάστημα" - "Sym+" - "Menu+" - "Αναζήτηση…" - "Διαγραφή ερωτήματος" - "Ερώτημα αναζήτησης" - "Αναζήτηση" - "Υποβολή ερωτήματος" - "Φωνητική αναζήτηση" - "Κοινή χρήση με" - "Κοινή χρήση με %s" - "Σύμπτυξη" - "Αναζήτηση" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-en-rAU/values-en-rAU.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-en-rAU/values-en-rAU.xml deleted file mode 100755 index 0b21ff7..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-en-rAU/values-en-rAU.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Navigate home" - "Navigate up" - "More options" - "Done" - "See all" - "Choose an app" - "OFF" - "ON" - "Alt+" - "Ctrl+" - "delete" - "enter" - "Function+" - "Meta+" - "Shift+" - "space" - "Sym+" - "Menu+" - "Search…" - "Clear query" - "Search query" - "Search" - "Submit query" - "Voice search" - "Share with" - "Share with %s" - "Collapse" - "Search" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-en-rCA/values-en-rCA.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-en-rCA/values-en-rCA.xml deleted file mode 100755 index 0b21ff7..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-en-rCA/values-en-rCA.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Navigate home" - "Navigate up" - "More options" - "Done" - "See all" - "Choose an app" - "OFF" - "ON" - "Alt+" - "Ctrl+" - "delete" - "enter" - "Function+" - "Meta+" - "Shift+" - "space" - "Sym+" - "Menu+" - "Search…" - "Clear query" - "Search query" - "Search" - "Submit query" - "Voice search" - "Share with" - "Share with %s" - "Collapse" - "Search" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-en-rGB/values-en-rGB.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-en-rGB/values-en-rGB.xml deleted file mode 100755 index 0b21ff7..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-en-rGB/values-en-rGB.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Navigate home" - "Navigate up" - "More options" - "Done" - "See all" - "Choose an app" - "OFF" - "ON" - "Alt+" - "Ctrl+" - "delete" - "enter" - "Function+" - "Meta+" - "Shift+" - "space" - "Sym+" - "Menu+" - "Search…" - "Clear query" - "Search query" - "Search" - "Submit query" - "Voice search" - "Share with" - "Share with %s" - "Collapse" - "Search" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-en-rIN/values-en-rIN.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-en-rIN/values-en-rIN.xml deleted file mode 100755 index 0b21ff7..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-en-rIN/values-en-rIN.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Navigate home" - "Navigate up" - "More options" - "Done" - "See all" - "Choose an app" - "OFF" - "ON" - "Alt+" - "Ctrl+" - "delete" - "enter" - "Function+" - "Meta+" - "Shift+" - "space" - "Sym+" - "Menu+" - "Search…" - "Clear query" - "Search query" - "Search" - "Submit query" - "Voice search" - "Share with" - "Share with %s" - "Collapse" - "Search" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-en-rXC/values-en-rXC.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-en-rXC/values-en-rXC.xml deleted file mode 100755 index 52e1a7d..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-en-rXC/values-en-rXC.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‎‏‏‎‏‏‏‎‎‏‎‎‎‏‏‎‏‏‏‎‎‏‏‏‎‎‏‎‎‏‏‎‎‎‏‎Navigate home‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‎‏‏‏‏‏‎‏‎‎‏‏‎‏‎‎‎‎‎‏‏‏‎‏‎‎‎‎‎‏‏‎‏‏‎‎‏‎‏‎‏‏‏‏‏‎‎Navigate up‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‏‏‎‎‏‏‏‎‎‎‏‎‎‏‏‏‎‏‎‎‏‏‎‎‏‎‎‏‎‏‎‏‎‎‎‏‏‏‎‏‎‎‎‏‏‎‏‎‎‎‏‎‎‏‏‎‎More options‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎‎‏‎‎‏‎‏‏‏‎‏‎‎‎‏‏‏‎‎‏‎‎‏‏‏‎‎‏‎‎‎‏‏‎‏‎‎‏‎‎‎‎‏‎‎‏‎‏‏‏‏‎‏‏‎Done‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‎‎‏‏‎‏‎‏‏‎‏‏‏‏‏‎‎‏‏‏‎‎‏‏‏‏‎‏‎‎‏‎‎‎‎‏‏‎‎‎‎‏‏‎‏‎‎‏‏‏‏‎‏‎See all‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‎‎‏‏‎‎‏‎‎‏‏‏‎‎‎‏‏‏‏‏‏‎‎‎‏‎‎‏‎‏‎‎‎‏‏‎‏‎‏‏‎‎‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎Choose an app‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‏‎‏‎‏‏‏‎‎‏‎‏‏‎‏‎‏‏‎‏‎‏‏‎‎‏‎‏‏‎‎‏‏‎‎‎‏‏‎‎‎‎‏‏‏‎‏‎‎‎‎‎‏‎‎‏‎OFF‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‎‎‎‎‏‏‏‏‎‏‎‎‎‎‏‏‏‏‏‏‎‎‏‎‎‎‏‎‏‎‎‏‎‎‎‏‎‎‎‎‎‎‎‎‏‏‏‎‏‏‏‎‏‏‎ON‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‎‎‎‏‎‎‏‎‏‎‏‎‎‎‎‏‎‎‏‎‏‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‏‏‎‏‎‎‎‏‎‏‏‏‎‏‏‏‏‏‎Alt+‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‎‎‎‏‎‏‎‏‏‏‏‏‏‎‏‎‎‎‏‎‎‏‎‏‏‎‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‏‎‎‎‎‎Ctrl+‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‏‏‎‎‏‎‎‎‎‏‏‎‎‎‎‏‏‏‎‎‎‏‎‎‏‏‎‎‏‏‏‏‏‏‎‎‏‏‎‏‏‎‎‎‎‎‎‎‎‏‏‎‎delete‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‎‎‎‏‏‏‎‏‎‎‏‏‎‏‏‎‎‎‎‎‎‎‏‏‏‏‏‏‎‎‏‎‎‏‏‏‏‎‎‏‎‏‏‎‎‎‎‏‏‏‎‎‎enter‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‎‎‎‎‏‎‎‎‎‏‏‏‏‎‎‎‏‎‎‎‏‏‏‎‏‎‎‎‎‎‏‏‎‏‏‏‎‎‏‏‎‏‏‎‎‎‎‏‎‏‎‎‏‏‎Function+‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‎‎‏‏‎‏‎‎‏‎‏‏‎‏‎‎‎‎‎‏‏‎‎‎‎‎‎‏‏‎‎‏‎‏‎‎‏‏‎‎‎‎‏‏‎‏‎‏‎‏‎‏‎Meta+‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‎‎‏‏‎‎‏‏‎‎‏‏‏‎‏‎‎‏‏‎‎‎‎‎‏‏‎‏‎‏‏‎‎‎‎‎‎‎‎‏‎‎‏‎‎‎‏‏‏‎‏‎‎‎Shift+‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‎‎‎‎‏‎‎‏‎‎‏‏‏‏‎‏‏‎‎‎‏‏‏‏‎‏‏‏‏‎‎‎‏‏‏‏‎‏‏‎‏‎‏‏‎‏‏‏‏‎‏‎‏‎‎space‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‏‎‏‎‏‎‏‎‎‏‎‎‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‎‎‏‎‎‎‎‎‎‏‎Sym+‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‏‏‎‎‎‎‏‎‎‏‏‎‏‏‎‏‎‎‏‏‎‏‎‏‏‏‎‏‎‎‏‏‏‏‏‏‎‎‏‎‏‎‏‎‎‎‎‏‏‎‎‎‏‏‎‏‎Menu+‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‏‏‎‎‎‎‎‏‎‎‎‏‎‏‎‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‏‏‎‎‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‏‏‏‎‎Search…‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‏‏‏‎‏‏‏‏‏‏‎‏‏‏‏‏‎‏‎‏‎‏‎‎‏‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‎‎‎‎‎‎‎‎‎‎‏‎‎‏‎Clear query‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‎‏‏‎‎‏‎‏‎‎‎‏‏‏‏‏‎‎‏‎‏‎‏‎‎‏‎‏‏‎‎‎‏‎‎‎‎‎‏‎‏‎‏‏‏‏‎‎‎‏‎‎‏‎‎‎‎Search query‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‎‏‎‏‏‏‎‏‎‎‏‎‏‎‎‏‎‎‎‏‏‎‏‎‏‎‏‎‏‎‎‎‏‎‏‎‎‎‎‎‎‏‎‏‏‎‎‎‏‎‏‎Search‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‏‏‏‎‏‏‎‎‏‎‎‏‎‏‎‎‏‎‏‎‏‎‏‎‏‎‎‎‎‎‏‏‎‎‎‎‎‏‏‎‎‎‏‏‎‎‎‎‎‎‎‎Submit query‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‎‏‏‎‎‏‏‎‎‎‎‏‎‎‎‎‎‎‏‎‏‏‏‏‏‎‏‏‏‎‎‏‏‏‎‎‎‏‎‏‎‎‏‏‎‏‏‎‎‏‎‎‎‏‏‎‎Voice search‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‏‏‏‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‏‎‏‎‏‏‏‎‎‏‏‎‎‎‎‎‏‎‏‎‏‎‏‏‎‏‎‏‏‎‏‎‎‎Share with‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‏‏‎‎‏‏‎‎‏‎‎‏‎‏‎‏‎‏‎‏‏‎‎‎‎‎‎‎‎‏‎‏‎‏‎‏‎‏‎‎‏‎‏‏‏‏‏‎‏‎‏‎‎‏‏‏‎Share with ‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‎‏‎‎‎‎‎‎‏‏‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‏‎‎‎‏‏‏‎‎‎‏‏‎‎‏‏‎‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎Collapse‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‎‎‎‎‎‏‏‏‎‏‏‎‎‏‏‏‎‎‏‎‎‎‏‏‎‎‏‎‏‎‎‎‏‎‎‏‎‏‎‏‏‏‏‎‎‎‎‎‎‎‎‎‎‏‏‎‎Search‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‎‏‏‏‎‏‏‎‎‎‎‏‎‏‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‏‎‏‏‏‎‎‏‎‏‏‏‎‏‏‏‏‏‏‏‎‎‎‏‏‎999+‎‏‎‎‏‎" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-es-rUS/values-es-rUS.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-es-rUS/values-es-rUS.xml deleted file mode 100755 index edb8524..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-es-rUS/values-es-rUS.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Navegar a la página principal" - "Navegar hacia arriba" - "Más opciones" - "Listo" - "Ver todo" - "Elige una aplicación." - "DESACTIVADO" - "ACTIVADO" - "Alt+" - "Ctrl+" - "borrar" - "intro" - "Función+" - "Meta+" - "Mayúscula+" - "espacio" - "Sym+" - "Menú+" - "Buscar…" - "Eliminar la consulta" - "Búsqueda" - "Búsqueda" - "Enviar consulta" - "Búsqueda por voz" - "Compartir con" - "Compartir con %s" - "Contraer" - "Buscar" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-es/values-es.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-es/values-es.xml deleted file mode 100755 index d2265ad..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-es/values-es.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Ir a la pantalla de inicio" - "Desplazarse hacia arriba" - "Más opciones" - "Listo" - "Ver todo" - "Seleccionar una aplicación" - "DESACTIVADO" - "ACTIVADO" - "Alt +" - "Ctrl +" - "Eliminar" - "Intro" - "Función +" - "Meta +" - "Mayús +" - "Espacio" - "Sym +" - "Menú +" - "Buscar…" - "Borrar consulta" - "Consulta" - "Buscar" - "Enviar consulta" - "Búsqueda por voz" - "Compartir con" - "Compartir con %s" - "Contraer" - "Buscar" - "+999" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-et/values-et.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-et/values-et.xml deleted file mode 100755 index 05be6e9..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-et/values-et.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Navigeerimine avaekraanile" - "Navigeerimine üles" - "Rohkem valikuid" - "Valmis" - "Kuva kõik" - "Valige rakendus" - "VÄLJAS" - "SEES" - "Alt +" - "Ctrl +" - "kustutamisklahv" - "sisestusklahv" - "Funktsiooniklahv +" - "Meta +" - "Tõstuklahv +" - "tühik" - "Sym +" - "Menüü +" - "Otsige …" - "Päringu tühistamine" - "Otsingupäring" - "Otsing" - "Päringu esitamine" - "Häälotsing" - "Jagamine:" - "Jagamine rakendusega %s" - "Ahendamine" - "Otsing" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-eu/values-eu.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-eu/values-eu.xml deleted file mode 100755 index 8c09875..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-eu/values-eu.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Joan orri nagusira" - "Joan gora" - "Aukera gehiago" - "Eginda" - "Ikusi guztiak" - "Aukeratu aplikazio bat" - "DESAKTIBATUTA" - "AKTIBATUTA" - "Alt +" - "Ktrl +" - "Ezabatu" - "Sartu" - "Funtzioa +" - "Meta +" - "Maius +" - "Zuriunea" - "Sym +" - "Menua +" - "Bilatu…" - "Garbitu kontsulta" - "Bilaketa-kontsulta" - "Bilatu" - "Bidali kontsulta" - "Ahozko bilaketa" - "Partekatu hauekin" - "Partekatu %s aplikazioarekin" - "Tolestu" - "Bilatu" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-fa/values-fa.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-fa/values-fa.xml deleted file mode 100755 index 90b2898..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-fa/values-fa.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "پیمایش به صفحه اصلی" - "پیمایش به بالا" - "گزینه‌های بیشتر" - "تمام" - "مشاهده همه" - "انتخاب برنامه" - "خاموش" - "روشن" - "‎Alt+‎" - "‎Ctrl+‎" - "delete" - "enter" - "‎Function+‎" - "‎Meta+‎" - "‎Shift+‎" - "کلید فاصله" - "‎Sym+‎" - "منو+" - "جستجو…" - "پاک کردن عبارت جستجو" - "عبارت جستجو" - "جستجو" - "ارسال عبارت جستجو" - "جستجوی گفتاری" - "اشتراک‌گذاری با" - "اشتراک‌گذاری با %s" - "کوچک کردن" - "جستجو" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-fi/values-fi.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-fi/values-fi.xml deleted file mode 100755 index 75b02bb..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-fi/values-fi.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Siirry etusivulle" - "Siirry ylös" - "Lisää" - "Valmis" - "Näytä kaikki" - "Valitse sovellus" - "POIS KÄYTÖSTÄ" - "KÄYTÖSSÄ" - "Alt+" - "Ctrl+" - "delete" - "enter" - "Fn+" - "Meta+" - "Vaihto+" - "välilyönti" - "Sym+" - "Valikko+" - "Haku…" - "Tyhjennä kysely" - "Hakulauseke" - "Haku" - "Lähetä kysely" - "Puhehaku" - "Jakaminen:" - "Jaa sovelluksessa %s" - "Kutista" - "Haku" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-fr-rCA/values-fr-rCA.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-fr-rCA/values-fr-rCA.xml deleted file mode 100755 index f71cf03..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-fr-rCA/values-fr-rCA.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Revenir à l\'accueil" - "Revenir en haut de la page" - "Plus d\'options" - "Terminé" - "Voir toutes les chaînes" - "Sélectionnez une application" - "DÉSACTIVÉ" - "ACTIVÉ" - "Alt+" - "Ctrl+" - "supprimer" - "entrée" - "Fonction+" - "Méta+" - "Maj+" - "espace" - "Sym+" - "Menu+" - "Recherche en cours..." - "Effacer la requête" - "Requête de recherche" - "Rechercher" - "Envoyer la requête" - "Recherche vocale" - "Partager" - "Partager avec %s" - "Réduire" - "Rechercher" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-fr/values-fr.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-fr/values-fr.xml deleted file mode 100755 index 2aee397..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-fr/values-fr.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Revenir à l\'accueil" - "Revenir en haut de la page" - "Plus d\'options" - "OK" - "Tout afficher" - "Sélectionner une application" - "DÉSACTIVÉ" - "ACTIVÉ" - "Alt+" - "Ctrl+" - "supprimer" - "entrée" - "Fonction+" - "Méta+" - "Maj+" - "espace" - "Sym+" - "Menu+" - "Rechercher…" - "Effacer la requête" - "Requête de recherche" - "Rechercher" - "Envoyer la requête" - "Recherche vocale" - "Partager avec" - "Partager avec %s" - "Réduire" - "Rechercher" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-gl/values-gl.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-gl/values-gl.xml deleted file mode 100755 index d0081c6..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-gl/values-gl.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Ir á páxina de inicio" - "Desprazarse cara arriba" - "Máis opcións" - "Feito" - "Ver todas" - "Escoller unha aplicación" - "DESACTIVAR" - "ACTIVAR" - "Alt +" - "Ctrl +" - "eliminar" - "Intro" - "Función +" - "Meta +" - "Maiús +" - "espazo" - "Sim +" - "Menú +" - "Buscar…" - "Borrar consulta" - "Consulta de busca" - "Buscar" - "Enviar consulta" - "Busca por voz" - "Compartir con" - "Compartir con %s" - "Contraer" - "Buscar" - ">999" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-gu/values-gu.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-gu/values-gu.xml deleted file mode 100755 index 0a3b83b..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-gu/values-gu.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "હોમ પર નેવિગેટ કરો" - "ઉપર નૅવિગેટ કરો" - "વધુ વિકલ્પો" - "થઈ ગયું" - "બધું જુઓ" - "એક ઍપ્લિકેશન પસંદ કરો" - "બંધ" - "ચાલુ" - "Alt+" - "Ctrl+" - "ડિલીટ કરો" - "Enter" - "Function+" - "Meta+" - "Shift+" - "Spacebar" - "Sym+" - "મેનૂ+" - "શોધો…" - "ક્વેરી સાફ કરો" - "શોધ ક્વેરી" - "શોધો" - "ક્વેરી સબમિટ કરો" - "વૉઇસ શોધ" - "આની સાથે શેર કરો" - "%sની સાથે શેર કરો" - "સંકુચિત કરો" - "શોધો" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-h720dp-v13/values-h720dp-v13.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-h720dp-v13/values-h720dp-v13.xml deleted file mode 100755 index e38bb90..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-h720dp-v13/values-h720dp-v13.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - 54dip - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-hdpi-v4/values-hdpi-v4.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-hdpi-v4/values-hdpi-v4.xml deleted file mode 100755 index d5a138e..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-hdpi-v4/values-hdpi-v4.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-hi/values-hi.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-hi/values-hi.xml deleted file mode 100755 index 6576cb7..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-hi/values-hi.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "होम पेज पर जाएं" - "ऊपर जाएं" - "ज़्यादा विकल्प" - "हो गया" - "सभी देखें" - "कोई एप्‍लिकेशन चुनें" - "बंद" - "चालू" - "Alt+" - "Ctrl+" - "delete" - "enter" - "Function+" - "Meta+" - "Shift+" - "space" - "Sym+" - "Menu+" - "खोजा जा रहा है…" - "क्‍वेरी साफ़ करें" - "सर्च क्वेरी" - "सर्च करें" - "क्वेरी सबमिट करें" - "आवाज़ सर्च" - "इसके साथ शेयर करें" - "%s के साथ शेयर करें" - "छोटा करें" - "सर्च" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-hr/values-hr.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-hr/values-hr.xml deleted file mode 100755 index 2c3e6ae..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-hr/values-hr.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Idi na početnu" - "Idi gore" - "Dodatne opcije" - "Gotovo" - "Prikaži sve" - "Odabir aplikacije" - "ISKLJUČENO" - "UKLJUČENO" - "Alt+" - "Ctrl+" - "delete" - "enter" - "Function+" - "Meta+" - "Shift+" - "razmaknica" - "Sym+" - "Menu+" - "Pretražite…" - "Izbriši upit" - "Upit za pretraživanje" - "Pretraživanje" - "Pošalji upit" - "Glasovno pretraživanje" - "Dijeljenje sa" - "Dijeli putem aplikacije %s" - "Sažmi" - "Pretraživanje" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-hu/values-hu.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-hu/values-hu.xml deleted file mode 100755 index f980def..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-hu/values-hu.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Ugrás a főoldalra" - "Felfelé mozgatás" - "További lehetőségek" - "Kész" - "Összes megtekintése" - "Válasszon ki egy alkalmazást" - "KI" - "BE" - "Alt+" - "Ctrl+" - "Delete" - "Enter" - "Function+" - "Meta+" - "Shift+" - "Szóköz" - "Sym+" - "Menu+" - "Keresés…" - "Lekérdezés törlése" - "Keresési lekérdezés" - "Keresés" - "Lekérdezés küldése" - "Hangalapú keresés" - "Megosztás a következővel:" - "Megosztás a következő alkalmazással: %s" - "Összecsukás" - "Keresés" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-hy/values-hy.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-hy/values-hy.xml deleted file mode 100755 index 3247f9a..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-hy/values-hy.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Ուղղվել տուն" - "Ուղղվել վերև" - "Այլ ընտրանքներ" - "Պատրաստ է" - "Տեսնել բոլորը" - "Ընտրել ծրագիր" - "ԱՆՋԱՏՎԱԾ" - "ՄԻԱՑՎԱԾ" - "Alt+" - "Ctrl+" - "Delete" - "Enter" - "Function+" - "Meta+" - "Shift+" - "բացատ" - "Sym+" - "Menu+" - "Որոնում..." - "Մաքրել հարցումը" - "Որոնման հարցում" - "Որոնել" - "Ուղարկել հարցումը" - "Ձայնային որոնում" - "Կիսվել" - "Ուղարկել %s-ին" - "Թաքցնել" - "Որոնել" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-in/values-in.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-in/values-in.xml deleted file mode 100755 index 314af7e..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-in/values-in.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Navigasi ke beranda" - "Navigasi naik" - "Opsi lain" - "Selesai" - "Lihat semua" - "Pilih aplikasi" - "NONAKTIF" - "AKTIF" - "Alt+" - "Ctrl+" - "delete" - "enter" - "Function+" - "Meta+" - "Shift+" - "spasi" - "Sym+" - "Menu+" - "Telusuri..." - "Hapus kueri" - "Kueri penelusuran" - "Telusuri" - "Kirim kueri" - "Penelusuran suara" - "Bagikan dengan" - "Bagikan ke %s" - "Ciutkan" - "Telusuri" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-is/values-is.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-is/values-is.xml deleted file mode 100755 index 58321f7..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-is/values-is.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Fara heim" - "Fara upp" - "Fleiri valkostir" - "Lokið" - "Sjá allt" - "Veldu forrit" - "SLÖKKT" - "KVEIKT" - "Alt+" - "Ctrl+" - "delete" - "enter" - "Aðgerðarlykill+" - "Meta+" - "Shift+" - "bilslá" - "Sym+" - "Valmynd+" - "Leita…" - "Hreinsa fyrirspurn" - "Leitarfyrirspurn" - "Leita" - "Senda fyrirspurn" - "Raddleit" - "Deila með" - "Deila með %s" - "Minnka" - "Leita" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-it/values-it.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-it/values-it.xml deleted file mode 100755 index 48842b3..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-it/values-it.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Vai alla home page" - "Vai in alto" - "Altre opzioni" - "Fine" - "Visualizza tutte" - "Scegli un\'applicazione" - "OFF" - "ON" - "ALT +" - "CTRL +" - "CANC" - "INVIO" - "FUNZIONE +" - "META +" - "MAIUSC +" - "barra spaziatrice" - "SYM +" - "MENU +" - "Cerca…" - "Cancella query" - "Query di ricerca" - "Cerca" - "Invia query" - "Ricerca vocale" - "Condividi con" - "Condividi tramite %s" - "Comprimi" - "Ricerca" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-iw/values-iw.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-iw/values-iw.xml deleted file mode 100755 index ed74d57..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-iw/values-iw.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "נווט לדף הבית" - "נווט למעלה" - "עוד אפשרויות" - "בוצע" - "ראה הכל" - "בחר אפליקציה" - "כבוי" - "פועל" - "Alt+" - "Ctrl+‎" - "delete" - "Enter" - "Function+" - "Meta+" - "Shift+" - "מקש רווח" - "Sym+" - "תפריט+" - "חיפוש…" - "מחק שאילתה" - "שאילתת חיפוש" - "חיפוש" - "שלח שאילתה" - "חיפוש קולי" - "שתף עם" - "שתף עם %s" - "כווץ" - "חיפוש" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ja/values-ja.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ja/values-ja.xml deleted file mode 100755 index 6be4581..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ja/values-ja.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "ホームへ移動" - "上へ移動" - "その他のオプション" - "完了" - "すべて表示" - "アプリの選択" - "OFF" - "ON" - "Alt+" - "Ctrl+" - "Delete" - "Enter" - "Function+" - "Meta+" - "Shift+" - "Space" - "Sym+" - "Menu+" - "検索…" - "検索キーワードを削除" - "検索キーワード" - "検索" - "検索キーワードを送信" - "音声検索" - "共有" - "%sと共有" - "折りたたむ" - "検索" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ka/values-ka.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ka/values-ka.xml deleted file mode 100755 index 8e91c0a..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ka/values-ka.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "მთავარზე ნავიგაცია" - "ზემოთ ნავიგაცია" - "მეტი ვარიანტები" - "დასრულდა" - "ყველას ნახვა" - "აპის არჩევა" - "გამორთულია" - "ჩართულია" - "Alt+" - "Ctrl+" - "წაშლა" - "შეყვანა" - "Function+" - "Meta+" - "Shift+" - "space" - "Sym+" - "Menu+" - "ძიება..." - "მოთხოვნის გასუფთავება" - "ძიების მოთხოვნა" - "ძიება" - "მოთხოვნის გადაგზავნა" - "ხმოვანი ძიება" - "გაზიარება:" - "გაუზიარეთ %s-ს" - "აკეცვა" - "ძიება" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-kk/values-kk.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-kk/values-kk.xml deleted file mode 100755 index d9596d0..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-kk/values-kk.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Негізгі бетте қозғалу" - "Жоғары қозғалу" - "Басқа опциялар" - "Дайын" - "Барлығын көру" - "Қолданбаны таңдау" - "ӨШІРУЛІ" - "ҚОСУЛЫ" - "Alt+" - "Ctrl+" - "delete" - "enter" - "Function+" - "Meta+" - "Shift+" - "бос орын" - "Sym+" - "Mәзір+" - "Іздеу…" - "Сұрақты жою" - "Сұрақты іздеу" - "Іздеу" - "Сұрақты жіберу" - "Дауыс арқылы іздеу" - "Бөлісу" - "%s қолданбасымен бөлісу" - "Тасалау" - "Іздеу" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-km/values-km.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-km/values-km.xml deleted file mode 100755 index 57735d2..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-km/values-km.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "រកមើល​ទៅ​ដើម" - "រកមើល​ឡើងលើ" - "ជម្រើស​ច្រើន​ទៀត" - "រួចរាល់" - "មើល​ទាំងអស់" - "ជ្រើស​កម្មវិធី​​" - "បិទ" - "បើក" - "Alt+" - "Ctrl+" - "delete" - "enter" - "Function+" - "Meta+" - "Shift+" - "space" - "Sym+" - "Menu+" - "ស្វែងរក…" - "សម្អាត​សំណួរ" - "ស្វែងរក​សំណួរ" - "ស្វែងរក" - "ដាក់​​​ស្នើ​សំណួរ" - "ការស្វែងរក​សំឡេង" - "ចែករំលែក​ជាមួយ" - "ចែក​រំលែក​ជា​មួយ %s" - "បង្រួម" - "ស្វែងរក" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-kn/values-kn.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-kn/values-kn.xml deleted file mode 100755 index 1e2402b..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-kn/values-kn.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "ಮುಖಪುಟವನ್ನು ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ" - "ಮೇಲಕ್ಕೆ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ" - "ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳು" - "ಮುಗಿದಿದೆ" - "ಎಲ್ಲವನ್ನೂ ನೋಡಿ" - "ಒಂದು ಅಪ್ಲಿಕೇಶನ್ ಆಯ್ಕೆಮಾಡಿ" - "ಆಫ್" - "ಆನ್" - "Alt+" - "Ctrl+" - "delete" - "enter" - "Function+" - "Meta+" - "Shift+" - "space" - "Sym+" - "Menu+" - "ಹುಡುಕಿ…" - "ಪ್ರಶ್ನೆಯನ್ನು ತೆರವುಗೊಳಿಸು" - "ಪ್ರಶ್ನೆಯನ್ನು ಹುಡುಕಿ" - "ಹುಡುಕಿ" - "ಪ್ರಶ್ನೆಯನ್ನು ಸಲ್ಲಿಸು" - "ಧ್ವನಿ ಹುಡುಕಾಟ" - "ಇವರೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಿ" - "%s ನೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಿ" - "ಸಂಕುಚಿಸು" - "ಹುಡುಕಿ" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ko/values-ko.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ko/values-ko.xml deleted file mode 100755 index 5e0d052..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ko/values-ko.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "홈 탐색" - "위로 탐색" - "옵션 더보기" - "완료" - "전체 보기" - "앱 선택" - "사용 안함" - "사용" - "Alt+" - "Ctrl+" - "삭제" - "입력" - "Function+" - "Meta+" - "Shift+" - "스페이스바" - "Sym+" - "Menu+" - "검색..." - "검색어 삭제" - "검색어" - "검색" - "검색어 보내기" - "음성 검색" - "공유 대상" - "%s와(과) 공유" - "접기" - "검색" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ky/values-ky.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ky/values-ky.xml deleted file mode 100755 index 7a8bb7f..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ky/values-ky.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Үйгө багыттоо" - "Жогору" - "Көбүрөөк мүмкүнчүлүктөр" - "Даяр" - "Бардыгын көрүү" - "Колдонмо тандоо" - "ӨЧҮК" - "КҮЙҮК" - "Alt+" - "Ctrl+" - "Delete" - "Enter" - "Function+" - "Meta+" - "Shift+" - "боштук" - "Sym+" - "Menu+" - "Издөө…" - "Талаптарды тазалоо" - "Издөө талаптары" - "Издөө" - "Талап жөнөтүү" - "Үн аркылуу издөө" - "Бөлүшүү" - "%s аркылуу бөлүшүү" - "Жыйнап коюу" - "Издөө" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-land/values-land.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-land/values-land.xml deleted file mode 100755 index 5d65779..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-land/values-land.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - 48dp - 12dp - 14dp - - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-large-v4/values-large-v4.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-large-v4/values-large-v4.xml deleted file mode 100755 index c0ec67a..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-large-v4/values-large-v4.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - 440dp - 60% - 90% - 60% - 90% - 55% - 80% - - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ta/values-ta.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ta/values-ta.xml deleted file mode 100755 index d9f29b6..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ta/values-ta.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "முகப்பிற்கு வழிசெலுத்து" - "மேலே செல்" - "மேலும் விருப்பங்கள்" - "முடிந்தது" - "எல்லாம் காட்டு" - "பயன்பாட்டைத் தேர்வுசெய்க" - "ஆஃப்" - "ஆன்" - "ஆல்ட் மற்றும்" - "கண்ட்ரோல் மற்றும்" - "டெலிட்" - "எண்டர்" - "ஃபங்ஷன் மற்றும்" - "மெட்டா மற்றும்" - "ஷிஃப்ட் மற்றும்" - "ஸ்பேஸ்" - "சிம்பல் மற்றும்" - "மெனு மற்றும்" - "தேடு..." - "வினவலை அழி" - "தேடல் வினவல்" - "தேடு" - "வினவலைச் சமர்ப்பி" - "குரல் தேடல்" - "இதனுடன் பகிர்" - "%s மூலம் பகிர்" - "சுருக்கு" - "தேடு" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-te/values-te.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-te/values-te.xml deleted file mode 100755 index 54f0b16..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-te/values-te.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "హోమ్‌కు నావిగేట్ చేయండి" - "పైకి నావిగేట్ చేయండి" - "మరిన్ని ఎంపికలు" - "పూర్తయింది" - "అన్నీ చూడండి" - "అనువర్తనాన్ని ఎంచుకోండి" - "ఆఫ్ చేయి" - "ఆన్ చేయి" - "Alt+" - "Ctrl+" - "delete" - "enter" - "Function+" - "Meta+" - "Shift+" - "స్పేస్" - "Sym+" - "Menu+" - "వెతుకు..." - "ప్రశ్నను క్లియర్ చేయి" - "ప్రశ్న శోధించండి" - "వెతుకు" - "ప్రశ్నని సమర్పించు" - "వాయిస్ శోధన" - "వీరితో భాగస్వామ్యం చేయి" - "%sతో భాగస్వామ్యం చేయండి" - "కుదించండి" - "వెతుకు" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-th/values-th.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-th/values-th.xml deleted file mode 100755 index 13dc94e..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-th/values-th.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "นำทางไปหน้าแรก" - "นำทางขึ้น" - "ตัวเลือกอื่น" - "เสร็จสิ้น" - "ดูทั้งหมด" - "เลือกแอป" - "ปิด" - "เปิด" - "Alt+" - "Ctrl+" - "Delete" - "Enter" - "Function+" - "Meta+" - "Shift+" - "Space" - "Sym+" - "เมนู+" - "ค้นหา…" - "ล้างข้อความค้นหา" - "ข้อความค้นหา" - "ค้นหา" - "ส่งข้อความค้นหา" - "ค้นหาด้วยเสียง" - "แชร์กับ" - "แชร์ทาง %s" - "ยุบ" - "ค้นหา" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-tl/values-tl.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-tl/values-tl.xml deleted file mode 100755 index 18a148f..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-tl/values-tl.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Mag-navigate patungo sa home" - "Mag-navigate pataas" - "Higit pang mga opsyon" - "Tapos na" - "Tingnan lahat" - "Pumili ng isang app" - "I-OFF" - "I-ON" - "Alt+" - "Ctrl+" - "delete" - "enter" - "Function+" - "Meta+" - "Shift+" - "space" - "Sym+" - "Menu+" - "Maghanap…" - "I-clear ang query" - "Query sa paghahanap" - "Maghanap" - "Isumite ang query" - "Paghahanap gamit ang boses" - "Ibahagi sa/kay" - "Ibahagi gamit ang %s" - "I-collapse" - "Maghanap" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-tr/values-tr.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-tr/values-tr.xml deleted file mode 100755 index 01b0f45..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-tr/values-tr.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Ana ekrana git" - "Yukarı git" - "Diğer seçenekler" - "Bitti" - "Tümünü göster" - "Bir uygulama seçin" - "KAPAT" - "AÇ" - "Alt+" - "Ctrl+" - "sil" - "enter" - "İşlev+" - "Meta+" - "Üst Karakter+" - "boşluk" - "Sym+" - "Menü+" - "Ara…" - "Sorguyu temizle" - "Arama sorgusu" - "Ara" - "Sorguyu gönder" - "Sesli arama" - "Şununla paylaş" - "%s ile paylaş" - "Daralt" - "Ara" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-uk/values-uk.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-uk/values-uk.xml deleted file mode 100755 index c1d3da7..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-uk/values-uk.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Перейти на головний" - "Перейти вгору" - "Інші опції" - "Готово" - "Переглянути всі" - "Вибрати програму" - "ВИМК." - "УВІМК." - "Alt+" - "Ctrl+" - "delete" - "enter" - "Function+" - "Meta+" - "Shift+" - "пробіл" - "Sym+" - "Menu+" - "Пошук…" - "Очистити запит" - "Пошуковий запит" - "Пошук" - "Надіслати запит" - "Голосовий пошук" - "Надіслати через" - "Поділитися через додаток %s" - "Згорнути" - "Пошук" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ur/values-ur.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ur/values-ur.xml deleted file mode 100755 index 6b717f4..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ur/values-ur.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "ہوم پر نیویگیٹ کریں" - "اوپر نیویگیٹ کریں" - "مزید اختیارات" - "ہو گیا" - "سبھی دیکھیں" - "ایک ایپ منتخب کریں" - "آف" - "آن" - "Alt+‎" - "Ctrl+‎" - "delete" - "enter" - "Function+‎" - "Meta+‎" - "Shift+‎" - "space" - "Sym+‎" - "Menu+‎" - "تلاش کریں…" - "استفسار صاف کریں" - "استفسار تلاش کریں" - "تلاش کریں" - "استفسار جمع کرائیں" - "صوتی تلاش" - "اشتراک کریں مع" - "%s کے ساتھ اشتراک کریں" - "سکیڑیں" - "تلاش" - "+999" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-uz/values-uz.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-uz/values-uz.xml deleted file mode 100755 index 053764c..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-uz/values-uz.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Boshiga o‘tish" - "Yuqoriga o‘tish" - "Boshqa parametrlar" - "Tayyor" - "Hammasi" - "Dastur tanlang" - "O‘CHIQ" - "YONIQ" - "Alt+" - "Ctrl+" - "Delete" - "Enter" - "Fn+" - "Meta+" - "Shift+" - "Probel" - "Sym+" - "Menyu+" - "Qidirish…" - "So‘rovni tozalash" - "So‘rovni izlash" - "Qidirish" - "So‘rov yaratish" - "Ovozli qidiruv" - "Ruxsat berish" - "%s orqali ulashish" - "Yig‘ish" - "Qidirish" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v16/values-v16.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v16/values-v16.xml deleted file mode 100755 index 5ee2feb..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v16/values-v16.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - 4dp - - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v17/values-v17.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v17/values-v17.xml deleted file mode 100755 index f85a197..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v17/values-v17.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v18/values-v18.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v18/values-v18.xml deleted file mode 100755 index 7dad77f..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v18/values-v18.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - 0px - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v21/values-v21.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v21/values-v21.xml deleted file mode 100755 index 98cfca4..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v21/values-v21.xml +++ /dev/null @@ -1,308 +0,0 @@ - - - @color/secondary_text_default_material_light - 0dp - 0dp - 12dp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v22/values-v22.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v22/values-v22.xml deleted file mode 100755 index d4a514a..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v22/values-v22.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v23/values-v23.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v23/values-v23.xml deleted file mode 100755 index 484f6d1..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v23/values-v23.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v24/values-v24.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v24/values-v24.xml deleted file mode 100755 index f9b3c08..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v24/values-v24.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v26/values-v26.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v26/values-v26.xml deleted file mode 100755 index 8b28a46..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v26/values-v26.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-vi/values-vi.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-vi/values-vi.xml deleted file mode 100755 index 1eabc08..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-vi/values-vi.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Điều hướng về trang chủ" - "Điều hướng lên trên" - "Tùy chọn khác" - "Xong" - "Xem tất cả" - "Chọn một ứng dụng" - "TẮT" - "BẬT" - "Alt+" - "Ctrl+" - "delete" - "enter" - "Function+" - "Meta+" - "Shift+" - "phím cách" - "Sym+" - "Menu+" - "Tìm kiếm…" - "Xóa truy vấn" - "Tìm kiếm truy vấn" - "Tìm kiếm" - "Gửi truy vấn" - "Tìm kiếm bằng giọng nói" - "Chia sẻ với" - "Chia sẻ với %s" - "Thu gọn" - "Tìm kiếm" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-watch-v20/values-watch-v20.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-watch-v20/values-watch-v20.xml deleted file mode 100755 index 2d85812..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-watch-v20/values-watch-v20.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-watch-v21/values-watch-v21.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-watch-v21/values-watch-v21.xml deleted file mode 100755 index deecc9e..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-watch-v21/values-watch-v21.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-xlarge-v4/values-xlarge-v4.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-xlarge-v4/values-xlarge-v4.xml deleted file mode 100755 index b499d2c..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-xlarge-v4/values-xlarge-v4.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - 60% - 90% - 50% - 70% - 45% - 72% - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-zh-rCN/values-zh-rCN.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-zh-rCN/values-zh-rCN.xml deleted file mode 100755 index 68140f7..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-zh-rCN/values-zh-rCN.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "转到主屏幕" - "转到上一层级" - "更多选项" - "完成" - "查看全部" - "选择应用" - "关闭" - "开启" - "Alt+" - "Ctrl+" - "Delete 键" - "Enter 键" - "Fn+" - "Meta+" - "Shift+" - "空格键" - "Sym+" - "Menu+" - "搜索…" - "清除查询" - "搜索查询" - "搜索" - "提交查询" - "语音搜索" - "分享方式" - "使用%s分享" - "收起" - "搜索" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-zh-rHK/values-zh-rHK.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-zh-rHK/values-zh-rHK.xml deleted file mode 100755 index f533663..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-zh-rHK/values-zh-rHK.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "瀏覽主頁" - "向上瀏覽" - "更多選項" - "完成" - "顯示全部" - "選擇應用程式" - "關閉" - "開啟" - "Alt +" - "Ctrl +" - "刪除" - "Enter 鍵" - "Fn +" - "Meta +" - "Shift +" - "空白鍵" - "Sym +" - "Menu +" - "搜尋…" - "清除查詢" - "搜尋查詢" - "搜尋" - "提交查詢" - "語音搜尋" - "分享對象" - "使用「%s」分享" - "收合" - "搜尋" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-zh-rTW/values-zh-rTW.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-zh-rTW/values-zh-rTW.xml deleted file mode 100755 index 75f498a..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-zh-rTW/values-zh-rTW.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "瀏覽首頁" - "向上瀏覽" - "更多選項" - "完成" - "查看全部" - "選擇應用程式" - "關閉" - "開啟" - "Alt +" - "Ctrl +" - "Delete 鍵" - "Enter 鍵" - "Fn +" - "Meta +" - "Shift +" - "空格鍵" - "Sym +" - "Menu +" - "搜尋…" - "清除查詢" - "搜尋查詢" - "搜尋" - "提交查詢" - "語音搜尋" - "選擇分享對象" - "與「%s」分享" - "收合" - "搜尋" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-zu/values-zu.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-zu/values-zu.xml deleted file mode 100755 index 31e318d..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values-zu/values-zu.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - "Zulazulela ekhaya" - "Zulazulela phezulu" - "Izinketho eziningi" - "Kwenziwe" - "Buka konke" - "Khetha uhlelo lokusebenza" - "VALIWE" - "VULIWE" - "Alt+" - "Ctrl+" - "susa" - "enter" - "Function+" - "Meta+" - "Shift+" - "space" - "Sym+" - "Imenyu+" - "Iyasesha..." - "Sula inkinga" - "Umbuzo wosesho" - "Sesha" - "Hambisa umbuzo" - "Ukusesha ngezwi" - "Yabelana no-" - "Yabelana ne-%s" - "Goqa" - "Sesha" - "999+" - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values/values.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values/values.xml deleted file mode 100755 index 9ad9ec2..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merged.dir/values/values.xml +++ /dev/null @@ -1,4635 +0,0 @@ - - - - Church 1 - Church 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - false - true - true - @android:color/black - #7fa87f - @android:color/black - @android:color/black - @color/material_deep_teal_200 - @color/material_deep_teal_500 - @color/material_grey_800 - @android:color/white - @color/material_grey_850 - @color/material_grey_50 - #80ffffff - #80000000 - @color/bright_foreground_material_light - @color/bright_foreground_material_dark - @android:color/white - @android:color/black - #ff5a595b - #ffd6d7d7 - #FF424242 - #FFFFFFFF - #03000000 - #37000000 - #D81B60 - #008577 - #00574B - #14000000 - #3F51B5 - #303F9F - @android:color/transparent - #14000000 - #44000000 - #0A000000 - #0F000000 - #1AFFFFFF - #2EFFFFFF - #323232 - #80bebebe - #80323232 - #ffbebebe - #ff323232 - #ff7043 - #ff5722 - @android:color/white - @android:color/black - #6680cbc4 - #66009688 - #ff37474f - #ff263238 - #ff21272b - #ff80cbc4 - #ff009688 - #fff5f5f5 - #ffe0e0e0 - #fffafafa - #ff757575 - #ff424242 - #ff303030 - #ff212121 - #1F000000 - #61000000 - #00ffffff - #52000000 - #6B000000 - #1F000000 - #0A000000 - #DE000000 - #ffffffff - #ff9e9e9e - @android:color/black - @color/material_grey_600 - @color/material_grey_900 - @color/material_grey_100 - #ffffffff - #de000000 - #4Dffffff - #39000000 - #33ffffff - #1f000000 - #b3ffffff - #8a000000 - #36ffffff - #24000000 - #ff616161 - #ffbdbdbd - #ffbdbdbd - #fff1f1f1 - #e6616161 - #e6FFFFFF - 16dp - 72dp - 56dp - 0dp - 0dp - 4dp - 16dp - 10dp - 6dp - 48dp - 180dp - 5dp - -3dp - 48dp - 48dp - 36dp - 48dp - 48dp - @dimen/abc_control_inset_material - 6dp - 8dp - @dimen/abc_control_padding_material - 720dp - 320dp - 2dp - 4dp - 4dp - 2dp - 80% - 100% - 320dp - 320dp - 8dp - 8dp - 65% - 95% - 24dp - 18dp - 8dp - 0.30 - 0.26 - 32dip - 8dip - 8dip - 7dp - 4dp - 10dp - 16dp - @dimen/abc_action_bar_content_inset_material - 296dp - 4dp - 48dip - 320dip - 2dp - 2dp - 20dp - 3dp - 14sp - 14sp - 14sp - 12sp - 34sp - 45sp - 56sp - 112sp - 24sp - 22sp - 18sp - 14sp - 16sp - 14sp - 16sp - 16dp - 20sp - 20dp - 1dp - 2dp - 2dp - 4dp - 6dp - 8dp - 4dp - 2dp - 320dp - 320dp - 4dp - 168dp - 96dp - 14sp - 8dp - 56dp - 24dp - 96dp - 56dp - 8dp - 1dp - 12sp - 16dp - 64dp - 0.5dp - 6dp - 24dp - 40dp - 56dp - 6dp - 6dp - 16dp - 32dp - 24dp - 16dp - 32dp - 280dp - 8dp - 8dp - 128dp - 0dp - 6dp - 0dp - -1px - -1px - 12dp - 14dp - 24dp - 14sp - 264dp - 72dp - 14sp - 12sp - 5dp - 0.30 - 0.26 - 16dp - 8dp - 0dp - 50dp - 14sp - 12sp - 20sp - 18sp - 0.26 - 0.20 - 0.12 - 0.50 - 0.38 - 0.70 - 0.54 - 20dp - 800dp - 120dp - 60dp - 5dp - 8dp - 0dp - 56dp - 4dp - 64dp - 0dp - 0dp - 2dp - 2dp - 2dp - 12dp - 8dp - 6dp - 0.07 - 4dp - 16dp - 16dp - 4dp - 6dp - 1dp - 4dp - 8dp - 8dp - 14sp - 0dp - 1dp - 8dp - 3dp - 14sp - 6dp - 2dp - 6dp - 0dp - 22dp - 14dp - 4dp - 8dp - 3dp - 4dp - 0dp - 4dp - 12dp - 1dp - 2dp - 16dp - 56dp - 32dp - 13sp - 12dp - 8dp - 64dp - 64dp - 10dp - @dimen/notification_content_margin_start - 16dp - 2dp - 3dp - 24dp - 13sp - 10dp - 5dp - 2dp - 16dp - 8dp - 8dp - 96dp - 6.5dp - 0dp - 16dp - #3333B5E5 - #0cffffff - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 220 - 150 - 150 - 150 - 127 - 150 - 2 - 300 - 320 - 100 - 100 - 100 - 250 - 200 - 999 - Navigate home - Navigate up - More options - Done - See all - Choose an app - OFF - ON - sans-serif - sans-serif-medium - sans-serif-medium - sans-serif - sans-serif - sans-serif - sans-serif - sans-serif-light - sans-serif - sans-serif - sans-serif - sans-serif-medium - Alt+ - Ctrl+ - delete - enter - Function+ - Meta+ - Shift+ - space - Sym+ - Menu+ - Search… - Clear query - Search query - Search - Submit query - Voice search - Share with - Share with %s - Collapse - Settings - Scriptor - android.support.design.widget.AppBarLayout$ScrollingViewBehavior - android.support.design.widget.BottomSheetBehavior - Character limit exceeded %1$d of %2$d - %1$d / %2$d - android.support.design.transformation.FabTransformationScrimBehavior - android.support.design.transformation.FabTransformationSheetBehavior - android.support.design.behavior.HideBottomViewOnScrollBehavior - Remove %1$s - Show password - M12,4.5C7,4.5 2.73,7.61 1,12c1.73,4.39 6,7.5 11,7.5s9.27,-3.11 11,-7.5c-1.73,-4.39 -6,-7.5 -11,-7.5zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5zM12,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3 3,-1.34 3,-3 -1.34,-3 -3,-3z - M2,4.27 L19.73,22 L22.27,19.46 L4.54,1.73 L4.54,1 L23,1 L23,23 L1,23 L1,4.27 Z - M2,4.27 L2,4.27 L4.54,1.73 L4.54,1.73 L4.54,1 L23,1 L23,23 L1,23 L1,4.27 Z - M3.27,4.27 L19.74,20.74 - Search - 999+ - Settings - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugResources/merger.xml b/code/Android App/build/intermediates/incremental/mergeDebugResources/merger.xml deleted file mode 100755 index 679407a..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugResources/merger.xml +++ /dev/null @@ -1,4987 +0,0 @@ - -#FF424242#FFFFFFFF#03000000#37000000 - - - - - - - - - - - - - - - - - - - - - - - - - - - 1dp2dp2dp#ffffffff#ff9e9e9e#1f000000#8a000000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 4dp6dp8dp4dp2dp320dp320dp32dp13sp12dp8dp64dp64dp10dp@dimen/notification_content_margin_start16dp2dp3dp24dp13sp10dp5dp#3333B5E5#0cffffff999999+"999+""999+""999+""999+""999+" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 8dp0dp50dp20dp800dp120dp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - truefalsetrue@android:color/black#7fa87f@android:color/black@android:color/black@color/material_deep_teal_200@color/material_deep_teal_500@color/material_grey_800@android:color/white@color/material_grey_850@color/material_grey_50#80ffffff#80000000@color/bright_foreground_material_light@color/bright_foreground_material_dark@android:color/white@android:color/black#ff5a595b#ffd6d7d7#80bebebe#80323232#ffbebebe#ff323232#ff7043#ff5722@android:color/white@android:color/black#6680cbc4#66009688#ff37474f#ff263238#ff21272b#ff80cbc4#ff009688#fff5f5f5#ffe0e0e0#fffafafa#ff757575#ff424242#ff303030#ff212121@android:color/black@color/material_grey_600@color/material_grey_900@color/material_grey_100#ffffffff#de000000#4Dffffff#39000000#33ffffff#1f000000#b3ffffff#8a000000#36ffffff#24000000#ff616161#ffbdbdbd#ffbdbdbd#fff1f1f1#e6616161#e6FFFFFF - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 16dp72dp56dp0dp0dp4dp16dp10dp6dp48dp180dp5dp-3dp48dp48dp36dp48dp48dp@dimen/abc_control_inset_material6dp8dp@dimen/abc_control_padding_material720dp320dp2dp4dp4dp2dp80%100%320dp320dp8dp8dp65%95%24dp18dp8dp0.300.2632dip8dip8dip7dp4dp10dp16dp@dimen/abc_action_bar_content_inset_material296dp4dp48dip320dip2dp2dp20dp3dp14sp14sp14sp12sp34sp45sp56sp112sp24sp22sp18sp14sp16sp14sp16sp16dp20sp20dp0.300.260.260.200.120.500.380.700.542dp16dp8dp8dp96dp6.5dp0dp16dp220150127150Navigate homeNavigate upMore optionsDoneSee allChoose an appOFFONsans-serifsans-serif-mediumsans-serif-mediumsans-serifsans-serifsans-serifsans-serifsans-serif-lightsans-serifsans-serifsans-serifsans-serif-mediumAlt+Ctrl+deleteenterFunction+Meta+Shift+spaceSym+Menu+Search…Clear querySearch querySearchSubmit queryVoice searchShare withShare with %sCollapseSearch"होम पेज पर जाएं""ऊपर जाएं""ज़्यादा विकल्प""हो गया""सभी देखें""कोई एप्‍लिकेशन चुनें""बंद""चालू""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""space""Sym+""Menu+""खोजा जा रहा है…""क्‍वेरी साफ़ करें""सर्च क्वेरी""सर्च करें""क्वेरी सबमिट करें""आवाज़ सर्च""इसके साथ शेयर करें""%s के साथ शेयर करें""छोटा करें""सर्च""Idi na početnu""Idi gore""Dodatne opcije""Gotovo""Prikaži sve""Odabir aplikacije""ISKLJUČENO""UKLJUČENO""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""razmaknica""Sym+""Menu+""Pretražite…""Izbriši upit""Upit za pretraživanje""Pretraživanje""Pošalji upit""Glasovno pretraživanje""Dijeljenje sa""Dijeli putem aplikacije %s""Sažmi""Pretraživanje""Ugrás a főoldalra""Felfelé mozgatás""További lehetőségek""Kész""Összes megtekintése""Válasszon ki egy alkalmazást""KI""BE""Alt+""Ctrl+""Delete""Enter""Function+""Meta+""Shift+""Szóköz""Sym+""Menu+""Keresés…""Lekérdezés törlése""Keresési lekérdezés""Keresés""Lekérdezés küldése""Hangalapú keresés""Megosztás a következővel:""Megosztás a következő alkalmazással: %s""Összecsukás""Keresés""Ուղղվել տուն""Ուղղվել վերև""Այլ ընտրանքներ""Պատրաստ է""Տեսնել բոլորը""Ընտրել ծրագիր""ԱՆՋԱՏՎԱԾ""ՄԻԱՑՎԱԾ""Alt+""Ctrl+""Delete""Enter""Function+""Meta+""Shift+""բացատ""Sym+""Menu+""Որոնում...""Մաքրել հարցումը""Որոնման հարցում""Որոնել""Ուղարկել հարցումը""Ձայնային որոնում""Կիսվել""Ուղարկել %s-ին""Թաքցնել""Որոնել""Navigasi ke beranda""Navigasi naik""Opsi lain""Selesai""Lihat semua""Pilih aplikasi""NONAKTIF""AKTIF""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""spasi""Sym+""Menu+""Telusuri...""Hapus kueri""Kueri penelusuran""Telusuri""Kirim kueri""Penelusuran suara""Bagikan dengan""Bagikan ke %s""Ciutkan""Telusuri""Fara heim""Fara upp""Fleiri valkostir""Lokið""Sjá allt""Veldu forrit""SLÖKKT""KVEIKT""Alt+""Ctrl+""delete""enter""Aðgerðarlykill+""Meta+""Shift+""bilslá""Sym+""Valmynd+""Leita…""Hreinsa fyrirspurn""Leitarfyrirspurn""Leita""Senda fyrirspurn""Raddleit""Deila með""Deila með %s""Minnka""Leita""Vai alla home page""Vai in alto""Altre opzioni""Fine""Visualizza tutte""Scegli un\'applicazione""OFF""ON""ALT +""CTRL +""CANC""INVIO""FUNZIONE +""META +""MAIUSC +""barra spaziatrice""SYM +""MENU +""Cerca…""Cancella query""Query di ricerca""Cerca""Invia query""Ricerca vocale""Condividi con""Condividi tramite %s""Comprimi""Ricerca""נווט לדף הבית""נווט למעלה""עוד אפשרויות""בוצע""ראה הכל""בחר אפליקציה""כבוי""פועל""Alt+""Ctrl+‎""delete""Enter""Function+""Meta+""Shift+""מקש רווח""Sym+""תפריט+""חיפוש…""מחק שאילתה""שאילתת חיפוש""חיפוש""שלח שאילתה""חיפוש קולי""שתף עם""שתף עם %s""כווץ""חיפוש""ホームへ移動""上へ移動""その他のオプション""完了""すべて表示""アプリの選択""OFF""ON""Alt+""Ctrl+""Delete""Enter""Function+""Meta+""Shift+""Space""Sym+""Menu+""検索…""検索キーワードを削除""検索キーワード""検索""検索キーワードを送信""音声検索""共有""%sと共有""折りたたむ""検索""მთავარზე ნავიგაცია""ზემოთ ნავიგაცია""მეტი ვარიანტები""დასრულდა""ყველას ნახვა""აპის არჩევა""გამორთულია""ჩართულია""Alt+""Ctrl+""წაშლა""შეყვანა""Function+""Meta+""Shift+""space""Sym+""Menu+""ძიება...""მოთხოვნის გასუფთავება""ძიების მოთხოვნა""ძიება""მოთხოვნის გადაგზავნა""ხმოვანი ძიება""გაზიარება:""გაუზიარეთ %s-ს""აკეცვა""ძიება""Негізгі бетте қозғалу""Жоғары қозғалу""Басқа опциялар""Дайын""Барлығын көру""Қолданбаны таңдау""ӨШІРУЛІ""ҚОСУЛЫ""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""бос орын""Sym+""Mәзір+""Іздеу…""Сұрақты жою""Сұрақты іздеу""Іздеу""Сұрақты жіберу""Дауыс арқылы іздеу""Бөлісу""%s қолданбасымен бөлісу""Тасалау""Іздеу""រកមើល​ទៅ​ដើម""រកមើល​ឡើងលើ""ជម្រើស​ច្រើន​ទៀត""រួចរាល់""មើល​ទាំងអស់""ជ្រើស​កម្មវិធី​​""បិទ""បើក""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""space""Sym+""Menu+""ស្វែងរក…""សម្អាត​សំណួរ""ស្វែងរក​សំណួរ""ស្វែងរក""ដាក់​​​ស្នើ​សំណួរ""ការស្វែងរក​សំឡេង""ចែករំលែក​ជាមួយ""ចែក​រំលែក​ជា​មួយ %s""បង្រួម""ស្វែងរក""ಮುಖಪುಟವನ್ನು ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ""ಮೇಲಕ್ಕೆ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ""ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳು""ಮುಗಿದಿದೆ""ಎಲ್ಲವನ್ನೂ ನೋಡಿ""ಒಂದು ಅಪ್ಲಿಕೇಶನ್ ಆಯ್ಕೆಮಾಡಿ""ಆಫ್""ಆನ್""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""space""Sym+""Menu+""ಹುಡುಕಿ…""ಪ್ರಶ್ನೆಯನ್ನು ತೆರವುಗೊಳಿಸು""ಪ್ರಶ್ನೆಯನ್ನು ಹುಡುಕಿ""ಹುಡುಕಿ""ಪ್ರಶ್ನೆಯನ್ನು ಸಲ್ಲಿಸು""ಧ್ವನಿ ಹುಡುಕಾಟ""ಇವರೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಿ""%s ನೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಿ""ಸಂಕುಚಿಸು""ಹುಡುಕಿ""홈 탐색""위로 탐색""옵션 더보기""완료""전체 보기""앱 선택""사용 안함""사용""Alt+""Ctrl+""삭제""입력""Function+""Meta+""Shift+""스페이스바""Sym+""Menu+""검색...""검색어 삭제""검색어""검색""검색어 보내기""음성 검색""공유 대상""%s와(과) 공유""접기""검색""Үйгө багыттоо""Жогору""Көбүрөөк мүмкүнчүлүктөр""Даяр""Бардыгын көрүү""Колдонмо тандоо""ӨЧҮК""КҮЙҮК""Alt+""Ctrl+""Delete""Enter""Function+""Meta+""Shift+""боштук""Sym+""Menu+""Издөө…""Талаптарды тазалоо""Издөө талаптары""Издөө""Талап жөнөтүү""Үн аркылуу издөө""Бөлүшүү""%s аркылуу бөлүшүү""Жыйнап коюу""Издөө"48dp12dp14dp440dp60%90%60%90%55%80%0px"Điều hướng về trang chủ""Điều hướng lên trên""Tùy chọn khác""Xong""Xem tất cả""Chọn một ứng dụng""TẮT""BẬT""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""phím cách""Sym+""Menu+""Tìm kiếm…""Xóa truy vấn""Tìm kiếm truy vấn""Tìm kiếm""Gửi truy vấn""Tìm kiếm bằng giọng nói""Chia sẻ với""Chia sẻ với %s""Thu gọn""Tìm kiếm"60%90%50%70%45%72%"转到主屏幕""转到上一层级""更多选项""完成""查看全部""选择应用""关闭""开启""Alt+""Ctrl+""Delete 键""Enter 键""Fn+""Meta+""Shift+""空格键""Sym+""Menu+""搜索…""清除查询""搜索查询""搜索""提交查询""语音搜索""分享方式""使用%s分享""收起""搜索""瀏覽主頁""向上瀏覽""更多選項""完成""顯示全部""選擇應用程式""關閉""開啟""Alt +""Ctrl +""刪除""Enter 鍵""Fn +""Meta +""Shift +""空白鍵""Sym +""Menu +""搜尋…""清除查詢""搜尋查詢""搜尋""提交查詢""語音搜尋""分享對象""使用「%s」分享""收合""搜尋""瀏覽首頁""向上瀏覽""更多選項""完成""查看全部""選擇應用程式""關閉""開啟""Alt +""Ctrl +""Delete 鍵""Enter 鍵""Fn +""Meta +""Shift +""空格鍵""Sym +""Menu +""搜尋…""清除查詢""搜尋查詢""搜尋""提交查詢""語音搜尋""選擇分享對象""與「%s」分享""收合""搜尋""Zulazulela ekhaya""Zulazulela phezulu""Izinketho eziningi""Kwenziwe""Buka konke""Khetha uhlelo lokusebenza""VALIWE""VULIWE""Alt+""Ctrl+""susa""enter""Function+""Meta+""Shift+""space""Sym+""Imenyu+""Iyasesha...""Sula inkinga""Umbuzo wosesho""Sesha""Hambisa umbuzo""Ukusesha ngezwi""Yabelana no-""Yabelana ne-%s""Goqa""Sesha"true#14000000#3F51B5#303F9F@android:color/transparent#14000000#44000000#0A000000#0F000000#1AFFFFFF#2EFFFFFF#323232#1F000000#61000000#00ffffff#52000000#6B000000#1F000000#0A000000#DE000000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 4dp168dp96dp14sp8dp56dp24dp96dp56dp8dp1dp12sp16dp64dp0.5dp6dp24dp40dp56dp6dp6dp16dp32dp24dp16dp32dp280dp8dp8dp128dp0dp6dp0dp-1px-1px12dp14dp24dp14sp264dp72dp14sp12sp5dp60dp5dp8dp0dp56dp4dp64dp0dp0dp2dp2dp2dp12dp8dp6dp0.074dp16dp16dp4dp6dp1dp4dp8dp8dp14sp0dp1dp8dp3dp14sp6dp2dp6dp0dp22dp14dp4dp8dp3dp4dp0dp4dp12dp1dp2dp16dp56dp1501502300320100100100250200android.support.design.widget.AppBarLayout$ScrollingViewBehaviorandroid.support.design.widget.BottomSheetBehaviorCharacter limit exceeded %1$d of %2$d%1$d / %2$dandroid.support.design.transformation.FabTransformationScrimBehaviorandroid.support.design.transformation.FabTransformationSheetBehaviorandroid.support.design.behavior.HideBottomViewOnScrollBehaviorRemove %1$sShow passwordM12,4.5C7,4.5 2.73,7.61 1,12c1.73,4.39 6,7.5 11,7.5s9.27,-3.11 11,-7.5c-1.73,-4.39 -6,-7.5 -11,-7.5zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5zM12,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3 3,-1.34 3,-3 -1.34,-3 -3,-3zM2,4.27 L19.73,22 L22.27,19.46 L4.54,1.73 L4.54,1 L23,1 L23,23 L1,23 L1,4.27 ZM2,4.27 L2,4.27 L4.54,1.73 L4.54,1.73 L4.54,1 L23,1 L23,23 L1,23 L1,4.27 ZM3.27,4.27 L19.74,20.74#008577#00574B#D81B6016dp12sp14sp18sp20spScriptorSettingsSettings - Church 1 - Church 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/mergeDebugShaders/merger.xml b/code/Android App/build/intermediates/incremental/mergeDebugShaders/merger.xml deleted file mode 100755 index d8cb3f7..0000000 --- a/code/Android App/build/intermediates/incremental/mergeDebugShaders/merger.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/code/Android App/build/intermediates/incremental/packageDebug/tmp/debug/dex-renamer-state.txt b/code/Android App/build/intermediates/incremental/packageDebug/tmp/debug/dex-renamer-state.txt deleted file mode 100755 index ffef914..0000000 --- a/code/Android App/build/intermediates/incremental/packageDebug/tmp/debug/dex-renamer-state.txt +++ /dev/null @@ -1,34 +0,0 @@ -#Mon Mar 18 20:10:36 EDT 2019 -path.1=classes.dex -path.0=classes.dex -renamed.10=classes11.dex -renamed.9=classes10.dex -renamed.8=classes9.dex -renamed.7=classes8.dex -renamed.6=classes7.dex -renamed.5=classes6.dex -renamed.4=classes5.dex -renamed.3=classes4.dex -renamed.2=classes3.dex -base.9=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\11 -renamed.1=classes2.dex -base.8=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\20 -renamed.0=classes.dex -base.7=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\15 -base.6=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\12 -base.5=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\13 -base.4=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\21 -base.3=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\19 -base.2=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\16 -base.1=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\17 -base.0=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\14 -base.10=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\18 -path.10=classes.dex -path.9=classes.dex -path.8=classes.dex -path.7=classes.dex -path.6=classes.dex -path.5=classes.dex -path.4=classes.dex -path.3=classes.dex -path.2=classes.dex diff --git a/code/Android App/build/intermediates/incremental/packageDebug/tmp/debug/file-input-save-data.txt b/code/Android App/build/intermediates/incremental/packageDebug/tmp/debug/file-input-save-data.txt deleted file mode 100755 index c790296..0000000 --- a/code/Android App/build/intermediates/incremental/packageDebug/tmp/debug/file-input-save-data.txt +++ /dev/null @@ -1,47 +0,0 @@ -#Internal package file, do not edit. -#Mon Mar 18 19:54:41 EDT 2019 -4.path=classes.dex -8.set=DEX -6.path=classes.dex -0.baseType=DIRECTORY -10.path=classes.dex -5.baseType=DIRECTORY -1.base=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\11 -8.path=classes.dex -3.base=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\15 -4.set=DEX -5.base=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\13 -7.base=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\19 -9.base=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\17 -1.baseType=DIRECTORY -0.set=DEX -6.baseType=DIRECTORY -7.set=DEX -3.set=DEX -2.baseType=DIRECTORY -10.baseType=DIRECTORY -1.path=classes.dex -7.baseType=DIRECTORY -3.path=classes.dex -10.set=DEX -5.path=classes.dex -0.base=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\18 -7.path=classes.dex -9.path=classes.dex -6.set=DEX -2.base=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\20 -4.base=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\12 -3.baseType=DIRECTORY -6.base=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\21 -10.base=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\14 -8.base=C\:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexMerger\\debug\\16 -2.set=DEX -8.baseType=DIRECTORY -9.set=DEX -count=11 -4.baseType=DIRECTORY -5.set=DEX -9.baseType=DIRECTORY -0.path=classes.dex -1.set=DEX -2.path=classes.dex diff --git a/code/Android App/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/G8dDJkzQTIhofpD35SKLGkFAdr8= b/code/Android App/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/G8dDJkzQTIhofpD35SKLGkFAdr8= deleted file mode 100755 index d75b355..0000000 Binary files a/code/Android App/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/G8dDJkzQTIhofpD35SKLGkFAdr8= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/n6GSrJNmUJdX7nST0D_GJuZUhlI= b/code/Android App/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/n6GSrJNmUJdX7nST0D_GJuZUhlI= deleted file mode 100755 index ebf20ab..0000000 Binary files a/code/Android App/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/n6GSrJNmUJdX7nST0D_GJuZUhlI= and /dev/null differ diff --git a/code/Android App/build/intermediates/incremental/processInstantRunDebugResourcesApk/package_resources-debug/dex-renamer-state.txt b/code/Android App/build/intermediates/incremental/processInstantRunDebugResourcesApk/package_resources-debug/dex-renamer-state.txt deleted file mode 100755 index 481dc90..0000000 --- a/code/Android App/build/intermediates/incremental/processInstantRunDebugResourcesApk/package_resources-debug/dex-renamer-state.txt +++ /dev/null @@ -1 +0,0 @@ -#Mon Mar 18 19:54:35 EDT 2019 diff --git a/code/Android App/build/intermediates/instant-run-apk/debug/app-debug.apk b/code/Android App/build/intermediates/instant-run-apk/debug/app-debug.apk deleted file mode 100755 index 1dbd822..0000000 Binary files a/code/Android App/build/intermediates/instant-run-apk/debug/app-debug.apk and /dev/null differ diff --git a/code/Android App/build/intermediates/instant-run-apk/debug/output.json b/code/Android App/build/intermediates/instant-run-apk/debug/output.json deleted file mode 100755 index f20a39f..0000000 --- a/code/Android App/build/intermediates/instant-run-apk/debug/output.json +++ /dev/null @@ -1 +0,0 @@ -[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-debug.apk","fullName":"debug","baseName":"debug"},"path":"app-debug.apk","properties":{}}] \ No newline at end of file diff --git a/code/Android App/build/intermediates/instant_app_manifest/debug/processDebugManifest/instant-app-manifest/AndroidManifest.xml b/code/Android App/build/intermediates/instant_app_manifest/debug/processDebugManifest/instant-app-manifest/AndroidManifest.xml deleted file mode 100755 index e580177..0000000 --- a/code/Android App/build/intermediates/instant_app_manifest/debug/processDebugManifest/instant-app-manifest/AndroidManifest.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/code/Android App/build/intermediates/instant_app_manifest/debug/processDebugManifest/instant-app-manifest/output.json b/code/Android App/build/intermediates/instant_app_manifest/debug/processDebugManifest/instant-app-manifest/output.json deleted file mode 100755 index b56482a..0000000 --- a/code/Android App/build/intermediates/instant_app_manifest/debug/processDebugManifest/instant-app-manifest/output.json +++ /dev/null @@ -1 +0,0 @@ -[{"outputType":{"type":"INSTANT_APP_MANIFEST"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-debug.apk","fullName":"debug","baseName":"debug"},"path":"AndroidManifest.xml","properties":{"packageId":"com.scriptor","split":"","minSdkVersion":"15"}}] \ No newline at end of file diff --git a/code/Android App/build/intermediates/instant_run_app_info_output_file/debug/generateDebugInstantRunAppInfo/instant-run-bootstrap.jar b/code/Android App/build/intermediates/instant_run_app_info_output_file/debug/generateDebugInstantRunAppInfo/instant-run-bootstrap.jar deleted file mode 100755 index 452e583..0000000 Binary files a/code/Android App/build/intermediates/instant_run_app_info_output_file/debug/generateDebugInstantRunAppInfo/instant-run-bootstrap.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/instant_run_main_apk_resources/debug/instantRunMainApkResourcesDebug/out/main_resources/resources_ap b/code/Android App/build/intermediates/instant_run_main_apk_resources/debug/instantRunMainApkResourcesDebug/out/main_resources/resources_ap deleted file mode 100755 index ebf20ab..0000000 Binary files a/code/Android App/build/intermediates/instant_run_main_apk_resources/debug/instantRunMainApkResourcesDebug/out/main_resources/resources_ap and /dev/null differ diff --git a/code/Android App/build/intermediates/instant_run_main_apk_resources/debug/instantRunMainApkResourcesDebug/out/output.json b/code/Android App/build/intermediates/instant_run_main_apk_resources/debug/instantRunMainApkResourcesDebug/out/output.json deleted file mode 100755 index ad14102..0000000 --- a/code/Android App/build/intermediates/instant_run_main_apk_resources/debug/instantRunMainApkResourcesDebug/out/output.json +++ /dev/null @@ -1 +0,0 @@ -[{"outputType":{"type":"INSTANT_RUN_MAIN_APK_RESOURCES"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-debug.apk","fullName":"debug","baseName":"debug"},"path":"main_resources\\resources_ap","properties":{}}] \ No newline at end of file diff --git a/code/Android App/build/intermediates/instant_run_merged_manifests/debug/processDebugManifest/instant-run/AndroidManifest.xml b/code/Android App/build/intermediates/instant_run_merged_manifests/debug/processDebugManifest/instant-run/AndroidManifest.xml deleted file mode 100755 index c428d5f..0000000 --- a/code/Android App/build/intermediates/instant_run_merged_manifests/debug/processDebugManifest/instant-run/AndroidManifest.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/code/Android App/build/intermediates/instant_run_merged_manifests/debug/processDebugManifest/instant-run/output.json b/code/Android App/build/intermediates/instant_run_merged_manifests/debug/processDebugManifest/instant-run/output.json deleted file mode 100755 index 65afb61..0000000 --- a/code/Android App/build/intermediates/instant_run_merged_manifests/debug/processDebugManifest/instant-run/output.json +++ /dev/null @@ -1 +0,0 @@ -[{"outputType":{"type":"INSTANT_RUN_MERGED_MANIFESTS"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-debug.apk","fullName":"debug","baseName":"debug"},"path":"AndroidManifest.xml","properties":{"packageId":"com.scriptor","split":"","minSdkVersion":"15"}}] \ No newline at end of file diff --git a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_0/AndroidManifest.xml b/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_0/AndroidManifest.xml deleted file mode 100755 index 378bdf6..0000000 --- a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_0/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_0/resources_ap b/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_0/resources_ap deleted file mode 100755 index be03c98..0000000 Binary files a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_0/resources_ap and /dev/null differ diff --git a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_1/AndroidManifest.xml b/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_1/AndroidManifest.xml deleted file mode 100755 index d26b7e9..0000000 --- a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_1/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_1/resources_ap b/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_1/resources_ap deleted file mode 100755 index 88579ae..0000000 Binary files a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_1/resources_ap and /dev/null differ diff --git a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_2/AndroidManifest.xml b/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_2/AndroidManifest.xml deleted file mode 100755 index a225efa..0000000 --- a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_2/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_2/resources_ap b/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_2/resources_ap deleted file mode 100755 index 7240fd4..0000000 Binary files a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_2/resources_ap and /dev/null differ diff --git a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_3/AndroidManifest.xml b/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_3/AndroidManifest.xml deleted file mode 100755 index eeb46ed..0000000 --- a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_3/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_3/resources_ap b/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_3/resources_ap deleted file mode 100755 index f5f3fa6..0000000 Binary files a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_3/resources_ap and /dev/null differ diff --git a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_4/AndroidManifest.xml b/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_4/AndroidManifest.xml deleted file mode 100755 index 51b8cd8..0000000 --- a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_4/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_4/resources_ap b/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_4/resources_ap deleted file mode 100755 index 29ccb56..0000000 Binary files a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_4/resources_ap and /dev/null differ diff --git a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_5/AndroidManifest.xml b/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_5/AndroidManifest.xml deleted file mode 100755 index 9c4f6f3..0000000 --- a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_5/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_5/resources_ap b/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_5/resources_ap deleted file mode 100755 index 18e3acc..0000000 Binary files a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_5/resources_ap and /dev/null differ diff --git a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_6/AndroidManifest.xml b/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_6/AndroidManifest.xml deleted file mode 100755 index 8e5f8fb..0000000 --- a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_6/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_6/resources_ap b/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_6/resources_ap deleted file mode 100755 index 4ce29bd..0000000 Binary files a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_6/resources_ap and /dev/null differ diff --git a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_7/AndroidManifest.xml b/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_7/AndroidManifest.xml deleted file mode 100755 index 3ede9c7..0000000 --- a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_7/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_7/resources_ap b/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_7/resources_ap deleted file mode 100755 index f7854d3..0000000 Binary files a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_7/resources_ap and /dev/null differ diff --git a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_8/AndroidManifest.xml b/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_8/AndroidManifest.xml deleted file mode 100755 index 7efd9a2..0000000 --- a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_8/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_8/resources_ap b/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_8/resources_ap deleted file mode 100755 index 7a7f0ab..0000000 Binary files a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_8/resources_ap and /dev/null differ diff --git a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_9/AndroidManifest.xml b/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_9/AndroidManifest.xml deleted file mode 100755 index e804dbf..0000000 --- a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_9/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_9/resources_ap b/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_9/resources_ap deleted file mode 100755 index 9926b53..0000000 Binary files a/code/Android App/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_9/resources_ap and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/arch/core/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/arch/core/R.class deleted file mode 100755 index f74ab6f..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/arch/core/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/arch/lifecycle/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/arch/lifecycle/R.class deleted file mode 100755 index c52407b..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/arch/lifecycle/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/arch/lifecycle/livedata/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/arch/lifecycle/livedata/R.class deleted file mode 100755 index 80ab4ab..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/arch/lifecycle/livedata/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/arch/lifecycle/livedata/core/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/arch/lifecycle/livedata/core/R.class deleted file mode 100755 index 85462a4..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/arch/lifecycle/livedata/core/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/arch/lifecycle/viewmodel/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/arch/lifecycle/viewmodel/R.class deleted file mode 100755 index 53678cf..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/arch/lifecycle/viewmodel/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$attr.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$attr.class deleted file mode 100755 index 39dadfb..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$color.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$color.class deleted file mode 100755 index 2e9a066..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$dimen.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$dimen.class deleted file mode 100755 index a2b44d7..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$drawable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$drawable.class deleted file mode 100755 index 514746a..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$id.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$id.class deleted file mode 100755 index c84f040..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$integer.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$integer.class deleted file mode 100755 index a0f398d..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$layout.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$layout.class deleted file mode 100755 index 2a6ff44..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$string.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$string.class deleted file mode 100755 index 2fb1b65..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$style.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$style.class deleted file mode 100755 index aeca33e..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$styleable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$styleable.class deleted file mode 100755 index 345f7ab..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R.class deleted file mode 100755 index 0874dd7..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/asynclayoutinflater/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$attr.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$attr.class deleted file mode 100755 index 196b27e..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$color.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$color.class deleted file mode 100755 index 616f58f..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$dimen.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$dimen.class deleted file mode 100755 index abf2ed4..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$drawable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$drawable.class deleted file mode 100755 index 3d60819..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$id.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$id.class deleted file mode 100755 index c4b2468..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$integer.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$integer.class deleted file mode 100755 index b6596a8..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$layout.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$layout.class deleted file mode 100755 index 5297a3e..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$string.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$string.class deleted file mode 100755 index 3cc2fec..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$style.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$style.class deleted file mode 100755 index f292e7f..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$styleable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$styleable.class deleted file mode 100755 index 446d0a8..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R.class deleted file mode 100755 index 57ad7c8..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/compat/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/constraint/R$attr.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/constraint/R$attr.class deleted file mode 100755 index e4ee068..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/constraint/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/constraint/R$id.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/constraint/R$id.class deleted file mode 100755 index a51a6f1..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/constraint/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/constraint/R$styleable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/constraint/R$styleable.class deleted file mode 100755 index 7da88e3..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/constraint/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/constraint/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/constraint/R.class deleted file mode 100755 index 237278c..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/constraint/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$attr.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$attr.class deleted file mode 100755 index 6313118..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$color.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$color.class deleted file mode 100755 index f867707..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$dimen.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$dimen.class deleted file mode 100755 index e3770ae..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$drawable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$drawable.class deleted file mode 100755 index e3a0e58..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$id.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$id.class deleted file mode 100755 index dae400f..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$integer.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$integer.class deleted file mode 100755 index 6647fd8..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$layout.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$layout.class deleted file mode 100755 index eed28af..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$string.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$string.class deleted file mode 100755 index 96343be..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$style.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$style.class deleted file mode 100755 index 4813ed8..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$styleable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$styleable.class deleted file mode 100755 index 469323d..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R.class deleted file mode 100755 index 8fbdcbb..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coordinatorlayout/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$attr.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$attr.class deleted file mode 100755 index 5d1d245..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$color.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$color.class deleted file mode 100755 index d6f1bb6..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$dimen.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$dimen.class deleted file mode 100755 index ae5b0ca..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$drawable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$drawable.class deleted file mode 100755 index 6fe94b0..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$id.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$id.class deleted file mode 100755 index 9c8f312..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$integer.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$integer.class deleted file mode 100755 index 2717f23..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$layout.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$layout.class deleted file mode 100755 index 1abb971..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$string.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$string.class deleted file mode 100755 index ce71049..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$style.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$style.class deleted file mode 100755 index 6a4bf04..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$styleable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$styleable.class deleted file mode 100755 index 30d59ab..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R.class deleted file mode 100755 index 120ef93..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreui/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$attr.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$attr.class deleted file mode 100755 index 9dc48f3..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$color.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$color.class deleted file mode 100755 index 4d2dbb0..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$dimen.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$dimen.class deleted file mode 100755 index 550daf7..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$drawable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$drawable.class deleted file mode 100755 index 76a4337..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$id.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$id.class deleted file mode 100755 index 998bb0e..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$integer.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$integer.class deleted file mode 100755 index 7534c58..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$layout.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$layout.class deleted file mode 100755 index 58f06b5..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$string.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$string.class deleted file mode 100755 index c4be0d6..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$style.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$style.class deleted file mode 100755 index 1468bdf..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$styleable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$styleable.class deleted file mode 100755 index 8b6cc31..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R.class deleted file mode 100755 index a92c243..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/coreutils/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/cursoradapter/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/cursoradapter/R.class deleted file mode 100755 index f9da80e..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/cursoradapter/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$attr.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$attr.class deleted file mode 100755 index d28e3e2..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$color.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$color.class deleted file mode 100755 index c53736f..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$dimen.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$dimen.class deleted file mode 100755 index 2338981..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$drawable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$drawable.class deleted file mode 100755 index 84216bc..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$id.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$id.class deleted file mode 100755 index 96b9fac..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$integer.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$integer.class deleted file mode 100755 index c67e4f8..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$layout.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$layout.class deleted file mode 100755 index 9e44720..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$string.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$string.class deleted file mode 100755 index 5bfbf9e..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$style.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$style.class deleted file mode 100755 index 131a48d..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$styleable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$styleable.class deleted file mode 100755 index 4294c06..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R.class deleted file mode 100755 index e47774a..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/customview/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$anim.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$anim.class deleted file mode 100755 index 20db283..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$anim.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$animator.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$animator.class deleted file mode 100755 index 84f5c88..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$animator.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$attr.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$attr.class deleted file mode 100755 index e1d77af..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$bool.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$bool.class deleted file mode 100755 index 3092f59..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$bool.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$color.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$color.class deleted file mode 100755 index e3f2a8f..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$dimen.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$dimen.class deleted file mode 100755 index acfb746..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$drawable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$drawable.class deleted file mode 100755 index e1a6547..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$id.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$id.class deleted file mode 100755 index 02a7978..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$integer.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$integer.class deleted file mode 100755 index 1937648..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$interpolator.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$interpolator.class deleted file mode 100755 index 34e1744..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$interpolator.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$layout.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$layout.class deleted file mode 100755 index 11608d9..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$string.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$string.class deleted file mode 100755 index fa2d93c..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$style.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$style.class deleted file mode 100755 index 8c2567d..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$styleable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$styleable.class deleted file mode 100755 index a0bbba8..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R.class deleted file mode 100755 index d3ada39..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/design/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/documentfile/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/documentfile/R.class deleted file mode 100755 index 8808028..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/documentfile/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$attr.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$attr.class deleted file mode 100755 index 6f3432e..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$color.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$color.class deleted file mode 100755 index 1b47111..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$dimen.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$dimen.class deleted file mode 100755 index 21aa3b3..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$drawable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$drawable.class deleted file mode 100755 index efa7e94..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$id.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$id.class deleted file mode 100755 index f7b6937..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$integer.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$integer.class deleted file mode 100755 index 77253ca..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$layout.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$layout.class deleted file mode 100755 index 701db2b..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$string.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$string.class deleted file mode 100755 index 1d4f378..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$style.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$style.class deleted file mode 100755 index 0f8bbc7..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$styleable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$styleable.class deleted file mode 100755 index 718d9b1..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R.class deleted file mode 100755 index ce9c72a..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/drawerlayout/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$attr.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$attr.class deleted file mode 100755 index 7d89f92..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$color.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$color.class deleted file mode 100755 index 20f010a..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$dimen.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$dimen.class deleted file mode 100755 index 3c31a78..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$drawable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$drawable.class deleted file mode 100755 index e99f0d4..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$id.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$id.class deleted file mode 100755 index b501812..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$integer.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$integer.class deleted file mode 100755 index ff3240a..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$layout.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$layout.class deleted file mode 100755 index 24af21d..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$string.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$string.class deleted file mode 100755 index 62a8352..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$style.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$style.class deleted file mode 100755 index 64d8ed3..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$styleable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$styleable.class deleted file mode 100755 index 4dc3949..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R.class deleted file mode 100755 index 030d8ce..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/fragment/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$attr.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$attr.class deleted file mode 100755 index 3a17d54..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$color.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$color.class deleted file mode 100755 index f0cbe41..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$dimen.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$dimen.class deleted file mode 100755 index 3ca1f4b..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$drawable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$drawable.class deleted file mode 100755 index 914ba1e..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$id.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$id.class deleted file mode 100755 index b120e4d..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$integer.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$integer.class deleted file mode 100755 index 5682edc..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$layout.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$layout.class deleted file mode 100755 index 7ac4e51..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$string.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$string.class deleted file mode 100755 index ffb5a42..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$style.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$style.class deleted file mode 100755 index 26f5b7a..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$styleable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$styleable.class deleted file mode 100755 index 2b37487..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R.class deleted file mode 100755 index 0219482..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/graphics/drawable/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/interpolator/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/interpolator/R.class deleted file mode 100755 index 0a83688..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/interpolator/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$attr.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$attr.class deleted file mode 100755 index df8a07c..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$color.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$color.class deleted file mode 100755 index ce2065e..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$dimen.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$dimen.class deleted file mode 100755 index e017d28..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$drawable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$drawable.class deleted file mode 100755 index 28a805a..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$id.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$id.class deleted file mode 100755 index 09d42f8..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$integer.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$integer.class deleted file mode 100755 index 5f71633..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$layout.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$layout.class deleted file mode 100755 index f34db2d..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$string.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$string.class deleted file mode 100755 index c6f18b7..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$style.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$style.class deleted file mode 100755 index f5e4d4d..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$styleable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$styleable.class deleted file mode 100755 index 5db0853..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R.class deleted file mode 100755 index 70da916..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/loader/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/localbroadcastmanager/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/localbroadcastmanager/R.class deleted file mode 100755 index a29b974..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/localbroadcastmanager/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/print/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/print/R.class deleted file mode 100755 index b8761d9..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/print/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$attr.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$attr.class deleted file mode 100755 index a04f67b..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$color.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$color.class deleted file mode 100755 index 1312866..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$dimen.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$dimen.class deleted file mode 100755 index a531fe4..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$drawable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$drawable.class deleted file mode 100755 index c1d5d0a..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$id.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$id.class deleted file mode 100755 index 958cba9..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$integer.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$integer.class deleted file mode 100755 index dccad09..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$layout.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$layout.class deleted file mode 100755 index 1aabfb5..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$string.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$string.class deleted file mode 100755 index 8a494ea..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$style.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$style.class deleted file mode 100755 index 841d660..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$styleable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$styleable.class deleted file mode 100755 index 201bc95..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R.class deleted file mode 100755 index 155b8a9..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/slidingpanelayout/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$attr.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$attr.class deleted file mode 100755 index c8b6066..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$color.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$color.class deleted file mode 100755 index 12b7876..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$dimen.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$dimen.class deleted file mode 100755 index a23a55a..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$drawable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$drawable.class deleted file mode 100755 index f4874a4..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$id.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$id.class deleted file mode 100755 index 841a5bd..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$integer.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$integer.class deleted file mode 100755 index 6a71362..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$layout.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$layout.class deleted file mode 100755 index 39eb317..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$string.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$string.class deleted file mode 100755 index 11e50b7..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$style.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$style.class deleted file mode 100755 index b2b5d33..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$styleable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$styleable.class deleted file mode 100755 index 527f746..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R.class deleted file mode 100755 index 069da82..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/swiperefreshlayout/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$attr.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$attr.class deleted file mode 100755 index 9159a65..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$color.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$color.class deleted file mode 100755 index ea65d10..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$dimen.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$dimen.class deleted file mode 100755 index 44c0d8f..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$drawable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$drawable.class deleted file mode 100755 index 2f08b95..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$id.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$id.class deleted file mode 100755 index 3983f98..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$integer.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$integer.class deleted file mode 100755 index e53fb28..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$layout.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$layout.class deleted file mode 100755 index 0375edd..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$string.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$string.class deleted file mode 100755 index 61e5dcd..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$style.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$style.class deleted file mode 100755 index 1ce25c5..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$styleable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$styleable.class deleted file mode 100755 index 9cb7778..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R.class deleted file mode 100755 index 889270a..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/transition/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$anim.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$anim.class deleted file mode 100755 index 1ab5b25..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$anim.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$attr.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$attr.class deleted file mode 100755 index b74e8d1..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$bool.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$bool.class deleted file mode 100755 index 921bfae..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$bool.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$color.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$color.class deleted file mode 100755 index 00e4d1d..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$dimen.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$dimen.class deleted file mode 100755 index eb76120..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$drawable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$drawable.class deleted file mode 100755 index 579c285..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$id.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$id.class deleted file mode 100755 index e673dee..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$integer.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$integer.class deleted file mode 100755 index 415e124..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$layout.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$layout.class deleted file mode 100755 index 1eaa2fc..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$string.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$string.class deleted file mode 100755 index 751c9f7..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$style.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$style.class deleted file mode 100755 index 6e4cd80..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$styleable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$styleable.class deleted file mode 100755 index 96a18be..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R.class deleted file mode 100755 index c2e3955..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/appcompat/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/cardview/R$attr.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/cardview/R$attr.class deleted file mode 100755 index be164b8..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/cardview/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/cardview/R$color.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/cardview/R$color.class deleted file mode 100755 index 66468f9..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/cardview/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/cardview/R$dimen.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/cardview/R$dimen.class deleted file mode 100755 index 4d19b1a..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/cardview/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/cardview/R$style.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/cardview/R$style.class deleted file mode 100755 index 964af87..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/cardview/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/cardview/R$styleable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/cardview/R$styleable.class deleted file mode 100755 index 79a2892..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/cardview/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/cardview/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/cardview/R.class deleted file mode 100755 index 18455b8..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/cardview/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$attr.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$attr.class deleted file mode 100755 index aff1355..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$color.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$color.class deleted file mode 100755 index b90abfd..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$dimen.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$dimen.class deleted file mode 100755 index f3a6868..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$drawable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$drawable.class deleted file mode 100755 index 28cd8be..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$id.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$id.class deleted file mode 100755 index fe202ee..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$integer.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$integer.class deleted file mode 100755 index ae89370..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$layout.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$layout.class deleted file mode 100755 index 023729e..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$string.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$string.class deleted file mode 100755 index 0e64a0e..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$style.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$style.class deleted file mode 100755 index 899d603..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$styleable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$styleable.class deleted file mode 100755 index 9c1648e..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R.class deleted file mode 100755 index 9796eb9..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/recyclerview/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$attr.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$attr.class deleted file mode 100755 index 8a87fa9..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$color.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$color.class deleted file mode 100755 index cf47beb..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$dimen.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$dimen.class deleted file mode 100755 index 4d8702c..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$drawable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$drawable.class deleted file mode 100755 index 2ea9a91..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$id.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$id.class deleted file mode 100755 index f8991c9..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$integer.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$integer.class deleted file mode 100755 index 0b92dea..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$layout.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$layout.class deleted file mode 100755 index 733fb59..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$string.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$string.class deleted file mode 100755 index fe3a314..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$style.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$style.class deleted file mode 100755 index 2e6f257..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$styleable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$styleable.class deleted file mode 100755 index b95e2d8..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R.class deleted file mode 100755 index 4785c9b..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v7/viewpager/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/androidx/versionedparcelable/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/androidx/versionedparcelable/R.class deleted file mode 100755 index 79a4038..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/androidx/versionedparcelable/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/BuildConfig.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/BuildConfig.class deleted file mode 100755 index 321b34c..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/BuildConfig.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/Church.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/Church.class deleted file mode 100755 index 567374d..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/Church.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/MainActivity$1.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/MainActivity$1.class deleted file mode 100755 index fa1dfeb..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/MainActivity$1.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/MainActivity.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/MainActivity.class deleted file mode 100755 index 7a454e7..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/MainActivity.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$anim.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$anim.class deleted file mode 100755 index da905dd..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$anim.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$animator.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$animator.class deleted file mode 100755 index c8d6b65..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$animator.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$array.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$array.class deleted file mode 100755 index eb17369..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$array.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$attr.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$attr.class deleted file mode 100755 index 2bf2e29..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$bool.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$bool.class deleted file mode 100755 index 429ea8e..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$bool.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$color.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$color.class deleted file mode 100755 index 160abbe..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$dimen.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$dimen.class deleted file mode 100755 index 04fe9c6..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$drawable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$drawable.class deleted file mode 100755 index d345435..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$id.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$id.class deleted file mode 100755 index 119b67c..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$integer.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$integer.class deleted file mode 100755 index 06f7732..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$interpolator.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$interpolator.class deleted file mode 100755 index 9c80c79..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$interpolator.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$layout.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$layout.class deleted file mode 100755 index 659a317..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$menu.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$menu.class deleted file mode 100755 index 5b9d613..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$menu.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$mipmap.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$mipmap.class deleted file mode 100755 index 0221244..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$mipmap.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$string.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$string.class deleted file mode 100755 index 114fce3..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$style.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$style.class deleted file mode 100755 index 4e0a074..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$styleable.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$styleable.class deleted file mode 100755 index 3da0bb7..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R.class deleted file mode 100755 index 84178e9..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/Settings$1.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/Settings$1.class deleted file mode 100755 index 54abfd4..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/Settings$1.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/Settings$2.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/Settings$2.class deleted file mode 100755 index 0da6f1b..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/Settings$2.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/Settings$3.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/Settings$3.class deleted file mode 100755 index b2ec4dd..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/Settings$3.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/Settings$4.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/Settings$4.class deleted file mode 100755 index 47f9ff1..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/Settings$4.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/Settings.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/Settings.class deleted file mode 100755 index 3389354..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/Settings.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/Song.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/Song.class deleted file mode 100755 index bf5be11..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/Song.class and /dev/null differ diff --git a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/songRequest.class b/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/songRequest.class deleted file mode 100755 index 9ebaedb..0000000 Binary files a/code/Android App/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/scriptor/songRequest.class and /dev/null differ diff --git a/code/Android App/build/intermediates/manifest-checker/debug/manifest.crc b/code/Android App/build/intermediates/manifest-checker/debug/manifest.crc deleted file mode 100755 index 999e215..0000000 --- a/code/Android App/build/intermediates/manifest-checker/debug/manifest.crc +++ /dev/null @@ -1 +0,0 @@ -1411782206 \ No newline at end of file diff --git a/code/Android App/build/intermediates/manifest-checker/debug/manifest.xml b/code/Android App/build/intermediates/manifest-checker/debug/manifest.xml deleted file mode 100755 index c428d5f..0000000 --- a/code/Android App/build/intermediates/manifest-checker/debug/manifest.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/code/Android App/build/intermediates/merged_manifests/debug/AndroidManifest.xml b/code/Android App/build/intermediates/merged_manifests/debug/AndroidManifest.xml deleted file mode 100755 index c428d5f..0000000 --- a/code/Android App/build/intermediates/merged_manifests/debug/AndroidManifest.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/code/Android App/build/intermediates/merged_manifests/debug/output.json b/code/Android App/build/intermediates/merged_manifests/debug/output.json deleted file mode 100755 index a56f221..0000000 --- a/code/Android App/build/intermediates/merged_manifests/debug/output.json +++ /dev/null @@ -1 +0,0 @@ -[{"outputType":{"type":"MERGED_MANIFESTS"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-debug.apk","fullName":"debug","baseName":"debug"},"path":"AndroidManifest.xml","properties":{"packageId":"com.scriptor","split":"","minSdkVersion":"15"}}] \ No newline at end of file diff --git a/code/Android App/build/intermediates/metadata_feature_manifest/debug/processDebugManifest/metadata-feature/output.json b/code/Android App/build/intermediates/metadata_feature_manifest/debug/processDebugManifest/metadata-feature/output.json deleted file mode 100755 index 53590e1..0000000 --- a/code/Android App/build/intermediates/metadata_feature_manifest/debug/processDebugManifest/metadata-feature/output.json +++ /dev/null @@ -1 +0,0 @@ -[{"outputType":{"type":"METADATA_FEATURE_MANIFEST"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-debug.apk","fullName":"debug","baseName":"debug"},"path":"AndroidManifest.xml","properties":{}}] \ No newline at end of file diff --git a/code/Android App/build/intermediates/processed_res/debug/processDebugResources/out/output.json b/code/Android App/build/intermediates/processed_res/debug/processDebugResources/out/output.json deleted file mode 100755 index d012585..0000000 --- a/code/Android App/build/intermediates/processed_res/debug/processDebugResources/out/output.json +++ /dev/null @@ -1 +0,0 @@ -[{"outputType":{"type":"PROCESSED_RES"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-debug.apk","fullName":"debug","baseName":"debug"},"path":"resources-debug.ap_","properties":{"packageId":"com.scriptor","split":"","minSdkVersion":"15"}}] \ No newline at end of file diff --git a/code/Android App/build/intermediates/processed_res/debug/processDebugResources/out/resources-debug.ap_ b/code/Android App/build/intermediates/processed_res/debug/processDebugResources/out/resources-debug.ap_ deleted file mode 100755 index 75b5396..0000000 Binary files a/code/Android App/build/intermediates/processed_res/debug/processDebugResources/out/resources-debug.ap_ and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/anim-v21_design_bottom_sheet_slide_in.xml.flat b/code/Android App/build/intermediates/res/merged/debug/anim-v21_design_bottom_sheet_slide_in.xml.flat deleted file mode 100755 index 8a9b235..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/anim-v21_design_bottom_sheet_slide_in.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/anim-v21_design_bottom_sheet_slide_out.xml.flat b/code/Android App/build/intermediates/res/merged/debug/anim-v21_design_bottom_sheet_slide_out.xml.flat deleted file mode 100755 index b105aa1..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/anim-v21_design_bottom_sheet_slide_out.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/anim_abc_fade_in.xml.flat b/code/Android App/build/intermediates/res/merged/debug/anim_abc_fade_in.xml.flat deleted file mode 100755 index 2450901..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/anim_abc_fade_in.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/anim_abc_fade_out.xml.flat b/code/Android App/build/intermediates/res/merged/debug/anim_abc_fade_out.xml.flat deleted file mode 100755 index 569085b..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/anim_abc_fade_out.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/anim_abc_grow_fade_in_from_bottom.xml.flat b/code/Android App/build/intermediates/res/merged/debug/anim_abc_grow_fade_in_from_bottom.xml.flat deleted file mode 100755 index 859f066..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/anim_abc_grow_fade_in_from_bottom.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/anim_abc_popup_enter.xml.flat b/code/Android App/build/intermediates/res/merged/debug/anim_abc_popup_enter.xml.flat deleted file mode 100755 index 122df45..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/anim_abc_popup_enter.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/anim_abc_popup_exit.xml.flat b/code/Android App/build/intermediates/res/merged/debug/anim_abc_popup_exit.xml.flat deleted file mode 100755 index d74e720..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/anim_abc_popup_exit.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/anim_abc_shrink_fade_out_from_bottom.xml.flat b/code/Android App/build/intermediates/res/merged/debug/anim_abc_shrink_fade_out_from_bottom.xml.flat deleted file mode 100755 index a05341f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/anim_abc_shrink_fade_out_from_bottom.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/anim_abc_slide_in_bottom.xml.flat b/code/Android App/build/intermediates/res/merged/debug/anim_abc_slide_in_bottom.xml.flat deleted file mode 100755 index 33f1920..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/anim_abc_slide_in_bottom.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/anim_abc_slide_in_top.xml.flat b/code/Android App/build/intermediates/res/merged/debug/anim_abc_slide_in_top.xml.flat deleted file mode 100755 index 4996351..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/anim_abc_slide_in_top.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/anim_abc_slide_out_bottom.xml.flat b/code/Android App/build/intermediates/res/merged/debug/anim_abc_slide_out_bottom.xml.flat deleted file mode 100755 index 938ebdc..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/anim_abc_slide_out_bottom.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/anim_abc_slide_out_top.xml.flat b/code/Android App/build/intermediates/res/merged/debug/anim_abc_slide_out_top.xml.flat deleted file mode 100755 index 2588eff..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/anim_abc_slide_out_top.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/anim_abc_tooltip_enter.xml.flat b/code/Android App/build/intermediates/res/merged/debug/anim_abc_tooltip_enter.xml.flat deleted file mode 100755 index ab73f05..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/anim_abc_tooltip_enter.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/anim_abc_tooltip_exit.xml.flat b/code/Android App/build/intermediates/res/merged/debug/anim_abc_tooltip_exit.xml.flat deleted file mode 100755 index 5337c8f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/anim_abc_tooltip_exit.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/anim_design_bottom_sheet_slide_in.xml.flat b/code/Android App/build/intermediates/res/merged/debug/anim_design_bottom_sheet_slide_in.xml.flat deleted file mode 100755 index e28bb85..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/anim_design_bottom_sheet_slide_in.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/anim_design_bottom_sheet_slide_out.xml.flat b/code/Android App/build/intermediates/res/merged/debug/anim_design_bottom_sheet_slide_out.xml.flat deleted file mode 100755 index b32a81a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/anim_design_bottom_sheet_slide_out.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/anim_design_snackbar_in.xml.flat b/code/Android App/build/intermediates/res/merged/debug/anim_design_snackbar_in.xml.flat deleted file mode 100755 index cc8ea94..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/anim_design_snackbar_in.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/anim_design_snackbar_out.xml.flat b/code/Android App/build/intermediates/res/merged/debug/anim_design_snackbar_out.xml.flat deleted file mode 100755 index 45e4021..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/anim_design_snackbar_out.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/animator-v21_design_appbar_state_list_animator.xml.flat b/code/Android App/build/intermediates/res/merged/debug/animator-v21_design_appbar_state_list_animator.xml.flat deleted file mode 100755 index 01ded0a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/animator-v21_design_appbar_state_list_animator.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/animator_design_fab_hide_motion_spec.xml.flat b/code/Android App/build/intermediates/res/merged/debug/animator_design_fab_hide_motion_spec.xml.flat deleted file mode 100755 index eaf0b8c..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/animator_design_fab_hide_motion_spec.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/animator_design_fab_show_motion_spec.xml.flat b/code/Android App/build/intermediates/res/merged/debug/animator_design_fab_show_motion_spec.xml.flat deleted file mode 100755 index a820cc6..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/animator_design_fab_show_motion_spec.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/animator_mtrl_btn_state_list_anim.xml.flat b/code/Android App/build/intermediates/res/merged/debug/animator_mtrl_btn_state_list_anim.xml.flat deleted file mode 100755 index a306141..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/animator_mtrl_btn_state_list_anim.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/animator_mtrl_btn_unelevated_state_list_anim.xml.flat b/code/Android App/build/intermediates/res/merged/debug/animator_mtrl_btn_unelevated_state_list_anim.xml.flat deleted file mode 100755 index ed5aa04..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/animator_mtrl_btn_unelevated_state_list_anim.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/animator_mtrl_chip_state_list_anim.xml.flat b/code/Android App/build/intermediates/res/merged/debug/animator_mtrl_chip_state_list_anim.xml.flat deleted file mode 100755 index 7446d20..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/animator_mtrl_chip_state_list_anim.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/animator_mtrl_fab_hide_motion_spec.xml.flat b/code/Android App/build/intermediates/res/merged/debug/animator_mtrl_fab_hide_motion_spec.xml.flat deleted file mode 100755 index 1cede53..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/animator_mtrl_fab_hide_motion_spec.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/animator_mtrl_fab_show_motion_spec.xml.flat b/code/Android App/build/intermediates/res/merged/debug/animator_mtrl_fab_show_motion_spec.xml.flat deleted file mode 100755 index b4f2842..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/animator_mtrl_fab_show_motion_spec.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/animator_mtrl_fab_transformation_sheet_collapse_spec.xml.flat b/code/Android App/build/intermediates/res/merged/debug/animator_mtrl_fab_transformation_sheet_collapse_spec.xml.flat deleted file mode 100755 index cb60075..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/animator_mtrl_fab_transformation_sheet_collapse_spec.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/animator_mtrl_fab_transformation_sheet_expand_spec.xml.flat b/code/Android App/build/intermediates/res/merged/debug/animator_mtrl_fab_transformation_sheet_expand_spec.xml.flat deleted file mode 100755 index 6695f5f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/animator_mtrl_fab_transformation_sheet_expand_spec.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color-v21_abc_btn_colored_borderless_text_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color-v21_abc_btn_colored_borderless_text_material.xml.flat deleted file mode 100755 index 65b5855..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color-v21_abc_btn_colored_borderless_text_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color-v23_abc_btn_colored_borderless_text_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color-v23_abc_btn_colored_borderless_text_material.xml.flat deleted file mode 100755 index 9a771b7..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color-v23_abc_btn_colored_borderless_text_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color-v23_abc_btn_colored_text_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color-v23_abc_btn_colored_text_material.xml.flat deleted file mode 100755 index aaab445..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color-v23_abc_btn_colored_text_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color-v23_abc_color_highlight_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color-v23_abc_color_highlight_material.xml.flat deleted file mode 100755 index 043ed27..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color-v23_abc_color_highlight_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color-v23_abc_tint_btn_checkable.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color-v23_abc_tint_btn_checkable.xml.flat deleted file mode 100755 index c2c8441..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color-v23_abc_tint_btn_checkable.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color-v23_abc_tint_default.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color-v23_abc_tint_default.xml.flat deleted file mode 100755 index ae88e85..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color-v23_abc_tint_default.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color-v23_abc_tint_edittext.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color-v23_abc_tint_edittext.xml.flat deleted file mode 100755 index a5ac999..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color-v23_abc_tint_edittext.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color-v23_abc_tint_seek_thumb.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color-v23_abc_tint_seek_thumb.xml.flat deleted file mode 100755 index 98c7aeb..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color-v23_abc_tint_seek_thumb.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color-v23_abc_tint_spinner.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color-v23_abc_tint_spinner.xml.flat deleted file mode 100755 index a032d18..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color-v23_abc_tint_spinner.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color-v23_abc_tint_switch_track.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color-v23_abc_tint_switch_track.xml.flat deleted file mode 100755 index 604c951..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color-v23_abc_tint_switch_track.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color-v23_design_tint_password_toggle.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color-v23_design_tint_password_toggle.xml.flat deleted file mode 100755 index fefe1b2..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color-v23_design_tint_password_toggle.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_abc_background_cache_hint_selector_material_dark.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_abc_background_cache_hint_selector_material_dark.xml.flat deleted file mode 100755 index 6bc51cd..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_abc_background_cache_hint_selector_material_dark.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_abc_background_cache_hint_selector_material_light.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_abc_background_cache_hint_selector_material_light.xml.flat deleted file mode 100755 index bab7d2a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_abc_background_cache_hint_selector_material_light.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_abc_btn_colored_borderless_text_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_abc_btn_colored_borderless_text_material.xml.flat deleted file mode 100755 index 63b876e..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_abc_btn_colored_borderless_text_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_abc_btn_colored_text_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_abc_btn_colored_text_material.xml.flat deleted file mode 100755 index be51132..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_abc_btn_colored_text_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_abc_hint_foreground_material_dark.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_abc_hint_foreground_material_dark.xml.flat deleted file mode 100755 index 4d9176a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_abc_hint_foreground_material_dark.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_abc_hint_foreground_material_light.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_abc_hint_foreground_material_light.xml.flat deleted file mode 100755 index fff351d..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_abc_hint_foreground_material_light.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_abc_primary_text_disable_only_material_dark.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_abc_primary_text_disable_only_material_dark.xml.flat deleted file mode 100755 index 8277b2e..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_abc_primary_text_disable_only_material_dark.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_abc_primary_text_disable_only_material_light.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_abc_primary_text_disable_only_material_light.xml.flat deleted file mode 100755 index 8432ee7..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_abc_primary_text_disable_only_material_light.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_abc_primary_text_material_dark.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_abc_primary_text_material_dark.xml.flat deleted file mode 100755 index 17a08f5..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_abc_primary_text_material_dark.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_abc_primary_text_material_light.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_abc_primary_text_material_light.xml.flat deleted file mode 100755 index 7f0a249..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_abc_primary_text_material_light.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_abc_search_url_text.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_abc_search_url_text.xml.flat deleted file mode 100755 index ad8275e..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_abc_search_url_text.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_abc_secondary_text_material_dark.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_abc_secondary_text_material_dark.xml.flat deleted file mode 100755 index 3c876c7..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_abc_secondary_text_material_dark.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_abc_secondary_text_material_light.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_abc_secondary_text_material_light.xml.flat deleted file mode 100755 index 2cfa0c4..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_abc_secondary_text_material_light.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_abc_tint_btn_checkable.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_abc_tint_btn_checkable.xml.flat deleted file mode 100755 index c828141..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_abc_tint_btn_checkable.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_abc_tint_default.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_abc_tint_default.xml.flat deleted file mode 100755 index 8cae51c..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_abc_tint_default.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_abc_tint_edittext.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_abc_tint_edittext.xml.flat deleted file mode 100755 index 07314ca..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_abc_tint_edittext.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_abc_tint_seek_thumb.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_abc_tint_seek_thumb.xml.flat deleted file mode 100755 index 970bf20..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_abc_tint_seek_thumb.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_abc_tint_spinner.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_abc_tint_spinner.xml.flat deleted file mode 100755 index 18634fb..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_abc_tint_spinner.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_abc_tint_switch_track.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_abc_tint_switch_track.xml.flat deleted file mode 100755 index cf31aaf..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_abc_tint_switch_track.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_design_error.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_design_error.xml.flat deleted file mode 100755 index 88c33fc..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_design_error.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_design_tint_password_toggle.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_design_tint_password_toggle.xml.flat deleted file mode 100755 index 5d3f1fc..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_design_tint_password_toggle.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_bottom_nav_colored_item_tint.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_mtrl_bottom_nav_colored_item_tint.xml.flat deleted file mode 100755 index 791b3d1..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_bottom_nav_colored_item_tint.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_bottom_nav_item_tint.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_mtrl_bottom_nav_item_tint.xml.flat deleted file mode 100755 index 8c9df5f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_bottom_nav_item_tint.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_btn_bg_color_selector.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_mtrl_btn_bg_color_selector.xml.flat deleted file mode 100755 index e389907..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_btn_bg_color_selector.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_btn_ripple_color.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_mtrl_btn_ripple_color.xml.flat deleted file mode 100755 index c8f4d51..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_btn_ripple_color.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_btn_stroke_color_selector.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_mtrl_btn_stroke_color_selector.xml.flat deleted file mode 100755 index eb475c7..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_btn_stroke_color_selector.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_btn_text_btn_ripple_color.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_mtrl_btn_text_btn_ripple_color.xml.flat deleted file mode 100755 index 3b817e9..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_btn_text_btn_ripple_color.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_btn_text_color_selector.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_mtrl_btn_text_color_selector.xml.flat deleted file mode 100755 index 22c4b99..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_btn_text_color_selector.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_chip_background_color.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_mtrl_chip_background_color.xml.flat deleted file mode 100755 index 37c562a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_chip_background_color.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_chip_close_icon_tint.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_mtrl_chip_close_icon_tint.xml.flat deleted file mode 100755 index 0b9d77e..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_chip_close_icon_tint.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_chip_ripple_color.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_mtrl_chip_ripple_color.xml.flat deleted file mode 100755 index 09f006b..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_chip_ripple_color.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_chip_text_color.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_mtrl_chip_text_color.xml.flat deleted file mode 100755 index b59a8c0..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_chip_text_color.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_fab_ripple_color.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_mtrl_fab_ripple_color.xml.flat deleted file mode 100755 index 1153043..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_fab_ripple_color.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_tabs_colored_ripple_color.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_mtrl_tabs_colored_ripple_color.xml.flat deleted file mode 100755 index 6ef99f3..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_tabs_colored_ripple_color.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_tabs_icon_color_selector.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_mtrl_tabs_icon_color_selector.xml.flat deleted file mode 100755 index 3a1117a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_tabs_icon_color_selector.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_tabs_icon_color_selector_colored.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_mtrl_tabs_icon_color_selector_colored.xml.flat deleted file mode 100755 index 4e9f54a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_tabs_icon_color_selector_colored.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_tabs_legacy_text_color_selector.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_mtrl_tabs_legacy_text_color_selector.xml.flat deleted file mode 100755 index 0b53e84..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_tabs_legacy_text_color_selector.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_tabs_ripple_color.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_mtrl_tabs_ripple_color.xml.flat deleted file mode 100755 index ffb35a8..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_tabs_ripple_color.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_text_btn_text_color_selector.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_mtrl_text_btn_text_color_selector.xml.flat deleted file mode 100755 index 4384142..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_mtrl_text_btn_text_color_selector.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_switch_thumb_material_dark.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_switch_thumb_material_dark.xml.flat deleted file mode 100755 index 8e8ed1e..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_switch_thumb_material_dark.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/color_switch_thumb_material_light.xml.flat b/code/Android App/build/intermediates/res/merged/debug/color_switch_thumb_material_light.xml.flat deleted file mode 100755 index c54bf6c..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/color_switch_thumb_material_light.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-anydpi-v21_design_ic_visibility.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-anydpi-v21_design_ic_visibility.xml.flat deleted file mode 100755 index d9e461b..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-anydpi-v21_design_ic_visibility.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-anydpi-v21_design_ic_visibility_off.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-anydpi-v21_design_ic_visibility_off.xml.flat deleted file mode 100755 index 47393d9..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-anydpi-v21_design_ic_visibility_off.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-anydpi-v21_ic_launcher_background.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-anydpi-v21_ic_launcher_background.xml.flat deleted file mode 100755 index 29e6d49..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-anydpi-v21_ic_launcher_background.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ab_share_pack_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ab_share_pack_mtrl_alpha.9.png.flat deleted file mode 100755 index 49b55e5..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ab_share_pack_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat deleted file mode 100755 index 2b7fc0f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat deleted file mode 100755 index e4ccf7f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat deleted file mode 100755 index dfecc6b..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat deleted file mode 100755 index 5605ad8..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat deleted file mode 100755 index 107f2b7..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat deleted file mode 100755 index d0bf109..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_cab_background_top_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_cab_background_top_mtrl_alpha.9.png.flat deleted file mode 100755 index 857e781..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_cab_background_top_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat deleted file mode 100755 index 7e37670..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_menu_copy_mtrl_am_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_menu_copy_mtrl_am_alpha.png.flat deleted file mode 100755 index 121c7ea..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_menu_copy_mtrl_am_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_menu_cut_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_menu_cut_mtrl_alpha.png.flat deleted file mode 100755 index a0039b8..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_menu_cut_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_menu_paste_mtrl_am_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_menu_paste_mtrl_am_alpha.png.flat deleted file mode 100755 index 32f552c..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_menu_paste_mtrl_am_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_menu_selectall_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_menu_selectall_mtrl_alpha.png.flat deleted file mode 100755 index 73fa07a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_menu_selectall_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_menu_share_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_menu_share_mtrl_alpha.png.flat deleted file mode 100755 index c9486b4..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_menu_share_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_star_black_16dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_star_black_16dp.png.flat deleted file mode 100755 index 0f52641..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_star_black_16dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_star_black_36dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_star_black_36dp.png.flat deleted file mode 100755 index a2c4992..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_star_black_36dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_star_black_48dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_star_black_48dp.png.flat deleted file mode 100755 index 038b66b..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_star_black_48dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_star_half_black_16dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_star_half_black_16dp.png.flat deleted file mode 100755 index a929d84..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_star_half_black_16dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_star_half_black_36dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_star_half_black_36dp.png.flat deleted file mode 100755 index e01fd20..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_star_half_black_36dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_star_half_black_48dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_star_half_black_48dp.png.flat deleted file mode 100755 index 687011a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_ic_star_half_black_48dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat deleted file mode 100755 index df62696..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_list_focused_holo.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_list_focused_holo.9.png.flat deleted file mode 100755 index 7bc0a45..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_list_focused_holo.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_list_longpressed_holo.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_list_longpressed_holo.9.png.flat deleted file mode 100755 index 7c67217..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_list_longpressed_holo.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_list_pressed_holo_dark.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_list_pressed_holo_dark.9.png.flat deleted file mode 100755 index e40317c..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_list_pressed_holo_dark.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_list_pressed_holo_light.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_list_pressed_holo_light.9.png.flat deleted file mode 100755 index db9011a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_list_pressed_holo_light.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_list_selector_disabled_holo_dark.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_list_selector_disabled_holo_dark.9.png.flat deleted file mode 100755 index b4036a0..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_list_selector_disabled_holo_dark.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_list_selector_disabled_holo_light.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_list_selector_disabled_holo_light.9.png.flat deleted file mode 100755 index 8d15ff5..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_list_selector_disabled_holo_light.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_menu_hardkey_panel_mtrl_mult.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_menu_hardkey_panel_mtrl_mult.9.png.flat deleted file mode 100755 index da4ebc3..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_menu_hardkey_panel_mtrl_mult.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_popup_background_mtrl_mult.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_popup_background_mtrl_mult.9.png.flat deleted file mode 100755 index 7589adf..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_popup_background_mtrl_mult.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_scrubber_control_off_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_scrubber_control_off_mtrl_alpha.png.flat deleted file mode 100755 index 257e109..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_scrubber_control_off_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat deleted file mode 100755 index 13dce46..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat deleted file mode 100755 index ad344cc..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_scrubber_primary_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_scrubber_primary_mtrl_alpha.9.png.flat deleted file mode 100755 index c794339..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_scrubber_primary_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_scrubber_track_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_scrubber_track_mtrl_alpha.9.png.flat deleted file mode 100755 index ca59d9b..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_scrubber_track_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat deleted file mode 100755 index 7533c71..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat deleted file mode 100755 index 4e98730..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat deleted file mode 100755 index 151a07d..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_text_select_handle_left_mtrl_dark.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_text_select_handle_left_mtrl_dark.png.flat deleted file mode 100755 index 6372170..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_text_select_handle_left_mtrl_dark.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_text_select_handle_left_mtrl_light.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_text_select_handle_left_mtrl_light.png.flat deleted file mode 100755 index 9ed3088..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_text_select_handle_left_mtrl_light.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_text_select_handle_middle_mtrl_dark.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_text_select_handle_middle_mtrl_dark.png.flat deleted file mode 100755 index 7e92172..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_text_select_handle_middle_mtrl_dark.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_text_select_handle_middle_mtrl_light.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_text_select_handle_middle_mtrl_light.png.flat deleted file mode 100755 index d5195b9..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_text_select_handle_middle_mtrl_light.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_text_select_handle_right_mtrl_dark.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_text_select_handle_right_mtrl_dark.png.flat deleted file mode 100755 index 998042d..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_text_select_handle_right_mtrl_dark.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_text_select_handle_right_mtrl_light.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_text_select_handle_right_mtrl_light.png.flat deleted file mode 100755 index 4847d7f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_text_select_handle_right_mtrl_light.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat deleted file mode 100755 index 86f96c3..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat deleted file mode 100755 index 05c0a34..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat deleted file mode 100755 index f5e138e..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat deleted file mode 100755 index ca05b5a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_design_ic_visibility.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_design_ic_visibility.png.flat deleted file mode 100755 index 1abc230..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_design_ic_visibility.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_design_ic_visibility_off.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_design_ic_visibility_off.png.flat deleted file mode 100755 index 6ffc943..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_design_ic_visibility_off.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_notification_bg_low_normal.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_notification_bg_low_normal.9.png.flat deleted file mode 100755 index 361649a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_notification_bg_low_normal.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_notification_bg_low_pressed.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_notification_bg_low_pressed.9.png.flat deleted file mode 100755 index e8487cb..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_notification_bg_low_pressed.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_notification_bg_normal.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_notification_bg_normal.9.png.flat deleted file mode 100755 index ff19e95..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_notification_bg_normal.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_notification_bg_normal_pressed.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_notification_bg_normal_pressed.9.png.flat deleted file mode 100755 index 68db9d5..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_notification_bg_normal_pressed.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_notify_panel_notification_icon_bg.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_notify_panel_notification_icon_bg.png.flat deleted file mode 100755 index bce557f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi-v4_notify_panel_notification_icon_bg.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi_ic_launcher_background.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi_ic_launcher_background.png.flat deleted file mode 100755 index 568cdaa..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-hdpi_ic_launcher_background.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-ldpi_ic_launcher_background.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-ldpi_ic_launcher_background.png.flat deleted file mode 100755 index 3301808..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-ldpi_ic_launcher_background.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-hdpi-v17_abc_ic_menu_copy_mtrl_am_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-hdpi-v17_abc_ic_menu_copy_mtrl_am_alpha.png.flat deleted file mode 100755 index b626012..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-hdpi-v17_abc_ic_menu_copy_mtrl_am_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-hdpi-v17_abc_ic_menu_cut_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-hdpi-v17_abc_ic_menu_cut_mtrl_alpha.png.flat deleted file mode 100755 index dec1aa9..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-hdpi-v17_abc_ic_menu_cut_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-hdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-hdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat deleted file mode 100755 index 3d2b5af..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-hdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-mdpi-v17_abc_ic_menu_copy_mtrl_am_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-mdpi-v17_abc_ic_menu_copy_mtrl_am_alpha.png.flat deleted file mode 100755 index 528c1c4..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-mdpi-v17_abc_ic_menu_copy_mtrl_am_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-mdpi-v17_abc_ic_menu_cut_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-mdpi-v17_abc_ic_menu_cut_mtrl_alpha.png.flat deleted file mode 100755 index efba850..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-mdpi-v17_abc_ic_menu_cut_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-mdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-mdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat deleted file mode 100755 index bfe0b30..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-mdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-xhdpi-v17_abc_ic_menu_copy_mtrl_am_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-xhdpi-v17_abc_ic_menu_copy_mtrl_am_alpha.png.flat deleted file mode 100755 index 70a6d09..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-xhdpi-v17_abc_ic_menu_copy_mtrl_am_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-xhdpi-v17_abc_ic_menu_cut_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-xhdpi-v17_abc_ic_menu_cut_mtrl_alpha.png.flat deleted file mode 100755 index bec0f1c..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-xhdpi-v17_abc_ic_menu_cut_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-xhdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-xhdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat deleted file mode 100755 index 1a9993d..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-xhdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-xxhdpi-v17_abc_ic_menu_copy_mtrl_am_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-xxhdpi-v17_abc_ic_menu_copy_mtrl_am_alpha.png.flat deleted file mode 100755 index f25a7f2..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-xxhdpi-v17_abc_ic_menu_copy_mtrl_am_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-xxhdpi-v17_abc_ic_menu_cut_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-xxhdpi-v17_abc_ic_menu_cut_mtrl_alpha.png.flat deleted file mode 100755 index 850a678..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-xxhdpi-v17_abc_ic_menu_cut_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-xxhdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-xxhdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat deleted file mode 100755 index 6e6db9d..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-xxhdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-xxxhdpi-v17_abc_ic_menu_copy_mtrl_am_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-xxxhdpi-v17_abc_ic_menu_copy_mtrl_am_alpha.png.flat deleted file mode 100755 index d1e9e74..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-xxxhdpi-v17_abc_ic_menu_copy_mtrl_am_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-xxxhdpi-v17_abc_ic_menu_cut_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-xxxhdpi-v17_abc_ic_menu_cut_mtrl_alpha.png.flat deleted file mode 100755 index 23f8f33..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-xxxhdpi-v17_abc_ic_menu_cut_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-xxxhdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-xxxhdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat deleted file mode 100755 index edb2c48..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-ldrtl-xxxhdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ab_share_pack_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ab_share_pack_mtrl_alpha.9.png.flat deleted file mode 100755 index bb752a9..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ab_share_pack_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat deleted file mode 100755 index 1df3ec8..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat deleted file mode 100755 index 5e689d9..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat deleted file mode 100755 index 519387a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat deleted file mode 100755 index 7aea6f2..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat deleted file mode 100755 index 3c22d40..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat deleted file mode 100755 index ceecbc8..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_cab_background_top_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_cab_background_top_mtrl_alpha.9.png.flat deleted file mode 100755 index 515770f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_cab_background_top_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat deleted file mode 100755 index fac3416..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_menu_copy_mtrl_am_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_menu_copy_mtrl_am_alpha.png.flat deleted file mode 100755 index 0a4ce39..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_menu_copy_mtrl_am_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_menu_cut_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_menu_cut_mtrl_alpha.png.flat deleted file mode 100755 index 8d23f99..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_menu_cut_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_menu_paste_mtrl_am_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_menu_paste_mtrl_am_alpha.png.flat deleted file mode 100755 index ad641dc..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_menu_paste_mtrl_am_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_menu_selectall_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_menu_selectall_mtrl_alpha.png.flat deleted file mode 100755 index b98574c..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_menu_selectall_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_menu_share_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_menu_share_mtrl_alpha.png.flat deleted file mode 100755 index 51d5c36..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_menu_share_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_star_black_16dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_star_black_16dp.png.flat deleted file mode 100755 index c20992a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_star_black_16dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_star_black_36dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_star_black_36dp.png.flat deleted file mode 100755 index 8536c29..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_star_black_36dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_star_black_48dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_star_black_48dp.png.flat deleted file mode 100755 index e1c0aa0..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_star_black_48dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_star_half_black_16dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_star_half_black_16dp.png.flat deleted file mode 100755 index af13c4b..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_star_half_black_16dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_star_half_black_36dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_star_half_black_36dp.png.flat deleted file mode 100755 index 4b2f86b..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_star_half_black_36dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_star_half_black_48dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_star_half_black_48dp.png.flat deleted file mode 100755 index 1de4030..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_ic_star_half_black_48dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat deleted file mode 100755 index fe6bdb2..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_list_focused_holo.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_list_focused_holo.9.png.flat deleted file mode 100755 index 4b895ef..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_list_focused_holo.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_list_longpressed_holo.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_list_longpressed_holo.9.png.flat deleted file mode 100755 index 520f677..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_list_longpressed_holo.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_list_pressed_holo_dark.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_list_pressed_holo_dark.9.png.flat deleted file mode 100755 index b56944a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_list_pressed_holo_dark.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_list_pressed_holo_light.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_list_pressed_holo_light.9.png.flat deleted file mode 100755 index b5d2d43..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_list_pressed_holo_light.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_list_selector_disabled_holo_dark.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_list_selector_disabled_holo_dark.9.png.flat deleted file mode 100755 index 591b6a7..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_list_selector_disabled_holo_dark.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_list_selector_disabled_holo_light.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_list_selector_disabled_holo_light.9.png.flat deleted file mode 100755 index d6fe419..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_list_selector_disabled_holo_light.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_menu_hardkey_panel_mtrl_mult.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_menu_hardkey_panel_mtrl_mult.9.png.flat deleted file mode 100755 index aaa5e5e..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_menu_hardkey_panel_mtrl_mult.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_popup_background_mtrl_mult.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_popup_background_mtrl_mult.9.png.flat deleted file mode 100755 index df4ca23..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_popup_background_mtrl_mult.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_scrubber_control_off_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_scrubber_control_off_mtrl_alpha.png.flat deleted file mode 100755 index b1910ed..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_scrubber_control_off_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat deleted file mode 100755 index 048ec92..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat deleted file mode 100755 index 286c6fe..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_scrubber_primary_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_scrubber_primary_mtrl_alpha.9.png.flat deleted file mode 100755 index 0c1d1d8..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_scrubber_primary_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_scrubber_track_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_scrubber_track_mtrl_alpha.9.png.flat deleted file mode 100755 index 55b4fe7..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_scrubber_track_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat deleted file mode 100755 index 3e16ff7..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat deleted file mode 100755 index 8072ccd..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat deleted file mode 100755 index 6ed125b..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_text_select_handle_left_mtrl_dark.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_text_select_handle_left_mtrl_dark.png.flat deleted file mode 100755 index ae01c1a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_text_select_handle_left_mtrl_dark.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_text_select_handle_left_mtrl_light.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_text_select_handle_left_mtrl_light.png.flat deleted file mode 100755 index ae72620..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_text_select_handle_left_mtrl_light.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_text_select_handle_middle_mtrl_dark.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_text_select_handle_middle_mtrl_dark.png.flat deleted file mode 100755 index 78dfd38..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_text_select_handle_middle_mtrl_dark.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_text_select_handle_middle_mtrl_light.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_text_select_handle_middle_mtrl_light.png.flat deleted file mode 100755 index ebd81eb..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_text_select_handle_middle_mtrl_light.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_text_select_handle_right_mtrl_dark.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_text_select_handle_right_mtrl_dark.png.flat deleted file mode 100755 index 6a6b1f9..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_text_select_handle_right_mtrl_dark.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_text_select_handle_right_mtrl_light.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_text_select_handle_right_mtrl_light.png.flat deleted file mode 100755 index b332fe7..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_text_select_handle_right_mtrl_light.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat deleted file mode 100755 index 284a3a6..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat deleted file mode 100755 index 90d57a7..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat deleted file mode 100755 index 595c79f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat deleted file mode 100755 index 2c1e39c..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_design_ic_visibility.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_design_ic_visibility.png.flat deleted file mode 100755 index 2fac6d9..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_design_ic_visibility.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_design_ic_visibility_off.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_design_ic_visibility_off.png.flat deleted file mode 100755 index 1274fda..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_design_ic_visibility_off.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_notification_bg_low_normal.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_notification_bg_low_normal.9.png.flat deleted file mode 100755 index e76d5ba..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_notification_bg_low_normal.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_notification_bg_low_pressed.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_notification_bg_low_pressed.9.png.flat deleted file mode 100755 index 12e26ca..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_notification_bg_low_pressed.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_notification_bg_normal.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_notification_bg_normal.9.png.flat deleted file mode 100755 index 45f4b71..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_notification_bg_normal.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_notification_bg_normal_pressed.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_notification_bg_normal_pressed.9.png.flat deleted file mode 100755 index b71991c..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_notification_bg_normal_pressed.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_notify_panel_notification_icon_bg.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_notify_panel_notification_icon_bg.png.flat deleted file mode 100755 index c785a57..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi-v4_notify_panel_notification_icon_bg.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi_ic_launcher_background.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi_ic_launcher_background.png.flat deleted file mode 100755 index 5a1fb4e..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-mdpi_ic_launcher_background.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-v21_abc_action_bar_item_background_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-v21_abc_action_bar_item_background_material.xml.flat deleted file mode 100755 index 80791d3..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-v21_abc_action_bar_item_background_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-v21_abc_btn_colored_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-v21_abc_btn_colored_material.xml.flat deleted file mode 100755 index 0b0ca91..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-v21_abc_btn_colored_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-v21_abc_dialog_material_background.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-v21_abc_dialog_material_background.xml.flat deleted file mode 100755 index ba8bb5e..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-v21_abc_dialog_material_background.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-v21_abc_edit_text_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-v21_abc_edit_text_material.xml.flat deleted file mode 100755 index 8f89bda..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-v21_abc_edit_text_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-v21_abc_list_divider_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-v21_abc_list_divider_material.xml.flat deleted file mode 100755 index 6afc953..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-v21_abc_list_divider_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-v21_avd_hide_password.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-v21_avd_hide_password.xml.flat deleted file mode 100755 index e9e7ab7..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-v21_avd_hide_password.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-v21_avd_show_password.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-v21_avd_show_password.xml.flat deleted file mode 100755 index 9fae639..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-v21_avd_show_password.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-v21_design_bottom_navigation_item_background.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-v21_design_bottom_navigation_item_background.xml.flat deleted file mode 100755 index 09854d3..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-v21_design_bottom_navigation_item_background.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-v21_design_password_eye.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-v21_design_password_eye.xml.flat deleted file mode 100755 index c621cab..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-v21_design_password_eye.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-v21_notification_action_background.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-v21_notification_action_background.xml.flat deleted file mode 100755 index 6212510..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-v21_notification_action_background.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-v23_abc_control_background_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-v23_abc_control_background_material.xml.flat deleted file mode 100755 index 17e94e5..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-v23_abc_control_background_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-v24_ic_launcher_foreground.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-v24_ic_launcher_foreground.xml.flat deleted file mode 100755 index 85aa74f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-v24_ic_launcher_foreground.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-watch-v20_abc_dialog_material_background.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-watch-v20_abc_dialog_material_background.xml.flat deleted file mode 100755 index 9e7b633..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-watch-v20_abc_dialog_material_background.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ab_share_pack_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ab_share_pack_mtrl_alpha.9.png.flat deleted file mode 100755 index 013cf02..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ab_share_pack_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat deleted file mode 100755 index bf835ef..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat deleted file mode 100755 index 89f5fa3..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat deleted file mode 100755 index 70064c6..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat deleted file mode 100755 index 3291153..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat deleted file mode 100755 index 579bfaf..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat deleted file mode 100755 index e53daa9..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_cab_background_top_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_cab_background_top_mtrl_alpha.9.png.flat deleted file mode 100755 index 0102ce5..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_cab_background_top_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat deleted file mode 100755 index 23898d6..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_menu_copy_mtrl_am_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_menu_copy_mtrl_am_alpha.png.flat deleted file mode 100755 index 4a103e2..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_menu_copy_mtrl_am_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_menu_cut_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_menu_cut_mtrl_alpha.png.flat deleted file mode 100755 index ee8104a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_menu_cut_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_menu_paste_mtrl_am_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_menu_paste_mtrl_am_alpha.png.flat deleted file mode 100755 index bec5cbc..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_menu_paste_mtrl_am_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_menu_selectall_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_menu_selectall_mtrl_alpha.png.flat deleted file mode 100755 index 258761f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_menu_selectall_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_menu_share_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_menu_share_mtrl_alpha.png.flat deleted file mode 100755 index f7aa40e..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_menu_share_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_star_black_16dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_star_black_16dp.png.flat deleted file mode 100755 index f637ae8..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_star_black_16dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_star_black_36dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_star_black_36dp.png.flat deleted file mode 100755 index 76b0134..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_star_black_36dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_star_black_48dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_star_black_48dp.png.flat deleted file mode 100755 index 37db7c7..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_star_black_48dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_star_half_black_16dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_star_half_black_16dp.png.flat deleted file mode 100755 index f82a770..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_star_half_black_16dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_star_half_black_36dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_star_half_black_36dp.png.flat deleted file mode 100755 index e28a0e2..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_star_half_black_36dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_star_half_black_48dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_star_half_black_48dp.png.flat deleted file mode 100755 index d7b3388..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_ic_star_half_black_48dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat deleted file mode 100755 index 4834318..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_list_focused_holo.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_list_focused_holo.9.png.flat deleted file mode 100755 index 570e32f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_list_focused_holo.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_list_longpressed_holo.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_list_longpressed_holo.9.png.flat deleted file mode 100755 index b8584bb..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_list_longpressed_holo.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_list_pressed_holo_dark.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_list_pressed_holo_dark.9.png.flat deleted file mode 100755 index e35ec82..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_list_pressed_holo_dark.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_list_pressed_holo_light.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_list_pressed_holo_light.9.png.flat deleted file mode 100755 index d76f311..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_list_pressed_holo_light.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_list_selector_disabled_holo_dark.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_list_selector_disabled_holo_dark.9.png.flat deleted file mode 100755 index 4b20968..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_list_selector_disabled_holo_dark.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_list_selector_disabled_holo_light.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_list_selector_disabled_holo_light.9.png.flat deleted file mode 100755 index 79090aa..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_list_selector_disabled_holo_light.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_menu_hardkey_panel_mtrl_mult.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_menu_hardkey_panel_mtrl_mult.9.png.flat deleted file mode 100755 index fcc1c60..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_menu_hardkey_panel_mtrl_mult.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_popup_background_mtrl_mult.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_popup_background_mtrl_mult.9.png.flat deleted file mode 100755 index b1540cd..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_popup_background_mtrl_mult.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_scrubber_control_off_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_scrubber_control_off_mtrl_alpha.png.flat deleted file mode 100755 index 5510c64..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_scrubber_control_off_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat deleted file mode 100755 index 6a5676c..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat deleted file mode 100755 index 5874b15..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_scrubber_primary_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_scrubber_primary_mtrl_alpha.9.png.flat deleted file mode 100755 index b555f00..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_scrubber_primary_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_scrubber_track_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_scrubber_track_mtrl_alpha.9.png.flat deleted file mode 100755 index dca8e6a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_scrubber_track_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat deleted file mode 100755 index 4026a96..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat deleted file mode 100755 index 6d46576..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat deleted file mode 100755 index 9837fc2..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_text_select_handle_left_mtrl_dark.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_text_select_handle_left_mtrl_dark.png.flat deleted file mode 100755 index f2318fd..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_text_select_handle_left_mtrl_dark.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_text_select_handle_left_mtrl_light.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_text_select_handle_left_mtrl_light.png.flat deleted file mode 100755 index eae426c..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_text_select_handle_left_mtrl_light.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_text_select_handle_middle_mtrl_dark.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_text_select_handle_middle_mtrl_dark.png.flat deleted file mode 100755 index 78a1161..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_text_select_handle_middle_mtrl_dark.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_text_select_handle_middle_mtrl_light.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_text_select_handle_middle_mtrl_light.png.flat deleted file mode 100755 index ede8fec..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_text_select_handle_middle_mtrl_light.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_text_select_handle_right_mtrl_dark.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_text_select_handle_right_mtrl_dark.png.flat deleted file mode 100755 index d72b28f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_text_select_handle_right_mtrl_dark.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_text_select_handle_right_mtrl_light.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_text_select_handle_right_mtrl_light.png.flat deleted file mode 100755 index db8e4c8..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_text_select_handle_right_mtrl_light.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat deleted file mode 100755 index 9c22eae..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat deleted file mode 100755 index 835ef00..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat deleted file mode 100755 index 2ef61ea..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat deleted file mode 100755 index bc28205..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_design_ic_visibility.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_design_ic_visibility.png.flat deleted file mode 100755 index a698e86..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_design_ic_visibility.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_design_ic_visibility_off.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_design_ic_visibility_off.png.flat deleted file mode 100755 index aaaca6e..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_design_ic_visibility_off.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_notification_bg_low_normal.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_notification_bg_low_normal.9.png.flat deleted file mode 100755 index d846f6a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_notification_bg_low_normal.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_notification_bg_low_pressed.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_notification_bg_low_pressed.9.png.flat deleted file mode 100755 index 4be9ca1..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_notification_bg_low_pressed.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_notification_bg_normal.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_notification_bg_normal.9.png.flat deleted file mode 100755 index f738b2b..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_notification_bg_normal.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_notification_bg_normal_pressed.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_notification_bg_normal_pressed.9.png.flat deleted file mode 100755 index ff1b1f2..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_notification_bg_normal_pressed.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_notify_panel_notification_icon_bg.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_notify_panel_notification_icon_bg.png.flat deleted file mode 100755 index 3bded89..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi-v4_notify_panel_notification_icon_bg.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi_ic_launcher_background.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi_ic_launcher_background.png.flat deleted file mode 100755 index 6cc0d92..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xhdpi_ic_launcher_background.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ab_share_pack_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ab_share_pack_mtrl_alpha.9.png.flat deleted file mode 100755 index d6c62fc..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ab_share_pack_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat deleted file mode 100755 index 7369f80..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat deleted file mode 100755 index bdae09c..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat deleted file mode 100755 index 82d6c69..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat deleted file mode 100755 index a4de0b6..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat deleted file mode 100755 index 43d54c7..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat deleted file mode 100755 index b0e9407..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_cab_background_top_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_cab_background_top_mtrl_alpha.9.png.flat deleted file mode 100755 index 87278f3..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_cab_background_top_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat deleted file mode 100755 index 9270e47..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_menu_copy_mtrl_am_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_menu_copy_mtrl_am_alpha.png.flat deleted file mode 100755 index 309f6e4..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_menu_copy_mtrl_am_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_menu_cut_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_menu_cut_mtrl_alpha.png.flat deleted file mode 100755 index a7387c3..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_menu_cut_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_menu_paste_mtrl_am_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_menu_paste_mtrl_am_alpha.png.flat deleted file mode 100755 index e9538f3..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_menu_paste_mtrl_am_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_menu_selectall_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_menu_selectall_mtrl_alpha.png.flat deleted file mode 100755 index c48bb29..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_menu_selectall_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_menu_share_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_menu_share_mtrl_alpha.png.flat deleted file mode 100755 index 75f8480..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_menu_share_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_star_black_16dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_star_black_16dp.png.flat deleted file mode 100755 index 0e6f6cf..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_star_black_16dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_star_black_36dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_star_black_36dp.png.flat deleted file mode 100755 index eeb4dbc..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_star_black_36dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_star_black_48dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_star_black_48dp.png.flat deleted file mode 100755 index 6384607..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_star_black_48dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_star_half_black_16dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_star_half_black_16dp.png.flat deleted file mode 100755 index 0b35ae8..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_star_half_black_16dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_star_half_black_36dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_star_half_black_36dp.png.flat deleted file mode 100755 index 7a02d28..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_star_half_black_36dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_star_half_black_48dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_star_half_black_48dp.png.flat deleted file mode 100755 index 8a0a70e..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_ic_star_half_black_48dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat deleted file mode 100755 index 9277635..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_list_focused_holo.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_list_focused_holo.9.png.flat deleted file mode 100755 index 228ab09..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_list_focused_holo.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_list_longpressed_holo.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_list_longpressed_holo.9.png.flat deleted file mode 100755 index d0eca1d..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_list_longpressed_holo.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_list_pressed_holo_dark.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_list_pressed_holo_dark.9.png.flat deleted file mode 100755 index 8032d7d..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_list_pressed_holo_dark.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_list_pressed_holo_light.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_list_pressed_holo_light.9.png.flat deleted file mode 100755 index acd25b2..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_list_pressed_holo_light.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_list_selector_disabled_holo_dark.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_list_selector_disabled_holo_dark.9.png.flat deleted file mode 100755 index 94e664e..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_list_selector_disabled_holo_dark.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_list_selector_disabled_holo_light.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_list_selector_disabled_holo_light.9.png.flat deleted file mode 100755 index e803d01..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_list_selector_disabled_holo_light.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_menu_hardkey_panel_mtrl_mult.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_menu_hardkey_panel_mtrl_mult.9.png.flat deleted file mode 100755 index 64a4299..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_menu_hardkey_panel_mtrl_mult.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_popup_background_mtrl_mult.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_popup_background_mtrl_mult.9.png.flat deleted file mode 100755 index a5b20e9..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_popup_background_mtrl_mult.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_scrubber_control_off_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_scrubber_control_off_mtrl_alpha.png.flat deleted file mode 100755 index f2069e1..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_scrubber_control_off_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat deleted file mode 100755 index 9572bcd..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat deleted file mode 100755 index 8e30164..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_scrubber_primary_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_scrubber_primary_mtrl_alpha.9.png.flat deleted file mode 100755 index 8f8d636..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_scrubber_primary_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_scrubber_track_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_scrubber_track_mtrl_alpha.9.png.flat deleted file mode 100755 index 698e190..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_scrubber_track_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat deleted file mode 100755 index 6468073..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat deleted file mode 100755 index b38de30..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat deleted file mode 100755 index d5eb169..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_text_select_handle_left_mtrl_dark.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_text_select_handle_left_mtrl_dark.png.flat deleted file mode 100755 index 5a447fe..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_text_select_handle_left_mtrl_dark.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_text_select_handle_left_mtrl_light.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_text_select_handle_left_mtrl_light.png.flat deleted file mode 100755 index 1f0955b..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_text_select_handle_left_mtrl_light.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_text_select_handle_middle_mtrl_dark.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_text_select_handle_middle_mtrl_dark.png.flat deleted file mode 100755 index 81a7bb8..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_text_select_handle_middle_mtrl_dark.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_text_select_handle_middle_mtrl_light.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_text_select_handle_middle_mtrl_light.png.flat deleted file mode 100755 index daa6ce1..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_text_select_handle_middle_mtrl_light.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_text_select_handle_right_mtrl_dark.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_text_select_handle_right_mtrl_dark.png.flat deleted file mode 100755 index 83f3158..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_text_select_handle_right_mtrl_dark.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_text_select_handle_right_mtrl_light.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_text_select_handle_right_mtrl_light.png.flat deleted file mode 100755 index 96f4048..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_text_select_handle_right_mtrl_light.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat deleted file mode 100755 index 3f8a1e9..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat deleted file mode 100755 index ca236ba..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat deleted file mode 100755 index f46a052..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat deleted file mode 100755 index c35d38a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_design_ic_visibility.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_design_ic_visibility.png.flat deleted file mode 100755 index 59b11dd..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_design_ic_visibility.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_design_ic_visibility_off.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_design_ic_visibility_off.png.flat deleted file mode 100755 index ae7820f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi-v4_design_ic_visibility_off.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi_ic_launcher_background.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi_ic_launcher_background.png.flat deleted file mode 100755 index debc20b..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxhdpi_ic_launcher_background.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat deleted file mode 100755 index 548a61f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat deleted file mode 100755 index 853c4e7..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat deleted file mode 100755 index 225bf67..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat deleted file mode 100755 index 17d4e9b..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat deleted file mode 100755 index 87d2ed0..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat deleted file mode 100755 index abe8d79..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_menu_copy_mtrl_am_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_menu_copy_mtrl_am_alpha.png.flat deleted file mode 100755 index 834932d..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_menu_copy_mtrl_am_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_menu_cut_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_menu_cut_mtrl_alpha.png.flat deleted file mode 100755 index 0a35307..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_menu_cut_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_menu_paste_mtrl_am_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_menu_paste_mtrl_am_alpha.png.flat deleted file mode 100755 index 2579d04..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_menu_paste_mtrl_am_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_menu_selectall_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_menu_selectall_mtrl_alpha.png.flat deleted file mode 100755 index a23bae8..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_menu_selectall_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_menu_share_mtrl_alpha.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_menu_share_mtrl_alpha.png.flat deleted file mode 100755 index cb177d3..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_menu_share_mtrl_alpha.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_star_black_16dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_star_black_16dp.png.flat deleted file mode 100755 index e253bd9..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_star_black_16dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_star_black_36dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_star_black_36dp.png.flat deleted file mode 100755 index e793be1..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_star_black_36dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_star_black_48dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_star_black_48dp.png.flat deleted file mode 100755 index 33b7a60..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_star_black_48dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_star_half_black_16dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_star_half_black_16dp.png.flat deleted file mode 100755 index 23b3ff7..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_star_half_black_16dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_star_half_black_36dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_star_half_black_36dp.png.flat deleted file mode 100755 index eb0ae75..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_star_half_black_36dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_star_half_black_48dp.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_star_half_black_48dp.png.flat deleted file mode 100755 index b7504f6..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_ic_star_half_black_48dp.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat deleted file mode 100755 index cd139a7..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat deleted file mode 100755 index d93034b..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat deleted file mode 100755 index 9a1d00a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat deleted file mode 100755 index b0437b9..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat deleted file mode 100755 index 7da8830..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_text_select_handle_left_mtrl_dark.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_text_select_handle_left_mtrl_dark.png.flat deleted file mode 100755 index 5634c3a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_text_select_handle_left_mtrl_dark.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_text_select_handle_left_mtrl_light.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_text_select_handle_left_mtrl_light.png.flat deleted file mode 100755 index c2f1580..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_text_select_handle_left_mtrl_light.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_text_select_handle_right_mtrl_dark.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_text_select_handle_right_mtrl_dark.png.flat deleted file mode 100755 index aeb1623..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_text_select_handle_right_mtrl_dark.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_text_select_handle_right_mtrl_light.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_text_select_handle_right_mtrl_light.png.flat deleted file mode 100755 index ab992c8..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_abc_text_select_handle_right_mtrl_light.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_design_ic_visibility.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_design_ic_visibility.png.flat deleted file mode 100755 index 800e26f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_design_ic_visibility.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_design_ic_visibility_off.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_design_ic_visibility_off.png.flat deleted file mode 100755 index 63ce306..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi-v4_design_ic_visibility_off.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi_ic_launcher_background.png.flat b/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi_ic_launcher_background.png.flat deleted file mode 100755 index 134b96a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable-xxxhdpi_ic_launcher_background.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_btn_borderless_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_btn_borderless_material.xml.flat deleted file mode 100755 index a8cb315..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_btn_borderless_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_btn_check_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_btn_check_material.xml.flat deleted file mode 100755 index aa49958..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_btn_check_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_btn_colored_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_btn_colored_material.xml.flat deleted file mode 100755 index 4f2761f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_btn_colored_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_btn_default_mtrl_shape.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_btn_default_mtrl_shape.xml.flat deleted file mode 100755 index eb24ed2..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_btn_default_mtrl_shape.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_btn_radio_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_btn_radio_material.xml.flat deleted file mode 100755 index 4018fa5..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_btn_radio_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_cab_background_internal_bg.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_cab_background_internal_bg.xml.flat deleted file mode 100755 index 84e29fd..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_cab_background_internal_bg.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_cab_background_top_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_cab_background_top_material.xml.flat deleted file mode 100755 index 9429861..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_cab_background_top_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_dialog_material_background.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_dialog_material_background.xml.flat deleted file mode 100755 index 02b56b0..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_dialog_material_background.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_edit_text_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_edit_text_material.xml.flat deleted file mode 100755 index d7c38a3..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_edit_text_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ic_ab_back_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ic_ab_back_material.xml.flat deleted file mode 100755 index d920d2c..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ic_ab_back_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ic_arrow_drop_right_black_24dp.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ic_arrow_drop_right_black_24dp.xml.flat deleted file mode 100755 index 23ad719..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ic_arrow_drop_right_black_24dp.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ic_clear_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ic_clear_material.xml.flat deleted file mode 100755 index 405df1f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ic_clear_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ic_go_search_api_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ic_go_search_api_material.xml.flat deleted file mode 100755 index f62e381..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ic_go_search_api_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ic_menu_overflow_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ic_menu_overflow_material.xml.flat deleted file mode 100755 index 6ac18ab..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ic_menu_overflow_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ic_search_api_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ic_search_api_material.xml.flat deleted file mode 100755 index e7f42bd..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ic_search_api_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ic_voice_search_api_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ic_voice_search_api_material.xml.flat deleted file mode 100755 index 9279602..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ic_voice_search_api_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_item_background_holo_dark.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_item_background_holo_dark.xml.flat deleted file mode 100755 index 71767f7..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_item_background_holo_dark.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_item_background_holo_light.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_item_background_holo_light.xml.flat deleted file mode 100755 index e0b9f9d..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_item_background_holo_light.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_list_divider_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_list_divider_material.xml.flat deleted file mode 100755 index 074f41f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_list_divider_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_list_selector_background_transition_holo_dark.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_list_selector_background_transition_holo_dark.xml.flat deleted file mode 100755 index 832a19a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_list_selector_background_transition_holo_dark.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_list_selector_background_transition_holo_light.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_list_selector_background_transition_holo_light.xml.flat deleted file mode 100755 index 0187815..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_list_selector_background_transition_holo_light.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_list_selector_holo_dark.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_list_selector_holo_dark.xml.flat deleted file mode 100755 index 3fd7f5f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_list_selector_holo_dark.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_list_selector_holo_light.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_list_selector_holo_light.xml.flat deleted file mode 100755 index 6d59999..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_list_selector_holo_light.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ratingbar_indicator_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ratingbar_indicator_material.xml.flat deleted file mode 100755 index ba6a23c..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ratingbar_indicator_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ratingbar_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ratingbar_material.xml.flat deleted file mode 100755 index ed9dec9..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ratingbar_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ratingbar_small_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ratingbar_small_material.xml.flat deleted file mode 100755 index 2e64582..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_ratingbar_small_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_seekbar_thumb_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_seekbar_thumb_material.xml.flat deleted file mode 100755 index 1490e91..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_seekbar_thumb_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_seekbar_tick_mark_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_seekbar_tick_mark_material.xml.flat deleted file mode 100755 index dcde6d3..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_seekbar_tick_mark_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_seekbar_track_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_seekbar_track_material.xml.flat deleted file mode 100755 index ae2122e..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_seekbar_track_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_spinner_textfield_background_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_spinner_textfield_background_material.xml.flat deleted file mode 100755 index 5716fed..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_spinner_textfield_background_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_switch_thumb_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_switch_thumb_material.xml.flat deleted file mode 100755 index 549e6a5..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_switch_thumb_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_tab_indicator_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_tab_indicator_material.xml.flat deleted file mode 100755 index 1571724..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_tab_indicator_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_text_cursor_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_text_cursor_material.xml.flat deleted file mode 100755 index f98136a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_text_cursor_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_textfield_search_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_textfield_search_material.xml.flat deleted file mode 100755 index 022361a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_textfield_search_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_vector_test.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_abc_vector_test.xml.flat deleted file mode 100755 index 26429ec..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_abc_vector_test.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_design_bottom_navigation_item_background.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_design_bottom_navigation_item_background.xml.flat deleted file mode 100755 index 0cf3d05..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_design_bottom_navigation_item_background.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_design_fab_background.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_design_fab_background.xml.flat deleted file mode 100755 index 34c0c23..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_design_fab_background.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_design_password_eye.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_design_password_eye.xml.flat deleted file mode 100755 index 6e8559f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_design_password_eye.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_design_snackbar_background.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_design_snackbar_background.xml.flat deleted file mode 100755 index 7e6d969..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_design_snackbar_background.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_ic_mtrl_chip_checked_black.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_ic_mtrl_chip_checked_black.xml.flat deleted file mode 100755 index b8e9a3a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_ic_mtrl_chip_checked_black.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_ic_mtrl_chip_checked_circle.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_ic_mtrl_chip_checked_circle.xml.flat deleted file mode 100755 index eb2ba48..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_ic_mtrl_chip_checked_circle.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_ic_mtrl_chip_close_circle.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_ic_mtrl_chip_close_circle.xml.flat deleted file mode 100755 index fe8d093..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_ic_mtrl_chip_close_circle.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_mtrl_snackbar_background.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_mtrl_snackbar_background.xml.flat deleted file mode 100755 index 4ee4ffa..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_mtrl_snackbar_background.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_mtrl_tabs_default_indicator.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_mtrl_tabs_default_indicator.xml.flat deleted file mode 100755 index 4375597..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_mtrl_tabs_default_indicator.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_navigation_empty_icon.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_navigation_empty_icon.xml.flat deleted file mode 100755 index 163e2a2..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_navigation_empty_icon.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_notification_bg.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_notification_bg.xml.flat deleted file mode 100755 index 7bae1b9..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_notification_bg.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_notification_bg_low.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_notification_bg_low.xml.flat deleted file mode 100755 index 6d508f2..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_notification_bg_low.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_notification_icon_background.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_notification_icon_background.xml.flat deleted file mode 100755 index 943be84..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_notification_icon_background.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_notification_tile_bg.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_notification_tile_bg.xml.flat deleted file mode 100755 index 3f7682b..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_notification_tile_bg.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_tooltip_frame_dark.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_tooltip_frame_dark.xml.flat deleted file mode 100755 index cc44d24..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_tooltip_frame_dark.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/drawable_tooltip_frame_light.xml.flat b/code/Android App/build/intermediates/res/merged/debug/drawable_tooltip_frame_light.xml.flat deleted file mode 100755 index 14b49f9..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/drawable_tooltip_frame_light.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/interpolator-v21_mtrl_fast_out_linear_in.xml.flat b/code/Android App/build/intermediates/res/merged/debug/interpolator-v21_mtrl_fast_out_linear_in.xml.flat deleted file mode 100755 index 172d60d..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/interpolator-v21_mtrl_fast_out_linear_in.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/interpolator-v21_mtrl_fast_out_slow_in.xml.flat b/code/Android App/build/intermediates/res/merged/debug/interpolator-v21_mtrl_fast_out_slow_in.xml.flat deleted file mode 100755 index 4007d40..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/interpolator-v21_mtrl_fast_out_slow_in.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/interpolator-v21_mtrl_linear_out_slow_in.xml.flat b/code/Android App/build/intermediates/res/merged/debug/interpolator-v21_mtrl_linear_out_slow_in.xml.flat deleted file mode 100755 index 8d8de4f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/interpolator-v21_mtrl_linear_out_slow_in.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/interpolator_mtrl_fast_out_linear_in.xml.flat b/code/Android App/build/intermediates/res/merged/debug/interpolator_mtrl_fast_out_linear_in.xml.flat deleted file mode 100755 index 71a511c..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/interpolator_mtrl_fast_out_linear_in.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/interpolator_mtrl_fast_out_slow_in.xml.flat b/code/Android App/build/intermediates/res/merged/debug/interpolator_mtrl_fast_out_slow_in.xml.flat deleted file mode 100755 index 2fbf027..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/interpolator_mtrl_fast_out_slow_in.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/interpolator_mtrl_linear.xml.flat b/code/Android App/build/intermediates/res/merged/debug/interpolator_mtrl_linear.xml.flat deleted file mode 100755 index f9a4209..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/interpolator_mtrl_linear.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/interpolator_mtrl_linear_out_slow_in.xml.flat b/code/Android App/build/intermediates/res/merged/debug/interpolator_mtrl_linear_out_slow_in.xml.flat deleted file mode 100755 index a2a2f5f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/interpolator_mtrl_linear_out_slow_in.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout-sw600dp-v13_design_layout_snackbar.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout-sw600dp-v13_design_layout_snackbar.xml.flat deleted file mode 100755 index abf6cfa..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout-sw600dp-v13_design_layout_snackbar.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout-sw600dp-v13_mtrl_layout_snackbar.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout-sw600dp-v13_mtrl_layout_snackbar.xml.flat deleted file mode 100755 index df3beb4..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout-sw600dp-v13_mtrl_layout_snackbar.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout-v16_notification_template_custom_big.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout-v16_notification_template_custom_big.xml.flat deleted file mode 100755 index 13d2c87..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout-v16_notification_template_custom_big.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout-v21_notification_action.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout-v21_notification_action.xml.flat deleted file mode 100755 index 87ff12e..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout-v21_notification_action.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout-v21_notification_action_tombstone.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout-v21_notification_action_tombstone.xml.flat deleted file mode 100755 index 8f5ebc7..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout-v21_notification_action_tombstone.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout-v21_notification_template_custom_big.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout-v21_notification_template_custom_big.xml.flat deleted file mode 100755 index e85a6d1..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout-v21_notification_template_custom_big.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout-v21_notification_template_icon_group.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout-v21_notification_template_icon_group.xml.flat deleted file mode 100755 index 15d9d26..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout-v21_notification_template_icon_group.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout-v26_abc_screen_toolbar.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout-v26_abc_screen_toolbar.xml.flat deleted file mode 100755 index 54e3d95..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout-v26_abc_screen_toolbar.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout-watch-v20_abc_alert_dialog_button_bar_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout-watch-v20_abc_alert_dialog_button_bar_material.xml.flat deleted file mode 100755 index e6bc7ee..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout-watch-v20_abc_alert_dialog_button_bar_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout-watch-v20_abc_alert_dialog_title_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout-watch-v20_abc_alert_dialog_title_material.xml.flat deleted file mode 100755 index 2919461..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout-watch-v20_abc_alert_dialog_title_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_action_bar_title_item.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_action_bar_title_item.xml.flat deleted file mode 100755 index 857161d..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_action_bar_title_item.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_action_bar_up_container.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_action_bar_up_container.xml.flat deleted file mode 100755 index 89bc2e1..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_action_bar_up_container.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_action_menu_item_layout.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_action_menu_item_layout.xml.flat deleted file mode 100755 index abe66b2..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_action_menu_item_layout.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_action_menu_layout.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_action_menu_layout.xml.flat deleted file mode 100755 index 7cb09db..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_action_menu_layout.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_action_mode_bar.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_action_mode_bar.xml.flat deleted file mode 100755 index 8a38756..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_action_mode_bar.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_action_mode_close_item_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_action_mode_close_item_material.xml.flat deleted file mode 100755 index 683f28e..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_action_mode_close_item_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_activity_chooser_view.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_activity_chooser_view.xml.flat deleted file mode 100755 index 17fb342..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_activity_chooser_view.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_activity_chooser_view_list_item.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_activity_chooser_view_list_item.xml.flat deleted file mode 100755 index e5c2c1b..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_activity_chooser_view_list_item.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_alert_dialog_button_bar_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_alert_dialog_button_bar_material.xml.flat deleted file mode 100755 index 56e440f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_alert_dialog_button_bar_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_alert_dialog_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_alert_dialog_material.xml.flat deleted file mode 100755 index 47a2cbf..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_alert_dialog_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_alert_dialog_title_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_alert_dialog_title_material.xml.flat deleted file mode 100755 index c1c08d7..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_alert_dialog_title_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_cascading_menu_item_layout.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_cascading_menu_item_layout.xml.flat deleted file mode 100755 index 217f130..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_cascading_menu_item_layout.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_dialog_title_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_dialog_title_material.xml.flat deleted file mode 100755 index 7895875..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_dialog_title_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_expanded_menu_layout.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_expanded_menu_layout.xml.flat deleted file mode 100755 index bb5bc29..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_expanded_menu_layout.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_list_menu_item_checkbox.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_list_menu_item_checkbox.xml.flat deleted file mode 100755 index c7fcbf0..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_list_menu_item_checkbox.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_list_menu_item_icon.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_list_menu_item_icon.xml.flat deleted file mode 100755 index 89a2c98..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_list_menu_item_icon.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_list_menu_item_layout.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_list_menu_item_layout.xml.flat deleted file mode 100755 index 3af4f0d..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_list_menu_item_layout.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_list_menu_item_radio.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_list_menu_item_radio.xml.flat deleted file mode 100755 index 064020a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_list_menu_item_radio.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_popup_menu_header_item_layout.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_popup_menu_header_item_layout.xml.flat deleted file mode 100755 index cf2229e..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_popup_menu_header_item_layout.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_popup_menu_item_layout.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_popup_menu_item_layout.xml.flat deleted file mode 100755 index c893bdf..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_popup_menu_item_layout.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_screen_content_include.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_screen_content_include.xml.flat deleted file mode 100755 index 69df189..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_screen_content_include.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_screen_simple.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_screen_simple.xml.flat deleted file mode 100755 index c9f8be5..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_screen_simple.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_screen_simple_overlay_action_mode.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_screen_simple_overlay_action_mode.xml.flat deleted file mode 100755 index 1763c0f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_screen_simple_overlay_action_mode.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_screen_toolbar.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_screen_toolbar.xml.flat deleted file mode 100755 index bf1dc26..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_screen_toolbar.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_search_dropdown_item_icons_2line.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_search_dropdown_item_icons_2line.xml.flat deleted file mode 100755 index f5fd7eb..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_search_dropdown_item_icons_2line.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_search_view.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_search_view.xml.flat deleted file mode 100755 index 45304a1..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_search_view.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_select_dialog_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_select_dialog_material.xml.flat deleted file mode 100755 index 7335a03..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_select_dialog_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_abc_tooltip.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_abc_tooltip.xml.flat deleted file mode 100755 index 1c3477e..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_abc_tooltip.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_activity_main.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_activity_main.xml.flat deleted file mode 100755 index 6dc13ee..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_activity_main.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_activity_settings.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_activity_settings.xml.flat deleted file mode 100755 index 670b899..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_activity_settings.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_content_main.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_content_main.xml.flat deleted file mode 100755 index e123a9c..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_content_main.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_content_settings.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_content_settings.xml.flat deleted file mode 100755 index 70f7de8..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_content_settings.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_design_bottom_navigation_item.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_design_bottom_navigation_item.xml.flat deleted file mode 100755 index 6e177d1..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_design_bottom_navigation_item.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_design_bottom_sheet_dialog.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_design_bottom_sheet_dialog.xml.flat deleted file mode 100755 index e3bc6e8..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_design_bottom_sheet_dialog.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_design_layout_snackbar.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_design_layout_snackbar.xml.flat deleted file mode 100755 index c259fca..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_design_layout_snackbar.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_design_layout_snackbar_include.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_design_layout_snackbar_include.xml.flat deleted file mode 100755 index 760ce6a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_design_layout_snackbar_include.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_design_layout_tab_icon.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_design_layout_tab_icon.xml.flat deleted file mode 100755 index d289585..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_design_layout_tab_icon.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_design_layout_tab_text.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_design_layout_tab_text.xml.flat deleted file mode 100755 index cce7839..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_design_layout_tab_text.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_design_menu_item_action_area.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_design_menu_item_action_area.xml.flat deleted file mode 100755 index 131de89..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_design_menu_item_action_area.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_design_navigation_item.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_design_navigation_item.xml.flat deleted file mode 100755 index dc97033..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_design_navigation_item.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_design_navigation_item_header.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_design_navigation_item_header.xml.flat deleted file mode 100755 index 60b1d92..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_design_navigation_item_header.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_design_navigation_item_separator.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_design_navigation_item_separator.xml.flat deleted file mode 100755 index f42a56a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_design_navigation_item_separator.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_design_navigation_item_subheader.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_design_navigation_item_subheader.xml.flat deleted file mode 100755 index 77a18ec..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_design_navigation_item_subheader.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_design_navigation_menu.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_design_navigation_menu.xml.flat deleted file mode 100755 index 9db7db3..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_design_navigation_menu.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_design_navigation_menu_item.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_design_navigation_menu_item.xml.flat deleted file mode 100755 index cf69c2e..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_design_navigation_menu_item.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_design_text_input_password_icon.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_design_text_input_password_icon.xml.flat deleted file mode 100755 index 37bea00..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_design_text_input_password_icon.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_mtrl_layout_snackbar.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_mtrl_layout_snackbar.xml.flat deleted file mode 100755 index 68dc2ce..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_mtrl_layout_snackbar.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_mtrl_layout_snackbar_include.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_mtrl_layout_snackbar_include.xml.flat deleted file mode 100755 index 8fa56e2..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_mtrl_layout_snackbar_include.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_notification_action.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_notification_action.xml.flat deleted file mode 100755 index 6c6cdad..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_notification_action.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_notification_action_tombstone.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_notification_action_tombstone.xml.flat deleted file mode 100755 index 6e3a0da..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_notification_action_tombstone.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_notification_template_custom_big.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_notification_template_custom_big.xml.flat deleted file mode 100755 index 8d08abe..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_notification_template_custom_big.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_notification_template_icon_group.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_notification_template_icon_group.xml.flat deleted file mode 100755 index 797b1fa..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_notification_template_icon_group.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_notification_template_part_chronometer.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_notification_template_part_chronometer.xml.flat deleted file mode 100755 index 43a3791..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_notification_template_part_chronometer.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_notification_template_part_time.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_notification_template_part_time.xml.flat deleted file mode 100755 index 808d560..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_notification_template_part_time.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_select_dialog_item_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_select_dialog_item_material.xml.flat deleted file mode 100755 index 47eb68b..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_select_dialog_item_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_select_dialog_multichoice_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_select_dialog_multichoice_material.xml.flat deleted file mode 100755 index 1134b28..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_select_dialog_multichoice_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_select_dialog_singlechoice_material.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_select_dialog_singlechoice_material.xml.flat deleted file mode 100755 index 1094d24..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_select_dialog_singlechoice_material.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/layout_support_simple_spinner_dropdown_item.xml.flat b/code/Android App/build/intermediates/res/merged/debug/layout_support_simple_spinner_dropdown_item.xml.flat deleted file mode 100755 index 4269145..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/layout_support_simple_spinner_dropdown_item.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/menu_menu_main.xml.flat b/code/Android App/build/intermediates/res/merged/debug/menu_menu_main.xml.flat deleted file mode 100755 index bbf09ad..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/menu_menu_main.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/mipmap-anydpi-v26_ic_launcher.xml.flat b/code/Android App/build/intermediates/res/merged/debug/mipmap-anydpi-v26_ic_launcher.xml.flat deleted file mode 100755 index 820ec9d..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/mipmap-anydpi-v26_ic_launcher.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/mipmap-anydpi-v26_ic_launcher_round.xml.flat b/code/Android App/build/intermediates/res/merged/debug/mipmap-anydpi-v26_ic_launcher_round.xml.flat deleted file mode 100755 index 879fb88..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/mipmap-anydpi-v26_ic_launcher_round.xml.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/mipmap-hdpi_ic_launcher.png.flat b/code/Android App/build/intermediates/res/merged/debug/mipmap-hdpi_ic_launcher.png.flat deleted file mode 100755 index d5a8123..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/mipmap-hdpi_ic_launcher.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/mipmap-hdpi_ic_launcher_round.png.flat b/code/Android App/build/intermediates/res/merged/debug/mipmap-hdpi_ic_launcher_round.png.flat deleted file mode 100755 index 8efb680..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/mipmap-hdpi_ic_launcher_round.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/mipmap-mdpi_ic_launcher.png.flat b/code/Android App/build/intermediates/res/merged/debug/mipmap-mdpi_ic_launcher.png.flat deleted file mode 100755 index e4cc66b..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/mipmap-mdpi_ic_launcher.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/mipmap-mdpi_ic_launcher_round.png.flat b/code/Android App/build/intermediates/res/merged/debug/mipmap-mdpi_ic_launcher_round.png.flat deleted file mode 100755 index af6ecfc..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/mipmap-mdpi_ic_launcher_round.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/mipmap-xhdpi_ic_launcher.png.flat b/code/Android App/build/intermediates/res/merged/debug/mipmap-xhdpi_ic_launcher.png.flat deleted file mode 100755 index d62e2b9..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/mipmap-xhdpi_ic_launcher.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/mipmap-xhdpi_ic_launcher_round.png.flat b/code/Android App/build/intermediates/res/merged/debug/mipmap-xhdpi_ic_launcher_round.png.flat deleted file mode 100755 index b9e9e39..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/mipmap-xhdpi_ic_launcher_round.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/mipmap-xxhdpi_ic_launcher.png.flat b/code/Android App/build/intermediates/res/merged/debug/mipmap-xxhdpi_ic_launcher.png.flat deleted file mode 100755 index a94528e..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/mipmap-xxhdpi_ic_launcher.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/mipmap-xxhdpi_ic_launcher_round.png.flat b/code/Android App/build/intermediates/res/merged/debug/mipmap-xxhdpi_ic_launcher_round.png.flat deleted file mode 100755 index 6e4fa3c..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/mipmap-xxhdpi_ic_launcher_round.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/mipmap-xxxhdpi_ic_launcher.png.flat b/code/Android App/build/intermediates/res/merged/debug/mipmap-xxxhdpi_ic_launcher.png.flat deleted file mode 100755 index ff04493..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/mipmap-xxxhdpi_ic_launcher.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/mipmap-xxxhdpi_ic_launcher_round.png.flat b/code/Android App/build/intermediates/res/merged/debug/mipmap-xxxhdpi_ic_launcher_round.png.flat deleted file mode 100755 index 6c7c612..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/mipmap-xxxhdpi_ic_launcher_round.png.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-af_values-af.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-af_values-af.arsc.flat deleted file mode 100755 index 77df6aa..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-af_values-af.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-am_values-am.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-am_values-am.arsc.flat deleted file mode 100755 index ca1c902..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-am_values-am.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-ar_values-ar.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-ar_values-ar.arsc.flat deleted file mode 100755 index 8e05644..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-ar_values-ar.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-as_values-as.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-as_values-as.arsc.flat deleted file mode 100755 index 3b7a18e..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-as_values-as.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-az_values-az.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-az_values-az.arsc.flat deleted file mode 100755 index 1484b59..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-az_values-az.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-b+sr+Latn_values-b+sr+Latn.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-b+sr+Latn_values-b+sr+Latn.arsc.flat deleted file mode 100755 index e8edec5..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-b+sr+Latn_values-b+sr+Latn.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-be_values-be.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-be_values-be.arsc.flat deleted file mode 100755 index e087aff..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-be_values-be.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-bg_values-bg.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-bg_values-bg.arsc.flat deleted file mode 100755 index c752c99..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-bg_values-bg.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-bn_values-bn.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-bn_values-bn.arsc.flat deleted file mode 100755 index 5ead690..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-bn_values-bn.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-bs_values-bs.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-bs_values-bs.arsc.flat deleted file mode 100755 index d8a7f57..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-bs_values-bs.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-ca_values-ca.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-ca_values-ca.arsc.flat deleted file mode 100755 index a22a6bf..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-ca_values-ca.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-cs_values-cs.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-cs_values-cs.arsc.flat deleted file mode 100755 index 0dde45e..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-cs_values-cs.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-da_values-da.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-da_values-da.arsc.flat deleted file mode 100755 index a09c1e4..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-da_values-da.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-de_values-de.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-de_values-de.arsc.flat deleted file mode 100755 index 4bfd485..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-de_values-de.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-el_values-el.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-el_values-el.arsc.flat deleted file mode 100755 index a1c8f28..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-el_values-el.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-en-rAU_values-en-rAU.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-en-rAU_values-en-rAU.arsc.flat deleted file mode 100755 index af9f636..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-en-rAU_values-en-rAU.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-en-rCA_values-en-rCA.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-en-rCA_values-en-rCA.arsc.flat deleted file mode 100755 index 532c3cf..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-en-rCA_values-en-rCA.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-en-rGB_values-en-rGB.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-en-rGB_values-en-rGB.arsc.flat deleted file mode 100755 index af60e11..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-en-rGB_values-en-rGB.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-en-rIN_values-en-rIN.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-en-rIN_values-en-rIN.arsc.flat deleted file mode 100755 index 1504173..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-en-rIN_values-en-rIN.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-en-rXC_values-en-rXC.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-en-rXC_values-en-rXC.arsc.flat deleted file mode 100755 index 6eb17ae..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-en-rXC_values-en-rXC.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-es-rUS_values-es-rUS.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-es-rUS_values-es-rUS.arsc.flat deleted file mode 100755 index de03c78..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-es-rUS_values-es-rUS.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-es_values-es.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-es_values-es.arsc.flat deleted file mode 100755 index a33212b..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-es_values-es.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-et_values-et.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-et_values-et.arsc.flat deleted file mode 100755 index 603c32e..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-et_values-et.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-eu_values-eu.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-eu_values-eu.arsc.flat deleted file mode 100755 index c923732..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-eu_values-eu.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-fa_values-fa.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-fa_values-fa.arsc.flat deleted file mode 100755 index c7e1d4b..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-fa_values-fa.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-fi_values-fi.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-fi_values-fi.arsc.flat deleted file mode 100755 index b990d19..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-fi_values-fi.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-fr-rCA_values-fr-rCA.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-fr-rCA_values-fr-rCA.arsc.flat deleted file mode 100755 index 0769e9e..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-fr-rCA_values-fr-rCA.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-fr_values-fr.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-fr_values-fr.arsc.flat deleted file mode 100755 index 7748ff3..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-fr_values-fr.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-gl_values-gl.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-gl_values-gl.arsc.flat deleted file mode 100755 index f645efb..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-gl_values-gl.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-gu_values-gu.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-gu_values-gu.arsc.flat deleted file mode 100755 index c0accb0..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-gu_values-gu.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-h720dp-v13_values-h720dp-v13.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-h720dp-v13_values-h720dp-v13.arsc.flat deleted file mode 100755 index 128d9b2..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-h720dp-v13_values-h720dp-v13.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-hdpi-v4_values-hdpi-v4.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-hdpi-v4_values-hdpi-v4.arsc.flat deleted file mode 100755 index 244122b..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-hdpi-v4_values-hdpi-v4.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-hi_values-hi.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-hi_values-hi.arsc.flat deleted file mode 100755 index f5c0836..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-hi_values-hi.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-hr_values-hr.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-hr_values-hr.arsc.flat deleted file mode 100755 index 67a06fb..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-hr_values-hr.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-hu_values-hu.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-hu_values-hu.arsc.flat deleted file mode 100755 index 2ddecaa..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-hu_values-hu.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-hy_values-hy.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-hy_values-hy.arsc.flat deleted file mode 100755 index 8c24fc5..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-hy_values-hy.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-in_values-in.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-in_values-in.arsc.flat deleted file mode 100755 index e63dd38..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-in_values-in.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-is_values-is.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-is_values-is.arsc.flat deleted file mode 100755 index 2f0d3e5..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-is_values-is.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-it_values-it.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-it_values-it.arsc.flat deleted file mode 100755 index cafcc25..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-it_values-it.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-iw_values-iw.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-iw_values-iw.arsc.flat deleted file mode 100755 index 0e22e32..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-iw_values-iw.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-ja_values-ja.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-ja_values-ja.arsc.flat deleted file mode 100755 index 2bbab64..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-ja_values-ja.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-ka_values-ka.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-ka_values-ka.arsc.flat deleted file mode 100755 index d351b46..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-ka_values-ka.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-kk_values-kk.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-kk_values-kk.arsc.flat deleted file mode 100755 index 079941b..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-kk_values-kk.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-km_values-km.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-km_values-km.arsc.flat deleted file mode 100755 index aa574bf..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-km_values-km.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-kn_values-kn.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-kn_values-kn.arsc.flat deleted file mode 100755 index bc20f1f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-kn_values-kn.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-ko_values-ko.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-ko_values-ko.arsc.flat deleted file mode 100755 index e11a1d1..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-ko_values-ko.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-ky_values-ky.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-ky_values-ky.arsc.flat deleted file mode 100755 index c87f2be..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-ky_values-ky.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-land_values-land.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-land_values-land.arsc.flat deleted file mode 100755 index c46a950..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-land_values-land.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-large-v4_values-large-v4.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-large-v4_values-large-v4.arsc.flat deleted file mode 100755 index c1bbdcf..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-large-v4_values-large-v4.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-ldltr-v21_values-ldltr-v21.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-ldltr-v21_values-ldltr-v21.arsc.flat deleted file mode 100755 index 12cca58..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-ldltr-v21_values-ldltr-v21.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-lo_values-lo.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-lo_values-lo.arsc.flat deleted file mode 100755 index da812e2..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-lo_values-lo.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-lt_values-lt.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-lt_values-lt.arsc.flat deleted file mode 100755 index 62e32d9..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-lt_values-lt.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-lv_values-lv.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-lv_values-lv.arsc.flat deleted file mode 100755 index ff994aa..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-lv_values-lv.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-mk_values-mk.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-mk_values-mk.arsc.flat deleted file mode 100755 index 77250a3..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-mk_values-mk.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-ml_values-ml.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-ml_values-ml.arsc.flat deleted file mode 100755 index 28f0032..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-ml_values-ml.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-mn_values-mn.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-mn_values-mn.arsc.flat deleted file mode 100755 index 58e5f6c..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-mn_values-mn.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-mr_values-mr.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-mr_values-mr.arsc.flat deleted file mode 100755 index ede2d3a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-mr_values-mr.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-ms_values-ms.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-ms_values-ms.arsc.flat deleted file mode 100755 index e3cf9a8..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-ms_values-ms.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-my_values-my.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-my_values-my.arsc.flat deleted file mode 100755 index 2d63696..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-my_values-my.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-nb_values-nb.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-nb_values-nb.arsc.flat deleted file mode 100755 index f8b5b53..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-nb_values-nb.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-ne_values-ne.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-ne_values-ne.arsc.flat deleted file mode 100755 index d2977f5..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-ne_values-ne.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-night-v8_values-night-v8.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-night-v8_values-night-v8.arsc.flat deleted file mode 100755 index bcaafb7..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-night-v8_values-night-v8.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-nl_values-nl.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-nl_values-nl.arsc.flat deleted file mode 100755 index 064fad4..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-nl_values-nl.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-or_values-or.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-or_values-or.arsc.flat deleted file mode 100755 index 9a0c89c..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-or_values-or.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-pa_values-pa.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-pa_values-pa.arsc.flat deleted file mode 100755 index 86234cd..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-pa_values-pa.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-pl_values-pl.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-pl_values-pl.arsc.flat deleted file mode 100755 index 45775d8..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-pl_values-pl.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-port_values-port.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-port_values-port.arsc.flat deleted file mode 100755 index 0a93a89..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-port_values-port.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-pt-rBR_values-pt-rBR.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-pt-rBR_values-pt-rBR.arsc.flat deleted file mode 100755 index 1cd18f4..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-pt-rBR_values-pt-rBR.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-pt-rPT_values-pt-rPT.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-pt-rPT_values-pt-rPT.arsc.flat deleted file mode 100755 index 5e6d5ec..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-pt-rPT_values-pt-rPT.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-pt_values-pt.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-pt_values-pt.arsc.flat deleted file mode 100755 index bef967e..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-pt_values-pt.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-ro_values-ro.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-ro_values-ro.arsc.flat deleted file mode 100755 index 6a93c3f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-ro_values-ro.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-ru_values-ru.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-ru_values-ru.arsc.flat deleted file mode 100755 index 156d91d..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-ru_values-ru.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-si_values-si.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-si_values-si.arsc.flat deleted file mode 100755 index b9c9404..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-si_values-si.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-sk_values-sk.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-sk_values-sk.arsc.flat deleted file mode 100755 index 0a2d8f5..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-sk_values-sk.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-sl_values-sl.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-sl_values-sl.arsc.flat deleted file mode 100755 index ae7af09..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-sl_values-sl.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-sq_values-sq.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-sq_values-sq.arsc.flat deleted file mode 100755 index fbdea08..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-sq_values-sq.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-sr_values-sr.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-sr_values-sr.arsc.flat deleted file mode 100755 index f612575..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-sr_values-sr.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-sv_values-sv.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-sv_values-sv.arsc.flat deleted file mode 100755 index 4e5018a..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-sv_values-sv.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-sw600dp-v13_values-sw600dp-v13.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-sw600dp-v13_values-sw600dp-v13.arsc.flat deleted file mode 100755 index d0e3f1b..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-sw600dp-v13_values-sw600dp-v13.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-sw_values-sw.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-sw_values-sw.arsc.flat deleted file mode 100755 index a9ed5ac..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-sw_values-sw.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-ta_values-ta.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-ta_values-ta.arsc.flat deleted file mode 100755 index 4d15a17..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-ta_values-ta.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-te_values-te.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-te_values-te.arsc.flat deleted file mode 100755 index 56e310c..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-te_values-te.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-th_values-th.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-th_values-th.arsc.flat deleted file mode 100755 index 709e5b7..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-th_values-th.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-tl_values-tl.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-tl_values-tl.arsc.flat deleted file mode 100755 index 147a530..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-tl_values-tl.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-tr_values-tr.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-tr_values-tr.arsc.flat deleted file mode 100755 index 7af4ba2..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-tr_values-tr.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-uk_values-uk.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-uk_values-uk.arsc.flat deleted file mode 100755 index 2bf60ee..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-uk_values-uk.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-ur_values-ur.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-ur_values-ur.arsc.flat deleted file mode 100755 index 64046c7..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-ur_values-ur.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-uz_values-uz.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-uz_values-uz.arsc.flat deleted file mode 100755 index 569eb86..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-uz_values-uz.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-v16_values-v16.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-v16_values-v16.arsc.flat deleted file mode 100755 index c8ce21c..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-v16_values-v16.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-v17_values-v17.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-v17_values-v17.arsc.flat deleted file mode 100755 index f5438ff..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-v17_values-v17.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-v18_values-v18.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-v18_values-v18.arsc.flat deleted file mode 100755 index b05b642..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-v18_values-v18.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-v21_values-v21.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-v21_values-v21.arsc.flat deleted file mode 100755 index 5e75f0f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-v21_values-v21.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-v22_values-v22.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-v22_values-v22.arsc.flat deleted file mode 100755 index 9f3509f..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-v22_values-v22.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-v23_values-v23.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-v23_values-v23.arsc.flat deleted file mode 100755 index 13d116c..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-v23_values-v23.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-v24_values-v24.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-v24_values-v24.arsc.flat deleted file mode 100755 index 40640ba..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-v24_values-v24.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-v25_values-v25.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-v25_values-v25.arsc.flat deleted file mode 100755 index 4bd9f11..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-v25_values-v25.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-v26_values-v26.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-v26_values-v26.arsc.flat deleted file mode 100755 index 713faad..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-v26_values-v26.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-v28_values-v28.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-v28_values-v28.arsc.flat deleted file mode 100755 index 8c8e8ea..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-v28_values-v28.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-vi_values-vi.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-vi_values-vi.arsc.flat deleted file mode 100755 index 4a5ac68..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-vi_values-vi.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-watch-v20_values-watch-v20.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-watch-v20_values-watch-v20.arsc.flat deleted file mode 100755 index f14d400..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-watch-v20_values-watch-v20.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-watch-v21_values-watch-v21.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-watch-v21_values-watch-v21.arsc.flat deleted file mode 100755 index 42d8a92..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-watch-v21_values-watch-v21.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-xlarge-v4_values-xlarge-v4.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-xlarge-v4_values-xlarge-v4.arsc.flat deleted file mode 100755 index 0a8bd9b..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-xlarge-v4_values-xlarge-v4.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-zh-rCN_values-zh-rCN.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-zh-rCN_values-zh-rCN.arsc.flat deleted file mode 100755 index 32e3beb..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-zh-rCN_values-zh-rCN.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-zh-rHK_values-zh-rHK.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-zh-rHK_values-zh-rHK.arsc.flat deleted file mode 100755 index 106e0d0..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-zh-rHK_values-zh-rHK.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-zh-rTW_values-zh-rTW.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-zh-rTW_values-zh-rTW.arsc.flat deleted file mode 100755 index c535852..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-zh-rTW_values-zh-rTW.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values-zu_values-zu.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values-zu_values-zu.arsc.flat deleted file mode 100755 index d9863ea..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values-zu_values-zu.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/merged/debug/values_values.arsc.flat b/code/Android App/build/intermediates/res/merged/debug/values_values.arsc.flat deleted file mode 100755 index 8b56645..0000000 Binary files a/code/Android App/build/intermediates/res/merged/debug/values_values.arsc.flat and /dev/null differ diff --git a/code/Android App/build/intermediates/res/symbol-table-with-package/debug/package-aware-r.txt b/code/Android App/build/intermediates/res/symbol-table-with-package/debug/package-aware-r.txt deleted file mode 100755 index 76e8f54..0000000 --- a/code/Android App/build/intermediates/res/symbol-table-with-package/debug/package-aware-r.txt +++ /dev/null @@ -1,1958 +0,0 @@ -com.scriptor -anim abc_fade_in -anim abc_fade_out -anim abc_grow_fade_in_from_bottom -anim abc_popup_enter -anim abc_popup_exit -anim abc_shrink_fade_out_from_bottom -anim abc_slide_in_bottom -anim abc_slide_in_top -anim abc_slide_out_bottom -anim abc_slide_out_top -anim abc_tooltip_enter -anim abc_tooltip_exit -anim design_bottom_sheet_slide_in -anim design_bottom_sheet_slide_out -anim design_snackbar_in -anim design_snackbar_out -animator design_appbar_state_list_animator -animator design_fab_hide_motion_spec -animator design_fab_show_motion_spec -animator mtrl_btn_state_list_anim -animator mtrl_btn_unelevated_state_list_anim -animator mtrl_chip_state_list_anim -animator mtrl_fab_hide_motion_spec -animator mtrl_fab_show_motion_spec -animator mtrl_fab_transformation_sheet_collapse_spec -animator mtrl_fab_transformation_sheet_expand_spec -array church_array -attr actionBarDivider -attr actionBarItemBackground -attr actionBarPopupTheme -attr actionBarSize -attr actionBarSplitStyle -attr actionBarStyle -attr actionBarTabBarStyle -attr actionBarTabStyle -attr actionBarTabTextStyle -attr actionBarTheme -attr actionBarWidgetTheme -attr actionButtonStyle -attr actionDropDownStyle -attr actionLayout -attr actionMenuTextAppearance -attr actionMenuTextColor -attr actionModeBackground -attr actionModeCloseButtonStyle -attr actionModeCloseDrawable -attr actionModeCopyDrawable -attr actionModeCutDrawable -attr actionModeFindDrawable -attr actionModePasteDrawable -attr actionModePopupWindowStyle -attr actionModeSelectAllDrawable -attr actionModeShareDrawable -attr actionModeSplitBackground -attr actionModeStyle -attr actionModeWebSearchDrawable -attr actionOverflowButtonStyle -attr actionOverflowMenuStyle -attr actionProviderClass -attr actionViewClass -attr activityChooserViewStyle -attr alertDialogButtonGroupStyle -attr alertDialogCenterButtons -attr alertDialogStyle -attr alertDialogTheme -attr allowStacking -attr alpha -attr alphabeticModifiers -attr arrowHeadLength -attr arrowShaftLength -attr autoCompleteTextViewStyle -attr autoSizeMaxTextSize -attr autoSizeMinTextSize -attr autoSizePresetSizes -attr autoSizeStepGranularity -attr autoSizeTextType -attr background -attr backgroundSplit -attr backgroundStacked -attr backgroundTint -attr backgroundTintMode -attr barLength -attr barrierAllowsGoneWidgets -attr barrierDirection -attr behavior_autoHide -attr behavior_fitToContents -attr behavior_hideable -attr behavior_overlapTop -attr behavior_peekHeight -attr behavior_skipCollapsed -attr borderWidth -attr borderlessButtonStyle -attr bottomAppBarStyle -attr bottomNavigationStyle -attr bottomSheetDialogTheme -attr bottomSheetStyle -attr boxBackgroundColor -attr boxBackgroundMode -attr boxCollapsedPaddingTop -attr boxCornerRadiusBottomEnd -attr boxCornerRadiusBottomStart -attr boxCornerRadiusTopEnd -attr boxCornerRadiusTopStart -attr boxStrokeColor -attr boxStrokeWidth -attr buttonBarButtonStyle -attr buttonBarNegativeButtonStyle -attr buttonBarNeutralButtonStyle -attr buttonBarPositiveButtonStyle -attr buttonBarStyle -attr buttonGravity -attr buttonIconDimen -attr buttonPanelSideLayout -attr buttonStyle -attr buttonStyleSmall -attr buttonTint -attr buttonTintMode -attr cardBackgroundColor -attr cardCornerRadius -attr cardElevation -attr cardMaxElevation -attr cardPreventCornerOverlap -attr cardUseCompatPadding -attr cardViewStyle -attr chainUseRtl -attr checkboxStyle -attr checkedChip -attr checkedIcon -attr checkedIconEnabled -attr checkedIconVisible -attr checkedTextViewStyle -attr chipBackgroundColor -attr chipCornerRadius -attr chipEndPadding -attr chipGroupStyle -attr chipIcon -attr chipIconEnabled -attr chipIconSize -attr chipIconTint -attr chipIconVisible -attr chipMinHeight -attr chipSpacing -attr chipSpacingHorizontal -attr chipSpacingVertical -attr chipStandaloneStyle -attr chipStartPadding -attr chipStrokeColor -attr chipStrokeWidth -attr chipStyle -attr closeIcon -attr closeIconEnabled -attr closeIconEndPadding -attr closeIconSize -attr closeIconStartPadding -attr closeIconTint -attr closeIconVisible -attr closeItemLayout -attr collapseContentDescription -attr collapseIcon -attr collapsedTitleGravity -attr collapsedTitleTextAppearance -attr color -attr colorAccent -attr colorBackgroundFloating -attr colorButtonNormal -attr colorControlActivated -attr colorControlHighlight -attr colorControlNormal -attr colorError -attr colorPrimary -attr colorPrimaryDark -attr colorSecondary -attr colorSwitchThumbNormal -attr commitIcon -attr constraintSet -attr constraint_referenced_ids -attr content -attr contentDescription -attr contentInsetEnd -attr contentInsetEndWithActions -attr contentInsetLeft -attr contentInsetRight -attr contentInsetStart -attr contentInsetStartWithNavigation -attr contentPadding -attr contentPaddingBottom -attr contentPaddingLeft -attr contentPaddingRight -attr contentPaddingTop -attr contentScrim -attr controlBackground -attr coordinatorLayoutStyle -attr cornerRadius -attr counterEnabled -attr counterMaxLength -attr counterOverflowTextAppearance -attr counterTextAppearance -attr customNavigationLayout -attr defaultQueryHint -attr dialogCornerRadius -attr dialogPreferredPadding -attr dialogTheme -attr displayOptions -attr divider -attr dividerHorizontal -attr dividerPadding -attr dividerVertical -attr drawableSize -attr drawerArrowStyle -attr dropDownListViewStyle -attr dropdownListPreferredItemHeight -attr editTextBackground -attr editTextColor -attr editTextStyle -attr elevation -attr emptyVisibility -attr enforceMaterialTheme -attr enforceTextAppearance -attr errorEnabled -attr errorTextAppearance -attr expandActivityOverflowButtonDrawable -attr expanded -attr expandedTitleGravity -attr expandedTitleMargin -attr expandedTitleMarginBottom -attr expandedTitleMarginEnd -attr expandedTitleMarginStart -attr expandedTitleMarginTop -attr expandedTitleTextAppearance -attr fabAlignmentMode -attr fabCradleMargin -attr fabCradleRoundedCornerRadius -attr fabCradleVerticalOffset -attr fabCustomSize -attr fabSize -attr fastScrollEnabled -attr fastScrollHorizontalThumbDrawable -attr fastScrollHorizontalTrackDrawable -attr fastScrollVerticalThumbDrawable -attr fastScrollVerticalTrackDrawable -attr firstBaselineToTopHeight -attr floatingActionButtonStyle -attr font -attr fontFamily -attr fontProviderAuthority -attr fontProviderCerts -attr fontProviderFetchStrategy -attr fontProviderFetchTimeout -attr fontProviderPackage -attr fontProviderQuery -attr fontStyle -attr fontVariationSettings -attr fontWeight -attr foregroundInsidePadding -attr gapBetweenBars -attr goIcon -attr headerLayout -attr height -attr helperText -attr helperTextEnabled -attr helperTextTextAppearance -attr hideMotionSpec -attr hideOnContentScroll -attr hideOnScroll -attr hintAnimationEnabled -attr hintEnabled -attr hintTextAppearance -attr homeAsUpIndicator -attr homeLayout -attr hoveredFocusedTranslationZ -attr icon -attr iconEndPadding -attr iconGravity -attr iconPadding -attr iconSize -attr iconStartPadding -attr iconTint -attr iconTintMode -attr iconifiedByDefault -attr imageButtonStyle -attr indeterminateProgressStyle -attr initialActivityCount -attr insetForeground -attr isLightTheme -attr itemBackground -attr itemHorizontalPadding -attr itemHorizontalTranslationEnabled -attr itemIconPadding -attr itemIconSize -attr itemIconTint -attr itemPadding -attr itemSpacing -attr itemTextAppearance -attr itemTextAppearanceActive -attr itemTextAppearanceInactive -attr itemTextColor -attr keylines -attr labelVisibilityMode -attr lastBaselineToBottomHeight -attr layout -attr layoutManager -attr layout_anchor -attr layout_anchorGravity -attr layout_behavior -attr layout_collapseMode -attr layout_collapseParallaxMultiplier -attr layout_constrainedHeight -attr layout_constrainedWidth -attr layout_constraintBaseline_creator -attr layout_constraintBaseline_toBaselineOf -attr layout_constraintBottom_creator -attr layout_constraintBottom_toBottomOf -attr layout_constraintBottom_toTopOf -attr layout_constraintCircle -attr layout_constraintCircleAngle -attr layout_constraintCircleRadius -attr layout_constraintDimensionRatio -attr layout_constraintEnd_toEndOf -attr layout_constraintEnd_toStartOf -attr layout_constraintGuide_begin -attr layout_constraintGuide_end -attr layout_constraintGuide_percent -attr layout_constraintHeight_default -attr layout_constraintHeight_max -attr layout_constraintHeight_min -attr layout_constraintHeight_percent -attr layout_constraintHorizontal_bias -attr layout_constraintHorizontal_chainStyle -attr layout_constraintHorizontal_weight -attr layout_constraintLeft_creator -attr layout_constraintLeft_toLeftOf -attr layout_constraintLeft_toRightOf -attr layout_constraintRight_creator -attr layout_constraintRight_toLeftOf -attr layout_constraintRight_toRightOf -attr layout_constraintStart_toEndOf -attr layout_constraintStart_toStartOf -attr layout_constraintTop_creator -attr layout_constraintTop_toBottomOf -attr layout_constraintTop_toTopOf -attr layout_constraintVertical_bias -attr layout_constraintVertical_chainStyle -attr layout_constraintVertical_weight -attr layout_constraintWidth_default -attr layout_constraintWidth_max -attr layout_constraintWidth_min -attr layout_constraintWidth_percent -attr layout_dodgeInsetEdges -attr layout_editor_absoluteX -attr layout_editor_absoluteY -attr layout_goneMarginBottom -attr layout_goneMarginEnd -attr layout_goneMarginLeft -attr layout_goneMarginRight -attr layout_goneMarginStart -attr layout_goneMarginTop -attr layout_insetEdge -attr layout_keyline -attr layout_optimizationLevel -attr layout_scrollFlags -attr layout_scrollInterpolator -attr liftOnScroll -attr lineHeight -attr lineSpacing -attr listChoiceBackgroundIndicator -attr listDividerAlertDialog -attr listItemLayout -attr listLayout -attr listMenuViewStyle -attr listPopupWindowStyle -attr listPreferredItemHeight -attr listPreferredItemHeightLarge -attr listPreferredItemHeightSmall -attr listPreferredItemPaddingLeft -attr listPreferredItemPaddingRight -attr logo -attr logoDescription -attr materialButtonStyle -attr materialCardViewStyle -attr maxActionInlineWidth -attr maxButtonHeight -attr maxImageSize -attr measureWithLargestChild -attr menu -attr multiChoiceItemLayout -attr navigationContentDescription -attr navigationIcon -attr navigationMode -attr navigationViewStyle -attr numericModifiers -attr overlapAnchor -attr paddingBottomNoButtons -attr paddingEnd -attr paddingStart -attr paddingTopNoTitle -attr panelBackground -attr panelMenuListTheme -attr panelMenuListWidth -attr passwordToggleContentDescription -attr passwordToggleDrawable -attr passwordToggleEnabled -attr passwordToggleTint -attr passwordToggleTintMode -attr popupMenuStyle -attr popupTheme -attr popupWindowStyle -attr preserveIconSpacing -attr pressedTranslationZ -attr progressBarPadding -attr progressBarStyle -attr queryBackground -attr queryHint -attr radioButtonStyle -attr ratingBarStyle -attr ratingBarStyleIndicator -attr ratingBarStyleSmall -attr reverseLayout -attr rippleColor -attr scrimAnimationDuration -attr scrimBackground -attr scrimVisibleHeightTrigger -attr searchHintIcon -attr searchIcon -attr searchViewStyle -attr seekBarStyle -attr selectableItemBackground -attr selectableItemBackgroundBorderless -attr showAsAction -attr showDividers -attr showMotionSpec -attr showText -attr showTitle -attr singleChoiceItemLayout -attr singleLine -attr singleSelection -attr snackbarButtonStyle -attr snackbarStyle -attr spanCount -attr spinBars -attr spinnerDropDownItemStyle -attr spinnerStyle -attr splitTrack -attr srcCompat -attr stackFromEnd -attr state_above_anchor -attr state_collapsed -attr state_collapsible -attr state_liftable -attr state_lifted -attr statusBarBackground -attr statusBarScrim -attr strokeColor -attr strokeWidth -attr subMenuArrow -attr submitBackground -attr subtitle -attr subtitleTextAppearance -attr subtitleTextColor -attr subtitleTextStyle -attr suggestionRowLayout -attr switchMinWidth -attr switchPadding -attr switchStyle -attr switchTextAppearance -attr tabBackground -attr tabContentStart -attr tabGravity -attr tabIconTint -attr tabIconTintMode -attr tabIndicator -attr tabIndicatorAnimationDuration -attr tabIndicatorColor -attr tabIndicatorFullWidth -attr tabIndicatorGravity -attr tabIndicatorHeight -attr tabInlineLabel -attr tabMaxWidth -attr tabMinWidth -attr tabMode -attr tabPadding -attr tabPaddingBottom -attr tabPaddingEnd -attr tabPaddingStart -attr tabPaddingTop -attr tabRippleColor -attr tabSelectedTextColor -attr tabStyle -attr tabTextAppearance -attr tabTextColor -attr tabUnboundedRipple -attr textAllCaps -attr textAppearanceBody1 -attr textAppearanceBody2 -attr textAppearanceButton -attr textAppearanceCaption -attr textAppearanceHeadline1 -attr textAppearanceHeadline2 -attr textAppearanceHeadline3 -attr textAppearanceHeadline4 -attr textAppearanceHeadline5 -attr textAppearanceHeadline6 -attr textAppearanceLargePopupMenu -attr textAppearanceListItem -attr textAppearanceListItemSecondary -attr textAppearanceListItemSmall -attr textAppearanceOverline -attr textAppearancePopupMenuHeader -attr textAppearanceSearchResultSubtitle -attr textAppearanceSearchResultTitle -attr textAppearanceSmallPopupMenu -attr textAppearanceSubtitle1 -attr textAppearanceSubtitle2 -attr textColorAlertDialogListItem -attr textColorSearchUrl -attr textEndPadding -attr textInputStyle -attr textStartPadding -attr theme -attr thickness -attr thumbTextPadding -attr thumbTint -attr thumbTintMode -attr tickMark -attr tickMarkTint -attr tickMarkTintMode -attr tint -attr tintMode -attr title -attr titleEnabled -attr titleMargin -attr titleMarginBottom -attr titleMarginEnd -attr titleMarginStart -attr titleMarginTop -attr titleMargins -attr titleTextAppearance -attr titleTextColor -attr titleTextStyle -attr toolbarId -attr toolbarNavigationButtonStyle -attr toolbarStyle -attr tooltipForegroundColor -attr tooltipFrameBackground -attr tooltipText -attr track -attr trackTint -attr trackTintMode -attr ttcIndex -attr useCompatPadding -attr viewInflaterClass -attr voiceIcon -attr windowActionBar -attr windowActionBarOverlay -attr windowActionModeOverlay -attr windowFixedHeightMajor -attr windowFixedHeightMinor -attr windowFixedWidthMajor -attr windowFixedWidthMinor -attr windowMinWidthMajor -attr windowMinWidthMinor -attr windowNoTitle -bool abc_action_bar_embed_tabs -bool abc_allow_stacked_button_bar -bool abc_config_actionMenuItemAllCaps -bool mtrl_btn_textappearance_all_caps -color abc_background_cache_hint_selector_material_dark -color abc_background_cache_hint_selector_material_light -color abc_btn_colored_borderless_text_material -color abc_btn_colored_text_material -color abc_color_highlight_material -color abc_hint_foreground_material_dark -color abc_hint_foreground_material_light -color abc_input_method_navigation_guard -color abc_primary_text_disable_only_material_dark -color abc_primary_text_disable_only_material_light -color abc_primary_text_material_dark -color abc_primary_text_material_light -color abc_search_url_text -color abc_search_url_text_normal -color abc_search_url_text_pressed -color abc_search_url_text_selected -color abc_secondary_text_material_dark -color abc_secondary_text_material_light -color abc_tint_btn_checkable -color abc_tint_default -color abc_tint_edittext -color abc_tint_seek_thumb -color abc_tint_spinner -color abc_tint_switch_track -color accent_material_dark -color accent_material_light -color background_floating_material_dark -color background_floating_material_light -color background_material_dark -color background_material_light -color bright_foreground_disabled_material_dark -color bright_foreground_disabled_material_light -color bright_foreground_inverse_material_dark -color bright_foreground_inverse_material_light -color bright_foreground_material_dark -color bright_foreground_material_light -color button_material_dark -color button_material_light -color cardview_dark_background -color cardview_light_background -color cardview_shadow_end_color -color cardview_shadow_start_color -color colorAccent -color colorPrimary -color colorPrimaryDark -color design_bottom_navigation_shadow_color -color design_default_color_primary -color design_default_color_primary_dark -color design_error -color design_fab_shadow_end_color -color design_fab_shadow_mid_color -color design_fab_shadow_start_color -color design_fab_stroke_end_inner_color -color design_fab_stroke_end_outer_color -color design_fab_stroke_top_inner_color -color design_fab_stroke_top_outer_color -color design_snackbar_background_color -color design_tint_password_toggle -color dim_foreground_disabled_material_dark -color dim_foreground_disabled_material_light -color dim_foreground_material_dark -color dim_foreground_material_light -color error_color_material_dark -color error_color_material_light -color foreground_material_dark -color foreground_material_light -color highlighted_text_material_dark -color highlighted_text_material_light -color material_blue_grey_800 -color material_blue_grey_900 -color material_blue_grey_950 -color material_deep_teal_200 -color material_deep_teal_500 -color material_grey_100 -color material_grey_300 -color material_grey_50 -color material_grey_600 -color material_grey_800 -color material_grey_850 -color material_grey_900 -color mtrl_bottom_nav_colored_item_tint -color mtrl_bottom_nav_item_tint -color mtrl_btn_bg_color_disabled -color mtrl_btn_bg_color_selector -color mtrl_btn_ripple_color -color mtrl_btn_stroke_color_selector -color mtrl_btn_text_btn_ripple_color -color mtrl_btn_text_color_disabled -color mtrl_btn_text_color_selector -color mtrl_btn_transparent_bg_color -color mtrl_chip_background_color -color mtrl_chip_close_icon_tint -color mtrl_chip_ripple_color -color mtrl_chip_text_color -color mtrl_fab_ripple_color -color mtrl_scrim_color -color mtrl_tabs_colored_ripple_color -color mtrl_tabs_icon_color_selector -color mtrl_tabs_icon_color_selector_colored -color mtrl_tabs_legacy_text_color_selector -color mtrl_tabs_ripple_color -color mtrl_text_btn_text_color_selector -color mtrl_textinput_default_box_stroke_color -color mtrl_textinput_disabled_color -color mtrl_textinput_filled_box_default_background_color -color mtrl_textinput_hovered_box_stroke_color -color notification_action_color_filter -color notification_icon_bg_color -color primary_dark_material_dark -color primary_dark_material_light -color primary_material_dark -color primary_material_light -color primary_text_default_material_dark -color primary_text_default_material_light -color primary_text_disabled_material_dark -color primary_text_disabled_material_light -color ripple_material_dark -color ripple_material_light -color secondary_text_default_material_dark -color secondary_text_default_material_light -color secondary_text_disabled_material_dark -color secondary_text_disabled_material_light -color switch_thumb_disabled_material_dark -color switch_thumb_disabled_material_light -color switch_thumb_material_dark -color switch_thumb_material_light -color switch_thumb_normal_material_dark -color switch_thumb_normal_material_light -color tooltip_background_dark -color tooltip_background_light -dimen abc_action_bar_content_inset_material -dimen abc_action_bar_content_inset_with_nav -dimen abc_action_bar_default_height_material -dimen abc_action_bar_default_padding_end_material -dimen abc_action_bar_default_padding_start_material -dimen abc_action_bar_elevation_material -dimen abc_action_bar_icon_vertical_padding_material -dimen abc_action_bar_overflow_padding_end_material -dimen abc_action_bar_overflow_padding_start_material -dimen abc_action_bar_stacked_max_height -dimen abc_action_bar_stacked_tab_max_width -dimen abc_action_bar_subtitle_bottom_margin_material -dimen abc_action_bar_subtitle_top_margin_material -dimen abc_action_button_min_height_material -dimen abc_action_button_min_width_material -dimen abc_action_button_min_width_overflow_material -dimen abc_alert_dialog_button_bar_height -dimen abc_alert_dialog_button_dimen -dimen abc_button_inset_horizontal_material -dimen abc_button_inset_vertical_material -dimen abc_button_padding_horizontal_material -dimen abc_button_padding_vertical_material -dimen abc_cascading_menus_min_smallest_width -dimen abc_config_prefDialogWidth -dimen abc_control_corner_material -dimen abc_control_inset_material -dimen abc_control_padding_material -dimen abc_dialog_corner_radius_material -dimen abc_dialog_fixed_height_major -dimen abc_dialog_fixed_height_minor -dimen abc_dialog_fixed_width_major -dimen abc_dialog_fixed_width_minor -dimen abc_dialog_list_padding_bottom_no_buttons -dimen abc_dialog_list_padding_top_no_title -dimen abc_dialog_min_width_major -dimen abc_dialog_min_width_minor -dimen abc_dialog_padding_material -dimen abc_dialog_padding_top_material -dimen abc_dialog_title_divider_material -dimen abc_disabled_alpha_material_dark -dimen abc_disabled_alpha_material_light -dimen abc_dropdownitem_icon_width -dimen abc_dropdownitem_text_padding_left -dimen abc_dropdownitem_text_padding_right -dimen abc_edit_text_inset_bottom_material -dimen abc_edit_text_inset_horizontal_material -dimen abc_edit_text_inset_top_material -dimen abc_floating_window_z -dimen abc_list_item_padding_horizontal_material -dimen abc_panel_menu_list_width -dimen abc_progress_bar_height_material -dimen abc_search_view_preferred_height -dimen abc_search_view_preferred_width -dimen abc_seekbar_track_background_height_material -dimen abc_seekbar_track_progress_height_material -dimen abc_select_dialog_padding_start_material -dimen abc_switch_padding -dimen abc_text_size_body_1_material -dimen abc_text_size_body_2_material -dimen abc_text_size_button_material -dimen abc_text_size_caption_material -dimen abc_text_size_display_1_material -dimen abc_text_size_display_2_material -dimen abc_text_size_display_3_material -dimen abc_text_size_display_4_material -dimen abc_text_size_headline_material -dimen abc_text_size_large_material -dimen abc_text_size_medium_material -dimen abc_text_size_menu_header_material -dimen abc_text_size_menu_material -dimen abc_text_size_small_material -dimen abc_text_size_subhead_material -dimen abc_text_size_subtitle_material_toolbar -dimen abc_text_size_title_material -dimen abc_text_size_title_material_toolbar -dimen cardview_compat_inset_shadow -dimen cardview_default_elevation -dimen cardview_default_radius -dimen compat_button_inset_horizontal_material -dimen compat_button_inset_vertical_material -dimen compat_button_padding_horizontal_material -dimen compat_button_padding_vertical_material -dimen compat_control_corner_material -dimen compat_notification_large_icon_max_height -dimen compat_notification_large_icon_max_width -dimen design_appbar_elevation -dimen design_bottom_navigation_active_item_max_width -dimen design_bottom_navigation_active_item_min_width -dimen design_bottom_navigation_active_text_size -dimen design_bottom_navigation_elevation -dimen design_bottom_navigation_height -dimen design_bottom_navigation_icon_size -dimen design_bottom_navigation_item_max_width -dimen design_bottom_navigation_item_min_width -dimen design_bottom_navigation_margin -dimen design_bottom_navigation_shadow_height -dimen design_bottom_navigation_text_size -dimen design_bottom_sheet_modal_elevation -dimen design_bottom_sheet_peek_height_min -dimen design_fab_border_width -dimen design_fab_elevation -dimen design_fab_image_size -dimen design_fab_size_mini -dimen design_fab_size_normal -dimen design_fab_translation_z_hovered_focused -dimen design_fab_translation_z_pressed -dimen design_navigation_elevation -dimen design_navigation_icon_padding -dimen design_navigation_icon_size -dimen design_navigation_item_horizontal_padding -dimen design_navigation_item_icon_padding -dimen design_navigation_max_width -dimen design_navigation_padding_bottom -dimen design_navigation_separator_vertical_padding -dimen design_snackbar_action_inline_max_width -dimen design_snackbar_background_corner_radius -dimen design_snackbar_elevation -dimen design_snackbar_extra_spacing_horizontal -dimen design_snackbar_max_width -dimen design_snackbar_min_width -dimen design_snackbar_padding_horizontal -dimen design_snackbar_padding_vertical -dimen design_snackbar_padding_vertical_2lines -dimen design_snackbar_text_size -dimen design_tab_max_width -dimen design_tab_scrollable_min_width -dimen design_tab_text_size -dimen design_tab_text_size_2line -dimen design_textinput_caption_translate_y -dimen disabled_alpha_material_dark -dimen disabled_alpha_material_light -dimen fab_margin -dimen fastscroll_default_thickness -dimen fastscroll_margin -dimen fastscroll_minimum_range -dimen font_size -dimen font_size_small -dimen font_small_large -dimen font_small_medium -dimen highlight_alpha_material_colored -dimen highlight_alpha_material_dark -dimen highlight_alpha_material_light -dimen hint_alpha_material_dark -dimen hint_alpha_material_light -dimen hint_pressed_alpha_material_dark -dimen hint_pressed_alpha_material_light -dimen item_touch_helper_max_drag_scroll_per_frame -dimen item_touch_helper_swipe_escape_max_velocity -dimen item_touch_helper_swipe_escape_velocity -dimen mtrl_bottomappbar_fabOffsetEndMode -dimen mtrl_bottomappbar_fab_cradle_margin -dimen mtrl_bottomappbar_fab_cradle_rounded_corner_radius -dimen mtrl_bottomappbar_fab_cradle_vertical_offset -dimen mtrl_bottomappbar_height -dimen mtrl_btn_corner_radius -dimen mtrl_btn_dialog_btn_min_width -dimen mtrl_btn_disabled_elevation -dimen mtrl_btn_disabled_z -dimen mtrl_btn_elevation -dimen mtrl_btn_focused_z -dimen mtrl_btn_hovered_z -dimen mtrl_btn_icon_btn_padding_left -dimen mtrl_btn_icon_padding -dimen mtrl_btn_inset -dimen mtrl_btn_letter_spacing -dimen mtrl_btn_padding_bottom -dimen mtrl_btn_padding_left -dimen mtrl_btn_padding_right -dimen mtrl_btn_padding_top -dimen mtrl_btn_pressed_z -dimen mtrl_btn_stroke_size -dimen mtrl_btn_text_btn_icon_padding -dimen mtrl_btn_text_btn_padding_left -dimen mtrl_btn_text_btn_padding_right -dimen mtrl_btn_text_size -dimen mtrl_btn_z -dimen mtrl_card_elevation -dimen mtrl_card_spacing -dimen mtrl_chip_pressed_translation_z -dimen mtrl_chip_text_size -dimen mtrl_fab_elevation -dimen mtrl_fab_translation_z_hovered_focused -dimen mtrl_fab_translation_z_pressed -dimen mtrl_navigation_elevation -dimen mtrl_navigation_item_horizontal_padding -dimen mtrl_navigation_item_icon_padding -dimen mtrl_snackbar_background_corner_radius -dimen mtrl_snackbar_margin -dimen mtrl_textinput_box_bottom_offset -dimen mtrl_textinput_box_corner_radius_medium -dimen mtrl_textinput_box_corner_radius_small -dimen mtrl_textinput_box_label_cutout_padding -dimen mtrl_textinput_box_padding_end -dimen mtrl_textinput_box_stroke_width_default -dimen mtrl_textinput_box_stroke_width_focused -dimen mtrl_textinput_outline_box_expanded_padding -dimen mtrl_toolbar_default_height -dimen notification_action_icon_size -dimen notification_action_text_size -dimen notification_big_circle_margin -dimen notification_content_margin_start -dimen notification_large_icon_height -dimen notification_large_icon_width -dimen notification_main_column_padding_top -dimen notification_media_narrow_margin -dimen notification_right_icon_size -dimen notification_right_side_padding_top -dimen notification_small_icon_background_padding -dimen notification_small_icon_size_as_large -dimen notification_subtext_size -dimen notification_top_pad -dimen notification_top_pad_large_text -dimen tooltip_corner_radius -dimen tooltip_horizontal_padding -dimen tooltip_margin -dimen tooltip_precise_anchor_extra_offset -dimen tooltip_precise_anchor_threshold -dimen tooltip_vertical_padding -dimen tooltip_y_offset_non_touch -dimen tooltip_y_offset_touch -drawable abc_ab_share_pack_mtrl_alpha -drawable abc_action_bar_item_background_material -drawable abc_btn_borderless_material -drawable abc_btn_check_material -drawable abc_btn_check_to_on_mtrl_000 -drawable abc_btn_check_to_on_mtrl_015 -drawable abc_btn_colored_material -drawable abc_btn_default_mtrl_shape -drawable abc_btn_radio_material -drawable abc_btn_radio_to_on_mtrl_000 -drawable abc_btn_radio_to_on_mtrl_015 -drawable abc_btn_switch_to_on_mtrl_00001 -drawable abc_btn_switch_to_on_mtrl_00012 -drawable abc_cab_background_internal_bg -drawable abc_cab_background_top_material -drawable abc_cab_background_top_mtrl_alpha -drawable abc_control_background_material -drawable abc_dialog_material_background -drawable abc_edit_text_material -drawable abc_ic_ab_back_material -drawable abc_ic_arrow_drop_right_black_24dp -drawable abc_ic_clear_material -drawable abc_ic_commit_search_api_mtrl_alpha -drawable abc_ic_go_search_api_material -drawable abc_ic_menu_copy_mtrl_am_alpha -drawable abc_ic_menu_cut_mtrl_alpha -drawable abc_ic_menu_overflow_material -drawable abc_ic_menu_paste_mtrl_am_alpha -drawable abc_ic_menu_selectall_mtrl_alpha -drawable abc_ic_menu_share_mtrl_alpha -drawable abc_ic_search_api_material -drawable abc_ic_star_black_16dp -drawable abc_ic_star_black_36dp -drawable abc_ic_star_black_48dp -drawable abc_ic_star_half_black_16dp -drawable abc_ic_star_half_black_36dp -drawable abc_ic_star_half_black_48dp -drawable abc_ic_voice_search_api_material -drawable abc_item_background_holo_dark -drawable abc_item_background_holo_light -drawable abc_list_divider_material -drawable abc_list_divider_mtrl_alpha -drawable abc_list_focused_holo -drawable abc_list_longpressed_holo -drawable abc_list_pressed_holo_dark -drawable abc_list_pressed_holo_light -drawable abc_list_selector_background_transition_holo_dark -drawable abc_list_selector_background_transition_holo_light -drawable abc_list_selector_disabled_holo_dark -drawable abc_list_selector_disabled_holo_light -drawable abc_list_selector_holo_dark -drawable abc_list_selector_holo_light -drawable abc_menu_hardkey_panel_mtrl_mult -drawable abc_popup_background_mtrl_mult -drawable abc_ratingbar_indicator_material -drawable abc_ratingbar_material -drawable abc_ratingbar_small_material -drawable abc_scrubber_control_off_mtrl_alpha -drawable abc_scrubber_control_to_pressed_mtrl_000 -drawable abc_scrubber_control_to_pressed_mtrl_005 -drawable abc_scrubber_primary_mtrl_alpha -drawable abc_scrubber_track_mtrl_alpha -drawable abc_seekbar_thumb_material -drawable abc_seekbar_tick_mark_material -drawable abc_seekbar_track_material -drawable abc_spinner_mtrl_am_alpha -drawable abc_spinner_textfield_background_material -drawable abc_switch_thumb_material -drawable abc_switch_track_mtrl_alpha -drawable abc_tab_indicator_material -drawable abc_tab_indicator_mtrl_alpha -drawable abc_text_cursor_material -drawable abc_text_select_handle_left_mtrl_dark -drawable abc_text_select_handle_left_mtrl_light -drawable abc_text_select_handle_middle_mtrl_dark -drawable abc_text_select_handle_middle_mtrl_light -drawable abc_text_select_handle_right_mtrl_dark -drawable abc_text_select_handle_right_mtrl_light -drawable abc_textfield_activated_mtrl_alpha -drawable abc_textfield_default_mtrl_alpha -drawable abc_textfield_search_activated_mtrl_alpha -drawable abc_textfield_search_default_mtrl_alpha -drawable abc_textfield_search_material -drawable abc_vector_test -drawable avd_hide_password -drawable avd_show_password -drawable design_bottom_navigation_item_background -drawable design_fab_background -drawable design_ic_visibility -drawable design_ic_visibility_off -drawable design_password_eye -drawable design_snackbar_background -drawable ic_launcher_background -drawable ic_launcher_foreground -drawable ic_mtrl_chip_checked_black -drawable ic_mtrl_chip_checked_circle -drawable ic_mtrl_chip_close_circle -drawable mtrl_snackbar_background -drawable mtrl_tabs_default_indicator -drawable navigation_empty_icon -drawable notification_action_background -drawable notification_bg -drawable notification_bg_low -drawable notification_bg_low_normal -drawable notification_bg_low_pressed -drawable notification_bg_normal -drawable notification_bg_normal_pressed -drawable notification_icon_background -drawable notification_template_icon_bg -drawable notification_template_icon_low_bg -drawable notification_tile_bg -drawable notify_panel_notification_icon_bg -drawable tooltip_frame_dark -drawable tooltip_frame_light -id ALT -id CTRL -id FUNCTION -id META -id SHIFT -id SYM -id action_bar -id action_bar_activity_content -id action_bar_container -id action_bar_root -id action_bar_spinner -id action_bar_subtitle -id action_bar_title -id action_container -id action_context_bar -id action_divider -id action_image -id action_menu_divider -id action_menu_presenter -id action_mode_bar -id action_mode_bar_stub -id action_mode_close_button -id action_settings -id action_text -id actions -id activity_chooser_view_content -id add -id alertTitle -id all -id always -id async -id auto -id barrier -id beginning -id blocking -id bottom -id button -id buttonPanel -id center -id center_horizontal -id center_vertical -id chains -id checkbox -id chronometer -id churchInfo -id churchSelectPrompt -id church_selection -id clip_horizontal -id clip_vertical -id collapseActionView -id container -id content -id contentPanel -id coordinator -id custom -id customPanel -id decor_content_parent -id default_activity_button -id design_bottom_sheet -id design_menu_item_action_area -id design_menu_item_action_area_stub -id design_menu_item_text -id design_navigation_view -id dimensions -id direct -id disableHome -id edit_query -id end -id enterAlways -id enterAlwaysCollapsed -id exitUntilCollapsed -id expand_activities_button -id expanded_menu -id fill -id fill_horizontal -id fill_vertical -id filled -id fixed -id fontSizePrompt -id forever -id ghost_view -id gone -id group_divider -id groups -id home -id homeAsUp -id icon -id icon_group -id ifRoom -id image -id info -id invisible -id italic -id item_touch_helper_previous_elevation -id labeled -id largeLabel -id largeSize -id left -id line1 -id line3 -id listMode -id list_item -id masked -id mediumSize -id message -id middle -id mini -id mtrl_child_content_container -id mtrl_internal_children_alpha_tag -id multiply -id navigation_header_container -id never -id none -id normal -id normalSize -id notification_background -id notification_main_column -id notification_main_column_container -id outline -id packed -id parallax -id parent -id parentPanel -id parent_matrix -id percent -id pin -id progress_circular -id progress_horizontal -id radio -id right -id right_icon -id right_side -id save_image_matrix -id save_non_transition_alpha -id save_scale_type -id screen -id scriptor -id scroll -id scrollIndicatorDown -id scrollIndicatorUp -id scrollView -id scrollable -id search_badge -id search_bar -id search_button -id search_close_btn -id search_edit_frame -id search_go_btn -id search_mag_icon -id search_plate -id search_src_text -id search_voice_btn -id select_dialog_listview -id selected -id shortcut -id showCustom -id showHome -id showTitle -id smallLabel -id smallSize -id snackbar_action -id snackbar_text -id snap -id snapMargins -id spacer -id split_action_bar -id spread -id spread_inside -id src_atop -id src_in -id src_over -id standard -id start -id stretch -id submenuarrow -id submit_area -id tabMode -id tag_transition_group -id tag_unhandled_key_event_manager -id tag_unhandled_key_listeners -id text -id text2 -id textSpacerNoButtons -id textSpacerNoTitle -id textStart -id text_input_password_toggle -id textinput_counter -id textinput_error -id textinput_helper_text -id time -id title -id titleDividerNoCustom -id title_template -id toolbar -id top -id topPanel -id touch_outside -id transition_current_scene -id transition_layout_save -id transition_position -id transition_scene_layoutid_cache -id transition_transform -id uniform -id unlabeled -id up -id useLogo -id view_offset_helper -id visible -id withText -id wrap -id wrap_content -integer abc_config_activityDefaultDur -integer abc_config_activityShortDur -integer app_bar_elevation_anim_duration -integer bottom_sheet_slide_duration -integer cancel_button_image_alpha -integer config_tooltipAnimTime -integer design_snackbar_text_max_lines -integer design_tab_indicator_anim_duration_ms -integer hide_password_duration -integer mtrl_btn_anim_delay_ms -integer mtrl_btn_anim_duration_ms -integer mtrl_chip_anim_duration -integer mtrl_tab_indicator_anim_duration_ms -integer show_password_duration -integer status_bar_notification_info_maxnum -interpolator mtrl_fast_out_linear_in -interpolator mtrl_fast_out_slow_in -interpolator mtrl_linear -interpolator mtrl_linear_out_slow_in -layout abc_action_bar_title_item -layout abc_action_bar_up_container -layout abc_action_menu_item_layout -layout abc_action_menu_layout -layout abc_action_mode_bar -layout abc_action_mode_close_item_material -layout abc_activity_chooser_view -layout abc_activity_chooser_view_list_item -layout abc_alert_dialog_button_bar_material -layout abc_alert_dialog_material -layout abc_alert_dialog_title_material -layout abc_cascading_menu_item_layout -layout abc_dialog_title_material -layout abc_expanded_menu_layout -layout abc_list_menu_item_checkbox -layout abc_list_menu_item_icon -layout abc_list_menu_item_layout -layout abc_list_menu_item_radio -layout abc_popup_menu_header_item_layout -layout abc_popup_menu_item_layout -layout abc_screen_content_include -layout abc_screen_simple -layout abc_screen_simple_overlay_action_mode -layout abc_screen_toolbar -layout abc_search_dropdown_item_icons_2line -layout abc_search_view -layout abc_select_dialog_material -layout abc_tooltip -layout activity_main -layout activity_settings -layout content_main -layout content_settings -layout design_bottom_navigation_item -layout design_bottom_sheet_dialog -layout design_layout_snackbar -layout design_layout_snackbar_include -layout design_layout_tab_icon -layout design_layout_tab_text -layout design_menu_item_action_area -layout design_navigation_item -layout design_navigation_item_header -layout design_navigation_item_separator -layout design_navigation_item_subheader -layout design_navigation_menu -layout design_navigation_menu_item -layout design_text_input_password_icon -layout mtrl_layout_snackbar -layout mtrl_layout_snackbar_include -layout notification_action -layout notification_action_tombstone -layout notification_template_custom_big -layout notification_template_icon_group -layout notification_template_part_chronometer -layout notification_template_part_time -layout select_dialog_item_material -layout select_dialog_multichoice_material -layout select_dialog_singlechoice_material -layout support_simple_spinner_dropdown_item -menu menu_main -mipmap ic_launcher -mipmap ic_launcher_round -string abc_action_bar_home_description -string abc_action_bar_up_description -string abc_action_menu_overflow_description -string abc_action_mode_done -string abc_activity_chooser_view_see_all -string abc_activitychooserview_choose_application -string abc_capital_off -string abc_capital_on -string abc_font_family_body_1_material -string abc_font_family_body_2_material -string abc_font_family_button_material -string abc_font_family_caption_material -string abc_font_family_display_1_material -string abc_font_family_display_2_material -string abc_font_family_display_3_material -string abc_font_family_display_4_material -string abc_font_family_headline_material -string abc_font_family_menu_material -string abc_font_family_subhead_material -string abc_font_family_title_material -string abc_menu_alt_shortcut_label -string abc_menu_ctrl_shortcut_label -string abc_menu_delete_shortcut_label -string abc_menu_enter_shortcut_label -string abc_menu_function_shortcut_label -string abc_menu_meta_shortcut_label -string abc_menu_shift_shortcut_label -string abc_menu_space_shortcut_label -string abc_menu_sym_shortcut_label -string abc_prepend_shortcut_label -string abc_search_hint -string abc_searchview_description_clear -string abc_searchview_description_query -string abc_searchview_description_search -string abc_searchview_description_submit -string abc_searchview_description_voice -string abc_shareactionprovider_share_with -string abc_shareactionprovider_share_with_application -string abc_toolbar_collapse_description -string action_settings -string app_name -string appbar_scrolling_view_behavior -string bottom_sheet_behavior -string character_counter_content_description -string character_counter_pattern -string fab_transformation_scrim_behavior -string fab_transformation_sheet_behavior -string hide_bottom_view_on_scroll_behavior -string mtrl_chip_close_icon_content_description -string password_toggle_content_description -string path_password_eye -string path_password_eye_mask_strike_through -string path_password_eye_mask_visible -string path_password_strike_through -string search_menu_title -string status_bar_notification_info_overflow -string title_activity_settings -style AlertDialog_AppCompat -style AlertDialog_AppCompat_Light -style Animation_AppCompat_Dialog -style Animation_AppCompat_DropDownUp -style Animation_AppCompat_Tooltip -style Animation_Design_BottomSheetDialog -style AppTheme -style AppTheme_AppBarOverlay -style AppTheme_NoActionBar -style AppTheme_PopupOverlay -style Base_AlertDialog_AppCompat -style Base_AlertDialog_AppCompat_Light -style Base_Animation_AppCompat_Dialog -style Base_Animation_AppCompat_DropDownUp -style Base_Animation_AppCompat_Tooltip -style Base_CardView -style Base_DialogWindowTitle_AppCompat -style Base_DialogWindowTitleBackground_AppCompat -style Base_TextAppearance_AppCompat -style Base_TextAppearance_AppCompat_Body1 -style Base_TextAppearance_AppCompat_Body2 -style Base_TextAppearance_AppCompat_Button -style Base_TextAppearance_AppCompat_Caption -style Base_TextAppearance_AppCompat_Display1 -style Base_TextAppearance_AppCompat_Display2 -style Base_TextAppearance_AppCompat_Display3 -style Base_TextAppearance_AppCompat_Display4 -style Base_TextAppearance_AppCompat_Headline -style Base_TextAppearance_AppCompat_Inverse -style Base_TextAppearance_AppCompat_Large -style Base_TextAppearance_AppCompat_Large_Inverse -style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large -style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small -style Base_TextAppearance_AppCompat_Medium -style Base_TextAppearance_AppCompat_Medium_Inverse -style Base_TextAppearance_AppCompat_Menu -style Base_TextAppearance_AppCompat_SearchResult -style Base_TextAppearance_AppCompat_SearchResult_Subtitle -style Base_TextAppearance_AppCompat_SearchResult_Title -style Base_TextAppearance_AppCompat_Small -style Base_TextAppearance_AppCompat_Small_Inverse -style Base_TextAppearance_AppCompat_Subhead -style Base_TextAppearance_AppCompat_Subhead_Inverse -style Base_TextAppearance_AppCompat_Title -style Base_TextAppearance_AppCompat_Title_Inverse -style Base_TextAppearance_AppCompat_Tooltip -style Base_TextAppearance_AppCompat_Widget_ActionBar_Menu -style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle -style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse -style Base_TextAppearance_AppCompat_Widget_ActionBar_Title -style Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse -style Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle -style Base_TextAppearance_AppCompat_Widget_ActionMode_Title -style Base_TextAppearance_AppCompat_Widget_Button -style Base_TextAppearance_AppCompat_Widget_Button_Borderless_Colored -style Base_TextAppearance_AppCompat_Widget_Button_Colored -style Base_TextAppearance_AppCompat_Widget_Button_Inverse -style Base_TextAppearance_AppCompat_Widget_DropDownItem -style Base_TextAppearance_AppCompat_Widget_PopupMenu_Header -style Base_TextAppearance_AppCompat_Widget_PopupMenu_Large -style Base_TextAppearance_AppCompat_Widget_PopupMenu_Small -style Base_TextAppearance_AppCompat_Widget_Switch -style Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem -style Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item -style Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle -style Base_TextAppearance_Widget_AppCompat_Toolbar_Title -style Base_Theme_AppCompat -style Base_Theme_AppCompat_CompactMenu -style Base_Theme_AppCompat_Dialog -style Base_Theme_AppCompat_Dialog_Alert -style Base_Theme_AppCompat_Dialog_FixedSize -style Base_Theme_AppCompat_Dialog_MinWidth -style Base_Theme_AppCompat_DialogWhenLarge -style Base_Theme_AppCompat_Light -style Base_Theme_AppCompat_Light_DarkActionBar -style Base_Theme_AppCompat_Light_Dialog -style Base_Theme_AppCompat_Light_Dialog_Alert -style Base_Theme_AppCompat_Light_Dialog_FixedSize -style Base_Theme_AppCompat_Light_Dialog_MinWidth -style Base_Theme_AppCompat_Light_DialogWhenLarge -style Base_Theme_MaterialComponents -style Base_Theme_MaterialComponents_Bridge -style Base_Theme_MaterialComponents_CompactMenu -style Base_Theme_MaterialComponents_Dialog -style Base_Theme_MaterialComponents_Dialog_Alert -style Base_Theme_MaterialComponents_Dialog_FixedSize -style Base_Theme_MaterialComponents_Dialog_MinWidth -style Base_Theme_MaterialComponents_DialogWhenLarge -style Base_Theme_MaterialComponents_Light -style Base_Theme_MaterialComponents_Light_Bridge -style Base_Theme_MaterialComponents_Light_DarkActionBar -style Base_Theme_MaterialComponents_Light_DarkActionBar_Bridge -style Base_Theme_MaterialComponents_Light_Dialog -style Base_Theme_MaterialComponents_Light_Dialog_Alert -style Base_Theme_MaterialComponents_Light_Dialog_FixedSize -style Base_Theme_MaterialComponents_Light_Dialog_MinWidth -style Base_Theme_MaterialComponents_Light_DialogWhenLarge -style Base_ThemeOverlay_AppCompat -style Base_ThemeOverlay_AppCompat_ActionBar -style Base_ThemeOverlay_AppCompat_Dark -style Base_ThemeOverlay_AppCompat_Dark_ActionBar -style Base_ThemeOverlay_AppCompat_Dialog -style Base_ThemeOverlay_AppCompat_Dialog_Alert -style Base_ThemeOverlay_AppCompat_Light -style Base_ThemeOverlay_MaterialComponents_Dialog -style Base_ThemeOverlay_MaterialComponents_Dialog_Alert -style Base_V14_Theme_MaterialComponents -style Base_V14_Theme_MaterialComponents_Bridge -style Base_V14_Theme_MaterialComponents_Dialog -style Base_V14_Theme_MaterialComponents_Light -style Base_V14_Theme_MaterialComponents_Light_Bridge -style Base_V14_Theme_MaterialComponents_Light_DarkActionBar_Bridge -style Base_V14_Theme_MaterialComponents_Light_Dialog -style Base_V14_ThemeOverlay_MaterialComponents_Dialog -style Base_V14_ThemeOverlay_MaterialComponents_Dialog_Alert -style Base_V21_Theme_AppCompat -style Base_V21_Theme_AppCompat_Dialog -style Base_V21_Theme_AppCompat_Light -style Base_V21_Theme_AppCompat_Light_Dialog -style Base_V21_ThemeOverlay_AppCompat_Dialog -style Base_V22_Theme_AppCompat -style Base_V22_Theme_AppCompat_Light -style Base_V23_Theme_AppCompat -style Base_V23_Theme_AppCompat_Light -style Base_V26_Theme_AppCompat -style Base_V26_Theme_AppCompat_Light -style Base_V26_Widget_AppCompat_Toolbar -style Base_V28_Theme_AppCompat -style Base_V28_Theme_AppCompat_Light -style Base_V7_Theme_AppCompat -style Base_V7_Theme_AppCompat_Dialog -style Base_V7_Theme_AppCompat_Light -style Base_V7_Theme_AppCompat_Light_Dialog -style Base_V7_ThemeOverlay_AppCompat_Dialog -style Base_V7_Widget_AppCompat_AutoCompleteTextView -style Base_V7_Widget_AppCompat_EditText -style Base_V7_Widget_AppCompat_Toolbar -style Base_Widget_AppCompat_ActionBar -style Base_Widget_AppCompat_ActionBar_Solid -style Base_Widget_AppCompat_ActionBar_TabBar -style Base_Widget_AppCompat_ActionBar_TabText -style Base_Widget_AppCompat_ActionBar_TabView -style Base_Widget_AppCompat_ActionButton -style Base_Widget_AppCompat_ActionButton_CloseMode -style Base_Widget_AppCompat_ActionButton_Overflow -style Base_Widget_AppCompat_ActionMode -style Base_Widget_AppCompat_ActivityChooserView -style Base_Widget_AppCompat_AutoCompleteTextView -style Base_Widget_AppCompat_Button -style Base_Widget_AppCompat_Button_Borderless -style Base_Widget_AppCompat_Button_Borderless_Colored -style Base_Widget_AppCompat_Button_ButtonBar_AlertDialog -style Base_Widget_AppCompat_Button_Colored -style Base_Widget_AppCompat_Button_Small -style Base_Widget_AppCompat_ButtonBar -style Base_Widget_AppCompat_ButtonBar_AlertDialog -style Base_Widget_AppCompat_CompoundButton_CheckBox -style Base_Widget_AppCompat_CompoundButton_RadioButton -style Base_Widget_AppCompat_CompoundButton_Switch -style Base_Widget_AppCompat_DrawerArrowToggle -style Base_Widget_AppCompat_DrawerArrowToggle_Common -style Base_Widget_AppCompat_DropDownItem_Spinner -style Base_Widget_AppCompat_EditText -style Base_Widget_AppCompat_ImageButton -style Base_Widget_AppCompat_Light_ActionBar -style Base_Widget_AppCompat_Light_ActionBar_Solid -style Base_Widget_AppCompat_Light_ActionBar_TabBar -style Base_Widget_AppCompat_Light_ActionBar_TabText -style Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse -style Base_Widget_AppCompat_Light_ActionBar_TabView -style Base_Widget_AppCompat_Light_PopupMenu -style Base_Widget_AppCompat_Light_PopupMenu_Overflow -style Base_Widget_AppCompat_ListMenuView -style Base_Widget_AppCompat_ListPopupWindow -style Base_Widget_AppCompat_ListView -style Base_Widget_AppCompat_ListView_DropDown -style Base_Widget_AppCompat_ListView_Menu -style Base_Widget_AppCompat_PopupMenu -style Base_Widget_AppCompat_PopupMenu_Overflow -style Base_Widget_AppCompat_PopupWindow -style Base_Widget_AppCompat_ProgressBar -style Base_Widget_AppCompat_ProgressBar_Horizontal -style Base_Widget_AppCompat_RatingBar -style Base_Widget_AppCompat_RatingBar_Indicator -style Base_Widget_AppCompat_RatingBar_Small -style Base_Widget_AppCompat_SearchView -style Base_Widget_AppCompat_SearchView_ActionBar -style Base_Widget_AppCompat_SeekBar -style Base_Widget_AppCompat_SeekBar_Discrete -style Base_Widget_AppCompat_Spinner -style Base_Widget_AppCompat_Spinner_Underlined -style Base_Widget_AppCompat_TextView_SpinnerItem -style Base_Widget_AppCompat_Toolbar -style Base_Widget_AppCompat_Toolbar_Button_Navigation -style Base_Widget_Design_TabLayout -style Base_Widget_MaterialComponents_Chip -style Base_Widget_MaterialComponents_TextInputEditText -style Base_Widget_MaterialComponents_TextInputLayout -style CardView -style CardView_Dark -style CardView_Light -style LargeText -style MediumText -style NormalText -style Platform_AppCompat -style Platform_AppCompat_Light -style Platform_MaterialComponents -style Platform_MaterialComponents_Dialog -style Platform_MaterialComponents_Light -style Platform_MaterialComponents_Light_Dialog -style Platform_ThemeOverlay_AppCompat -style Platform_ThemeOverlay_AppCompat_Dark -style Platform_ThemeOverlay_AppCompat_Light -style Platform_V21_AppCompat -style Platform_V21_AppCompat_Light -style Platform_V25_AppCompat -style Platform_V25_AppCompat_Light -style Platform_Widget_AppCompat_Spinner -style RtlOverlay_DialogWindowTitle_AppCompat -style RtlOverlay_Widget_AppCompat_ActionBar_TitleItem -style RtlOverlay_Widget_AppCompat_DialogTitle_Icon -style RtlOverlay_Widget_AppCompat_PopupMenuItem -style RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup -style RtlOverlay_Widget_AppCompat_PopupMenuItem_Shortcut -style RtlOverlay_Widget_AppCompat_PopupMenuItem_SubmenuArrow -style RtlOverlay_Widget_AppCompat_PopupMenuItem_Text -style RtlOverlay_Widget_AppCompat_PopupMenuItem_Title -style RtlOverlay_Widget_AppCompat_Search_DropDown -style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1 -style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2 -style RtlOverlay_Widget_AppCompat_Search_DropDown_Query -style RtlOverlay_Widget_AppCompat_Search_DropDown_Text -style RtlOverlay_Widget_AppCompat_SearchView_MagIcon -style RtlUnderlay_Widget_AppCompat_ActionButton -style RtlUnderlay_Widget_AppCompat_ActionButton_Overflow -style SmallText -style TextAppearance_AppCompat -style TextAppearance_AppCompat_Body1 -style TextAppearance_AppCompat_Body2 -style TextAppearance_AppCompat_Button -style TextAppearance_AppCompat_Caption -style TextAppearance_AppCompat_Display1 -style TextAppearance_AppCompat_Display2 -style TextAppearance_AppCompat_Display3 -style TextAppearance_AppCompat_Display4 -style TextAppearance_AppCompat_Headline -style TextAppearance_AppCompat_Inverse -style TextAppearance_AppCompat_Large -style TextAppearance_AppCompat_Large_Inverse -style TextAppearance_AppCompat_Light_SearchResult_Subtitle -style TextAppearance_AppCompat_Light_SearchResult_Title -style TextAppearance_AppCompat_Light_Widget_PopupMenu_Large -style TextAppearance_AppCompat_Light_Widget_PopupMenu_Small -style TextAppearance_AppCompat_Medium -style TextAppearance_AppCompat_Medium_Inverse -style TextAppearance_AppCompat_Menu -style TextAppearance_AppCompat_SearchResult_Subtitle -style TextAppearance_AppCompat_SearchResult_Title -style TextAppearance_AppCompat_Small -style TextAppearance_AppCompat_Small_Inverse -style TextAppearance_AppCompat_Subhead -style TextAppearance_AppCompat_Subhead_Inverse -style TextAppearance_AppCompat_Title -style TextAppearance_AppCompat_Title_Inverse -style TextAppearance_AppCompat_Tooltip -style TextAppearance_AppCompat_Widget_ActionBar_Menu -style TextAppearance_AppCompat_Widget_ActionBar_Subtitle -style TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse -style TextAppearance_AppCompat_Widget_ActionBar_Title -style TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse -style TextAppearance_AppCompat_Widget_ActionMode_Subtitle -style TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse -style TextAppearance_AppCompat_Widget_ActionMode_Title -style TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse -style TextAppearance_AppCompat_Widget_Button -style TextAppearance_AppCompat_Widget_Button_Borderless_Colored -style TextAppearance_AppCompat_Widget_Button_Colored -style TextAppearance_AppCompat_Widget_Button_Inverse -style TextAppearance_AppCompat_Widget_DropDownItem -style TextAppearance_AppCompat_Widget_PopupMenu_Header -style TextAppearance_AppCompat_Widget_PopupMenu_Large -style TextAppearance_AppCompat_Widget_PopupMenu_Small -style TextAppearance_AppCompat_Widget_Switch -style TextAppearance_AppCompat_Widget_TextView_SpinnerItem -style TextAppearance_Compat_Notification -style TextAppearance_Compat_Notification_Info -style TextAppearance_Compat_Notification_Line2 -style TextAppearance_Compat_Notification_Time -style TextAppearance_Compat_Notification_Title -style TextAppearance_Design_CollapsingToolbar_Expanded -style TextAppearance_Design_Counter -style TextAppearance_Design_Counter_Overflow -style TextAppearance_Design_Error -style TextAppearance_Design_HelperText -style TextAppearance_Design_Hint -style TextAppearance_Design_Snackbar_Message -style TextAppearance_Design_Tab -style TextAppearance_MaterialComponents_Body1 -style TextAppearance_MaterialComponents_Body2 -style TextAppearance_MaterialComponents_Button -style TextAppearance_MaterialComponents_Caption -style TextAppearance_MaterialComponents_Chip -style TextAppearance_MaterialComponents_Headline1 -style TextAppearance_MaterialComponents_Headline2 -style TextAppearance_MaterialComponents_Headline3 -style TextAppearance_MaterialComponents_Headline4 -style TextAppearance_MaterialComponents_Headline5 -style TextAppearance_MaterialComponents_Headline6 -style TextAppearance_MaterialComponents_Overline -style TextAppearance_MaterialComponents_Subtitle1 -style TextAppearance_MaterialComponents_Subtitle2 -style TextAppearance_MaterialComponents_Tab -style TextAppearance_Widget_AppCompat_ExpandedMenu_Item -style TextAppearance_Widget_AppCompat_Toolbar_Subtitle -style TextAppearance_Widget_AppCompat_Toolbar_Title -style Theme_AppCompat -style Theme_AppCompat_CompactMenu -style Theme_AppCompat_DayNight -style Theme_AppCompat_DayNight_DarkActionBar -style Theme_AppCompat_DayNight_Dialog -style Theme_AppCompat_DayNight_Dialog_Alert -style Theme_AppCompat_DayNight_Dialog_MinWidth -style Theme_AppCompat_DayNight_DialogWhenLarge -style Theme_AppCompat_DayNight_NoActionBar -style Theme_AppCompat_Dialog -style Theme_AppCompat_Dialog_Alert -style Theme_AppCompat_Dialog_MinWidth -style Theme_AppCompat_DialogWhenLarge -style Theme_AppCompat_Light -style Theme_AppCompat_Light_DarkActionBar -style Theme_AppCompat_Light_Dialog -style Theme_AppCompat_Light_Dialog_Alert -style Theme_AppCompat_Light_Dialog_MinWidth -style Theme_AppCompat_Light_DialogWhenLarge -style Theme_AppCompat_Light_NoActionBar -style Theme_AppCompat_NoActionBar -style Theme_Design -style Theme_Design_BottomSheetDialog -style Theme_Design_Light -style Theme_Design_Light_BottomSheetDialog -style Theme_Design_Light_NoActionBar -style Theme_Design_NoActionBar -style Theme_MaterialComponents -style Theme_MaterialComponents_BottomSheetDialog -style Theme_MaterialComponents_Bridge -style Theme_MaterialComponents_CompactMenu -style Theme_MaterialComponents_Dialog -style Theme_MaterialComponents_Dialog_Alert -style Theme_MaterialComponents_Dialog_MinWidth -style Theme_MaterialComponents_DialogWhenLarge -style Theme_MaterialComponents_Light -style Theme_MaterialComponents_Light_BottomSheetDialog -style Theme_MaterialComponents_Light_Bridge -style Theme_MaterialComponents_Light_DarkActionBar -style Theme_MaterialComponents_Light_DarkActionBar_Bridge -style Theme_MaterialComponents_Light_Dialog -style Theme_MaterialComponents_Light_Dialog_Alert -style Theme_MaterialComponents_Light_Dialog_MinWidth -style Theme_MaterialComponents_Light_DialogWhenLarge -style Theme_MaterialComponents_Light_NoActionBar -style Theme_MaterialComponents_Light_NoActionBar_Bridge -style Theme_MaterialComponents_NoActionBar -style Theme_MaterialComponents_NoActionBar_Bridge -style ThemeOverlay_AppCompat -style ThemeOverlay_AppCompat_ActionBar -style ThemeOverlay_AppCompat_Dark -style ThemeOverlay_AppCompat_Dark_ActionBar -style ThemeOverlay_AppCompat_Dialog -style ThemeOverlay_AppCompat_Dialog_Alert -style ThemeOverlay_AppCompat_Light -style ThemeOverlay_MaterialComponents -style ThemeOverlay_MaterialComponents_ActionBar -style ThemeOverlay_MaterialComponents_Dark -style ThemeOverlay_MaterialComponents_Dark_ActionBar -style ThemeOverlay_MaterialComponents_Dialog -style ThemeOverlay_MaterialComponents_Dialog_Alert -style ThemeOverlay_MaterialComponents_Light -style ThemeOverlay_MaterialComponents_TextInputEditText -style ThemeOverlay_MaterialComponents_TextInputEditText_FilledBox -style ThemeOverlay_MaterialComponents_TextInputEditText_FilledBox_Dense -style ThemeOverlay_MaterialComponents_TextInputEditText_OutlinedBox -style ThemeOverlay_MaterialComponents_TextInputEditText_OutlinedBox_Dense -style Widget_AppCompat_ActionBar -style Widget_AppCompat_ActionBar_Solid -style Widget_AppCompat_ActionBar_TabBar -style Widget_AppCompat_ActionBar_TabText -style Widget_AppCompat_ActionBar_TabView -style Widget_AppCompat_ActionButton -style Widget_AppCompat_ActionButton_CloseMode -style Widget_AppCompat_ActionButton_Overflow -style Widget_AppCompat_ActionMode -style Widget_AppCompat_ActivityChooserView -style Widget_AppCompat_AutoCompleteTextView -style Widget_AppCompat_Button -style Widget_AppCompat_Button_Borderless -style Widget_AppCompat_Button_Borderless_Colored -style Widget_AppCompat_Button_ButtonBar_AlertDialog -style Widget_AppCompat_Button_Colored -style Widget_AppCompat_Button_Small -style Widget_AppCompat_ButtonBar -style Widget_AppCompat_ButtonBar_AlertDialog -style Widget_AppCompat_CompoundButton_CheckBox -style Widget_AppCompat_CompoundButton_RadioButton -style Widget_AppCompat_CompoundButton_Switch -style Widget_AppCompat_DrawerArrowToggle -style Widget_AppCompat_DropDownItem_Spinner -style Widget_AppCompat_EditText -style Widget_AppCompat_ImageButton -style Widget_AppCompat_Light_ActionBar -style Widget_AppCompat_Light_ActionBar_Solid -style Widget_AppCompat_Light_ActionBar_Solid_Inverse -style Widget_AppCompat_Light_ActionBar_TabBar -style Widget_AppCompat_Light_ActionBar_TabBar_Inverse -style Widget_AppCompat_Light_ActionBar_TabText -style Widget_AppCompat_Light_ActionBar_TabText_Inverse -style Widget_AppCompat_Light_ActionBar_TabView -style Widget_AppCompat_Light_ActionBar_TabView_Inverse -style Widget_AppCompat_Light_ActionButton -style Widget_AppCompat_Light_ActionButton_CloseMode -style Widget_AppCompat_Light_ActionButton_Overflow -style Widget_AppCompat_Light_ActionMode_Inverse -style Widget_AppCompat_Light_ActivityChooserView -style Widget_AppCompat_Light_AutoCompleteTextView -style Widget_AppCompat_Light_DropDownItem_Spinner -style Widget_AppCompat_Light_ListPopupWindow -style Widget_AppCompat_Light_ListView_DropDown -style Widget_AppCompat_Light_PopupMenu -style Widget_AppCompat_Light_PopupMenu_Overflow -style Widget_AppCompat_Light_SearchView -style Widget_AppCompat_Light_Spinner_DropDown_ActionBar -style Widget_AppCompat_ListMenuView -style Widget_AppCompat_ListPopupWindow -style Widget_AppCompat_ListView -style Widget_AppCompat_ListView_DropDown -style Widget_AppCompat_ListView_Menu -style Widget_AppCompat_PopupMenu -style Widget_AppCompat_PopupMenu_Overflow -style Widget_AppCompat_PopupWindow -style Widget_AppCompat_ProgressBar -style Widget_AppCompat_ProgressBar_Horizontal -style Widget_AppCompat_RatingBar -style Widget_AppCompat_RatingBar_Indicator -style Widget_AppCompat_RatingBar_Small -style Widget_AppCompat_SearchView -style Widget_AppCompat_SearchView_ActionBar -style Widget_AppCompat_SeekBar -style Widget_AppCompat_SeekBar_Discrete -style Widget_AppCompat_Spinner -style Widget_AppCompat_Spinner_DropDown -style Widget_AppCompat_Spinner_DropDown_ActionBar -style Widget_AppCompat_Spinner_Underlined -style Widget_AppCompat_TextView_SpinnerItem -style Widget_AppCompat_Toolbar -style Widget_AppCompat_Toolbar_Button_Navigation -style Widget_Compat_NotificationActionContainer -style Widget_Compat_NotificationActionText -style Widget_Design_AppBarLayout -style Widget_Design_BottomNavigationView -style Widget_Design_BottomSheet_Modal -style Widget_Design_CollapsingToolbar -style Widget_Design_FloatingActionButton -style Widget_Design_NavigationView -style Widget_Design_ScrimInsetsFrameLayout -style Widget_Design_Snackbar -style Widget_Design_TabLayout -style Widget_Design_TextInputLayout -style Widget_MaterialComponents_BottomAppBar -style Widget_MaterialComponents_BottomAppBar_Colored -style Widget_MaterialComponents_BottomNavigationView -style Widget_MaterialComponents_BottomNavigationView_Colored -style Widget_MaterialComponents_BottomSheet_Modal -style Widget_MaterialComponents_Button -style Widget_MaterialComponents_Button_Icon -style Widget_MaterialComponents_Button_OutlinedButton -style Widget_MaterialComponents_Button_OutlinedButton_Icon -style Widget_MaterialComponents_Button_TextButton -style Widget_MaterialComponents_Button_TextButton_Dialog -style Widget_MaterialComponents_Button_TextButton_Dialog_Icon -style Widget_MaterialComponents_Button_TextButton_Icon -style Widget_MaterialComponents_Button_UnelevatedButton -style Widget_MaterialComponents_Button_UnelevatedButton_Icon -style Widget_MaterialComponents_CardView -style Widget_MaterialComponents_Chip_Action -style Widget_MaterialComponents_Chip_Choice -style Widget_MaterialComponents_Chip_Entry -style Widget_MaterialComponents_Chip_Filter -style Widget_MaterialComponents_ChipGroup -style Widget_MaterialComponents_FloatingActionButton -style Widget_MaterialComponents_NavigationView -style Widget_MaterialComponents_Snackbar -style Widget_MaterialComponents_Snackbar_FullWidth -style Widget_MaterialComponents_TabLayout -style Widget_MaterialComponents_TabLayout_Colored -style Widget_MaterialComponents_TextInputEditText_FilledBox -style Widget_MaterialComponents_TextInputEditText_FilledBox_Dense -style Widget_MaterialComponents_TextInputEditText_OutlinedBox -style Widget_MaterialComponents_TextInputEditText_OutlinedBox_Dense -style Widget_MaterialComponents_TextInputLayout_FilledBox -style Widget_MaterialComponents_TextInputLayout_FilledBox_Dense -style Widget_MaterialComponents_TextInputLayout_OutlinedBox -style Widget_MaterialComponents_TextInputLayout_OutlinedBox_Dense -style Widget_MaterialComponents_Toolbar -style Widget_Support_CoordinatorLayout -styleable ActionBar background backgroundSplit backgroundStacked contentInsetEnd contentInsetEndWithActions contentInsetLeft contentInsetRight contentInsetStart contentInsetStartWithNavigation customNavigationLayout displayOptions divider elevation height hideOnContentScroll homeAsUpIndicator homeLayout icon indeterminateProgressStyle itemPadding logo navigationMode popupTheme progressBarPadding progressBarStyle subtitle subtitleTextStyle title titleTextStyle -styleable ActionBarLayout android_layout_gravity -styleable ActionMenuItemView android_minWidth -styleable ActionMenuView -styleable ActionMode background backgroundSplit closeItemLayout height subtitleTextStyle titleTextStyle -styleable ActivityChooserView expandActivityOverflowButtonDrawable initialActivityCount -styleable AlertDialog android_layout buttonIconDimen buttonPanelSideLayout listItemLayout listLayout multiChoiceItemLayout showTitle singleChoiceItemLayout -styleable AnimatedStateListDrawableCompat android_dither android_visible android_variablePadding android_constantSize android_enterFadeDuration android_exitFadeDuration -styleable AnimatedStateListDrawableItem android_id android_drawable -styleable AnimatedStateListDrawableTransition android_drawable android_toId android_fromId android_reversible -styleable AppBarLayout android_background android_touchscreenBlocksFocus android_keyboardNavigationCluster elevation expanded liftOnScroll -styleable AppBarLayoutStates state_collapsed state_collapsible state_liftable state_lifted -styleable AppBarLayout_Layout layout_scrollFlags layout_scrollInterpolator -styleable AppCompatImageView android_src srcCompat tint tintMode -styleable AppCompatSeekBar android_thumb tickMark tickMarkTint tickMarkTintMode -styleable AppCompatTextHelper android_textAppearance android_drawableTop android_drawableBottom android_drawableLeft android_drawableRight android_drawableStart android_drawableEnd -styleable AppCompatTextView android_textAppearance autoSizeMaxTextSize autoSizeMinTextSize autoSizePresetSizes autoSizeStepGranularity autoSizeTextType firstBaselineToTopHeight fontFamily lastBaselineToBottomHeight lineHeight textAllCaps -styleable AppCompatTheme android_windowIsFloating android_windowAnimationStyle actionBarDivider actionBarItemBackground actionBarPopupTheme actionBarSize actionBarSplitStyle actionBarStyle actionBarTabBarStyle actionBarTabStyle actionBarTabTextStyle actionBarTheme actionBarWidgetTheme actionButtonStyle actionDropDownStyle actionMenuTextAppearance actionMenuTextColor actionModeBackground actionModeCloseButtonStyle actionModeCloseDrawable actionModeCopyDrawable actionModeCutDrawable actionModeFindDrawable actionModePasteDrawable actionModePopupWindowStyle actionModeSelectAllDrawable actionModeShareDrawable actionModeSplitBackground actionModeStyle actionModeWebSearchDrawable actionOverflowButtonStyle actionOverflowMenuStyle activityChooserViewStyle alertDialogButtonGroupStyle alertDialogCenterButtons alertDialogStyle alertDialogTheme autoCompleteTextViewStyle borderlessButtonStyle buttonBarButtonStyle buttonBarNegativeButtonStyle buttonBarNeutralButtonStyle buttonBarPositiveButtonStyle buttonBarStyle buttonStyle buttonStyleSmall checkboxStyle checkedTextViewStyle colorAccent colorBackgroundFloating colorButtonNormal colorControlActivated colorControlHighlight colorControlNormal colorError colorPrimary colorPrimaryDark colorSwitchThumbNormal controlBackground dialogCornerRadius dialogPreferredPadding dialogTheme dividerHorizontal dividerVertical dropDownListViewStyle dropdownListPreferredItemHeight editTextBackground editTextColor editTextStyle homeAsUpIndicator imageButtonStyle listChoiceBackgroundIndicator listDividerAlertDialog listMenuViewStyle listPopupWindowStyle listPreferredItemHeight listPreferredItemHeightLarge listPreferredItemHeightSmall listPreferredItemPaddingLeft listPreferredItemPaddingRight panelBackground panelMenuListTheme panelMenuListWidth popupMenuStyle popupWindowStyle radioButtonStyle ratingBarStyle ratingBarStyleIndicator ratingBarStyleSmall searchViewStyle seekBarStyle selectableItemBackground selectableItemBackgroundBorderless spinnerDropDownItemStyle spinnerStyle switchStyle textAppearanceLargePopupMenu textAppearanceListItem textAppearanceListItemSecondary textAppearanceListItemSmall textAppearancePopupMenuHeader textAppearanceSearchResultSubtitle textAppearanceSearchResultTitle textAppearanceSmallPopupMenu textColorAlertDialogListItem textColorSearchUrl toolbarNavigationButtonStyle toolbarStyle tooltipForegroundColor tooltipFrameBackground viewInflaterClass windowActionBar windowActionBarOverlay windowActionModeOverlay windowFixedHeightMajor windowFixedHeightMinor windowFixedWidthMajor windowFixedWidthMinor windowMinWidthMajor windowMinWidthMinor windowNoTitle -styleable BottomAppBar backgroundTint fabAlignmentMode fabCradleMargin fabCradleRoundedCornerRadius fabCradleVerticalOffset hideOnScroll -styleable BottomNavigationView elevation itemBackground itemHorizontalTranslationEnabled itemIconSize itemIconTint itemTextAppearanceActive itemTextAppearanceInactive itemTextColor labelVisibilityMode menu -styleable BottomSheetBehavior_Layout behavior_fitToContents behavior_hideable behavior_peekHeight behavior_skipCollapsed -styleable ButtonBarLayout allowStacking -styleable CardView android_minWidth android_minHeight cardBackgroundColor cardCornerRadius cardElevation cardMaxElevation cardPreventCornerOverlap cardUseCompatPadding contentPadding contentPaddingBottom contentPaddingLeft contentPaddingRight contentPaddingTop -styleable Chip android_textAppearance android_ellipsize android_maxWidth android_text android_checkable checkedIcon checkedIconEnabled checkedIconVisible chipBackgroundColor chipCornerRadius chipEndPadding chipIcon chipIconEnabled chipIconSize chipIconTint chipIconVisible chipMinHeight chipStartPadding chipStrokeColor chipStrokeWidth closeIcon closeIconEnabled closeIconEndPadding closeIconSize closeIconStartPadding closeIconTint closeIconVisible hideMotionSpec iconEndPadding iconStartPadding rippleColor showMotionSpec textEndPadding textStartPadding -styleable ChipGroup checkedChip chipSpacing chipSpacingHorizontal chipSpacingVertical singleLine singleSelection -styleable CollapsingToolbarLayout collapsedTitleGravity collapsedTitleTextAppearance contentScrim expandedTitleGravity expandedTitleMargin expandedTitleMarginBottom expandedTitleMarginEnd expandedTitleMarginStart expandedTitleMarginTop expandedTitleTextAppearance scrimAnimationDuration scrimVisibleHeightTrigger statusBarScrim title titleEnabled toolbarId -styleable CollapsingToolbarLayout_Layout layout_collapseMode layout_collapseParallaxMultiplier -styleable ColorStateListItem android_color android_alpha alpha -styleable CompoundButton android_button buttonTint buttonTintMode -styleable ConstraintLayout_Layout android_orientation android_maxWidth android_maxHeight android_minWidth android_minHeight barrierAllowsGoneWidgets barrierDirection chainUseRtl constraintSet constraint_referenced_ids layout_constrainedHeight layout_constrainedWidth layout_constraintBaseline_creator layout_constraintBaseline_toBaselineOf layout_constraintBottom_creator layout_constraintBottom_toBottomOf layout_constraintBottom_toTopOf layout_constraintCircle layout_constraintCircleAngle layout_constraintCircleRadius layout_constraintDimensionRatio layout_constraintEnd_toEndOf layout_constraintEnd_toStartOf layout_constraintGuide_begin layout_constraintGuide_end layout_constraintGuide_percent layout_constraintHeight_default layout_constraintHeight_max layout_constraintHeight_min layout_constraintHeight_percent layout_constraintHorizontal_bias layout_constraintHorizontal_chainStyle layout_constraintHorizontal_weight layout_constraintLeft_creator layout_constraintLeft_toLeftOf layout_constraintLeft_toRightOf layout_constraintRight_creator layout_constraintRight_toLeftOf layout_constraintRight_toRightOf layout_constraintStart_toEndOf layout_constraintStart_toStartOf layout_constraintTop_creator layout_constraintTop_toBottomOf layout_constraintTop_toTopOf layout_constraintVertical_bias layout_constraintVertical_chainStyle layout_constraintVertical_weight layout_constraintWidth_default layout_constraintWidth_max layout_constraintWidth_min layout_constraintWidth_percent layout_editor_absoluteX layout_editor_absoluteY layout_goneMarginBottom layout_goneMarginEnd layout_goneMarginLeft layout_goneMarginRight layout_goneMarginStart layout_goneMarginTop layout_optimizationLevel -styleable ConstraintLayout_placeholder content emptyVisibility -styleable ConstraintSet android_orientation android_id android_visibility android_layout_width android_layout_height android_layout_marginLeft android_layout_marginTop android_layout_marginRight android_layout_marginBottom android_maxWidth android_maxHeight android_minWidth android_minHeight android_alpha android_transformPivotX android_transformPivotY android_translationX android_translationY android_scaleX android_scaleY android_rotation android_rotationX android_rotationY android_layout_marginStart android_layout_marginEnd android_translationZ android_elevation barrierAllowsGoneWidgets barrierDirection chainUseRtl constraint_referenced_ids layout_constrainedHeight layout_constrainedWidth layout_constraintBaseline_creator layout_constraintBaseline_toBaselineOf layout_constraintBottom_creator layout_constraintBottom_toBottomOf layout_constraintBottom_toTopOf layout_constraintCircle layout_constraintCircleAngle layout_constraintCircleRadius layout_constraintDimensionRatio layout_constraintEnd_toEndOf layout_constraintEnd_toStartOf layout_constraintGuide_begin layout_constraintGuide_end layout_constraintGuide_percent layout_constraintHeight_default layout_constraintHeight_max layout_constraintHeight_min layout_constraintHeight_percent layout_constraintHorizontal_bias layout_constraintHorizontal_chainStyle layout_constraintHorizontal_weight layout_constraintLeft_creator layout_constraintLeft_toLeftOf layout_constraintLeft_toRightOf layout_constraintRight_creator layout_constraintRight_toLeftOf layout_constraintRight_toRightOf layout_constraintStart_toEndOf layout_constraintStart_toStartOf layout_constraintTop_creator layout_constraintTop_toBottomOf layout_constraintTop_toTopOf layout_constraintVertical_bias layout_constraintVertical_chainStyle layout_constraintVertical_weight layout_constraintWidth_default layout_constraintWidth_max layout_constraintWidth_min layout_constraintWidth_percent layout_editor_absoluteX layout_editor_absoluteY layout_goneMarginBottom layout_goneMarginEnd layout_goneMarginLeft layout_goneMarginRight layout_goneMarginStart layout_goneMarginTop -styleable CoordinatorLayout keylines statusBarBackground -styleable CoordinatorLayout_Layout android_layout_gravity layout_anchor layout_anchorGravity layout_behavior layout_dodgeInsetEdges layout_insetEdge layout_keyline -styleable DesignTheme bottomSheetDialogTheme bottomSheetStyle -styleable DrawerArrowToggle arrowHeadLength arrowShaftLength barLength color drawableSize gapBetweenBars spinBars thickness -styleable FloatingActionButton backgroundTint backgroundTintMode borderWidth elevation fabCustomSize fabSize hideMotionSpec hoveredFocusedTranslationZ maxImageSize pressedTranslationZ rippleColor showMotionSpec useCompatPadding -styleable FloatingActionButton_Behavior_Layout behavior_autoHide -styleable FlowLayout itemSpacing lineSpacing -styleable FontFamily fontProviderAuthority fontProviderCerts fontProviderFetchStrategy fontProviderFetchTimeout fontProviderPackage fontProviderQuery -styleable FontFamilyFont android_font android_fontWeight android_fontStyle android_ttcIndex android_fontVariationSettings font fontStyle fontVariationSettings fontWeight ttcIndex -styleable ForegroundLinearLayout android_foreground android_foregroundGravity foregroundInsidePadding -styleable GradientColor android_startColor android_endColor android_type android_centerX android_centerY android_gradientRadius android_tileMode android_centerColor android_startX android_startY android_endX android_endY -styleable GradientColorItem android_color android_offset -styleable LinearConstraintLayout android_orientation -styleable LinearLayoutCompat android_gravity android_orientation android_baselineAligned android_baselineAlignedChildIndex android_weightSum divider dividerPadding measureWithLargestChild showDividers -styleable LinearLayoutCompat_Layout android_layout_gravity android_layout_width android_layout_height android_layout_weight -styleable ListPopupWindow android_dropDownHorizontalOffset android_dropDownVerticalOffset -styleable MaterialButton android_insetLeft android_insetRight android_insetTop android_insetBottom backgroundTint backgroundTintMode cornerRadius icon iconGravity iconPadding iconSize iconTint iconTintMode rippleColor strokeColor strokeWidth -styleable MaterialCardView strokeColor strokeWidth -styleable MaterialComponentsTheme bottomSheetDialogTheme bottomSheetStyle chipGroupStyle chipStandaloneStyle chipStyle colorAccent colorBackgroundFloating colorPrimary colorPrimaryDark colorSecondary editTextStyle floatingActionButtonStyle materialButtonStyle materialCardViewStyle navigationViewStyle scrimBackground snackbarButtonStyle tabStyle textAppearanceBody1 textAppearanceBody2 textAppearanceButton textAppearanceCaption textAppearanceHeadline1 textAppearanceHeadline2 textAppearanceHeadline3 textAppearanceHeadline4 textAppearanceHeadline5 textAppearanceHeadline6 textAppearanceOverline textAppearanceSubtitle1 textAppearanceSubtitle2 textInputStyle -styleable MenuGroup android_enabled android_id android_visible android_menuCategory android_orderInCategory android_checkableBehavior -styleable MenuItem android_icon android_enabled android_id android_checked android_visible android_menuCategory android_orderInCategory android_title android_titleCondensed android_alphabeticShortcut android_numericShortcut android_checkable android_onClick actionLayout actionProviderClass actionViewClass alphabeticModifiers contentDescription iconTint iconTintMode numericModifiers showAsAction tooltipText -styleable MenuView android_windowAnimationStyle android_itemTextAppearance android_horizontalDivider android_verticalDivider android_headerBackground android_itemBackground android_itemIconDisabledAlpha preserveIconSpacing subMenuArrow -styleable NavigationView android_background android_fitsSystemWindows android_maxWidth elevation headerLayout itemBackground itemHorizontalPadding itemIconPadding itemIconTint itemTextAppearance itemTextColor menu -styleable PopupWindow android_popupBackground android_popupAnimationStyle overlapAnchor -styleable PopupWindowBackgroundState state_above_anchor -styleable RecycleListView paddingBottomNoButtons paddingTopNoTitle -styleable RecyclerView android_orientation android_descendantFocusability fastScrollEnabled fastScrollHorizontalThumbDrawable fastScrollHorizontalTrackDrawable fastScrollVerticalThumbDrawable fastScrollVerticalTrackDrawable layoutManager reverseLayout spanCount stackFromEnd -styleable ScrimInsetsFrameLayout insetForeground -styleable ScrollingViewBehavior_Layout behavior_overlapTop -styleable SearchView android_focusable android_maxWidth android_inputType android_imeOptions closeIcon commitIcon defaultQueryHint goIcon iconifiedByDefault layout queryBackground queryHint searchHintIcon searchIcon submitBackground suggestionRowLayout voiceIcon -styleable Snackbar snackbarButtonStyle snackbarStyle -styleable SnackbarLayout android_maxWidth elevation maxActionInlineWidth -styleable Spinner android_entries android_popupBackground android_prompt android_dropDownWidth popupTheme -styleable StateListDrawable android_dither android_visible android_variablePadding android_constantSize android_enterFadeDuration android_exitFadeDuration -styleable StateListDrawableItem android_drawable -styleable SwitchCompat android_textOn android_textOff android_thumb showText splitTrack switchMinWidth switchPadding switchTextAppearance thumbTextPadding thumbTint thumbTintMode track trackTint trackTintMode -styleable TabItem android_icon android_layout android_text -styleable TabLayout tabBackground tabContentStart tabGravity tabIconTint tabIconTintMode tabIndicator tabIndicatorAnimationDuration tabIndicatorColor tabIndicatorFullWidth tabIndicatorGravity tabIndicatorHeight tabInlineLabel tabMaxWidth tabMinWidth tabMode tabPadding tabPaddingBottom tabPaddingEnd tabPaddingStart tabPaddingTop tabRippleColor tabSelectedTextColor tabTextAppearance tabTextColor tabUnboundedRipple -styleable TextAppearance android_textSize android_typeface android_textStyle android_textColor android_textColorHint android_textColorLink android_shadowColor android_shadowDx android_shadowDy android_shadowRadius android_fontFamily fontFamily textAllCaps -styleable TextInputLayout android_textColorHint android_hint boxBackgroundColor boxBackgroundMode boxCollapsedPaddingTop boxCornerRadiusBottomEnd boxCornerRadiusBottomStart boxCornerRadiusTopEnd boxCornerRadiusTopStart boxStrokeColor boxStrokeWidth counterEnabled counterMaxLength counterOverflowTextAppearance counterTextAppearance errorEnabled errorTextAppearance helperText helperTextEnabled helperTextTextAppearance hintAnimationEnabled hintEnabled hintTextAppearance passwordToggleContentDescription passwordToggleDrawable passwordToggleEnabled passwordToggleTint passwordToggleTintMode -styleable ThemeEnforcement android_textAppearance enforceMaterialTheme enforceTextAppearance -styleable Toolbar android_gravity android_minHeight buttonGravity collapseContentDescription collapseIcon contentInsetEnd contentInsetEndWithActions contentInsetLeft contentInsetRight contentInsetStart contentInsetStartWithNavigation logo logoDescription maxButtonHeight navigationContentDescription navigationIcon popupTheme subtitle subtitleTextAppearance subtitleTextColor title titleMargin titleMarginBottom titleMarginEnd titleMarginStart titleMarginTop titleMargins titleTextAppearance titleTextColor -styleable View android_theme android_focusable paddingEnd paddingStart theme -styleable ViewBackgroundHelper android_background backgroundTint backgroundTintMode -styleable ViewStubCompat android_id android_layout android_inflatedId diff --git a/code/Android App/build/intermediates/resources/instant-run/debug/output.json b/code/Android App/build/intermediates/resources/instant-run/debug/output.json deleted file mode 100755 index 3fd7950..0000000 --- a/code/Android App/build/intermediates/resources/instant-run/debug/output.json +++ /dev/null @@ -1 +0,0 @@ -[{"outputType":{"type":"INSTANT_RUN_PACKAGED_RESOURCES"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-debug.apk","fullName":"debug","baseName":"debug"},"path":"resources-debug.apk","properties":{}}] \ No newline at end of file diff --git a/code/Android App/build/intermediates/resources/instant-run/debug/resources-debug.apk b/code/Android App/build/intermediates/resources/instant-run/debug/resources-debug.apk deleted file mode 100755 index 3f3196e..0000000 Binary files a/code/Android App/build/intermediates/resources/instant-run/debug/resources-debug.apk and /dev/null differ diff --git a/code/Android App/build/intermediates/signing_config/debug/out/signing-config.json b/code/Android App/build/intermediates/signing_config/debug/out/signing-config.json deleted file mode 100755 index 36ee4bf..0000000 --- a/code/Android App/build/intermediates/signing_config/debug/out/signing-config.json +++ /dev/null @@ -1 +0,0 @@ -{"mName":"debug","mStoreFile":"C:\\Users\\Adrian\\.android\\debug.keystore","mStorePassword":"android","mKeyAlias":"AndroidDebugKey","mKeyPassword":"android","mStoreType":"jks","mV1SigningEnabled":true,"mV2SigningEnabled":true} \ No newline at end of file diff --git a/code/Android App/build/intermediates/split-apk/debug/dep/dependencies.apk b/code/Android App/build/intermediates/split-apk/debug/dep/dependencies.apk deleted file mode 100755 index d2d4fdb..0000000 Binary files a/code/Android App/build/intermediates/split-apk/debug/dep/dependencies.apk and /dev/null differ diff --git a/code/Android App/build/intermediates/split-apk/debug/resources/AndroidManifest.xml b/code/Android App/build/intermediates/split-apk/debug/resources/AndroidManifest.xml deleted file mode 100755 index 63ba3af..0000000 --- a/code/Android App/build/intermediates/split-apk/debug/resources/AndroidManifest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/code/Android App/build/intermediates/split-apk/debug/slices/slice_0.apk b/code/Android App/build/intermediates/split-apk/debug/slices/slice_0.apk deleted file mode 100755 index 5480e26..0000000 Binary files a/code/Android App/build/intermediates/split-apk/debug/slices/slice_0.apk and /dev/null differ diff --git a/code/Android App/build/intermediates/split-apk/debug/slices/slice_1.apk b/code/Android App/build/intermediates/split-apk/debug/slices/slice_1.apk deleted file mode 100755 index 9255acc..0000000 Binary files a/code/Android App/build/intermediates/split-apk/debug/slices/slice_1.apk and /dev/null differ diff --git a/code/Android App/build/intermediates/split-apk/debug/slices/slice_2.apk b/code/Android App/build/intermediates/split-apk/debug/slices/slice_2.apk deleted file mode 100755 index 9055c5f..0000000 Binary files a/code/Android App/build/intermediates/split-apk/debug/slices/slice_2.apk and /dev/null differ diff --git a/code/Android App/build/intermediates/split-apk/debug/slices/slice_3.apk b/code/Android App/build/intermediates/split-apk/debug/slices/slice_3.apk deleted file mode 100755 index 1032cf0..0000000 Binary files a/code/Android App/build/intermediates/split-apk/debug/slices/slice_3.apk and /dev/null differ diff --git a/code/Android App/build/intermediates/split-apk/debug/slices/slice_4.apk b/code/Android App/build/intermediates/split-apk/debug/slices/slice_4.apk deleted file mode 100755 index d9faf91..0000000 Binary files a/code/Android App/build/intermediates/split-apk/debug/slices/slice_4.apk and /dev/null differ diff --git a/code/Android App/build/intermediates/split-apk/debug/slices/slice_5.apk b/code/Android App/build/intermediates/split-apk/debug/slices/slice_5.apk deleted file mode 100755 index d87111d..0000000 Binary files a/code/Android App/build/intermediates/split-apk/debug/slices/slice_5.apk and /dev/null differ diff --git a/code/Android App/build/intermediates/split-apk/debug/slices/slice_6.apk b/code/Android App/build/intermediates/split-apk/debug/slices/slice_6.apk deleted file mode 100755 index 47f2e05..0000000 Binary files a/code/Android App/build/intermediates/split-apk/debug/slices/slice_6.apk and /dev/null differ diff --git a/code/Android App/build/intermediates/split-apk/debug/slices/slice_7.apk b/code/Android App/build/intermediates/split-apk/debug/slices/slice_7.apk deleted file mode 100755 index 1c62987..0000000 Binary files a/code/Android App/build/intermediates/split-apk/debug/slices/slice_7.apk and /dev/null differ diff --git a/code/Android App/build/intermediates/split-apk/debug/slices/slice_8.apk b/code/Android App/build/intermediates/split-apk/debug/slices/slice_8.apk deleted file mode 100755 index b4c6e9b..0000000 Binary files a/code/Android App/build/intermediates/split-apk/debug/slices/slice_8.apk and /dev/null differ diff --git a/code/Android App/build/intermediates/split-apk/debug/slices/slice_9.apk b/code/Android App/build/intermediates/split-apk/debug/slices/slice_9.apk deleted file mode 100755 index 2ed0b34..0000000 Binary files a/code/Android App/build/intermediates/split-apk/debug/slices/slice_9.apk and /dev/null differ diff --git a/code/Android App/build/intermediates/symbols/debug/R.txt b/code/Android App/build/intermediates/symbols/debug/R.txt deleted file mode 100755 index 7e66316..0000000 --- a/code/Android App/build/intermediates/symbols/debug/R.txt +++ /dev/null @@ -1,2778 +0,0 @@ -int anim abc_fade_in 0x7f010000 -int anim abc_fade_out 0x7f010001 -int anim abc_grow_fade_in_from_bottom 0x7f010002 -int anim abc_popup_enter 0x7f010003 -int anim abc_popup_exit 0x7f010004 -int anim abc_shrink_fade_out_from_bottom 0x7f010005 -int anim abc_slide_in_bottom 0x7f010006 -int anim abc_slide_in_top 0x7f010007 -int anim abc_slide_out_bottom 0x7f010008 -int anim abc_slide_out_top 0x7f010009 -int anim abc_tooltip_enter 0x7f01000a -int anim abc_tooltip_exit 0x7f01000b -int anim design_bottom_sheet_slide_in 0x7f01000c -int anim design_bottom_sheet_slide_out 0x7f01000d -int anim design_snackbar_in 0x7f01000e -int anim design_snackbar_out 0x7f01000f -int animator design_appbar_state_list_animator 0x7f020000 -int animator design_fab_hide_motion_spec 0x7f020001 -int animator design_fab_show_motion_spec 0x7f020002 -int animator mtrl_btn_state_list_anim 0x7f020003 -int animator mtrl_btn_unelevated_state_list_anim 0x7f020004 -int animator mtrl_chip_state_list_anim 0x7f020005 -int animator mtrl_fab_hide_motion_spec 0x7f020006 -int animator mtrl_fab_show_motion_spec 0x7f020007 -int animator mtrl_fab_transformation_sheet_collapse_spec 0x7f020008 -int animator mtrl_fab_transformation_sheet_expand_spec 0x7f020009 -int array church_array 0x7f030000 -int attr actionBarDivider 0x7f040000 -int attr actionBarItemBackground 0x7f040001 -int attr actionBarPopupTheme 0x7f040002 -int attr actionBarSize 0x7f040003 -int attr actionBarSplitStyle 0x7f040004 -int attr actionBarStyle 0x7f040005 -int attr actionBarTabBarStyle 0x7f040006 -int attr actionBarTabStyle 0x7f040007 -int attr actionBarTabTextStyle 0x7f040008 -int attr actionBarTheme 0x7f040009 -int attr actionBarWidgetTheme 0x7f04000a -int attr actionButtonStyle 0x7f04000b -int attr actionDropDownStyle 0x7f04000c -int attr actionLayout 0x7f04000d -int attr actionMenuTextAppearance 0x7f04000e -int attr actionMenuTextColor 0x7f04000f -int attr actionModeBackground 0x7f040010 -int attr actionModeCloseButtonStyle 0x7f040011 -int attr actionModeCloseDrawable 0x7f040012 -int attr actionModeCopyDrawable 0x7f040013 -int attr actionModeCutDrawable 0x7f040014 -int attr actionModeFindDrawable 0x7f040015 -int attr actionModePasteDrawable 0x7f040016 -int attr actionModePopupWindowStyle 0x7f040017 -int attr actionModeSelectAllDrawable 0x7f040018 -int attr actionModeShareDrawable 0x7f040019 -int attr actionModeSplitBackground 0x7f04001a -int attr actionModeStyle 0x7f04001b -int attr actionModeWebSearchDrawable 0x7f04001c -int attr actionOverflowButtonStyle 0x7f04001d -int attr actionOverflowMenuStyle 0x7f04001e -int attr actionProviderClass 0x7f04001f -int attr actionViewClass 0x7f040020 -int attr activityChooserViewStyle 0x7f040021 -int attr alertDialogButtonGroupStyle 0x7f040022 -int attr alertDialogCenterButtons 0x7f040023 -int attr alertDialogStyle 0x7f040024 -int attr alertDialogTheme 0x7f040025 -int attr allowStacking 0x7f040026 -int attr alpha 0x7f040027 -int attr alphabeticModifiers 0x7f040028 -int attr arrowHeadLength 0x7f040029 -int attr arrowShaftLength 0x7f04002a -int attr autoCompleteTextViewStyle 0x7f04002b -int attr autoSizeMaxTextSize 0x7f04002c -int attr autoSizeMinTextSize 0x7f04002d -int attr autoSizePresetSizes 0x7f04002e -int attr autoSizeStepGranularity 0x7f04002f -int attr autoSizeTextType 0x7f040030 -int attr background 0x7f040031 -int attr backgroundSplit 0x7f040032 -int attr backgroundStacked 0x7f040033 -int attr backgroundTint 0x7f040034 -int attr backgroundTintMode 0x7f040035 -int attr barLength 0x7f040036 -int attr barrierAllowsGoneWidgets 0x7f040037 -int attr barrierDirection 0x7f040038 -int attr behavior_autoHide 0x7f040039 -int attr behavior_fitToContents 0x7f04003a -int attr behavior_hideable 0x7f04003b -int attr behavior_overlapTop 0x7f04003c -int attr behavior_peekHeight 0x7f04003d -int attr behavior_skipCollapsed 0x7f04003e -int attr borderWidth 0x7f04003f -int attr borderlessButtonStyle 0x7f040040 -int attr bottomAppBarStyle 0x7f040041 -int attr bottomNavigationStyle 0x7f040042 -int attr bottomSheetDialogTheme 0x7f040043 -int attr bottomSheetStyle 0x7f040044 -int attr boxBackgroundColor 0x7f040045 -int attr boxBackgroundMode 0x7f040046 -int attr boxCollapsedPaddingTop 0x7f040047 -int attr boxCornerRadiusBottomEnd 0x7f040048 -int attr boxCornerRadiusBottomStart 0x7f040049 -int attr boxCornerRadiusTopEnd 0x7f04004a -int attr boxCornerRadiusTopStart 0x7f04004b -int attr boxStrokeColor 0x7f04004c -int attr boxStrokeWidth 0x7f04004d -int attr buttonBarButtonStyle 0x7f04004e -int attr buttonBarNegativeButtonStyle 0x7f04004f -int attr buttonBarNeutralButtonStyle 0x7f040050 -int attr buttonBarPositiveButtonStyle 0x7f040051 -int attr buttonBarStyle 0x7f040052 -int attr buttonGravity 0x7f040053 -int attr buttonIconDimen 0x7f040054 -int attr buttonPanelSideLayout 0x7f040055 -int attr buttonStyle 0x7f040056 -int attr buttonStyleSmall 0x7f040057 -int attr buttonTint 0x7f040058 -int attr buttonTintMode 0x7f040059 -int attr cardBackgroundColor 0x7f04005a -int attr cardCornerRadius 0x7f04005b -int attr cardElevation 0x7f04005c -int attr cardMaxElevation 0x7f04005d -int attr cardPreventCornerOverlap 0x7f04005e -int attr cardUseCompatPadding 0x7f04005f -int attr cardViewStyle 0x7f040060 -int attr chainUseRtl 0x7f040061 -int attr checkboxStyle 0x7f040062 -int attr checkedChip 0x7f040063 -int attr checkedIcon 0x7f040064 -int attr checkedIconEnabled 0x7f040065 -int attr checkedIconVisible 0x7f040066 -int attr checkedTextViewStyle 0x7f040067 -int attr chipBackgroundColor 0x7f040068 -int attr chipCornerRadius 0x7f040069 -int attr chipEndPadding 0x7f04006a -int attr chipGroupStyle 0x7f04006b -int attr chipIcon 0x7f04006c -int attr chipIconEnabled 0x7f04006d -int attr chipIconSize 0x7f04006e -int attr chipIconTint 0x7f04006f -int attr chipIconVisible 0x7f040070 -int attr chipMinHeight 0x7f040071 -int attr chipSpacing 0x7f040072 -int attr chipSpacingHorizontal 0x7f040073 -int attr chipSpacingVertical 0x7f040074 -int attr chipStandaloneStyle 0x7f040075 -int attr chipStartPadding 0x7f040076 -int attr chipStrokeColor 0x7f040077 -int attr chipStrokeWidth 0x7f040078 -int attr chipStyle 0x7f040079 -int attr closeIcon 0x7f04007a -int attr closeIconEnabled 0x7f04007b -int attr closeIconEndPadding 0x7f04007c -int attr closeIconSize 0x7f04007d -int attr closeIconStartPadding 0x7f04007e -int attr closeIconTint 0x7f04007f -int attr closeIconVisible 0x7f040080 -int attr closeItemLayout 0x7f040081 -int attr collapseContentDescription 0x7f040082 -int attr collapseIcon 0x7f040083 -int attr collapsedTitleGravity 0x7f040084 -int attr collapsedTitleTextAppearance 0x7f040085 -int attr color 0x7f040086 -int attr colorAccent 0x7f040087 -int attr colorBackgroundFloating 0x7f040088 -int attr colorButtonNormal 0x7f040089 -int attr colorControlActivated 0x7f04008a -int attr colorControlHighlight 0x7f04008b -int attr colorControlNormal 0x7f04008c -int attr colorError 0x7f04008d -int attr colorPrimary 0x7f04008e -int attr colorPrimaryDark 0x7f04008f -int attr colorSecondary 0x7f040090 -int attr colorSwitchThumbNormal 0x7f040091 -int attr commitIcon 0x7f040092 -int attr constraintSet 0x7f040093 -int attr constraint_referenced_ids 0x7f040094 -int attr content 0x7f040095 -int attr contentDescription 0x7f040096 -int attr contentInsetEnd 0x7f040097 -int attr contentInsetEndWithActions 0x7f040098 -int attr contentInsetLeft 0x7f040099 -int attr contentInsetRight 0x7f04009a -int attr contentInsetStart 0x7f04009b -int attr contentInsetStartWithNavigation 0x7f04009c -int attr contentPadding 0x7f04009d -int attr contentPaddingBottom 0x7f04009e -int attr contentPaddingLeft 0x7f04009f -int attr contentPaddingRight 0x7f0400a0 -int attr contentPaddingTop 0x7f0400a1 -int attr contentScrim 0x7f0400a2 -int attr controlBackground 0x7f0400a3 -int attr coordinatorLayoutStyle 0x7f0400a4 -int attr cornerRadius 0x7f0400a5 -int attr counterEnabled 0x7f0400a6 -int attr counterMaxLength 0x7f0400a7 -int attr counterOverflowTextAppearance 0x7f0400a8 -int attr counterTextAppearance 0x7f0400a9 -int attr customNavigationLayout 0x7f0400aa -int attr defaultQueryHint 0x7f0400ab -int attr dialogCornerRadius 0x7f0400ac -int attr dialogPreferredPadding 0x7f0400ad -int attr dialogTheme 0x7f0400ae -int attr displayOptions 0x7f0400af -int attr divider 0x7f0400b0 -int attr dividerHorizontal 0x7f0400b1 -int attr dividerPadding 0x7f0400b2 -int attr dividerVertical 0x7f0400b3 -int attr drawableSize 0x7f0400b4 -int attr drawerArrowStyle 0x7f0400b5 -int attr dropDownListViewStyle 0x7f0400b6 -int attr dropdownListPreferredItemHeight 0x7f0400b7 -int attr editTextBackground 0x7f0400b8 -int attr editTextColor 0x7f0400b9 -int attr editTextStyle 0x7f0400ba -int attr elevation 0x7f0400bb -int attr emptyVisibility 0x7f0400bc -int attr enforceMaterialTheme 0x7f0400bd -int attr enforceTextAppearance 0x7f0400be -int attr errorEnabled 0x7f0400bf -int attr errorTextAppearance 0x7f0400c0 -int attr expandActivityOverflowButtonDrawable 0x7f0400c1 -int attr expanded 0x7f0400c2 -int attr expandedTitleGravity 0x7f0400c3 -int attr expandedTitleMargin 0x7f0400c4 -int attr expandedTitleMarginBottom 0x7f0400c5 -int attr expandedTitleMarginEnd 0x7f0400c6 -int attr expandedTitleMarginStart 0x7f0400c7 -int attr expandedTitleMarginTop 0x7f0400c8 -int attr expandedTitleTextAppearance 0x7f0400c9 -int attr fabAlignmentMode 0x7f0400ca -int attr fabCradleMargin 0x7f0400cb -int attr fabCradleRoundedCornerRadius 0x7f0400cc -int attr fabCradleVerticalOffset 0x7f0400cd -int attr fabCustomSize 0x7f0400ce -int attr fabSize 0x7f0400cf -int attr fastScrollEnabled 0x7f0400d0 -int attr fastScrollHorizontalThumbDrawable 0x7f0400d1 -int attr fastScrollHorizontalTrackDrawable 0x7f0400d2 -int attr fastScrollVerticalThumbDrawable 0x7f0400d3 -int attr fastScrollVerticalTrackDrawable 0x7f0400d4 -int attr firstBaselineToTopHeight 0x7f0400d5 -int attr floatingActionButtonStyle 0x7f0400d6 -int attr font 0x7f0400d7 -int attr fontFamily 0x7f0400d8 -int attr fontProviderAuthority 0x7f0400d9 -int attr fontProviderCerts 0x7f0400da -int attr fontProviderFetchStrategy 0x7f0400db -int attr fontProviderFetchTimeout 0x7f0400dc -int attr fontProviderPackage 0x7f0400dd -int attr fontProviderQuery 0x7f0400de -int attr fontStyle 0x7f0400df -int attr fontVariationSettings 0x7f0400e0 -int attr fontWeight 0x7f0400e1 -int attr foregroundInsidePadding 0x7f0400e2 -int attr gapBetweenBars 0x7f0400e3 -int attr goIcon 0x7f0400e4 -int attr headerLayout 0x7f0400e5 -int attr height 0x7f0400e6 -int attr helperText 0x7f0400e7 -int attr helperTextEnabled 0x7f0400e8 -int attr helperTextTextAppearance 0x7f0400e9 -int attr hideMotionSpec 0x7f0400ea -int attr hideOnContentScroll 0x7f0400eb -int attr hideOnScroll 0x7f0400ec -int attr hintAnimationEnabled 0x7f0400ed -int attr hintEnabled 0x7f0400ee -int attr hintTextAppearance 0x7f0400ef -int attr homeAsUpIndicator 0x7f0400f0 -int attr homeLayout 0x7f0400f1 -int attr hoveredFocusedTranslationZ 0x7f0400f2 -int attr icon 0x7f0400f3 -int attr iconEndPadding 0x7f0400f4 -int attr iconGravity 0x7f0400f5 -int attr iconPadding 0x7f0400f6 -int attr iconSize 0x7f0400f7 -int attr iconStartPadding 0x7f0400f8 -int attr iconTint 0x7f0400f9 -int attr iconTintMode 0x7f0400fa -int attr iconifiedByDefault 0x7f0400fb -int attr imageButtonStyle 0x7f0400fc -int attr indeterminateProgressStyle 0x7f0400fd -int attr initialActivityCount 0x7f0400fe -int attr insetForeground 0x7f0400ff -int attr isLightTheme 0x7f040100 -int attr itemBackground 0x7f040101 -int attr itemHorizontalPadding 0x7f040102 -int attr itemHorizontalTranslationEnabled 0x7f040103 -int attr itemIconPadding 0x7f040104 -int attr itemIconSize 0x7f040105 -int attr itemIconTint 0x7f040106 -int attr itemPadding 0x7f040107 -int attr itemSpacing 0x7f040108 -int attr itemTextAppearance 0x7f040109 -int attr itemTextAppearanceActive 0x7f04010a -int attr itemTextAppearanceInactive 0x7f04010b -int attr itemTextColor 0x7f04010c -int attr keylines 0x7f04010d -int attr labelVisibilityMode 0x7f04010e -int attr lastBaselineToBottomHeight 0x7f04010f -int attr layout 0x7f040110 -int attr layoutManager 0x7f040111 -int attr layout_anchor 0x7f040112 -int attr layout_anchorGravity 0x7f040113 -int attr layout_behavior 0x7f040114 -int attr layout_collapseMode 0x7f040115 -int attr layout_collapseParallaxMultiplier 0x7f040116 -int attr layout_constrainedHeight 0x7f040117 -int attr layout_constrainedWidth 0x7f040118 -int attr layout_constraintBaseline_creator 0x7f040119 -int attr layout_constraintBaseline_toBaselineOf 0x7f04011a -int attr layout_constraintBottom_creator 0x7f04011b -int attr layout_constraintBottom_toBottomOf 0x7f04011c -int attr layout_constraintBottom_toTopOf 0x7f04011d -int attr layout_constraintCircle 0x7f04011e -int attr layout_constraintCircleAngle 0x7f04011f -int attr layout_constraintCircleRadius 0x7f040120 -int attr layout_constraintDimensionRatio 0x7f040121 -int attr layout_constraintEnd_toEndOf 0x7f040122 -int attr layout_constraintEnd_toStartOf 0x7f040123 -int attr layout_constraintGuide_begin 0x7f040124 -int attr layout_constraintGuide_end 0x7f040125 -int attr layout_constraintGuide_percent 0x7f040126 -int attr layout_constraintHeight_default 0x7f040127 -int attr layout_constraintHeight_max 0x7f040128 -int attr layout_constraintHeight_min 0x7f040129 -int attr layout_constraintHeight_percent 0x7f04012a -int attr layout_constraintHorizontal_bias 0x7f04012b -int attr layout_constraintHorizontal_chainStyle 0x7f04012c -int attr layout_constraintHorizontal_weight 0x7f04012d -int attr layout_constraintLeft_creator 0x7f04012e -int attr layout_constraintLeft_toLeftOf 0x7f04012f -int attr layout_constraintLeft_toRightOf 0x7f040130 -int attr layout_constraintRight_creator 0x7f040131 -int attr layout_constraintRight_toLeftOf 0x7f040132 -int attr layout_constraintRight_toRightOf 0x7f040133 -int attr layout_constraintStart_toEndOf 0x7f040134 -int attr layout_constraintStart_toStartOf 0x7f040135 -int attr layout_constraintTop_creator 0x7f040136 -int attr layout_constraintTop_toBottomOf 0x7f040137 -int attr layout_constraintTop_toTopOf 0x7f040138 -int attr layout_constraintVertical_bias 0x7f040139 -int attr layout_constraintVertical_chainStyle 0x7f04013a -int attr layout_constraintVertical_weight 0x7f04013b -int attr layout_constraintWidth_default 0x7f04013c -int attr layout_constraintWidth_max 0x7f04013d -int attr layout_constraintWidth_min 0x7f04013e -int attr layout_constraintWidth_percent 0x7f04013f -int attr layout_dodgeInsetEdges 0x7f040140 -int attr layout_editor_absoluteX 0x7f040141 -int attr layout_editor_absoluteY 0x7f040142 -int attr layout_goneMarginBottom 0x7f040143 -int attr layout_goneMarginEnd 0x7f040144 -int attr layout_goneMarginLeft 0x7f040145 -int attr layout_goneMarginRight 0x7f040146 -int attr layout_goneMarginStart 0x7f040147 -int attr layout_goneMarginTop 0x7f040148 -int attr layout_insetEdge 0x7f040149 -int attr layout_keyline 0x7f04014a -int attr layout_optimizationLevel 0x7f04014b -int attr layout_scrollFlags 0x7f04014c -int attr layout_scrollInterpolator 0x7f04014d -int attr liftOnScroll 0x7f04014e -int attr lineHeight 0x7f04014f -int attr lineSpacing 0x7f040150 -int attr listChoiceBackgroundIndicator 0x7f040151 -int attr listDividerAlertDialog 0x7f040152 -int attr listItemLayout 0x7f040153 -int attr listLayout 0x7f040154 -int attr listMenuViewStyle 0x7f040155 -int attr listPopupWindowStyle 0x7f040156 -int attr listPreferredItemHeight 0x7f040157 -int attr listPreferredItemHeightLarge 0x7f040158 -int attr listPreferredItemHeightSmall 0x7f040159 -int attr listPreferredItemPaddingLeft 0x7f04015a -int attr listPreferredItemPaddingRight 0x7f04015b -int attr logo 0x7f04015c -int attr logoDescription 0x7f04015d -int attr materialButtonStyle 0x7f04015e -int attr materialCardViewStyle 0x7f04015f -int attr maxActionInlineWidth 0x7f040160 -int attr maxButtonHeight 0x7f040161 -int attr maxImageSize 0x7f040162 -int attr measureWithLargestChild 0x7f040163 -int attr menu 0x7f040164 -int attr multiChoiceItemLayout 0x7f040165 -int attr navigationContentDescription 0x7f040166 -int attr navigationIcon 0x7f040167 -int attr navigationMode 0x7f040168 -int attr navigationViewStyle 0x7f040169 -int attr numericModifiers 0x7f04016a -int attr overlapAnchor 0x7f04016b -int attr paddingBottomNoButtons 0x7f04016c -int attr paddingEnd 0x7f04016d -int attr paddingStart 0x7f04016e -int attr paddingTopNoTitle 0x7f04016f -int attr panelBackground 0x7f040170 -int attr panelMenuListTheme 0x7f040171 -int attr panelMenuListWidth 0x7f040172 -int attr passwordToggleContentDescription 0x7f040173 -int attr passwordToggleDrawable 0x7f040174 -int attr passwordToggleEnabled 0x7f040175 -int attr passwordToggleTint 0x7f040176 -int attr passwordToggleTintMode 0x7f040177 -int attr popupMenuStyle 0x7f040178 -int attr popupTheme 0x7f040179 -int attr popupWindowStyle 0x7f04017a -int attr preserveIconSpacing 0x7f04017b -int attr pressedTranslationZ 0x7f04017c -int attr progressBarPadding 0x7f04017d -int attr progressBarStyle 0x7f04017e -int attr queryBackground 0x7f04017f -int attr queryHint 0x7f040180 -int attr radioButtonStyle 0x7f040181 -int attr ratingBarStyle 0x7f040182 -int attr ratingBarStyleIndicator 0x7f040183 -int attr ratingBarStyleSmall 0x7f040184 -int attr reverseLayout 0x7f040185 -int attr rippleColor 0x7f040186 -int attr scrimAnimationDuration 0x7f040187 -int attr scrimBackground 0x7f040188 -int attr scrimVisibleHeightTrigger 0x7f040189 -int attr searchHintIcon 0x7f04018a -int attr searchIcon 0x7f04018b -int attr searchViewStyle 0x7f04018c -int attr seekBarStyle 0x7f04018d -int attr selectableItemBackground 0x7f04018e -int attr selectableItemBackgroundBorderless 0x7f04018f -int attr showAsAction 0x7f040190 -int attr showDividers 0x7f040191 -int attr showMotionSpec 0x7f040192 -int attr showText 0x7f040193 -int attr showTitle 0x7f040194 -int attr singleChoiceItemLayout 0x7f040195 -int attr singleLine 0x7f040196 -int attr singleSelection 0x7f040197 -int attr snackbarButtonStyle 0x7f040198 -int attr snackbarStyle 0x7f040199 -int attr spanCount 0x7f04019a -int attr spinBars 0x7f04019b -int attr spinnerDropDownItemStyle 0x7f04019c -int attr spinnerStyle 0x7f04019d -int attr splitTrack 0x7f04019e -int attr srcCompat 0x7f04019f -int attr stackFromEnd 0x7f0401a0 -int attr state_above_anchor 0x7f0401a1 -int attr state_collapsed 0x7f0401a2 -int attr state_collapsible 0x7f0401a3 -int attr state_liftable 0x7f0401a4 -int attr state_lifted 0x7f0401a5 -int attr statusBarBackground 0x7f0401a6 -int attr statusBarScrim 0x7f0401a7 -int attr strokeColor 0x7f0401a8 -int attr strokeWidth 0x7f0401a9 -int attr subMenuArrow 0x7f0401aa -int attr submitBackground 0x7f0401ab -int attr subtitle 0x7f0401ac -int attr subtitleTextAppearance 0x7f0401ad -int attr subtitleTextColor 0x7f0401ae -int attr subtitleTextStyle 0x7f0401af -int attr suggestionRowLayout 0x7f0401b0 -int attr switchMinWidth 0x7f0401b1 -int attr switchPadding 0x7f0401b2 -int attr switchStyle 0x7f0401b3 -int attr switchTextAppearance 0x7f0401b4 -int attr tabBackground 0x7f0401b5 -int attr tabContentStart 0x7f0401b6 -int attr tabGravity 0x7f0401b7 -int attr tabIconTint 0x7f0401b8 -int attr tabIconTintMode 0x7f0401b9 -int attr tabIndicator 0x7f0401ba -int attr tabIndicatorAnimationDuration 0x7f0401bb -int attr tabIndicatorColor 0x7f0401bc -int attr tabIndicatorFullWidth 0x7f0401bd -int attr tabIndicatorGravity 0x7f0401be -int attr tabIndicatorHeight 0x7f0401bf -int attr tabInlineLabel 0x7f0401c0 -int attr tabMaxWidth 0x7f0401c1 -int attr tabMinWidth 0x7f0401c2 -int attr tabMode 0x7f0401c3 -int attr tabPadding 0x7f0401c4 -int attr tabPaddingBottom 0x7f0401c5 -int attr tabPaddingEnd 0x7f0401c6 -int attr tabPaddingStart 0x7f0401c7 -int attr tabPaddingTop 0x7f0401c8 -int attr tabRippleColor 0x7f0401c9 -int attr tabSelectedTextColor 0x7f0401ca -int attr tabStyle 0x7f0401cb -int attr tabTextAppearance 0x7f0401cc -int attr tabTextColor 0x7f0401cd -int attr tabUnboundedRipple 0x7f0401ce -int attr textAllCaps 0x7f0401cf -int attr textAppearanceBody1 0x7f0401d0 -int attr textAppearanceBody2 0x7f0401d1 -int attr textAppearanceButton 0x7f0401d2 -int attr textAppearanceCaption 0x7f0401d3 -int attr textAppearanceHeadline1 0x7f0401d4 -int attr textAppearanceHeadline2 0x7f0401d5 -int attr textAppearanceHeadline3 0x7f0401d6 -int attr textAppearanceHeadline4 0x7f0401d7 -int attr textAppearanceHeadline5 0x7f0401d8 -int attr textAppearanceHeadline6 0x7f0401d9 -int attr textAppearanceLargePopupMenu 0x7f0401da -int attr textAppearanceListItem 0x7f0401db -int attr textAppearanceListItemSecondary 0x7f0401dc -int attr textAppearanceListItemSmall 0x7f0401dd -int attr textAppearanceOverline 0x7f0401de -int attr textAppearancePopupMenuHeader 0x7f0401df -int attr textAppearanceSearchResultSubtitle 0x7f0401e0 -int attr textAppearanceSearchResultTitle 0x7f0401e1 -int attr textAppearanceSmallPopupMenu 0x7f0401e2 -int attr textAppearanceSubtitle1 0x7f0401e3 -int attr textAppearanceSubtitle2 0x7f0401e4 -int attr textColorAlertDialogListItem 0x7f0401e5 -int attr textColorSearchUrl 0x7f0401e6 -int attr textEndPadding 0x7f0401e7 -int attr textInputStyle 0x7f0401e8 -int attr textStartPadding 0x7f0401e9 -int attr theme 0x7f0401ea -int attr thickness 0x7f0401eb -int attr thumbTextPadding 0x7f0401ec -int attr thumbTint 0x7f0401ed -int attr thumbTintMode 0x7f0401ee -int attr tickMark 0x7f0401ef -int attr tickMarkTint 0x7f0401f0 -int attr tickMarkTintMode 0x7f0401f1 -int attr tint 0x7f0401f2 -int attr tintMode 0x7f0401f3 -int attr title 0x7f0401f4 -int attr titleEnabled 0x7f0401f5 -int attr titleMargin 0x7f0401f6 -int attr titleMarginBottom 0x7f0401f7 -int attr titleMarginEnd 0x7f0401f8 -int attr titleMarginStart 0x7f0401f9 -int attr titleMarginTop 0x7f0401fa -int attr titleMargins 0x7f0401fb -int attr titleTextAppearance 0x7f0401fc -int attr titleTextColor 0x7f0401fd -int attr titleTextStyle 0x7f0401fe -int attr toolbarId 0x7f0401ff -int attr toolbarNavigationButtonStyle 0x7f040200 -int attr toolbarStyle 0x7f040201 -int attr tooltipForegroundColor 0x7f040202 -int attr tooltipFrameBackground 0x7f040203 -int attr tooltipText 0x7f040204 -int attr track 0x7f040205 -int attr trackTint 0x7f040206 -int attr trackTintMode 0x7f040207 -int attr ttcIndex 0x7f040208 -int attr useCompatPadding 0x7f040209 -int attr viewInflaterClass 0x7f04020a -int attr voiceIcon 0x7f04020b -int attr windowActionBar 0x7f04020c -int attr windowActionBarOverlay 0x7f04020d -int attr windowActionModeOverlay 0x7f04020e -int attr windowFixedHeightMajor 0x7f04020f -int attr windowFixedHeightMinor 0x7f040210 -int attr windowFixedWidthMajor 0x7f040211 -int attr windowFixedWidthMinor 0x7f040212 -int attr windowMinWidthMajor 0x7f040213 -int attr windowMinWidthMinor 0x7f040214 -int attr windowNoTitle 0x7f040215 -int bool abc_action_bar_embed_tabs 0x7f050000 -int bool abc_allow_stacked_button_bar 0x7f050001 -int bool abc_config_actionMenuItemAllCaps 0x7f050002 -int bool mtrl_btn_textappearance_all_caps 0x7f050003 -int color abc_background_cache_hint_selector_material_dark 0x7f060000 -int color abc_background_cache_hint_selector_material_light 0x7f060001 -int color abc_btn_colored_borderless_text_material 0x7f060002 -int color abc_btn_colored_text_material 0x7f060003 -int color abc_color_highlight_material 0x7f060004 -int color abc_hint_foreground_material_dark 0x7f060005 -int color abc_hint_foreground_material_light 0x7f060006 -int color abc_input_method_navigation_guard 0x7f060007 -int color abc_primary_text_disable_only_material_dark 0x7f060008 -int color abc_primary_text_disable_only_material_light 0x7f060009 -int color abc_primary_text_material_dark 0x7f06000a -int color abc_primary_text_material_light 0x7f06000b -int color abc_search_url_text 0x7f06000c -int color abc_search_url_text_normal 0x7f06000d -int color abc_search_url_text_pressed 0x7f06000e -int color abc_search_url_text_selected 0x7f06000f -int color abc_secondary_text_material_dark 0x7f060010 -int color abc_secondary_text_material_light 0x7f060011 -int color abc_tint_btn_checkable 0x7f060012 -int color abc_tint_default 0x7f060013 -int color abc_tint_edittext 0x7f060014 -int color abc_tint_seek_thumb 0x7f060015 -int color abc_tint_spinner 0x7f060016 -int color abc_tint_switch_track 0x7f060017 -int color accent_material_dark 0x7f060018 -int color accent_material_light 0x7f060019 -int color background_floating_material_dark 0x7f06001a -int color background_floating_material_light 0x7f06001b -int color background_material_dark 0x7f06001c -int color background_material_light 0x7f06001d -int color bright_foreground_disabled_material_dark 0x7f06001e -int color bright_foreground_disabled_material_light 0x7f06001f -int color bright_foreground_inverse_material_dark 0x7f060020 -int color bright_foreground_inverse_material_light 0x7f060021 -int color bright_foreground_material_dark 0x7f060022 -int color bright_foreground_material_light 0x7f060023 -int color button_material_dark 0x7f060024 -int color button_material_light 0x7f060025 -int color cardview_dark_background 0x7f060026 -int color cardview_light_background 0x7f060027 -int color cardview_shadow_end_color 0x7f060028 -int color cardview_shadow_start_color 0x7f060029 -int color colorAccent 0x7f06002a -int color colorPrimary 0x7f06002b -int color colorPrimaryDark 0x7f06002c -int color design_bottom_navigation_shadow_color 0x7f06002d -int color design_default_color_primary 0x7f06002e -int color design_default_color_primary_dark 0x7f06002f -int color design_error 0x7f060030 -int color design_fab_shadow_end_color 0x7f060031 -int color design_fab_shadow_mid_color 0x7f060032 -int color design_fab_shadow_start_color 0x7f060033 -int color design_fab_stroke_end_inner_color 0x7f060034 -int color design_fab_stroke_end_outer_color 0x7f060035 -int color design_fab_stroke_top_inner_color 0x7f060036 -int color design_fab_stroke_top_outer_color 0x7f060037 -int color design_snackbar_background_color 0x7f060038 -int color design_tint_password_toggle 0x7f060039 -int color dim_foreground_disabled_material_dark 0x7f06003a -int color dim_foreground_disabled_material_light 0x7f06003b -int color dim_foreground_material_dark 0x7f06003c -int color dim_foreground_material_light 0x7f06003d -int color error_color_material_dark 0x7f06003e -int color error_color_material_light 0x7f06003f -int color foreground_material_dark 0x7f060040 -int color foreground_material_light 0x7f060041 -int color highlighted_text_material_dark 0x7f060042 -int color highlighted_text_material_light 0x7f060043 -int color material_blue_grey_800 0x7f060044 -int color material_blue_grey_900 0x7f060045 -int color material_blue_grey_950 0x7f060046 -int color material_deep_teal_200 0x7f060047 -int color material_deep_teal_500 0x7f060048 -int color material_grey_100 0x7f060049 -int color material_grey_300 0x7f06004a -int color material_grey_50 0x7f06004b -int color material_grey_600 0x7f06004c -int color material_grey_800 0x7f06004d -int color material_grey_850 0x7f06004e -int color material_grey_900 0x7f06004f -int color mtrl_bottom_nav_colored_item_tint 0x7f060050 -int color mtrl_bottom_nav_item_tint 0x7f060051 -int color mtrl_btn_bg_color_disabled 0x7f060052 -int color mtrl_btn_bg_color_selector 0x7f060053 -int color mtrl_btn_ripple_color 0x7f060054 -int color mtrl_btn_stroke_color_selector 0x7f060055 -int color mtrl_btn_text_btn_ripple_color 0x7f060056 -int color mtrl_btn_text_color_disabled 0x7f060057 -int color mtrl_btn_text_color_selector 0x7f060058 -int color mtrl_btn_transparent_bg_color 0x7f060059 -int color mtrl_chip_background_color 0x7f06005a -int color mtrl_chip_close_icon_tint 0x7f06005b -int color mtrl_chip_ripple_color 0x7f06005c -int color mtrl_chip_text_color 0x7f06005d -int color mtrl_fab_ripple_color 0x7f06005e -int color mtrl_scrim_color 0x7f06005f -int color mtrl_tabs_colored_ripple_color 0x7f060060 -int color mtrl_tabs_icon_color_selector 0x7f060061 -int color mtrl_tabs_icon_color_selector_colored 0x7f060062 -int color mtrl_tabs_legacy_text_color_selector 0x7f060063 -int color mtrl_tabs_ripple_color 0x7f060064 -int color mtrl_text_btn_text_color_selector 0x7f060065 -int color mtrl_textinput_default_box_stroke_color 0x7f060066 -int color mtrl_textinput_disabled_color 0x7f060067 -int color mtrl_textinput_filled_box_default_background_color 0x7f060068 -int color mtrl_textinput_hovered_box_stroke_color 0x7f060069 -int color notification_action_color_filter 0x7f06006a -int color notification_icon_bg_color 0x7f06006b -int color primary_dark_material_dark 0x7f06006c -int color primary_dark_material_light 0x7f06006d -int color primary_material_dark 0x7f06006e -int color primary_material_light 0x7f06006f -int color primary_text_default_material_dark 0x7f060070 -int color primary_text_default_material_light 0x7f060071 -int color primary_text_disabled_material_dark 0x7f060072 -int color primary_text_disabled_material_light 0x7f060073 -int color ripple_material_dark 0x7f060074 -int color ripple_material_light 0x7f060075 -int color secondary_text_default_material_dark 0x7f060076 -int color secondary_text_default_material_light 0x7f060077 -int color secondary_text_disabled_material_dark 0x7f060078 -int color secondary_text_disabled_material_light 0x7f060079 -int color switch_thumb_disabled_material_dark 0x7f06007a -int color switch_thumb_disabled_material_light 0x7f06007b -int color switch_thumb_material_dark 0x7f06007c -int color switch_thumb_material_light 0x7f06007d -int color switch_thumb_normal_material_dark 0x7f06007e -int color switch_thumb_normal_material_light 0x7f06007f -int color tooltip_background_dark 0x7f060080 -int color tooltip_background_light 0x7f060081 -int dimen abc_action_bar_content_inset_material 0x7f070000 -int dimen abc_action_bar_content_inset_with_nav 0x7f070001 -int dimen abc_action_bar_default_height_material 0x7f070002 -int dimen abc_action_bar_default_padding_end_material 0x7f070003 -int dimen abc_action_bar_default_padding_start_material 0x7f070004 -int dimen abc_action_bar_elevation_material 0x7f070005 -int dimen abc_action_bar_icon_vertical_padding_material 0x7f070006 -int dimen abc_action_bar_overflow_padding_end_material 0x7f070007 -int dimen abc_action_bar_overflow_padding_start_material 0x7f070008 -int dimen abc_action_bar_stacked_max_height 0x7f070009 -int dimen abc_action_bar_stacked_tab_max_width 0x7f07000a -int dimen abc_action_bar_subtitle_bottom_margin_material 0x7f07000b -int dimen abc_action_bar_subtitle_top_margin_material 0x7f07000c -int dimen abc_action_button_min_height_material 0x7f07000d -int dimen abc_action_button_min_width_material 0x7f07000e -int dimen abc_action_button_min_width_overflow_material 0x7f07000f -int dimen abc_alert_dialog_button_bar_height 0x7f070010 -int dimen abc_alert_dialog_button_dimen 0x7f070011 -int dimen abc_button_inset_horizontal_material 0x7f070012 -int dimen abc_button_inset_vertical_material 0x7f070013 -int dimen abc_button_padding_horizontal_material 0x7f070014 -int dimen abc_button_padding_vertical_material 0x7f070015 -int dimen abc_cascading_menus_min_smallest_width 0x7f070016 -int dimen abc_config_prefDialogWidth 0x7f070017 -int dimen abc_control_corner_material 0x7f070018 -int dimen abc_control_inset_material 0x7f070019 -int dimen abc_control_padding_material 0x7f07001a -int dimen abc_dialog_corner_radius_material 0x7f07001b -int dimen abc_dialog_fixed_height_major 0x7f07001c -int dimen abc_dialog_fixed_height_minor 0x7f07001d -int dimen abc_dialog_fixed_width_major 0x7f07001e -int dimen abc_dialog_fixed_width_minor 0x7f07001f -int dimen abc_dialog_list_padding_bottom_no_buttons 0x7f070020 -int dimen abc_dialog_list_padding_top_no_title 0x7f070021 -int dimen abc_dialog_min_width_major 0x7f070022 -int dimen abc_dialog_min_width_minor 0x7f070023 -int dimen abc_dialog_padding_material 0x7f070024 -int dimen abc_dialog_padding_top_material 0x7f070025 -int dimen abc_dialog_title_divider_material 0x7f070026 -int dimen abc_disabled_alpha_material_dark 0x7f070027 -int dimen abc_disabled_alpha_material_light 0x7f070028 -int dimen abc_dropdownitem_icon_width 0x7f070029 -int dimen abc_dropdownitem_text_padding_left 0x7f07002a -int dimen abc_dropdownitem_text_padding_right 0x7f07002b -int dimen abc_edit_text_inset_bottom_material 0x7f07002c -int dimen abc_edit_text_inset_horizontal_material 0x7f07002d -int dimen abc_edit_text_inset_top_material 0x7f07002e -int dimen abc_floating_window_z 0x7f07002f -int dimen abc_list_item_padding_horizontal_material 0x7f070030 -int dimen abc_panel_menu_list_width 0x7f070031 -int dimen abc_progress_bar_height_material 0x7f070032 -int dimen abc_search_view_preferred_height 0x7f070033 -int dimen abc_search_view_preferred_width 0x7f070034 -int dimen abc_seekbar_track_background_height_material 0x7f070035 -int dimen abc_seekbar_track_progress_height_material 0x7f070036 -int dimen abc_select_dialog_padding_start_material 0x7f070037 -int dimen abc_switch_padding 0x7f070038 -int dimen abc_text_size_body_1_material 0x7f070039 -int dimen abc_text_size_body_2_material 0x7f07003a -int dimen abc_text_size_button_material 0x7f07003b -int dimen abc_text_size_caption_material 0x7f07003c -int dimen abc_text_size_display_1_material 0x7f07003d -int dimen abc_text_size_display_2_material 0x7f07003e -int dimen abc_text_size_display_3_material 0x7f07003f -int dimen abc_text_size_display_4_material 0x7f070040 -int dimen abc_text_size_headline_material 0x7f070041 -int dimen abc_text_size_large_material 0x7f070042 -int dimen abc_text_size_medium_material 0x7f070043 -int dimen abc_text_size_menu_header_material 0x7f070044 -int dimen abc_text_size_menu_material 0x7f070045 -int dimen abc_text_size_small_material 0x7f070046 -int dimen abc_text_size_subhead_material 0x7f070047 -int dimen abc_text_size_subtitle_material_toolbar 0x7f070048 -int dimen abc_text_size_title_material 0x7f070049 -int dimen abc_text_size_title_material_toolbar 0x7f07004a -int dimen cardview_compat_inset_shadow 0x7f07004b -int dimen cardview_default_elevation 0x7f07004c -int dimen cardview_default_radius 0x7f07004d -int dimen compat_button_inset_horizontal_material 0x7f07004e -int dimen compat_button_inset_vertical_material 0x7f07004f -int dimen compat_button_padding_horizontal_material 0x7f070050 -int dimen compat_button_padding_vertical_material 0x7f070051 -int dimen compat_control_corner_material 0x7f070052 -int dimen compat_notification_large_icon_max_height 0x7f070053 -int dimen compat_notification_large_icon_max_width 0x7f070054 -int dimen design_appbar_elevation 0x7f070055 -int dimen design_bottom_navigation_active_item_max_width 0x7f070056 -int dimen design_bottom_navigation_active_item_min_width 0x7f070057 -int dimen design_bottom_navigation_active_text_size 0x7f070058 -int dimen design_bottom_navigation_elevation 0x7f070059 -int dimen design_bottom_navigation_height 0x7f07005a -int dimen design_bottom_navigation_icon_size 0x7f07005b -int dimen design_bottom_navigation_item_max_width 0x7f07005c -int dimen design_bottom_navigation_item_min_width 0x7f07005d -int dimen design_bottom_navigation_margin 0x7f07005e -int dimen design_bottom_navigation_shadow_height 0x7f07005f -int dimen design_bottom_navigation_text_size 0x7f070060 -int dimen design_bottom_sheet_modal_elevation 0x7f070061 -int dimen design_bottom_sheet_peek_height_min 0x7f070062 -int dimen design_fab_border_width 0x7f070063 -int dimen design_fab_elevation 0x7f070064 -int dimen design_fab_image_size 0x7f070065 -int dimen design_fab_size_mini 0x7f070066 -int dimen design_fab_size_normal 0x7f070067 -int dimen design_fab_translation_z_hovered_focused 0x7f070068 -int dimen design_fab_translation_z_pressed 0x7f070069 -int dimen design_navigation_elevation 0x7f07006a -int dimen design_navigation_icon_padding 0x7f07006b -int dimen design_navigation_icon_size 0x7f07006c -int dimen design_navigation_item_horizontal_padding 0x7f07006d -int dimen design_navigation_item_icon_padding 0x7f07006e -int dimen design_navigation_max_width 0x7f07006f -int dimen design_navigation_padding_bottom 0x7f070070 -int dimen design_navigation_separator_vertical_padding 0x7f070071 -int dimen design_snackbar_action_inline_max_width 0x7f070072 -int dimen design_snackbar_background_corner_radius 0x7f070073 -int dimen design_snackbar_elevation 0x7f070074 -int dimen design_snackbar_extra_spacing_horizontal 0x7f070075 -int dimen design_snackbar_max_width 0x7f070076 -int dimen design_snackbar_min_width 0x7f070077 -int dimen design_snackbar_padding_horizontal 0x7f070078 -int dimen design_snackbar_padding_vertical 0x7f070079 -int dimen design_snackbar_padding_vertical_2lines 0x7f07007a -int dimen design_snackbar_text_size 0x7f07007b -int dimen design_tab_max_width 0x7f07007c -int dimen design_tab_scrollable_min_width 0x7f07007d -int dimen design_tab_text_size 0x7f07007e -int dimen design_tab_text_size_2line 0x7f07007f -int dimen design_textinput_caption_translate_y 0x7f070080 -int dimen disabled_alpha_material_dark 0x7f070081 -int dimen disabled_alpha_material_light 0x7f070082 -int dimen fab_margin 0x7f070083 -int dimen fastscroll_default_thickness 0x7f070084 -int dimen fastscroll_margin 0x7f070085 -int dimen fastscroll_minimum_range 0x7f070086 -int dimen font_size 0x7f070087 -int dimen font_size_small 0x7f070088 -int dimen font_small_large 0x7f070089 -int dimen font_small_medium 0x7f07008a -int dimen highlight_alpha_material_colored 0x7f07008b -int dimen highlight_alpha_material_dark 0x7f07008c -int dimen highlight_alpha_material_light 0x7f07008d -int dimen hint_alpha_material_dark 0x7f07008e -int dimen hint_alpha_material_light 0x7f07008f -int dimen hint_pressed_alpha_material_dark 0x7f070090 -int dimen hint_pressed_alpha_material_light 0x7f070091 -int dimen item_touch_helper_max_drag_scroll_per_frame 0x7f070092 -int dimen item_touch_helper_swipe_escape_max_velocity 0x7f070093 -int dimen item_touch_helper_swipe_escape_velocity 0x7f070094 -int dimen mtrl_bottomappbar_fabOffsetEndMode 0x7f070095 -int dimen mtrl_bottomappbar_fab_cradle_margin 0x7f070096 -int dimen mtrl_bottomappbar_fab_cradle_rounded_corner_radius 0x7f070097 -int dimen mtrl_bottomappbar_fab_cradle_vertical_offset 0x7f070098 -int dimen mtrl_bottomappbar_height 0x7f070099 -int dimen mtrl_btn_corner_radius 0x7f07009a -int dimen mtrl_btn_dialog_btn_min_width 0x7f07009b -int dimen mtrl_btn_disabled_elevation 0x7f07009c -int dimen mtrl_btn_disabled_z 0x7f07009d -int dimen mtrl_btn_elevation 0x7f07009e -int dimen mtrl_btn_focused_z 0x7f07009f -int dimen mtrl_btn_hovered_z 0x7f0700a0 -int dimen mtrl_btn_icon_btn_padding_left 0x7f0700a1 -int dimen mtrl_btn_icon_padding 0x7f0700a2 -int dimen mtrl_btn_inset 0x7f0700a3 -int dimen mtrl_btn_letter_spacing 0x7f0700a4 -int dimen mtrl_btn_padding_bottom 0x7f0700a5 -int dimen mtrl_btn_padding_left 0x7f0700a6 -int dimen mtrl_btn_padding_right 0x7f0700a7 -int dimen mtrl_btn_padding_top 0x7f0700a8 -int dimen mtrl_btn_pressed_z 0x7f0700a9 -int dimen mtrl_btn_stroke_size 0x7f0700aa -int dimen mtrl_btn_text_btn_icon_padding 0x7f0700ab -int dimen mtrl_btn_text_btn_padding_left 0x7f0700ac -int dimen mtrl_btn_text_btn_padding_right 0x7f0700ad -int dimen mtrl_btn_text_size 0x7f0700ae -int dimen mtrl_btn_z 0x7f0700af -int dimen mtrl_card_elevation 0x7f0700b0 -int dimen mtrl_card_spacing 0x7f0700b1 -int dimen mtrl_chip_pressed_translation_z 0x7f0700b2 -int dimen mtrl_chip_text_size 0x7f0700b3 -int dimen mtrl_fab_elevation 0x7f0700b4 -int dimen mtrl_fab_translation_z_hovered_focused 0x7f0700b5 -int dimen mtrl_fab_translation_z_pressed 0x7f0700b6 -int dimen mtrl_navigation_elevation 0x7f0700b7 -int dimen mtrl_navigation_item_horizontal_padding 0x7f0700b8 -int dimen mtrl_navigation_item_icon_padding 0x7f0700b9 -int dimen mtrl_snackbar_background_corner_radius 0x7f0700ba -int dimen mtrl_snackbar_margin 0x7f0700bb -int dimen mtrl_textinput_box_bottom_offset 0x7f0700bc -int dimen mtrl_textinput_box_corner_radius_medium 0x7f0700bd -int dimen mtrl_textinput_box_corner_radius_small 0x7f0700be -int dimen mtrl_textinput_box_label_cutout_padding 0x7f0700bf -int dimen mtrl_textinput_box_padding_end 0x7f0700c0 -int dimen mtrl_textinput_box_stroke_width_default 0x7f0700c1 -int dimen mtrl_textinput_box_stroke_width_focused 0x7f0700c2 -int dimen mtrl_textinput_outline_box_expanded_padding 0x7f0700c3 -int dimen mtrl_toolbar_default_height 0x7f0700c4 -int dimen notification_action_icon_size 0x7f0700c5 -int dimen notification_action_text_size 0x7f0700c6 -int dimen notification_big_circle_margin 0x7f0700c7 -int dimen notification_content_margin_start 0x7f0700c8 -int dimen notification_large_icon_height 0x7f0700c9 -int dimen notification_large_icon_width 0x7f0700ca -int dimen notification_main_column_padding_top 0x7f0700cb -int dimen notification_media_narrow_margin 0x7f0700cc -int dimen notification_right_icon_size 0x7f0700cd -int dimen notification_right_side_padding_top 0x7f0700ce -int dimen notification_small_icon_background_padding 0x7f0700cf -int dimen notification_small_icon_size_as_large 0x7f0700d0 -int dimen notification_subtext_size 0x7f0700d1 -int dimen notification_top_pad 0x7f0700d2 -int dimen notification_top_pad_large_text 0x7f0700d3 -int dimen tooltip_corner_radius 0x7f0700d4 -int dimen tooltip_horizontal_padding 0x7f0700d5 -int dimen tooltip_margin 0x7f0700d6 -int dimen tooltip_precise_anchor_extra_offset 0x7f0700d7 -int dimen tooltip_precise_anchor_threshold 0x7f0700d8 -int dimen tooltip_vertical_padding 0x7f0700d9 -int dimen tooltip_y_offset_non_touch 0x7f0700da -int dimen tooltip_y_offset_touch 0x7f0700db -int drawable abc_ab_share_pack_mtrl_alpha 0x7f080007 -int drawable abc_action_bar_item_background_material 0x7f080008 -int drawable abc_btn_borderless_material 0x7f080009 -int drawable abc_btn_check_material 0x7f08000a -int drawable abc_btn_check_to_on_mtrl_000 0x7f08000b -int drawable abc_btn_check_to_on_mtrl_015 0x7f08000c -int drawable abc_btn_colored_material 0x7f08000d -int drawable abc_btn_default_mtrl_shape 0x7f08000e -int drawable abc_btn_radio_material 0x7f08000f -int drawable abc_btn_radio_to_on_mtrl_000 0x7f080010 -int drawable abc_btn_radio_to_on_mtrl_015 0x7f080011 -int drawable abc_btn_switch_to_on_mtrl_00001 0x7f080012 -int drawable abc_btn_switch_to_on_mtrl_00012 0x7f080013 -int drawable abc_cab_background_internal_bg 0x7f080014 -int drawable abc_cab_background_top_material 0x7f080015 -int drawable abc_cab_background_top_mtrl_alpha 0x7f080016 -int drawable abc_control_background_material 0x7f080017 -int drawable abc_dialog_material_background 0x7f080018 -int drawable abc_edit_text_material 0x7f080019 -int drawable abc_ic_ab_back_material 0x7f08001a -int drawable abc_ic_arrow_drop_right_black_24dp 0x7f08001b -int drawable abc_ic_clear_material 0x7f08001c -int drawable abc_ic_commit_search_api_mtrl_alpha 0x7f08001d -int drawable abc_ic_go_search_api_material 0x7f08001e -int drawable abc_ic_menu_copy_mtrl_am_alpha 0x7f08001f -int drawable abc_ic_menu_cut_mtrl_alpha 0x7f080020 -int drawable abc_ic_menu_overflow_material 0x7f080021 -int drawable abc_ic_menu_paste_mtrl_am_alpha 0x7f080022 -int drawable abc_ic_menu_selectall_mtrl_alpha 0x7f080023 -int drawable abc_ic_menu_share_mtrl_alpha 0x7f080024 -int drawable abc_ic_search_api_material 0x7f080025 -int drawable abc_ic_star_black_16dp 0x7f080026 -int drawable abc_ic_star_black_36dp 0x7f080027 -int drawable abc_ic_star_black_48dp 0x7f080028 -int drawable abc_ic_star_half_black_16dp 0x7f080029 -int drawable abc_ic_star_half_black_36dp 0x7f08002a -int drawable abc_ic_star_half_black_48dp 0x7f08002b -int drawable abc_ic_voice_search_api_material 0x7f08002c -int drawable abc_item_background_holo_dark 0x7f08002d -int drawable abc_item_background_holo_light 0x7f08002e -int drawable abc_list_divider_material 0x7f08002f -int drawable abc_list_divider_mtrl_alpha 0x7f080030 -int drawable abc_list_focused_holo 0x7f080031 -int drawable abc_list_longpressed_holo 0x7f080032 -int drawable abc_list_pressed_holo_dark 0x7f080033 -int drawable abc_list_pressed_holo_light 0x7f080034 -int drawable abc_list_selector_background_transition_holo_dark 0x7f080035 -int drawable abc_list_selector_background_transition_holo_light 0x7f080036 -int drawable abc_list_selector_disabled_holo_dark 0x7f080037 -int drawable abc_list_selector_disabled_holo_light 0x7f080038 -int drawable abc_list_selector_holo_dark 0x7f080039 -int drawable abc_list_selector_holo_light 0x7f08003a -int drawable abc_menu_hardkey_panel_mtrl_mult 0x7f08003b -int drawable abc_popup_background_mtrl_mult 0x7f08003c -int drawable abc_ratingbar_indicator_material 0x7f08003d -int drawable abc_ratingbar_material 0x7f08003e -int drawable abc_ratingbar_small_material 0x7f08003f -int drawable abc_scrubber_control_off_mtrl_alpha 0x7f080040 -int drawable abc_scrubber_control_to_pressed_mtrl_000 0x7f080041 -int drawable abc_scrubber_control_to_pressed_mtrl_005 0x7f080042 -int drawable abc_scrubber_primary_mtrl_alpha 0x7f080043 -int drawable abc_scrubber_track_mtrl_alpha 0x7f080044 -int drawable abc_seekbar_thumb_material 0x7f080045 -int drawable abc_seekbar_tick_mark_material 0x7f080046 -int drawable abc_seekbar_track_material 0x7f080047 -int drawable abc_spinner_mtrl_am_alpha 0x7f080048 -int drawable abc_spinner_textfield_background_material 0x7f080049 -int drawable abc_switch_thumb_material 0x7f08004a -int drawable abc_switch_track_mtrl_alpha 0x7f08004b -int drawable abc_tab_indicator_material 0x7f08004c -int drawable abc_tab_indicator_mtrl_alpha 0x7f08004d -int drawable abc_text_cursor_material 0x7f08004e -int drawable abc_text_select_handle_left_mtrl_dark 0x7f08004f -int drawable abc_text_select_handle_left_mtrl_light 0x7f080050 -int drawable abc_text_select_handle_middle_mtrl_dark 0x7f080051 -int drawable abc_text_select_handle_middle_mtrl_light 0x7f080052 -int drawable abc_text_select_handle_right_mtrl_dark 0x7f080053 -int drawable abc_text_select_handle_right_mtrl_light 0x7f080054 -int drawable abc_textfield_activated_mtrl_alpha 0x7f080055 -int drawable abc_textfield_default_mtrl_alpha 0x7f080056 -int drawable abc_textfield_search_activated_mtrl_alpha 0x7f080057 -int drawable abc_textfield_search_default_mtrl_alpha 0x7f080058 -int drawable abc_textfield_search_material 0x7f080059 -int drawable abc_vector_test 0x7f08005a -int drawable avd_hide_password 0x7f08005b -int drawable avd_show_password 0x7f08005c -int drawable design_bottom_navigation_item_background 0x7f08005d -int drawable design_fab_background 0x7f08005e -int drawable design_ic_visibility 0x7f08005f -int drawable design_ic_visibility_off 0x7f080060 -int drawable design_password_eye 0x7f080061 -int drawable design_snackbar_background 0x7f080062 -int drawable ic_launcher_background 0x7f080063 -int drawable ic_launcher_foreground 0x7f080064 -int drawable ic_mtrl_chip_checked_black 0x7f080065 -int drawable ic_mtrl_chip_checked_circle 0x7f080066 -int drawable ic_mtrl_chip_close_circle 0x7f080067 -int drawable mtrl_snackbar_background 0x7f080068 -int drawable mtrl_tabs_default_indicator 0x7f080069 -int drawable navigation_empty_icon 0x7f08006a -int drawable notification_action_background 0x7f08006b -int drawable notification_bg 0x7f08006c -int drawable notification_bg_low 0x7f08006d -int drawable notification_bg_low_normal 0x7f08006e -int drawable notification_bg_low_pressed 0x7f08006f -int drawable notification_bg_normal 0x7f080070 -int drawable notification_bg_normal_pressed 0x7f080071 -int drawable notification_icon_background 0x7f080072 -int drawable notification_template_icon_bg 0x7f080073 -int drawable notification_template_icon_low_bg 0x7f080074 -int drawable notification_tile_bg 0x7f080075 -int drawable notify_panel_notification_icon_bg 0x7f080076 -int drawable tooltip_frame_dark 0x7f080077 -int drawable tooltip_frame_light 0x7f080078 -int id ALT 0x7f090000 -int id CTRL 0x7f090001 -int id FUNCTION 0x7f090002 -int id META 0x7f090003 -int id SHIFT 0x7f090004 -int id SYM 0x7f090005 -int id action_bar 0x7f090006 -int id action_bar_activity_content 0x7f090007 -int id action_bar_container 0x7f090008 -int id action_bar_root 0x7f090009 -int id action_bar_spinner 0x7f09000a -int id action_bar_subtitle 0x7f09000b -int id action_bar_title 0x7f09000c -int id action_container 0x7f09000d -int id action_context_bar 0x7f09000e -int id action_divider 0x7f09000f -int id action_image 0x7f090010 -int id action_menu_divider 0x7f090011 -int id action_menu_presenter 0x7f090012 -int id action_mode_bar 0x7f090013 -int id action_mode_bar_stub 0x7f090014 -int id action_mode_close_button 0x7f090015 -int id action_settings 0x7f090016 -int id action_text 0x7f090017 -int id actions 0x7f090018 -int id activity_chooser_view_content 0x7f090019 -int id add 0x7f09001a -int id alertTitle 0x7f09001b -int id all 0x7f09001c -int id always 0x7f09001d -int id async 0x7f09001e -int id auto 0x7f09001f -int id barrier 0x7f090020 -int id beginning 0x7f090021 -int id blocking 0x7f090022 -int id bottom 0x7f090023 -int id button 0x7f090024 -int id buttonPanel 0x7f090025 -int id center 0x7f090026 -int id center_horizontal 0x7f090027 -int id center_vertical 0x7f090028 -int id chains 0x7f090029 -int id checkbox 0x7f09002a -int id chronometer 0x7f09002b -int id churchInfo 0x7f09002c -int id churchSelectPrompt 0x7f09002d -int id church_selection 0x7f09002e -int id clip_horizontal 0x7f09002f -int id clip_vertical 0x7f090030 -int id collapseActionView 0x7f090031 -int id container 0x7f090032 -int id content 0x7f090033 -int id contentPanel 0x7f090034 -int id coordinator 0x7f090035 -int id custom 0x7f090036 -int id customPanel 0x7f090037 -int id decor_content_parent 0x7f090038 -int id default_activity_button 0x7f090039 -int id design_bottom_sheet 0x7f09003a -int id design_menu_item_action_area 0x7f09003b -int id design_menu_item_action_area_stub 0x7f09003c -int id design_menu_item_text 0x7f09003d -int id design_navigation_view 0x7f09003e -int id dimensions 0x7f09003f -int id direct 0x7f090040 -int id disableHome 0x7f090041 -int id edit_query 0x7f090042 -int id end 0x7f090043 -int id enterAlways 0x7f090044 -int id enterAlwaysCollapsed 0x7f090045 -int id exitUntilCollapsed 0x7f090046 -int id expand_activities_button 0x7f090047 -int id expanded_menu 0x7f090048 -int id fill 0x7f090049 -int id fill_horizontal 0x7f09004a -int id fill_vertical 0x7f09004b -int id filled 0x7f09004c -int id fixed 0x7f09004d -int id fontSizePrompt 0x7f09004e -int id forever 0x7f09004f -int id ghost_view 0x7f090050 -int id gone 0x7f090051 -int id group_divider 0x7f090052 -int id groups 0x7f090053 -int id home 0x7f090054 -int id homeAsUp 0x7f090055 -int id icon 0x7f090056 -int id icon_group 0x7f090057 -int id ifRoom 0x7f090058 -int id image 0x7f090059 -int id info 0x7f09005a -int id invisible 0x7f09005b -int id italic 0x7f09005c -int id item_touch_helper_previous_elevation 0x7f09005d -int id labeled 0x7f09005e -int id largeLabel 0x7f09005f -int id largeSize 0x7f090060 -int id left 0x7f090061 -int id line1 0x7f090062 -int id line3 0x7f090063 -int id listMode 0x7f090064 -int id list_item 0x7f090065 -int id masked 0x7f090066 -int id mediumSize 0x7f090067 -int id message 0x7f090068 -int id middle 0x7f090069 -int id mini 0x7f09006a -int id mtrl_child_content_container 0x7f09006b -int id mtrl_internal_children_alpha_tag 0x7f09006c -int id multiply 0x7f09006d -int id navigation_header_container 0x7f09006e -int id never 0x7f09006f -int id none 0x7f090070 -int id normal 0x7f090071 -int id normalSize 0x7f090072 -int id notification_background 0x7f090073 -int id notification_main_column 0x7f090074 -int id notification_main_column_container 0x7f090075 -int id outline 0x7f090076 -int id packed 0x7f090077 -int id parallax 0x7f090078 -int id parent 0x7f090079 -int id parentPanel 0x7f09007a -int id parent_matrix 0x7f09007b -int id percent 0x7f09007c -int id pin 0x7f09007d -int id progress_circular 0x7f09007e -int id progress_horizontal 0x7f09007f -int id radio 0x7f090080 -int id right 0x7f090081 -int id right_icon 0x7f090082 -int id right_side 0x7f090083 -int id save_image_matrix 0x7f090084 -int id save_non_transition_alpha 0x7f090085 -int id save_scale_type 0x7f090086 -int id screen 0x7f090087 -int id scriptor 0x7f090088 -int id scroll 0x7f090089 -int id scrollIndicatorDown 0x7f09008a -int id scrollIndicatorUp 0x7f09008b -int id scrollView 0x7f09008c -int id scrollable 0x7f09008d -int id search_badge 0x7f09008e -int id search_bar 0x7f09008f -int id search_button 0x7f090090 -int id search_close_btn 0x7f090091 -int id search_edit_frame 0x7f090092 -int id search_go_btn 0x7f090093 -int id search_mag_icon 0x7f090094 -int id search_plate 0x7f090095 -int id search_src_text 0x7f090096 -int id search_voice_btn 0x7f090097 -int id select_dialog_listview 0x7f090098 -int id selected 0x7f090099 -int id shortcut 0x7f09009a -int id showCustom 0x7f09009b -int id showHome 0x7f09009c -int id showTitle 0x7f09009d -int id smallLabel 0x7f09009e -int id smallSize 0x7f09009f -int id snackbar_action 0x7f0900a0 -int id snackbar_text 0x7f0900a1 -int id snap 0x7f0900a2 -int id snapMargins 0x7f0900a3 -int id spacer 0x7f0900a4 -int id split_action_bar 0x7f0900a5 -int id spread 0x7f0900a6 -int id spread_inside 0x7f0900a7 -int id src_atop 0x7f0900a8 -int id src_in 0x7f0900a9 -int id src_over 0x7f0900aa -int id standard 0x7f0900ab -int id start 0x7f0900ac -int id stretch 0x7f0900ad -int id submenuarrow 0x7f0900ae -int id submit_area 0x7f0900af -int id tabMode 0x7f0900b0 -int id tag_transition_group 0x7f0900b1 -int id tag_unhandled_key_event_manager 0x7f0900b2 -int id tag_unhandled_key_listeners 0x7f0900b3 -int id text 0x7f0900b4 -int id text2 0x7f0900b5 -int id textSpacerNoButtons 0x7f0900b6 -int id textSpacerNoTitle 0x7f0900b7 -int id textStart 0x7f0900b8 -int id text_input_password_toggle 0x7f0900b9 -int id textinput_counter 0x7f0900ba -int id textinput_error 0x7f0900bb -int id textinput_helper_text 0x7f0900bc -int id time 0x7f0900bd -int id title 0x7f0900be -int id titleDividerNoCustom 0x7f0900bf -int id title_template 0x7f0900c0 -int id toolbar 0x7f0900c1 -int id top 0x7f0900c2 -int id topPanel 0x7f0900c3 -int id touch_outside 0x7f0900c4 -int id transition_current_scene 0x7f0900c5 -int id transition_layout_save 0x7f0900c6 -int id transition_position 0x7f0900c7 -int id transition_scene_layoutid_cache 0x7f0900c8 -int id transition_transform 0x7f0900c9 -int id uniform 0x7f0900ca -int id unlabeled 0x7f0900cb -int id up 0x7f0900cc -int id useLogo 0x7f0900cd -int id view_offset_helper 0x7f0900ce -int id visible 0x7f0900cf -int id withText 0x7f0900d0 -int id wrap 0x7f0900d1 -int id wrap_content 0x7f0900d2 -int integer abc_config_activityDefaultDur 0x7f0a0000 -int integer abc_config_activityShortDur 0x7f0a0001 -int integer app_bar_elevation_anim_duration 0x7f0a0002 -int integer bottom_sheet_slide_duration 0x7f0a0003 -int integer cancel_button_image_alpha 0x7f0a0004 -int integer config_tooltipAnimTime 0x7f0a0005 -int integer design_snackbar_text_max_lines 0x7f0a0006 -int integer design_tab_indicator_anim_duration_ms 0x7f0a0007 -int integer hide_password_duration 0x7f0a0008 -int integer mtrl_btn_anim_delay_ms 0x7f0a0009 -int integer mtrl_btn_anim_duration_ms 0x7f0a000a -int integer mtrl_chip_anim_duration 0x7f0a000b -int integer mtrl_tab_indicator_anim_duration_ms 0x7f0a000c -int integer show_password_duration 0x7f0a000d -int integer status_bar_notification_info_maxnum 0x7f0a000e -int interpolator mtrl_fast_out_linear_in 0x7f0b0000 -int interpolator mtrl_fast_out_slow_in 0x7f0b0001 -int interpolator mtrl_linear 0x7f0b0002 -int interpolator mtrl_linear_out_slow_in 0x7f0b0003 -int layout abc_action_bar_title_item 0x7f0c0000 -int layout abc_action_bar_up_container 0x7f0c0001 -int layout abc_action_menu_item_layout 0x7f0c0002 -int layout abc_action_menu_layout 0x7f0c0003 -int layout abc_action_mode_bar 0x7f0c0004 -int layout abc_action_mode_close_item_material 0x7f0c0005 -int layout abc_activity_chooser_view 0x7f0c0006 -int layout abc_activity_chooser_view_list_item 0x7f0c0007 -int layout abc_alert_dialog_button_bar_material 0x7f0c0008 -int layout abc_alert_dialog_material 0x7f0c0009 -int layout abc_alert_dialog_title_material 0x7f0c000a -int layout abc_cascading_menu_item_layout 0x7f0c000b -int layout abc_dialog_title_material 0x7f0c000c -int layout abc_expanded_menu_layout 0x7f0c000d -int layout abc_list_menu_item_checkbox 0x7f0c000e -int layout abc_list_menu_item_icon 0x7f0c000f -int layout abc_list_menu_item_layout 0x7f0c0010 -int layout abc_list_menu_item_radio 0x7f0c0011 -int layout abc_popup_menu_header_item_layout 0x7f0c0012 -int layout abc_popup_menu_item_layout 0x7f0c0013 -int layout abc_screen_content_include 0x7f0c0014 -int layout abc_screen_simple 0x7f0c0015 -int layout abc_screen_simple_overlay_action_mode 0x7f0c0016 -int layout abc_screen_toolbar 0x7f0c0017 -int layout abc_search_dropdown_item_icons_2line 0x7f0c0018 -int layout abc_search_view 0x7f0c0019 -int layout abc_select_dialog_material 0x7f0c001a -int layout abc_tooltip 0x7f0c001b -int layout activity_main 0x7f0c001c -int layout activity_settings 0x7f0c001d -int layout content_main 0x7f0c001e -int layout content_settings 0x7f0c001f -int layout design_bottom_navigation_item 0x7f0c0020 -int layout design_bottom_sheet_dialog 0x7f0c0021 -int layout design_layout_snackbar 0x7f0c0022 -int layout design_layout_snackbar_include 0x7f0c0023 -int layout design_layout_tab_icon 0x7f0c0024 -int layout design_layout_tab_text 0x7f0c0025 -int layout design_menu_item_action_area 0x7f0c0026 -int layout design_navigation_item 0x7f0c0027 -int layout design_navigation_item_header 0x7f0c0028 -int layout design_navigation_item_separator 0x7f0c0029 -int layout design_navigation_item_subheader 0x7f0c002a -int layout design_navigation_menu 0x7f0c002b -int layout design_navigation_menu_item 0x7f0c002c -int layout design_text_input_password_icon 0x7f0c002d -int layout mtrl_layout_snackbar 0x7f0c002e -int layout mtrl_layout_snackbar_include 0x7f0c002f -int layout notification_action 0x7f0c0030 -int layout notification_action_tombstone 0x7f0c0031 -int layout notification_template_custom_big 0x7f0c0032 -int layout notification_template_icon_group 0x7f0c0033 -int layout notification_template_part_chronometer 0x7f0c0034 -int layout notification_template_part_time 0x7f0c0035 -int layout select_dialog_item_material 0x7f0c0036 -int layout select_dialog_multichoice_material 0x7f0c0037 -int layout select_dialog_singlechoice_material 0x7f0c0038 -int layout support_simple_spinner_dropdown_item 0x7f0c0039 -int menu menu_main 0x7f0d0000 -int mipmap ic_launcher 0x7f0e0000 -int mipmap ic_launcher_round 0x7f0e0001 -int string abc_action_bar_home_description 0x7f0f0000 -int string abc_action_bar_up_description 0x7f0f0001 -int string abc_action_menu_overflow_description 0x7f0f0002 -int string abc_action_mode_done 0x7f0f0003 -int string abc_activity_chooser_view_see_all 0x7f0f0004 -int string abc_activitychooserview_choose_application 0x7f0f0005 -int string abc_capital_off 0x7f0f0006 -int string abc_capital_on 0x7f0f0007 -int string abc_font_family_body_1_material 0x7f0f0008 -int string abc_font_family_body_2_material 0x7f0f0009 -int string abc_font_family_button_material 0x7f0f000a -int string abc_font_family_caption_material 0x7f0f000b -int string abc_font_family_display_1_material 0x7f0f000c -int string abc_font_family_display_2_material 0x7f0f000d -int string abc_font_family_display_3_material 0x7f0f000e -int string abc_font_family_display_4_material 0x7f0f000f -int string abc_font_family_headline_material 0x7f0f0010 -int string abc_font_family_menu_material 0x7f0f0011 -int string abc_font_family_subhead_material 0x7f0f0012 -int string abc_font_family_title_material 0x7f0f0013 -int string abc_menu_alt_shortcut_label 0x7f0f0014 -int string abc_menu_ctrl_shortcut_label 0x7f0f0015 -int string abc_menu_delete_shortcut_label 0x7f0f0016 -int string abc_menu_enter_shortcut_label 0x7f0f0017 -int string abc_menu_function_shortcut_label 0x7f0f0018 -int string abc_menu_meta_shortcut_label 0x7f0f0019 -int string abc_menu_shift_shortcut_label 0x7f0f001a -int string abc_menu_space_shortcut_label 0x7f0f001b -int string abc_menu_sym_shortcut_label 0x7f0f001c -int string abc_prepend_shortcut_label 0x7f0f001d -int string abc_search_hint 0x7f0f001e -int string abc_searchview_description_clear 0x7f0f001f -int string abc_searchview_description_query 0x7f0f0020 -int string abc_searchview_description_search 0x7f0f0021 -int string abc_searchview_description_submit 0x7f0f0022 -int string abc_searchview_description_voice 0x7f0f0023 -int string abc_shareactionprovider_share_with 0x7f0f0024 -int string abc_shareactionprovider_share_with_application 0x7f0f0025 -int string abc_toolbar_collapse_description 0x7f0f0026 -int string action_settings 0x7f0f0027 -int string app_name 0x7f0f0028 -int string appbar_scrolling_view_behavior 0x7f0f0029 -int string bottom_sheet_behavior 0x7f0f002a -int string character_counter_content_description 0x7f0f002b -int string character_counter_pattern 0x7f0f002c -int string fab_transformation_scrim_behavior 0x7f0f002d -int string fab_transformation_sheet_behavior 0x7f0f002e -int string hide_bottom_view_on_scroll_behavior 0x7f0f002f -int string mtrl_chip_close_icon_content_description 0x7f0f0030 -int string password_toggle_content_description 0x7f0f0031 -int string path_password_eye 0x7f0f0032 -int string path_password_eye_mask_strike_through 0x7f0f0033 -int string path_password_eye_mask_visible 0x7f0f0034 -int string path_password_strike_through 0x7f0f0035 -int string search_menu_title 0x7f0f0036 -int string status_bar_notification_info_overflow 0x7f0f0037 -int string title_activity_settings 0x7f0f0038 -int style AlertDialog_AppCompat 0x7f100000 -int style AlertDialog_AppCompat_Light 0x7f100001 -int style Animation_AppCompat_Dialog 0x7f100002 -int style Animation_AppCompat_DropDownUp 0x7f100003 -int style Animation_AppCompat_Tooltip 0x7f100004 -int style Animation_Design_BottomSheetDialog 0x7f100005 -int style AppTheme 0x7f100006 -int style AppTheme_AppBarOverlay 0x7f100007 -int style AppTheme_NoActionBar 0x7f100008 -int style AppTheme_PopupOverlay 0x7f100009 -int style Base_AlertDialog_AppCompat 0x7f10000a -int style Base_AlertDialog_AppCompat_Light 0x7f10000b -int style Base_Animation_AppCompat_Dialog 0x7f10000c -int style Base_Animation_AppCompat_DropDownUp 0x7f10000d -int style Base_Animation_AppCompat_Tooltip 0x7f10000e -int style Base_CardView 0x7f10000f -int style Base_DialogWindowTitle_AppCompat 0x7f100010 -int style Base_DialogWindowTitleBackground_AppCompat 0x7f100011 -int style Base_TextAppearance_AppCompat 0x7f100012 -int style Base_TextAppearance_AppCompat_Body1 0x7f100013 -int style Base_TextAppearance_AppCompat_Body2 0x7f100014 -int style Base_TextAppearance_AppCompat_Button 0x7f100015 -int style Base_TextAppearance_AppCompat_Caption 0x7f100016 -int style Base_TextAppearance_AppCompat_Display1 0x7f100017 -int style Base_TextAppearance_AppCompat_Display2 0x7f100018 -int style Base_TextAppearance_AppCompat_Display3 0x7f100019 -int style Base_TextAppearance_AppCompat_Display4 0x7f10001a -int style Base_TextAppearance_AppCompat_Headline 0x7f10001b -int style Base_TextAppearance_AppCompat_Inverse 0x7f10001c -int style Base_TextAppearance_AppCompat_Large 0x7f10001d -int style Base_TextAppearance_AppCompat_Large_Inverse 0x7f10001e -int style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large 0x7f10001f -int style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small 0x7f100020 -int style Base_TextAppearance_AppCompat_Medium 0x7f100021 -int style Base_TextAppearance_AppCompat_Medium_Inverse 0x7f100022 -int style Base_TextAppearance_AppCompat_Menu 0x7f100023 -int style Base_TextAppearance_AppCompat_SearchResult 0x7f100024 -int style Base_TextAppearance_AppCompat_SearchResult_Subtitle 0x7f100025 -int style Base_TextAppearance_AppCompat_SearchResult_Title 0x7f100026 -int style Base_TextAppearance_AppCompat_Small 0x7f100027 -int style Base_TextAppearance_AppCompat_Small_Inverse 0x7f100028 -int style Base_TextAppearance_AppCompat_Subhead 0x7f100029 -int style Base_TextAppearance_AppCompat_Subhead_Inverse 0x7f10002a -int style Base_TextAppearance_AppCompat_Title 0x7f10002b -int style Base_TextAppearance_AppCompat_Title_Inverse 0x7f10002c -int style Base_TextAppearance_AppCompat_Tooltip 0x7f10002d -int style Base_TextAppearance_AppCompat_Widget_ActionBar_Menu 0x7f10002e -int style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle 0x7f10002f -int style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse 0x7f100030 -int style Base_TextAppearance_AppCompat_Widget_ActionBar_Title 0x7f100031 -int style Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse 0x7f100032 -int style Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle 0x7f100033 -int style Base_TextAppearance_AppCompat_Widget_ActionMode_Title 0x7f100034 -int style Base_TextAppearance_AppCompat_Widget_Button 0x7f100035 -int style Base_TextAppearance_AppCompat_Widget_Button_Borderless_Colored 0x7f100036 -int style Base_TextAppearance_AppCompat_Widget_Button_Colored 0x7f100037 -int style Base_TextAppearance_AppCompat_Widget_Button_Inverse 0x7f100038 -int style Base_TextAppearance_AppCompat_Widget_DropDownItem 0x7f100039 -int style Base_TextAppearance_AppCompat_Widget_PopupMenu_Header 0x7f10003a -int style Base_TextAppearance_AppCompat_Widget_PopupMenu_Large 0x7f10003b -int style Base_TextAppearance_AppCompat_Widget_PopupMenu_Small 0x7f10003c -int style Base_TextAppearance_AppCompat_Widget_Switch 0x7f10003d -int style Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem 0x7f10003e -int style Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item 0x7f10003f -int style Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle 0x7f100040 -int style Base_TextAppearance_Widget_AppCompat_Toolbar_Title 0x7f100041 -int style Base_Theme_AppCompat 0x7f100042 -int style Base_Theme_AppCompat_CompactMenu 0x7f100043 -int style Base_Theme_AppCompat_Dialog 0x7f100044 -int style Base_Theme_AppCompat_Dialog_Alert 0x7f100045 -int style Base_Theme_AppCompat_Dialog_FixedSize 0x7f100046 -int style Base_Theme_AppCompat_Dialog_MinWidth 0x7f100047 -int style Base_Theme_AppCompat_DialogWhenLarge 0x7f100048 -int style Base_Theme_AppCompat_Light 0x7f100049 -int style Base_Theme_AppCompat_Light_DarkActionBar 0x7f10004a -int style Base_Theme_AppCompat_Light_Dialog 0x7f10004b -int style Base_Theme_AppCompat_Light_Dialog_Alert 0x7f10004c -int style Base_Theme_AppCompat_Light_Dialog_FixedSize 0x7f10004d -int style Base_Theme_AppCompat_Light_Dialog_MinWidth 0x7f10004e -int style Base_Theme_AppCompat_Light_DialogWhenLarge 0x7f10004f -int style Base_Theme_MaterialComponents 0x7f100050 -int style Base_Theme_MaterialComponents_Bridge 0x7f100051 -int style Base_Theme_MaterialComponents_CompactMenu 0x7f100052 -int style Base_Theme_MaterialComponents_Dialog 0x7f100053 -int style Base_Theme_MaterialComponents_Dialog_Alert 0x7f100054 -int style Base_Theme_MaterialComponents_Dialog_FixedSize 0x7f100055 -int style Base_Theme_MaterialComponents_Dialog_MinWidth 0x7f100056 -int style Base_Theme_MaterialComponents_DialogWhenLarge 0x7f100057 -int style Base_Theme_MaterialComponents_Light 0x7f100058 -int style Base_Theme_MaterialComponents_Light_Bridge 0x7f100059 -int style Base_Theme_MaterialComponents_Light_DarkActionBar 0x7f10005a -int style Base_Theme_MaterialComponents_Light_DarkActionBar_Bridge 0x7f10005b -int style Base_Theme_MaterialComponents_Light_Dialog 0x7f10005c -int style Base_Theme_MaterialComponents_Light_Dialog_Alert 0x7f10005d -int style Base_Theme_MaterialComponents_Light_Dialog_FixedSize 0x7f10005e -int style Base_Theme_MaterialComponents_Light_Dialog_MinWidth 0x7f10005f -int style Base_Theme_MaterialComponents_Light_DialogWhenLarge 0x7f100060 -int style Base_ThemeOverlay_AppCompat 0x7f100061 -int style Base_ThemeOverlay_AppCompat_ActionBar 0x7f100062 -int style Base_ThemeOverlay_AppCompat_Dark 0x7f100063 -int style Base_ThemeOverlay_AppCompat_Dark_ActionBar 0x7f100064 -int style Base_ThemeOverlay_AppCompat_Dialog 0x7f100065 -int style Base_ThemeOverlay_AppCompat_Dialog_Alert 0x7f100066 -int style Base_ThemeOverlay_AppCompat_Light 0x7f100067 -int style Base_ThemeOverlay_MaterialComponents_Dialog 0x7f100068 -int style Base_ThemeOverlay_MaterialComponents_Dialog_Alert 0x7f100069 -int style Base_V14_Theme_MaterialComponents 0x7f10006a -int style Base_V14_Theme_MaterialComponents_Bridge 0x7f10006b -int style Base_V14_Theme_MaterialComponents_Dialog 0x7f10006c -int style Base_V14_Theme_MaterialComponents_Light 0x7f10006d -int style Base_V14_Theme_MaterialComponents_Light_Bridge 0x7f10006e -int style Base_V14_Theme_MaterialComponents_Light_DarkActionBar_Bridge 0x7f10006f -int style Base_V14_Theme_MaterialComponents_Light_Dialog 0x7f100070 -int style Base_V14_ThemeOverlay_MaterialComponents_Dialog 0x7f100071 -int style Base_V14_ThemeOverlay_MaterialComponents_Dialog_Alert 0x7f100072 -int style Base_V21_Theme_AppCompat 0x7f100073 -int style Base_V21_Theme_AppCompat_Dialog 0x7f100074 -int style Base_V21_Theme_AppCompat_Light 0x7f100075 -int style Base_V21_Theme_AppCompat_Light_Dialog 0x7f100076 -int style Base_V21_ThemeOverlay_AppCompat_Dialog 0x7f100077 -int style Base_V22_Theme_AppCompat 0x7f100078 -int style Base_V22_Theme_AppCompat_Light 0x7f100079 -int style Base_V23_Theme_AppCompat 0x7f10007a -int style Base_V23_Theme_AppCompat_Light 0x7f10007b -int style Base_V26_Theme_AppCompat 0x7f10007c -int style Base_V26_Theme_AppCompat_Light 0x7f10007d -int style Base_V26_Widget_AppCompat_Toolbar 0x7f10007e -int style Base_V28_Theme_AppCompat 0x7f10007f -int style Base_V28_Theme_AppCompat_Light 0x7f100080 -int style Base_V7_Theme_AppCompat 0x7f100081 -int style Base_V7_Theme_AppCompat_Dialog 0x7f100082 -int style Base_V7_Theme_AppCompat_Light 0x7f100083 -int style Base_V7_Theme_AppCompat_Light_Dialog 0x7f100084 -int style Base_V7_ThemeOverlay_AppCompat_Dialog 0x7f100085 -int style Base_V7_Widget_AppCompat_AutoCompleteTextView 0x7f100086 -int style Base_V7_Widget_AppCompat_EditText 0x7f100087 -int style Base_V7_Widget_AppCompat_Toolbar 0x7f100088 -int style Base_Widget_AppCompat_ActionBar 0x7f100089 -int style Base_Widget_AppCompat_ActionBar_Solid 0x7f10008a -int style Base_Widget_AppCompat_ActionBar_TabBar 0x7f10008b -int style Base_Widget_AppCompat_ActionBar_TabText 0x7f10008c -int style Base_Widget_AppCompat_ActionBar_TabView 0x7f10008d -int style Base_Widget_AppCompat_ActionButton 0x7f10008e -int style Base_Widget_AppCompat_ActionButton_CloseMode 0x7f10008f -int style Base_Widget_AppCompat_ActionButton_Overflow 0x7f100090 -int style Base_Widget_AppCompat_ActionMode 0x7f100091 -int style Base_Widget_AppCompat_ActivityChooserView 0x7f100092 -int style Base_Widget_AppCompat_AutoCompleteTextView 0x7f100093 -int style Base_Widget_AppCompat_Button 0x7f100094 -int style Base_Widget_AppCompat_Button_Borderless 0x7f100095 -int style Base_Widget_AppCompat_Button_Borderless_Colored 0x7f100096 -int style Base_Widget_AppCompat_Button_ButtonBar_AlertDialog 0x7f100097 -int style Base_Widget_AppCompat_Button_Colored 0x7f100098 -int style Base_Widget_AppCompat_Button_Small 0x7f100099 -int style Base_Widget_AppCompat_ButtonBar 0x7f10009a -int style Base_Widget_AppCompat_ButtonBar_AlertDialog 0x7f10009b -int style Base_Widget_AppCompat_CompoundButton_CheckBox 0x7f10009c -int style Base_Widget_AppCompat_CompoundButton_RadioButton 0x7f10009d -int style Base_Widget_AppCompat_CompoundButton_Switch 0x7f10009e -int style Base_Widget_AppCompat_DrawerArrowToggle 0x7f10009f -int style Base_Widget_AppCompat_DrawerArrowToggle_Common 0x7f1000a0 -int style Base_Widget_AppCompat_DropDownItem_Spinner 0x7f1000a1 -int style Base_Widget_AppCompat_EditText 0x7f1000a2 -int style Base_Widget_AppCompat_ImageButton 0x7f1000a3 -int style Base_Widget_AppCompat_Light_ActionBar 0x7f1000a4 -int style Base_Widget_AppCompat_Light_ActionBar_Solid 0x7f1000a5 -int style Base_Widget_AppCompat_Light_ActionBar_TabBar 0x7f1000a6 -int style Base_Widget_AppCompat_Light_ActionBar_TabText 0x7f1000a7 -int style Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse 0x7f1000a8 -int style Base_Widget_AppCompat_Light_ActionBar_TabView 0x7f1000a9 -int style Base_Widget_AppCompat_Light_PopupMenu 0x7f1000aa -int style Base_Widget_AppCompat_Light_PopupMenu_Overflow 0x7f1000ab -int style Base_Widget_AppCompat_ListMenuView 0x7f1000ac -int style Base_Widget_AppCompat_ListPopupWindow 0x7f1000ad -int style Base_Widget_AppCompat_ListView 0x7f1000ae -int style Base_Widget_AppCompat_ListView_DropDown 0x7f1000af -int style Base_Widget_AppCompat_ListView_Menu 0x7f1000b0 -int style Base_Widget_AppCompat_PopupMenu 0x7f1000b1 -int style Base_Widget_AppCompat_PopupMenu_Overflow 0x7f1000b2 -int style Base_Widget_AppCompat_PopupWindow 0x7f1000b3 -int style Base_Widget_AppCompat_ProgressBar 0x7f1000b4 -int style Base_Widget_AppCompat_ProgressBar_Horizontal 0x7f1000b5 -int style Base_Widget_AppCompat_RatingBar 0x7f1000b6 -int style Base_Widget_AppCompat_RatingBar_Indicator 0x7f1000b7 -int style Base_Widget_AppCompat_RatingBar_Small 0x7f1000b8 -int style Base_Widget_AppCompat_SearchView 0x7f1000b9 -int style Base_Widget_AppCompat_SearchView_ActionBar 0x7f1000ba -int style Base_Widget_AppCompat_SeekBar 0x7f1000bb -int style Base_Widget_AppCompat_SeekBar_Discrete 0x7f1000bc -int style Base_Widget_AppCompat_Spinner 0x7f1000bd -int style Base_Widget_AppCompat_Spinner_Underlined 0x7f1000be -int style Base_Widget_AppCompat_TextView_SpinnerItem 0x7f1000bf -int style Base_Widget_AppCompat_Toolbar 0x7f1000c0 -int style Base_Widget_AppCompat_Toolbar_Button_Navigation 0x7f1000c1 -int style Base_Widget_Design_TabLayout 0x7f1000c2 -int style Base_Widget_MaterialComponents_Chip 0x7f1000c3 -int style Base_Widget_MaterialComponents_TextInputEditText 0x7f1000c4 -int style Base_Widget_MaterialComponents_TextInputLayout 0x7f1000c5 -int style CardView 0x7f1000c6 -int style CardView_Dark 0x7f1000c7 -int style CardView_Light 0x7f1000c8 -int style LargeText 0x7f1000c9 -int style MediumText 0x7f1000ca -int style NormalText 0x7f1000cb -int style Platform_AppCompat 0x7f1000cc -int style Platform_AppCompat_Light 0x7f1000cd -int style Platform_MaterialComponents 0x7f1000ce -int style Platform_MaterialComponents_Dialog 0x7f1000cf -int style Platform_MaterialComponents_Light 0x7f1000d0 -int style Platform_MaterialComponents_Light_Dialog 0x7f1000d1 -int style Platform_ThemeOverlay_AppCompat 0x7f1000d2 -int style Platform_ThemeOverlay_AppCompat_Dark 0x7f1000d3 -int style Platform_ThemeOverlay_AppCompat_Light 0x7f1000d4 -int style Platform_V21_AppCompat 0x7f1000d5 -int style Platform_V21_AppCompat_Light 0x7f1000d6 -int style Platform_V25_AppCompat 0x7f1000d7 -int style Platform_V25_AppCompat_Light 0x7f1000d8 -int style Platform_Widget_AppCompat_Spinner 0x7f1000d9 -int style RtlOverlay_DialogWindowTitle_AppCompat 0x7f1000da -int style RtlOverlay_Widget_AppCompat_ActionBar_TitleItem 0x7f1000db -int style RtlOverlay_Widget_AppCompat_DialogTitle_Icon 0x7f1000dc -int style RtlOverlay_Widget_AppCompat_PopupMenuItem 0x7f1000dd -int style RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup 0x7f1000de -int style RtlOverlay_Widget_AppCompat_PopupMenuItem_Shortcut 0x7f1000df -int style RtlOverlay_Widget_AppCompat_PopupMenuItem_SubmenuArrow 0x7f1000e0 -int style RtlOverlay_Widget_AppCompat_PopupMenuItem_Text 0x7f1000e1 -int style RtlOverlay_Widget_AppCompat_PopupMenuItem_Title 0x7f1000e2 -int style RtlOverlay_Widget_AppCompat_Search_DropDown 0x7f1000e3 -int style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1 0x7f1000e4 -int style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2 0x7f1000e5 -int style RtlOverlay_Widget_AppCompat_Search_DropDown_Query 0x7f1000e6 -int style RtlOverlay_Widget_AppCompat_Search_DropDown_Text 0x7f1000e7 -int style RtlOverlay_Widget_AppCompat_SearchView_MagIcon 0x7f1000e8 -int style RtlUnderlay_Widget_AppCompat_ActionButton 0x7f1000e9 -int style RtlUnderlay_Widget_AppCompat_ActionButton_Overflow 0x7f1000ea -int style SmallText 0x7f1000eb -int style TextAppearance_AppCompat 0x7f1000ec -int style TextAppearance_AppCompat_Body1 0x7f1000ed -int style TextAppearance_AppCompat_Body2 0x7f1000ee -int style TextAppearance_AppCompat_Button 0x7f1000ef -int style TextAppearance_AppCompat_Caption 0x7f1000f0 -int style TextAppearance_AppCompat_Display1 0x7f1000f1 -int style TextAppearance_AppCompat_Display2 0x7f1000f2 -int style TextAppearance_AppCompat_Display3 0x7f1000f3 -int style TextAppearance_AppCompat_Display4 0x7f1000f4 -int style TextAppearance_AppCompat_Headline 0x7f1000f5 -int style TextAppearance_AppCompat_Inverse 0x7f1000f6 -int style TextAppearance_AppCompat_Large 0x7f1000f7 -int style TextAppearance_AppCompat_Large_Inverse 0x7f1000f8 -int style TextAppearance_AppCompat_Light_SearchResult_Subtitle 0x7f1000f9 -int style TextAppearance_AppCompat_Light_SearchResult_Title 0x7f1000fa -int style TextAppearance_AppCompat_Light_Widget_PopupMenu_Large 0x7f1000fb -int style TextAppearance_AppCompat_Light_Widget_PopupMenu_Small 0x7f1000fc -int style TextAppearance_AppCompat_Medium 0x7f1000fd -int style TextAppearance_AppCompat_Medium_Inverse 0x7f1000fe -int style TextAppearance_AppCompat_Menu 0x7f1000ff -int style TextAppearance_AppCompat_SearchResult_Subtitle 0x7f100100 -int style TextAppearance_AppCompat_SearchResult_Title 0x7f100101 -int style TextAppearance_AppCompat_Small 0x7f100102 -int style TextAppearance_AppCompat_Small_Inverse 0x7f100103 -int style TextAppearance_AppCompat_Subhead 0x7f100104 -int style TextAppearance_AppCompat_Subhead_Inverse 0x7f100105 -int style TextAppearance_AppCompat_Title 0x7f100106 -int style TextAppearance_AppCompat_Title_Inverse 0x7f100107 -int style TextAppearance_AppCompat_Tooltip 0x7f100108 -int style TextAppearance_AppCompat_Widget_ActionBar_Menu 0x7f100109 -int style TextAppearance_AppCompat_Widget_ActionBar_Subtitle 0x7f10010a -int style TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse 0x7f10010b -int style TextAppearance_AppCompat_Widget_ActionBar_Title 0x7f10010c -int style TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse 0x7f10010d -int style TextAppearance_AppCompat_Widget_ActionMode_Subtitle 0x7f10010e -int style TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse 0x7f10010f -int style TextAppearance_AppCompat_Widget_ActionMode_Title 0x7f100110 -int style TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse 0x7f100111 -int style TextAppearance_AppCompat_Widget_Button 0x7f100112 -int style TextAppearance_AppCompat_Widget_Button_Borderless_Colored 0x7f100113 -int style TextAppearance_AppCompat_Widget_Button_Colored 0x7f100114 -int style TextAppearance_AppCompat_Widget_Button_Inverse 0x7f100115 -int style TextAppearance_AppCompat_Widget_DropDownItem 0x7f100116 -int style TextAppearance_AppCompat_Widget_PopupMenu_Header 0x7f100117 -int style TextAppearance_AppCompat_Widget_PopupMenu_Large 0x7f100118 -int style TextAppearance_AppCompat_Widget_PopupMenu_Small 0x7f100119 -int style TextAppearance_AppCompat_Widget_Switch 0x7f10011a -int style TextAppearance_AppCompat_Widget_TextView_SpinnerItem 0x7f10011b -int style TextAppearance_Compat_Notification 0x7f10011c -int style TextAppearance_Compat_Notification_Info 0x7f10011d -int style TextAppearance_Compat_Notification_Line2 0x7f10011e -int style TextAppearance_Compat_Notification_Time 0x7f10011f -int style TextAppearance_Compat_Notification_Title 0x7f100120 -int style TextAppearance_Design_CollapsingToolbar_Expanded 0x7f100121 -int style TextAppearance_Design_Counter 0x7f100122 -int style TextAppearance_Design_Counter_Overflow 0x7f100123 -int style TextAppearance_Design_Error 0x7f100124 -int style TextAppearance_Design_HelperText 0x7f100125 -int style TextAppearance_Design_Hint 0x7f100126 -int style TextAppearance_Design_Snackbar_Message 0x7f100127 -int style TextAppearance_Design_Tab 0x7f100128 -int style TextAppearance_MaterialComponents_Body1 0x7f100129 -int style TextAppearance_MaterialComponents_Body2 0x7f10012a -int style TextAppearance_MaterialComponents_Button 0x7f10012b -int style TextAppearance_MaterialComponents_Caption 0x7f10012c -int style TextAppearance_MaterialComponents_Chip 0x7f10012d -int style TextAppearance_MaterialComponents_Headline1 0x7f10012e -int style TextAppearance_MaterialComponents_Headline2 0x7f10012f -int style TextAppearance_MaterialComponents_Headline3 0x7f100130 -int style TextAppearance_MaterialComponents_Headline4 0x7f100131 -int style TextAppearance_MaterialComponents_Headline5 0x7f100132 -int style TextAppearance_MaterialComponents_Headline6 0x7f100133 -int style TextAppearance_MaterialComponents_Overline 0x7f100134 -int style TextAppearance_MaterialComponents_Subtitle1 0x7f100135 -int style TextAppearance_MaterialComponents_Subtitle2 0x7f100136 -int style TextAppearance_MaterialComponents_Tab 0x7f100137 -int style TextAppearance_Widget_AppCompat_ExpandedMenu_Item 0x7f100138 -int style TextAppearance_Widget_AppCompat_Toolbar_Subtitle 0x7f100139 -int style TextAppearance_Widget_AppCompat_Toolbar_Title 0x7f10013a -int style Theme_AppCompat 0x7f10013b -int style Theme_AppCompat_CompactMenu 0x7f10013c -int style Theme_AppCompat_DayNight 0x7f10013d -int style Theme_AppCompat_DayNight_DarkActionBar 0x7f10013e -int style Theme_AppCompat_DayNight_Dialog 0x7f10013f -int style Theme_AppCompat_DayNight_Dialog_Alert 0x7f100140 -int style Theme_AppCompat_DayNight_Dialog_MinWidth 0x7f100141 -int style Theme_AppCompat_DayNight_DialogWhenLarge 0x7f100142 -int style Theme_AppCompat_DayNight_NoActionBar 0x7f100143 -int style Theme_AppCompat_Dialog 0x7f100144 -int style Theme_AppCompat_Dialog_Alert 0x7f100145 -int style Theme_AppCompat_Dialog_MinWidth 0x7f100146 -int style Theme_AppCompat_DialogWhenLarge 0x7f100147 -int style Theme_AppCompat_Light 0x7f100148 -int style Theme_AppCompat_Light_DarkActionBar 0x7f100149 -int style Theme_AppCompat_Light_Dialog 0x7f10014a -int style Theme_AppCompat_Light_Dialog_Alert 0x7f10014b -int style Theme_AppCompat_Light_Dialog_MinWidth 0x7f10014c -int style Theme_AppCompat_Light_DialogWhenLarge 0x7f10014d -int style Theme_AppCompat_Light_NoActionBar 0x7f10014e -int style Theme_AppCompat_NoActionBar 0x7f10014f -int style Theme_Design 0x7f100150 -int style Theme_Design_BottomSheetDialog 0x7f100151 -int style Theme_Design_Light 0x7f100152 -int style Theme_Design_Light_BottomSheetDialog 0x7f100153 -int style Theme_Design_Light_NoActionBar 0x7f100154 -int style Theme_Design_NoActionBar 0x7f100155 -int style Theme_MaterialComponents 0x7f100156 -int style Theme_MaterialComponents_BottomSheetDialog 0x7f100157 -int style Theme_MaterialComponents_Bridge 0x7f100158 -int style Theme_MaterialComponents_CompactMenu 0x7f100159 -int style Theme_MaterialComponents_Dialog 0x7f10015a -int style Theme_MaterialComponents_Dialog_Alert 0x7f10015b -int style Theme_MaterialComponents_Dialog_MinWidth 0x7f10015c -int style Theme_MaterialComponents_DialogWhenLarge 0x7f10015d -int style Theme_MaterialComponents_Light 0x7f10015e -int style Theme_MaterialComponents_Light_BottomSheetDialog 0x7f10015f -int style Theme_MaterialComponents_Light_Bridge 0x7f100160 -int style Theme_MaterialComponents_Light_DarkActionBar 0x7f100161 -int style Theme_MaterialComponents_Light_DarkActionBar_Bridge 0x7f100162 -int style Theme_MaterialComponents_Light_Dialog 0x7f100163 -int style Theme_MaterialComponents_Light_Dialog_Alert 0x7f100164 -int style Theme_MaterialComponents_Light_Dialog_MinWidth 0x7f100165 -int style Theme_MaterialComponents_Light_DialogWhenLarge 0x7f100166 -int style Theme_MaterialComponents_Light_NoActionBar 0x7f100167 -int style Theme_MaterialComponents_Light_NoActionBar_Bridge 0x7f100168 -int style Theme_MaterialComponents_NoActionBar 0x7f100169 -int style Theme_MaterialComponents_NoActionBar_Bridge 0x7f10016a -int style ThemeOverlay_AppCompat 0x7f10016b -int style ThemeOverlay_AppCompat_ActionBar 0x7f10016c -int style ThemeOverlay_AppCompat_Dark 0x7f10016d -int style ThemeOverlay_AppCompat_Dark_ActionBar 0x7f10016e -int style ThemeOverlay_AppCompat_Dialog 0x7f10016f -int style ThemeOverlay_AppCompat_Dialog_Alert 0x7f100170 -int style ThemeOverlay_AppCompat_Light 0x7f100171 -int style ThemeOverlay_MaterialComponents 0x7f100172 -int style ThemeOverlay_MaterialComponents_ActionBar 0x7f100173 -int style ThemeOverlay_MaterialComponents_Dark 0x7f100174 -int style ThemeOverlay_MaterialComponents_Dark_ActionBar 0x7f100175 -int style ThemeOverlay_MaterialComponents_Dialog 0x7f100176 -int style ThemeOverlay_MaterialComponents_Dialog_Alert 0x7f100177 -int style ThemeOverlay_MaterialComponents_Light 0x7f100178 -int style ThemeOverlay_MaterialComponents_TextInputEditText 0x7f100179 -int style ThemeOverlay_MaterialComponents_TextInputEditText_FilledBox 0x7f10017a -int style ThemeOverlay_MaterialComponents_TextInputEditText_FilledBox_Dense 0x7f10017b -int style ThemeOverlay_MaterialComponents_TextInputEditText_OutlinedBox 0x7f10017c -int style ThemeOverlay_MaterialComponents_TextInputEditText_OutlinedBox_Dense 0x7f10017d -int style Widget_AppCompat_ActionBar 0x7f10017e -int style Widget_AppCompat_ActionBar_Solid 0x7f10017f -int style Widget_AppCompat_ActionBar_TabBar 0x7f100180 -int style Widget_AppCompat_ActionBar_TabText 0x7f100181 -int style Widget_AppCompat_ActionBar_TabView 0x7f100182 -int style Widget_AppCompat_ActionButton 0x7f100183 -int style Widget_AppCompat_ActionButton_CloseMode 0x7f100184 -int style Widget_AppCompat_ActionButton_Overflow 0x7f100185 -int style Widget_AppCompat_ActionMode 0x7f100186 -int style Widget_AppCompat_ActivityChooserView 0x7f100187 -int style Widget_AppCompat_AutoCompleteTextView 0x7f100188 -int style Widget_AppCompat_Button 0x7f100189 -int style Widget_AppCompat_Button_Borderless 0x7f10018a -int style Widget_AppCompat_Button_Borderless_Colored 0x7f10018b -int style Widget_AppCompat_Button_ButtonBar_AlertDialog 0x7f10018c -int style Widget_AppCompat_Button_Colored 0x7f10018d -int style Widget_AppCompat_Button_Small 0x7f10018e -int style Widget_AppCompat_ButtonBar 0x7f10018f -int style Widget_AppCompat_ButtonBar_AlertDialog 0x7f100190 -int style Widget_AppCompat_CompoundButton_CheckBox 0x7f100191 -int style Widget_AppCompat_CompoundButton_RadioButton 0x7f100192 -int style Widget_AppCompat_CompoundButton_Switch 0x7f100193 -int style Widget_AppCompat_DrawerArrowToggle 0x7f100194 -int style Widget_AppCompat_DropDownItem_Spinner 0x7f100195 -int style Widget_AppCompat_EditText 0x7f100196 -int style Widget_AppCompat_ImageButton 0x7f100197 -int style Widget_AppCompat_Light_ActionBar 0x7f100198 -int style Widget_AppCompat_Light_ActionBar_Solid 0x7f100199 -int style Widget_AppCompat_Light_ActionBar_Solid_Inverse 0x7f10019a -int style Widget_AppCompat_Light_ActionBar_TabBar 0x7f10019b -int style Widget_AppCompat_Light_ActionBar_TabBar_Inverse 0x7f10019c -int style Widget_AppCompat_Light_ActionBar_TabText 0x7f10019d -int style Widget_AppCompat_Light_ActionBar_TabText_Inverse 0x7f10019e -int style Widget_AppCompat_Light_ActionBar_TabView 0x7f10019f -int style Widget_AppCompat_Light_ActionBar_TabView_Inverse 0x7f1001a0 -int style Widget_AppCompat_Light_ActionButton 0x7f1001a1 -int style Widget_AppCompat_Light_ActionButton_CloseMode 0x7f1001a2 -int style Widget_AppCompat_Light_ActionButton_Overflow 0x7f1001a3 -int style Widget_AppCompat_Light_ActionMode_Inverse 0x7f1001a4 -int style Widget_AppCompat_Light_ActivityChooserView 0x7f1001a5 -int style Widget_AppCompat_Light_AutoCompleteTextView 0x7f1001a6 -int style Widget_AppCompat_Light_DropDownItem_Spinner 0x7f1001a7 -int style Widget_AppCompat_Light_ListPopupWindow 0x7f1001a8 -int style Widget_AppCompat_Light_ListView_DropDown 0x7f1001a9 -int style Widget_AppCompat_Light_PopupMenu 0x7f1001aa -int style Widget_AppCompat_Light_PopupMenu_Overflow 0x7f1001ab -int style Widget_AppCompat_Light_SearchView 0x7f1001ac -int style Widget_AppCompat_Light_Spinner_DropDown_ActionBar 0x7f1001ad -int style Widget_AppCompat_ListMenuView 0x7f1001ae -int style Widget_AppCompat_ListPopupWindow 0x7f1001af -int style Widget_AppCompat_ListView 0x7f1001b0 -int style Widget_AppCompat_ListView_DropDown 0x7f1001b1 -int style Widget_AppCompat_ListView_Menu 0x7f1001b2 -int style Widget_AppCompat_PopupMenu 0x7f1001b3 -int style Widget_AppCompat_PopupMenu_Overflow 0x7f1001b4 -int style Widget_AppCompat_PopupWindow 0x7f1001b5 -int style Widget_AppCompat_ProgressBar 0x7f1001b6 -int style Widget_AppCompat_ProgressBar_Horizontal 0x7f1001b7 -int style Widget_AppCompat_RatingBar 0x7f1001b8 -int style Widget_AppCompat_RatingBar_Indicator 0x7f1001b9 -int style Widget_AppCompat_RatingBar_Small 0x7f1001ba -int style Widget_AppCompat_SearchView 0x7f1001bb -int style Widget_AppCompat_SearchView_ActionBar 0x7f1001bc -int style Widget_AppCompat_SeekBar 0x7f1001bd -int style Widget_AppCompat_SeekBar_Discrete 0x7f1001be -int style Widget_AppCompat_Spinner 0x7f1001bf -int style Widget_AppCompat_Spinner_DropDown 0x7f1001c0 -int style Widget_AppCompat_Spinner_DropDown_ActionBar 0x7f1001c1 -int style Widget_AppCompat_Spinner_Underlined 0x7f1001c2 -int style Widget_AppCompat_TextView_SpinnerItem 0x7f1001c3 -int style Widget_AppCompat_Toolbar 0x7f1001c4 -int style Widget_AppCompat_Toolbar_Button_Navigation 0x7f1001c5 -int style Widget_Compat_NotificationActionContainer 0x7f1001c6 -int style Widget_Compat_NotificationActionText 0x7f1001c7 -int style Widget_Design_AppBarLayout 0x7f1001c8 -int style Widget_Design_BottomNavigationView 0x7f1001c9 -int style Widget_Design_BottomSheet_Modal 0x7f1001ca -int style Widget_Design_CollapsingToolbar 0x7f1001cb -int style Widget_Design_FloatingActionButton 0x7f1001cc -int style Widget_Design_NavigationView 0x7f1001cd -int style Widget_Design_ScrimInsetsFrameLayout 0x7f1001ce -int style Widget_Design_Snackbar 0x7f1001cf -int style Widget_Design_TabLayout 0x7f1001d0 -int style Widget_Design_TextInputLayout 0x7f1001d1 -int style Widget_MaterialComponents_BottomAppBar 0x7f1001d2 -int style Widget_MaterialComponents_BottomAppBar_Colored 0x7f1001d3 -int style Widget_MaterialComponents_BottomNavigationView 0x7f1001d4 -int style Widget_MaterialComponents_BottomNavigationView_Colored 0x7f1001d5 -int style Widget_MaterialComponents_BottomSheet_Modal 0x7f1001d6 -int style Widget_MaterialComponents_Button 0x7f1001d7 -int style Widget_MaterialComponents_Button_Icon 0x7f1001d8 -int style Widget_MaterialComponents_Button_OutlinedButton 0x7f1001d9 -int style Widget_MaterialComponents_Button_OutlinedButton_Icon 0x7f1001da -int style Widget_MaterialComponents_Button_TextButton 0x7f1001db -int style Widget_MaterialComponents_Button_TextButton_Dialog 0x7f1001dc -int style Widget_MaterialComponents_Button_TextButton_Dialog_Icon 0x7f1001dd -int style Widget_MaterialComponents_Button_TextButton_Icon 0x7f1001de -int style Widget_MaterialComponents_Button_UnelevatedButton 0x7f1001df -int style Widget_MaterialComponents_Button_UnelevatedButton_Icon 0x7f1001e0 -int style Widget_MaterialComponents_CardView 0x7f1001e1 -int style Widget_MaterialComponents_Chip_Action 0x7f1001e2 -int style Widget_MaterialComponents_Chip_Choice 0x7f1001e3 -int style Widget_MaterialComponents_Chip_Entry 0x7f1001e4 -int style Widget_MaterialComponents_Chip_Filter 0x7f1001e5 -int style Widget_MaterialComponents_ChipGroup 0x7f1001e6 -int style Widget_MaterialComponents_FloatingActionButton 0x7f1001e7 -int style Widget_MaterialComponents_NavigationView 0x7f1001e8 -int style Widget_MaterialComponents_Snackbar 0x7f1001e9 -int style Widget_MaterialComponents_Snackbar_FullWidth 0x7f1001ea -int style Widget_MaterialComponents_TabLayout 0x7f1001eb -int style Widget_MaterialComponents_TabLayout_Colored 0x7f1001ec -int style Widget_MaterialComponents_TextInputEditText_FilledBox 0x7f1001ed -int style Widget_MaterialComponents_TextInputEditText_FilledBox_Dense 0x7f1001ee -int style Widget_MaterialComponents_TextInputEditText_OutlinedBox 0x7f1001ef -int style Widget_MaterialComponents_TextInputEditText_OutlinedBox_Dense 0x7f1001f0 -int style Widget_MaterialComponents_TextInputLayout_FilledBox 0x7f1001f1 -int style Widget_MaterialComponents_TextInputLayout_FilledBox_Dense 0x7f1001f2 -int style Widget_MaterialComponents_TextInputLayout_OutlinedBox 0x7f1001f3 -int style Widget_MaterialComponents_TextInputLayout_OutlinedBox_Dense 0x7f1001f4 -int style Widget_MaterialComponents_Toolbar 0x7f1001f5 -int style Widget_Support_CoordinatorLayout 0x7f1001f6 -int[] styleable ActionBar { 0x7f040031, 0x7f040032, 0x7f040033, 0x7f040097, 0x7f040098, 0x7f040099, 0x7f04009a, 0x7f04009b, 0x7f04009c, 0x7f0400aa, 0x7f0400af, 0x7f0400b0, 0x7f0400bb, 0x7f0400e6, 0x7f0400eb, 0x7f0400f0, 0x7f0400f1, 0x7f0400f3, 0x7f0400fd, 0x7f040107, 0x7f04015c, 0x7f040168, 0x7f040179, 0x7f04017d, 0x7f04017e, 0x7f0401ac, 0x7f0401af, 0x7f0401f4, 0x7f0401fe } -int styleable ActionBar_background 0 -int styleable ActionBar_backgroundSplit 1 -int styleable ActionBar_backgroundStacked 2 -int styleable ActionBar_contentInsetEnd 3 -int styleable ActionBar_contentInsetEndWithActions 4 -int styleable ActionBar_contentInsetLeft 5 -int styleable ActionBar_contentInsetRight 6 -int styleable ActionBar_contentInsetStart 7 -int styleable ActionBar_contentInsetStartWithNavigation 8 -int styleable ActionBar_customNavigationLayout 9 -int styleable ActionBar_displayOptions 10 -int styleable ActionBar_divider 11 -int styleable ActionBar_elevation 12 -int styleable ActionBar_height 13 -int styleable ActionBar_hideOnContentScroll 14 -int styleable ActionBar_homeAsUpIndicator 15 -int styleable ActionBar_homeLayout 16 -int styleable ActionBar_icon 17 -int styleable ActionBar_indeterminateProgressStyle 18 -int styleable ActionBar_itemPadding 19 -int styleable ActionBar_logo 20 -int styleable ActionBar_navigationMode 21 -int styleable ActionBar_popupTheme 22 -int styleable ActionBar_progressBarPadding 23 -int styleable ActionBar_progressBarStyle 24 -int styleable ActionBar_subtitle 25 -int styleable ActionBar_subtitleTextStyle 26 -int styleable ActionBar_title 27 -int styleable ActionBar_titleTextStyle 28 -int[] styleable ActionBarLayout { 0x010100b3 } -int styleable ActionBarLayout_android_layout_gravity 0 -int[] styleable ActionMenuItemView { 0x0101013f } -int styleable ActionMenuItemView_android_minWidth 0 -int[] styleable ActionMenuView { } -int[] styleable ActionMode { 0x7f040031, 0x7f040032, 0x7f040081, 0x7f0400e6, 0x7f0401af, 0x7f0401fe } -int styleable ActionMode_background 0 -int styleable ActionMode_backgroundSplit 1 -int styleable ActionMode_closeItemLayout 2 -int styleable ActionMode_height 3 -int styleable ActionMode_subtitleTextStyle 4 -int styleable ActionMode_titleTextStyle 5 -int[] styleable ActivityChooserView { 0x7f0400c1, 0x7f0400fe } -int styleable ActivityChooserView_expandActivityOverflowButtonDrawable 0 -int styleable ActivityChooserView_initialActivityCount 1 -int[] styleable AlertDialog { 0x010100f2, 0x7f040054, 0x7f040055, 0x7f040153, 0x7f040154, 0x7f040165, 0x7f040194, 0x7f040195 } -int styleable AlertDialog_android_layout 0 -int styleable AlertDialog_buttonIconDimen 1 -int styleable AlertDialog_buttonPanelSideLayout 2 -int styleable AlertDialog_listItemLayout 3 -int styleable AlertDialog_listLayout 4 -int styleable AlertDialog_multiChoiceItemLayout 5 -int styleable AlertDialog_showTitle 6 -int styleable AlertDialog_singleChoiceItemLayout 7 -int[] styleable AnimatedStateListDrawableCompat { 0x0101011c, 0x01010194, 0x01010195, 0x01010196, 0x0101030c, 0x0101030d } -int styleable AnimatedStateListDrawableCompat_android_dither 0 -int styleable AnimatedStateListDrawableCompat_android_visible 1 -int styleable AnimatedStateListDrawableCompat_android_variablePadding 2 -int styleable AnimatedStateListDrawableCompat_android_constantSize 3 -int styleable AnimatedStateListDrawableCompat_android_enterFadeDuration 4 -int styleable AnimatedStateListDrawableCompat_android_exitFadeDuration 5 -int[] styleable AnimatedStateListDrawableItem { 0x010100d0, 0x01010199 } -int styleable AnimatedStateListDrawableItem_android_id 0 -int styleable AnimatedStateListDrawableItem_android_drawable 1 -int[] styleable AnimatedStateListDrawableTransition { 0x01010199, 0x01010449, 0x0101044a, 0x0101044b } -int styleable AnimatedStateListDrawableTransition_android_drawable 0 -int styleable AnimatedStateListDrawableTransition_android_toId 1 -int styleable AnimatedStateListDrawableTransition_android_fromId 2 -int styleable AnimatedStateListDrawableTransition_android_reversible 3 -int[] styleable AppBarLayout { 0x010100d4, 0x0101048f, 0x01010540, 0x7f0400bb, 0x7f0400c2, 0x7f04014e } -int styleable AppBarLayout_android_background 0 -int styleable AppBarLayout_android_touchscreenBlocksFocus 1 -int styleable AppBarLayout_android_keyboardNavigationCluster 2 -int styleable AppBarLayout_elevation 3 -int styleable AppBarLayout_expanded 4 -int styleable AppBarLayout_liftOnScroll 5 -int[] styleable AppBarLayoutStates { 0x7f0401a2, 0x7f0401a3, 0x7f0401a4, 0x7f0401a5 } -int styleable AppBarLayoutStates_state_collapsed 0 -int styleable AppBarLayoutStates_state_collapsible 1 -int styleable AppBarLayoutStates_state_liftable 2 -int styleable AppBarLayoutStates_state_lifted 3 -int[] styleable AppBarLayout_Layout { 0x7f04014c, 0x7f04014d } -int styleable AppBarLayout_Layout_layout_scrollFlags 0 -int styleable AppBarLayout_Layout_layout_scrollInterpolator 1 -int[] styleable AppCompatImageView { 0x01010119, 0x7f04019f, 0x7f0401f2, 0x7f0401f3 } -int styleable AppCompatImageView_android_src 0 -int styleable AppCompatImageView_srcCompat 1 -int styleable AppCompatImageView_tint 2 -int styleable AppCompatImageView_tintMode 3 -int[] styleable AppCompatSeekBar { 0x01010142, 0x7f0401ef, 0x7f0401f0, 0x7f0401f1 } -int styleable AppCompatSeekBar_android_thumb 0 -int styleable AppCompatSeekBar_tickMark 1 -int styleable AppCompatSeekBar_tickMarkTint 2 -int styleable AppCompatSeekBar_tickMarkTintMode 3 -int[] styleable AppCompatTextHelper { 0x01010034, 0x0101016d, 0x0101016e, 0x0101016f, 0x01010170, 0x01010392, 0x01010393 } -int styleable AppCompatTextHelper_android_textAppearance 0 -int styleable AppCompatTextHelper_android_drawableTop 1 -int styleable AppCompatTextHelper_android_drawableBottom 2 -int styleable AppCompatTextHelper_android_drawableLeft 3 -int styleable AppCompatTextHelper_android_drawableRight 4 -int styleable AppCompatTextHelper_android_drawableStart 5 -int styleable AppCompatTextHelper_android_drawableEnd 6 -int[] styleable AppCompatTextView { 0x01010034, 0x7f04002c, 0x7f04002d, 0x7f04002e, 0x7f04002f, 0x7f040030, 0x7f0400d5, 0x7f0400d8, 0x7f04010f, 0x7f04014f, 0x7f0401cf } -int styleable AppCompatTextView_android_textAppearance 0 -int styleable AppCompatTextView_autoSizeMaxTextSize 1 -int styleable AppCompatTextView_autoSizeMinTextSize 2 -int styleable AppCompatTextView_autoSizePresetSizes 3 -int styleable AppCompatTextView_autoSizeStepGranularity 4 -int styleable AppCompatTextView_autoSizeTextType 5 -int styleable AppCompatTextView_firstBaselineToTopHeight 6 -int styleable AppCompatTextView_fontFamily 7 -int styleable AppCompatTextView_lastBaselineToBottomHeight 8 -int styleable AppCompatTextView_lineHeight 9 -int styleable AppCompatTextView_textAllCaps 10 -int[] styleable AppCompatTheme { 0x01010057, 0x010100ae, 0x7f040000, 0x7f040001, 0x7f040002, 0x7f040003, 0x7f040004, 0x7f040005, 0x7f040006, 0x7f040007, 0x7f040008, 0x7f040009, 0x7f04000a, 0x7f04000b, 0x7f04000c, 0x7f04000e, 0x7f04000f, 0x7f040010, 0x7f040011, 0x7f040012, 0x7f040013, 0x7f040014, 0x7f040015, 0x7f040016, 0x7f040017, 0x7f040018, 0x7f040019, 0x7f04001a, 0x7f04001b, 0x7f04001c, 0x7f04001d, 0x7f04001e, 0x7f040021, 0x7f040022, 0x7f040023, 0x7f040024, 0x7f040025, 0x7f04002b, 0x7f040040, 0x7f04004e, 0x7f04004f, 0x7f040050, 0x7f040051, 0x7f040052, 0x7f040056, 0x7f040057, 0x7f040062, 0x7f040067, 0x7f040087, 0x7f040088, 0x7f040089, 0x7f04008a, 0x7f04008b, 0x7f04008c, 0x7f04008d, 0x7f04008e, 0x7f04008f, 0x7f040091, 0x7f0400a3, 0x7f0400ac, 0x7f0400ad, 0x7f0400ae, 0x7f0400b1, 0x7f0400b3, 0x7f0400b6, 0x7f0400b7, 0x7f0400b8, 0x7f0400b9, 0x7f0400ba, 0x7f0400f0, 0x7f0400fc, 0x7f040151, 0x7f040152, 0x7f040155, 0x7f040156, 0x7f040157, 0x7f040158, 0x7f040159, 0x7f04015a, 0x7f04015b, 0x7f040170, 0x7f040171, 0x7f040172, 0x7f040178, 0x7f04017a, 0x7f040181, 0x7f040182, 0x7f040183, 0x7f040184, 0x7f04018c, 0x7f04018d, 0x7f04018e, 0x7f04018f, 0x7f04019c, 0x7f04019d, 0x7f0401b3, 0x7f0401da, 0x7f0401db, 0x7f0401dc, 0x7f0401dd, 0x7f0401df, 0x7f0401e0, 0x7f0401e1, 0x7f0401e2, 0x7f0401e5, 0x7f0401e6, 0x7f040200, 0x7f040201, 0x7f040202, 0x7f040203, 0x7f04020a, 0x7f04020c, 0x7f04020d, 0x7f04020e, 0x7f04020f, 0x7f040210, 0x7f040211, 0x7f040212, 0x7f040213, 0x7f040214, 0x7f040215 } -int styleable AppCompatTheme_android_windowIsFloating 0 -int styleable AppCompatTheme_android_windowAnimationStyle 1 -int styleable AppCompatTheme_actionBarDivider 2 -int styleable AppCompatTheme_actionBarItemBackground 3 -int styleable AppCompatTheme_actionBarPopupTheme 4 -int styleable AppCompatTheme_actionBarSize 5 -int styleable AppCompatTheme_actionBarSplitStyle 6 -int styleable AppCompatTheme_actionBarStyle 7 -int styleable AppCompatTheme_actionBarTabBarStyle 8 -int styleable AppCompatTheme_actionBarTabStyle 9 -int styleable AppCompatTheme_actionBarTabTextStyle 10 -int styleable AppCompatTheme_actionBarTheme 11 -int styleable AppCompatTheme_actionBarWidgetTheme 12 -int styleable AppCompatTheme_actionButtonStyle 13 -int styleable AppCompatTheme_actionDropDownStyle 14 -int styleable AppCompatTheme_actionMenuTextAppearance 15 -int styleable AppCompatTheme_actionMenuTextColor 16 -int styleable AppCompatTheme_actionModeBackground 17 -int styleable AppCompatTheme_actionModeCloseButtonStyle 18 -int styleable AppCompatTheme_actionModeCloseDrawable 19 -int styleable AppCompatTheme_actionModeCopyDrawable 20 -int styleable AppCompatTheme_actionModeCutDrawable 21 -int styleable AppCompatTheme_actionModeFindDrawable 22 -int styleable AppCompatTheme_actionModePasteDrawable 23 -int styleable AppCompatTheme_actionModePopupWindowStyle 24 -int styleable AppCompatTheme_actionModeSelectAllDrawable 25 -int styleable AppCompatTheme_actionModeShareDrawable 26 -int styleable AppCompatTheme_actionModeSplitBackground 27 -int styleable AppCompatTheme_actionModeStyle 28 -int styleable AppCompatTheme_actionModeWebSearchDrawable 29 -int styleable AppCompatTheme_actionOverflowButtonStyle 30 -int styleable AppCompatTheme_actionOverflowMenuStyle 31 -int styleable AppCompatTheme_activityChooserViewStyle 32 -int styleable AppCompatTheme_alertDialogButtonGroupStyle 33 -int styleable AppCompatTheme_alertDialogCenterButtons 34 -int styleable AppCompatTheme_alertDialogStyle 35 -int styleable AppCompatTheme_alertDialogTheme 36 -int styleable AppCompatTheme_autoCompleteTextViewStyle 37 -int styleable AppCompatTheme_borderlessButtonStyle 38 -int styleable AppCompatTheme_buttonBarButtonStyle 39 -int styleable AppCompatTheme_buttonBarNegativeButtonStyle 40 -int styleable AppCompatTheme_buttonBarNeutralButtonStyle 41 -int styleable AppCompatTheme_buttonBarPositiveButtonStyle 42 -int styleable AppCompatTheme_buttonBarStyle 43 -int styleable AppCompatTheme_buttonStyle 44 -int styleable AppCompatTheme_buttonStyleSmall 45 -int styleable AppCompatTheme_checkboxStyle 46 -int styleable AppCompatTheme_checkedTextViewStyle 47 -int styleable AppCompatTheme_colorAccent 48 -int styleable AppCompatTheme_colorBackgroundFloating 49 -int styleable AppCompatTheme_colorButtonNormal 50 -int styleable AppCompatTheme_colorControlActivated 51 -int styleable AppCompatTheme_colorControlHighlight 52 -int styleable AppCompatTheme_colorControlNormal 53 -int styleable AppCompatTheme_colorError 54 -int styleable AppCompatTheme_colorPrimary 55 -int styleable AppCompatTheme_colorPrimaryDark 56 -int styleable AppCompatTheme_colorSwitchThumbNormal 57 -int styleable AppCompatTheme_controlBackground 58 -int styleable AppCompatTheme_dialogCornerRadius 59 -int styleable AppCompatTheme_dialogPreferredPadding 60 -int styleable AppCompatTheme_dialogTheme 61 -int styleable AppCompatTheme_dividerHorizontal 62 -int styleable AppCompatTheme_dividerVertical 63 -int styleable AppCompatTheme_dropDownListViewStyle 64 -int styleable AppCompatTheme_dropdownListPreferredItemHeight 65 -int styleable AppCompatTheme_editTextBackground 66 -int styleable AppCompatTheme_editTextColor 67 -int styleable AppCompatTheme_editTextStyle 68 -int styleable AppCompatTheme_homeAsUpIndicator 69 -int styleable AppCompatTheme_imageButtonStyle 70 -int styleable AppCompatTheme_listChoiceBackgroundIndicator 71 -int styleable AppCompatTheme_listDividerAlertDialog 72 -int styleable AppCompatTheme_listMenuViewStyle 73 -int styleable AppCompatTheme_listPopupWindowStyle 74 -int styleable AppCompatTheme_listPreferredItemHeight 75 -int styleable AppCompatTheme_listPreferredItemHeightLarge 76 -int styleable AppCompatTheme_listPreferredItemHeightSmall 77 -int styleable AppCompatTheme_listPreferredItemPaddingLeft 78 -int styleable AppCompatTheme_listPreferredItemPaddingRight 79 -int styleable AppCompatTheme_panelBackground 80 -int styleable AppCompatTheme_panelMenuListTheme 81 -int styleable AppCompatTheme_panelMenuListWidth 82 -int styleable AppCompatTheme_popupMenuStyle 83 -int styleable AppCompatTheme_popupWindowStyle 84 -int styleable AppCompatTheme_radioButtonStyle 85 -int styleable AppCompatTheme_ratingBarStyle 86 -int styleable AppCompatTheme_ratingBarStyleIndicator 87 -int styleable AppCompatTheme_ratingBarStyleSmall 88 -int styleable AppCompatTheme_searchViewStyle 89 -int styleable AppCompatTheme_seekBarStyle 90 -int styleable AppCompatTheme_selectableItemBackground 91 -int styleable AppCompatTheme_selectableItemBackgroundBorderless 92 -int styleable AppCompatTheme_spinnerDropDownItemStyle 93 -int styleable AppCompatTheme_spinnerStyle 94 -int styleable AppCompatTheme_switchStyle 95 -int styleable AppCompatTheme_textAppearanceLargePopupMenu 96 -int styleable AppCompatTheme_textAppearanceListItem 97 -int styleable AppCompatTheme_textAppearanceListItemSecondary 98 -int styleable AppCompatTheme_textAppearanceListItemSmall 99 -int styleable AppCompatTheme_textAppearancePopupMenuHeader 100 -int styleable AppCompatTheme_textAppearanceSearchResultSubtitle 101 -int styleable AppCompatTheme_textAppearanceSearchResultTitle 102 -int styleable AppCompatTheme_textAppearanceSmallPopupMenu 103 -int styleable AppCompatTheme_textColorAlertDialogListItem 104 -int styleable AppCompatTheme_textColorSearchUrl 105 -int styleable AppCompatTheme_toolbarNavigationButtonStyle 106 -int styleable AppCompatTheme_toolbarStyle 107 -int styleable AppCompatTheme_tooltipForegroundColor 108 -int styleable AppCompatTheme_tooltipFrameBackground 109 -int styleable AppCompatTheme_viewInflaterClass 110 -int styleable AppCompatTheme_windowActionBar 111 -int styleable AppCompatTheme_windowActionBarOverlay 112 -int styleable AppCompatTheme_windowActionModeOverlay 113 -int styleable AppCompatTheme_windowFixedHeightMajor 114 -int styleable AppCompatTheme_windowFixedHeightMinor 115 -int styleable AppCompatTheme_windowFixedWidthMajor 116 -int styleable AppCompatTheme_windowFixedWidthMinor 117 -int styleable AppCompatTheme_windowMinWidthMajor 118 -int styleable AppCompatTheme_windowMinWidthMinor 119 -int styleable AppCompatTheme_windowNoTitle 120 -int[] styleable BottomAppBar { 0x7f040034, 0x7f0400ca, 0x7f0400cb, 0x7f0400cc, 0x7f0400cd, 0x7f0400ec } -int styleable BottomAppBar_backgroundTint 0 -int styleable BottomAppBar_fabAlignmentMode 1 -int styleable BottomAppBar_fabCradleMargin 2 -int styleable BottomAppBar_fabCradleRoundedCornerRadius 3 -int styleable BottomAppBar_fabCradleVerticalOffset 4 -int styleable BottomAppBar_hideOnScroll 5 -int[] styleable BottomNavigationView { 0x7f0400bb, 0x7f040101, 0x7f040103, 0x7f040105, 0x7f040106, 0x7f04010a, 0x7f04010b, 0x7f04010c, 0x7f04010e, 0x7f040164 } -int styleable BottomNavigationView_elevation 0 -int styleable BottomNavigationView_itemBackground 1 -int styleable BottomNavigationView_itemHorizontalTranslationEnabled 2 -int styleable BottomNavigationView_itemIconSize 3 -int styleable BottomNavigationView_itemIconTint 4 -int styleable BottomNavigationView_itemTextAppearanceActive 5 -int styleable BottomNavigationView_itemTextAppearanceInactive 6 -int styleable BottomNavigationView_itemTextColor 7 -int styleable BottomNavigationView_labelVisibilityMode 8 -int styleable BottomNavigationView_menu 9 -int[] styleable BottomSheetBehavior_Layout { 0x7f04003a, 0x7f04003b, 0x7f04003d, 0x7f04003e } -int styleable BottomSheetBehavior_Layout_behavior_fitToContents 0 -int styleable BottomSheetBehavior_Layout_behavior_hideable 1 -int styleable BottomSheetBehavior_Layout_behavior_peekHeight 2 -int styleable BottomSheetBehavior_Layout_behavior_skipCollapsed 3 -int[] styleable ButtonBarLayout { 0x7f040026 } -int styleable ButtonBarLayout_allowStacking 0 -int[] styleable CardView { 0x0101013f, 0x01010140, 0x7f04005a, 0x7f04005b, 0x7f04005c, 0x7f04005d, 0x7f04005e, 0x7f04005f, 0x7f04009d, 0x7f04009e, 0x7f04009f, 0x7f0400a0, 0x7f0400a1 } -int styleable CardView_android_minWidth 0 -int styleable CardView_android_minHeight 1 -int styleable CardView_cardBackgroundColor 2 -int styleable CardView_cardCornerRadius 3 -int styleable CardView_cardElevation 4 -int styleable CardView_cardMaxElevation 5 -int styleable CardView_cardPreventCornerOverlap 6 -int styleable CardView_cardUseCompatPadding 7 -int styleable CardView_contentPadding 8 -int styleable CardView_contentPaddingBottom 9 -int styleable CardView_contentPaddingLeft 10 -int styleable CardView_contentPaddingRight 11 -int styleable CardView_contentPaddingTop 12 -int[] styleable Chip { 0x01010034, 0x010100ab, 0x0101011f, 0x0101014f, 0x010101e5, 0x7f040064, 0x7f040065, 0x7f040066, 0x7f040068, 0x7f040069, 0x7f04006a, 0x7f04006c, 0x7f04006d, 0x7f04006e, 0x7f04006f, 0x7f040070, 0x7f040071, 0x7f040076, 0x7f040077, 0x7f040078, 0x7f04007a, 0x7f04007b, 0x7f04007c, 0x7f04007d, 0x7f04007e, 0x7f04007f, 0x7f040080, 0x7f0400ea, 0x7f0400f4, 0x7f0400f8, 0x7f040186, 0x7f040192, 0x7f0401e7, 0x7f0401e9 } -int styleable Chip_android_textAppearance 0 -int styleable Chip_android_ellipsize 1 -int styleable Chip_android_maxWidth 2 -int styleable Chip_android_text 3 -int styleable Chip_android_checkable 4 -int styleable Chip_checkedIcon 5 -int styleable Chip_checkedIconEnabled 6 -int styleable Chip_checkedIconVisible 7 -int styleable Chip_chipBackgroundColor 8 -int styleable Chip_chipCornerRadius 9 -int styleable Chip_chipEndPadding 10 -int styleable Chip_chipIcon 11 -int styleable Chip_chipIconEnabled 12 -int styleable Chip_chipIconSize 13 -int styleable Chip_chipIconTint 14 -int styleable Chip_chipIconVisible 15 -int styleable Chip_chipMinHeight 16 -int styleable Chip_chipStartPadding 17 -int styleable Chip_chipStrokeColor 18 -int styleable Chip_chipStrokeWidth 19 -int styleable Chip_closeIcon 20 -int styleable Chip_closeIconEnabled 21 -int styleable Chip_closeIconEndPadding 22 -int styleable Chip_closeIconSize 23 -int styleable Chip_closeIconStartPadding 24 -int styleable Chip_closeIconTint 25 -int styleable Chip_closeIconVisible 26 -int styleable Chip_hideMotionSpec 27 -int styleable Chip_iconEndPadding 28 -int styleable Chip_iconStartPadding 29 -int styleable Chip_rippleColor 30 -int styleable Chip_showMotionSpec 31 -int styleable Chip_textEndPadding 32 -int styleable Chip_textStartPadding 33 -int[] styleable ChipGroup { 0x7f040063, 0x7f040072, 0x7f040073, 0x7f040074, 0x7f040196, 0x7f040197 } -int styleable ChipGroup_checkedChip 0 -int styleable ChipGroup_chipSpacing 1 -int styleable ChipGroup_chipSpacingHorizontal 2 -int styleable ChipGroup_chipSpacingVertical 3 -int styleable ChipGroup_singleLine 4 -int styleable ChipGroup_singleSelection 5 -int[] styleable CollapsingToolbarLayout { 0x7f040084, 0x7f040085, 0x7f0400a2, 0x7f0400c3, 0x7f0400c4, 0x7f0400c5, 0x7f0400c6, 0x7f0400c7, 0x7f0400c8, 0x7f0400c9, 0x7f040187, 0x7f040189, 0x7f0401a7, 0x7f0401f4, 0x7f0401f5, 0x7f0401ff } -int styleable CollapsingToolbarLayout_collapsedTitleGravity 0 -int styleable CollapsingToolbarLayout_collapsedTitleTextAppearance 1 -int styleable CollapsingToolbarLayout_contentScrim 2 -int styleable CollapsingToolbarLayout_expandedTitleGravity 3 -int styleable CollapsingToolbarLayout_expandedTitleMargin 4 -int styleable CollapsingToolbarLayout_expandedTitleMarginBottom 5 -int styleable CollapsingToolbarLayout_expandedTitleMarginEnd 6 -int styleable CollapsingToolbarLayout_expandedTitleMarginStart 7 -int styleable CollapsingToolbarLayout_expandedTitleMarginTop 8 -int styleable CollapsingToolbarLayout_expandedTitleTextAppearance 9 -int styleable CollapsingToolbarLayout_scrimAnimationDuration 10 -int styleable CollapsingToolbarLayout_scrimVisibleHeightTrigger 11 -int styleable CollapsingToolbarLayout_statusBarScrim 12 -int styleable CollapsingToolbarLayout_title 13 -int styleable CollapsingToolbarLayout_titleEnabled 14 -int styleable CollapsingToolbarLayout_toolbarId 15 -int[] styleable CollapsingToolbarLayout_Layout { 0x7f040115, 0x7f040116 } -int styleable CollapsingToolbarLayout_Layout_layout_collapseMode 0 -int styleable CollapsingToolbarLayout_Layout_layout_collapseParallaxMultiplier 1 -int[] styleable ColorStateListItem { 0x010101a5, 0x0101031f, 0x7f040027 } -int styleable ColorStateListItem_android_color 0 -int styleable ColorStateListItem_android_alpha 1 -int styleable ColorStateListItem_alpha 2 -int[] styleable CompoundButton { 0x01010107, 0x7f040058, 0x7f040059 } -int styleable CompoundButton_android_button 0 -int styleable CompoundButton_buttonTint 1 -int styleable CompoundButton_buttonTintMode 2 -int[] styleable ConstraintLayout_Layout { 0x010100c4, 0x0101011f, 0x01010120, 0x0101013f, 0x01010140, 0x7f040037, 0x7f040038, 0x7f040061, 0x7f040093, 0x7f040094, 0x7f040117, 0x7f040118, 0x7f040119, 0x7f04011a, 0x7f04011b, 0x7f04011c, 0x7f04011d, 0x7f04011e, 0x7f04011f, 0x7f040120, 0x7f040121, 0x7f040122, 0x7f040123, 0x7f040124, 0x7f040125, 0x7f040126, 0x7f040127, 0x7f040128, 0x7f040129, 0x7f04012a, 0x7f04012b, 0x7f04012c, 0x7f04012d, 0x7f04012e, 0x7f04012f, 0x7f040130, 0x7f040131, 0x7f040132, 0x7f040133, 0x7f040134, 0x7f040135, 0x7f040136, 0x7f040137, 0x7f040138, 0x7f040139, 0x7f04013a, 0x7f04013b, 0x7f04013c, 0x7f04013d, 0x7f04013e, 0x7f04013f, 0x7f040141, 0x7f040142, 0x7f040143, 0x7f040144, 0x7f040145, 0x7f040146, 0x7f040147, 0x7f040148, 0x7f04014b } -int styleable ConstraintLayout_Layout_android_orientation 0 -int styleable ConstraintLayout_Layout_android_maxWidth 1 -int styleable ConstraintLayout_Layout_android_maxHeight 2 -int styleable ConstraintLayout_Layout_android_minWidth 3 -int styleable ConstraintLayout_Layout_android_minHeight 4 -int styleable ConstraintLayout_Layout_barrierAllowsGoneWidgets 5 -int styleable ConstraintLayout_Layout_barrierDirection 6 -int styleable ConstraintLayout_Layout_chainUseRtl 7 -int styleable ConstraintLayout_Layout_constraintSet 8 -int styleable ConstraintLayout_Layout_constraint_referenced_ids 9 -int styleable ConstraintLayout_Layout_layout_constrainedHeight 10 -int styleable ConstraintLayout_Layout_layout_constrainedWidth 11 -int styleable ConstraintLayout_Layout_layout_constraintBaseline_creator 12 -int styleable ConstraintLayout_Layout_layout_constraintBaseline_toBaselineOf 13 -int styleable ConstraintLayout_Layout_layout_constraintBottom_creator 14 -int styleable ConstraintLayout_Layout_layout_constraintBottom_toBottomOf 15 -int styleable ConstraintLayout_Layout_layout_constraintBottom_toTopOf 16 -int styleable ConstraintLayout_Layout_layout_constraintCircle 17 -int styleable ConstraintLayout_Layout_layout_constraintCircleAngle 18 -int styleable ConstraintLayout_Layout_layout_constraintCircleRadius 19 -int styleable ConstraintLayout_Layout_layout_constraintDimensionRatio 20 -int styleable ConstraintLayout_Layout_layout_constraintEnd_toEndOf 21 -int styleable ConstraintLayout_Layout_layout_constraintEnd_toStartOf 22 -int styleable ConstraintLayout_Layout_layout_constraintGuide_begin 23 -int styleable ConstraintLayout_Layout_layout_constraintGuide_end 24 -int styleable ConstraintLayout_Layout_layout_constraintGuide_percent 25 -int styleable ConstraintLayout_Layout_layout_constraintHeight_default 26 -int styleable ConstraintLayout_Layout_layout_constraintHeight_max 27 -int styleable ConstraintLayout_Layout_layout_constraintHeight_min 28 -int styleable ConstraintLayout_Layout_layout_constraintHeight_percent 29 -int styleable ConstraintLayout_Layout_layout_constraintHorizontal_bias 30 -int styleable ConstraintLayout_Layout_layout_constraintHorizontal_chainStyle 31 -int styleable ConstraintLayout_Layout_layout_constraintHorizontal_weight 32 -int styleable ConstraintLayout_Layout_layout_constraintLeft_creator 33 -int styleable ConstraintLayout_Layout_layout_constraintLeft_toLeftOf 34 -int styleable ConstraintLayout_Layout_layout_constraintLeft_toRightOf 35 -int styleable ConstraintLayout_Layout_layout_constraintRight_creator 36 -int styleable ConstraintLayout_Layout_layout_constraintRight_toLeftOf 37 -int styleable ConstraintLayout_Layout_layout_constraintRight_toRightOf 38 -int styleable ConstraintLayout_Layout_layout_constraintStart_toEndOf 39 -int styleable ConstraintLayout_Layout_layout_constraintStart_toStartOf 40 -int styleable ConstraintLayout_Layout_layout_constraintTop_creator 41 -int styleable ConstraintLayout_Layout_layout_constraintTop_toBottomOf 42 -int styleable ConstraintLayout_Layout_layout_constraintTop_toTopOf 43 -int styleable ConstraintLayout_Layout_layout_constraintVertical_bias 44 -int styleable ConstraintLayout_Layout_layout_constraintVertical_chainStyle 45 -int styleable ConstraintLayout_Layout_layout_constraintVertical_weight 46 -int styleable ConstraintLayout_Layout_layout_constraintWidth_default 47 -int styleable ConstraintLayout_Layout_layout_constraintWidth_max 48 -int styleable ConstraintLayout_Layout_layout_constraintWidth_min 49 -int styleable ConstraintLayout_Layout_layout_constraintWidth_percent 50 -int styleable ConstraintLayout_Layout_layout_editor_absoluteX 51 -int styleable ConstraintLayout_Layout_layout_editor_absoluteY 52 -int styleable ConstraintLayout_Layout_layout_goneMarginBottom 53 -int styleable ConstraintLayout_Layout_layout_goneMarginEnd 54 -int styleable ConstraintLayout_Layout_layout_goneMarginLeft 55 -int styleable ConstraintLayout_Layout_layout_goneMarginRight 56 -int styleable ConstraintLayout_Layout_layout_goneMarginStart 57 -int styleable ConstraintLayout_Layout_layout_goneMarginTop 58 -int styleable ConstraintLayout_Layout_layout_optimizationLevel 59 -int[] styleable ConstraintLayout_placeholder { 0x7f040095, 0x7f0400bc } -int styleable ConstraintLayout_placeholder_content 0 -int styleable ConstraintLayout_placeholder_emptyVisibility 1 -int[] styleable ConstraintSet { 0x010100c4, 0x010100d0, 0x010100dc, 0x010100f4, 0x010100f5, 0x010100f7, 0x010100f8, 0x010100f9, 0x010100fa, 0x0101011f, 0x01010120, 0x0101013f, 0x01010140, 0x0101031f, 0x01010320, 0x01010321, 0x01010322, 0x01010323, 0x01010324, 0x01010325, 0x01010326, 0x01010327, 0x01010328, 0x010103b5, 0x010103b6, 0x010103fa, 0x01010440, 0x7f040037, 0x7f040038, 0x7f040061, 0x7f040094, 0x7f040117, 0x7f040118, 0x7f040119, 0x7f04011a, 0x7f04011b, 0x7f04011c, 0x7f04011d, 0x7f04011e, 0x7f04011f, 0x7f040120, 0x7f040121, 0x7f040122, 0x7f040123, 0x7f040124, 0x7f040125, 0x7f040126, 0x7f040127, 0x7f040128, 0x7f040129, 0x7f04012a, 0x7f04012b, 0x7f04012c, 0x7f04012d, 0x7f04012e, 0x7f04012f, 0x7f040130, 0x7f040131, 0x7f040132, 0x7f040133, 0x7f040134, 0x7f040135, 0x7f040136, 0x7f040137, 0x7f040138, 0x7f040139, 0x7f04013a, 0x7f04013b, 0x7f04013c, 0x7f04013d, 0x7f04013e, 0x7f04013f, 0x7f040141, 0x7f040142, 0x7f040143, 0x7f040144, 0x7f040145, 0x7f040146, 0x7f040147, 0x7f040148 } -int styleable ConstraintSet_android_orientation 0 -int styleable ConstraintSet_android_id 1 -int styleable ConstraintSet_android_visibility 2 -int styleable ConstraintSet_android_layout_width 3 -int styleable ConstraintSet_android_layout_height 4 -int styleable ConstraintSet_android_layout_marginLeft 5 -int styleable ConstraintSet_android_layout_marginTop 6 -int styleable ConstraintSet_android_layout_marginRight 7 -int styleable ConstraintSet_android_layout_marginBottom 8 -int styleable ConstraintSet_android_maxWidth 9 -int styleable ConstraintSet_android_maxHeight 10 -int styleable ConstraintSet_android_minWidth 11 -int styleable ConstraintSet_android_minHeight 12 -int styleable ConstraintSet_android_alpha 13 -int styleable ConstraintSet_android_transformPivotX 14 -int styleable ConstraintSet_android_transformPivotY 15 -int styleable ConstraintSet_android_translationX 16 -int styleable ConstraintSet_android_translationY 17 -int styleable ConstraintSet_android_scaleX 18 -int styleable ConstraintSet_android_scaleY 19 -int styleable ConstraintSet_android_rotation 20 -int styleable ConstraintSet_android_rotationX 21 -int styleable ConstraintSet_android_rotationY 22 -int styleable ConstraintSet_android_layout_marginStart 23 -int styleable ConstraintSet_android_layout_marginEnd 24 -int styleable ConstraintSet_android_translationZ 25 -int styleable ConstraintSet_android_elevation 26 -int styleable ConstraintSet_barrierAllowsGoneWidgets 27 -int styleable ConstraintSet_barrierDirection 28 -int styleable ConstraintSet_chainUseRtl 29 -int styleable ConstraintSet_constraint_referenced_ids 30 -int styleable ConstraintSet_layout_constrainedHeight 31 -int styleable ConstraintSet_layout_constrainedWidth 32 -int styleable ConstraintSet_layout_constraintBaseline_creator 33 -int styleable ConstraintSet_layout_constraintBaseline_toBaselineOf 34 -int styleable ConstraintSet_layout_constraintBottom_creator 35 -int styleable ConstraintSet_layout_constraintBottom_toBottomOf 36 -int styleable ConstraintSet_layout_constraintBottom_toTopOf 37 -int styleable ConstraintSet_layout_constraintCircle 38 -int styleable ConstraintSet_layout_constraintCircleAngle 39 -int styleable ConstraintSet_layout_constraintCircleRadius 40 -int styleable ConstraintSet_layout_constraintDimensionRatio 41 -int styleable ConstraintSet_layout_constraintEnd_toEndOf 42 -int styleable ConstraintSet_layout_constraintEnd_toStartOf 43 -int styleable ConstraintSet_layout_constraintGuide_begin 44 -int styleable ConstraintSet_layout_constraintGuide_end 45 -int styleable ConstraintSet_layout_constraintGuide_percent 46 -int styleable ConstraintSet_layout_constraintHeight_default 47 -int styleable ConstraintSet_layout_constraintHeight_max 48 -int styleable ConstraintSet_layout_constraintHeight_min 49 -int styleable ConstraintSet_layout_constraintHeight_percent 50 -int styleable ConstraintSet_layout_constraintHorizontal_bias 51 -int styleable ConstraintSet_layout_constraintHorizontal_chainStyle 52 -int styleable ConstraintSet_layout_constraintHorizontal_weight 53 -int styleable ConstraintSet_layout_constraintLeft_creator 54 -int styleable ConstraintSet_layout_constraintLeft_toLeftOf 55 -int styleable ConstraintSet_layout_constraintLeft_toRightOf 56 -int styleable ConstraintSet_layout_constraintRight_creator 57 -int styleable ConstraintSet_layout_constraintRight_toLeftOf 58 -int styleable ConstraintSet_layout_constraintRight_toRightOf 59 -int styleable ConstraintSet_layout_constraintStart_toEndOf 60 -int styleable ConstraintSet_layout_constraintStart_toStartOf 61 -int styleable ConstraintSet_layout_constraintTop_creator 62 -int styleable ConstraintSet_layout_constraintTop_toBottomOf 63 -int styleable ConstraintSet_layout_constraintTop_toTopOf 64 -int styleable ConstraintSet_layout_constraintVertical_bias 65 -int styleable ConstraintSet_layout_constraintVertical_chainStyle 66 -int styleable ConstraintSet_layout_constraintVertical_weight 67 -int styleable ConstraintSet_layout_constraintWidth_default 68 -int styleable ConstraintSet_layout_constraintWidth_max 69 -int styleable ConstraintSet_layout_constraintWidth_min 70 -int styleable ConstraintSet_layout_constraintWidth_percent 71 -int styleable ConstraintSet_layout_editor_absoluteX 72 -int styleable ConstraintSet_layout_editor_absoluteY 73 -int styleable ConstraintSet_layout_goneMarginBottom 74 -int styleable ConstraintSet_layout_goneMarginEnd 75 -int styleable ConstraintSet_layout_goneMarginLeft 76 -int styleable ConstraintSet_layout_goneMarginRight 77 -int styleable ConstraintSet_layout_goneMarginStart 78 -int styleable ConstraintSet_layout_goneMarginTop 79 -int[] styleable CoordinatorLayout { 0x7f04010d, 0x7f0401a6 } -int styleable CoordinatorLayout_keylines 0 -int styleable CoordinatorLayout_statusBarBackground 1 -int[] styleable CoordinatorLayout_Layout { 0x010100b3, 0x7f040112, 0x7f040113, 0x7f040114, 0x7f040140, 0x7f040149, 0x7f04014a } -int styleable CoordinatorLayout_Layout_android_layout_gravity 0 -int styleable CoordinatorLayout_Layout_layout_anchor 1 -int styleable CoordinatorLayout_Layout_layout_anchorGravity 2 -int styleable CoordinatorLayout_Layout_layout_behavior 3 -int styleable CoordinatorLayout_Layout_layout_dodgeInsetEdges 4 -int styleable CoordinatorLayout_Layout_layout_insetEdge 5 -int styleable CoordinatorLayout_Layout_layout_keyline 6 -int[] styleable DesignTheme { 0x7f040043, 0x7f040044 } -int styleable DesignTheme_bottomSheetDialogTheme 0 -int styleable DesignTheme_bottomSheetStyle 1 -int[] styleable DrawerArrowToggle { 0x7f040029, 0x7f04002a, 0x7f040036, 0x7f040086, 0x7f0400b4, 0x7f0400e3, 0x7f04019b, 0x7f0401eb } -int styleable DrawerArrowToggle_arrowHeadLength 0 -int styleable DrawerArrowToggle_arrowShaftLength 1 -int styleable DrawerArrowToggle_barLength 2 -int styleable DrawerArrowToggle_color 3 -int styleable DrawerArrowToggle_drawableSize 4 -int styleable DrawerArrowToggle_gapBetweenBars 5 -int styleable DrawerArrowToggle_spinBars 6 -int styleable DrawerArrowToggle_thickness 7 -int[] styleable FloatingActionButton { 0x7f040034, 0x7f040035, 0x7f04003f, 0x7f0400bb, 0x7f0400ce, 0x7f0400cf, 0x7f0400ea, 0x7f0400f2, 0x7f040162, 0x7f04017c, 0x7f040186, 0x7f040192, 0x7f040209 } -int styleable FloatingActionButton_backgroundTint 0 -int styleable FloatingActionButton_backgroundTintMode 1 -int styleable FloatingActionButton_borderWidth 2 -int styleable FloatingActionButton_elevation 3 -int styleable FloatingActionButton_fabCustomSize 4 -int styleable FloatingActionButton_fabSize 5 -int styleable FloatingActionButton_hideMotionSpec 6 -int styleable FloatingActionButton_hoveredFocusedTranslationZ 7 -int styleable FloatingActionButton_maxImageSize 8 -int styleable FloatingActionButton_pressedTranslationZ 9 -int styleable FloatingActionButton_rippleColor 10 -int styleable FloatingActionButton_showMotionSpec 11 -int styleable FloatingActionButton_useCompatPadding 12 -int[] styleable FloatingActionButton_Behavior_Layout { 0x7f040039 } -int styleable FloatingActionButton_Behavior_Layout_behavior_autoHide 0 -int[] styleable FlowLayout { 0x7f040108, 0x7f040150 } -int styleable FlowLayout_itemSpacing 0 -int styleable FlowLayout_lineSpacing 1 -int[] styleable FontFamily { 0x7f0400d9, 0x7f0400da, 0x7f0400db, 0x7f0400dc, 0x7f0400dd, 0x7f0400de } -int styleable FontFamily_fontProviderAuthority 0 -int styleable FontFamily_fontProviderCerts 1 -int styleable FontFamily_fontProviderFetchStrategy 2 -int styleable FontFamily_fontProviderFetchTimeout 3 -int styleable FontFamily_fontProviderPackage 4 -int styleable FontFamily_fontProviderQuery 5 -int[] styleable FontFamilyFont { 0x01010532, 0x01010533, 0x0101053f, 0x0101056f, 0x01010570, 0x7f0400d7, 0x7f0400df, 0x7f0400e0, 0x7f0400e1, 0x7f040208 } -int styleable FontFamilyFont_android_font 0 -int styleable FontFamilyFont_android_fontWeight 1 -int styleable FontFamilyFont_android_fontStyle 2 -int styleable FontFamilyFont_android_ttcIndex 3 -int styleable FontFamilyFont_android_fontVariationSettings 4 -int styleable FontFamilyFont_font 5 -int styleable FontFamilyFont_fontStyle 6 -int styleable FontFamilyFont_fontVariationSettings 7 -int styleable FontFamilyFont_fontWeight 8 -int styleable FontFamilyFont_ttcIndex 9 -int[] styleable ForegroundLinearLayout { 0x01010109, 0x01010200, 0x7f0400e2 } -int styleable ForegroundLinearLayout_android_foreground 0 -int styleable ForegroundLinearLayout_android_foregroundGravity 1 -int styleable ForegroundLinearLayout_foregroundInsidePadding 2 -int[] styleable GradientColor { 0x0101019d, 0x0101019e, 0x010101a1, 0x010101a2, 0x010101a3, 0x010101a4, 0x01010201, 0x0101020b, 0x01010510, 0x01010511, 0x01010512, 0x01010513 } -int styleable GradientColor_android_startColor 0 -int styleable GradientColor_android_endColor 1 -int styleable GradientColor_android_type 2 -int styleable GradientColor_android_centerX 3 -int styleable GradientColor_android_centerY 4 -int styleable GradientColor_android_gradientRadius 5 -int styleable GradientColor_android_tileMode 6 -int styleable GradientColor_android_centerColor 7 -int styleable GradientColor_android_startX 8 -int styleable GradientColor_android_startY 9 -int styleable GradientColor_android_endX 10 -int styleable GradientColor_android_endY 11 -int[] styleable GradientColorItem { 0x010101a5, 0x01010514 } -int styleable GradientColorItem_android_color 0 -int styleable GradientColorItem_android_offset 1 -int[] styleable LinearConstraintLayout { 0x010100c4 } -int styleable LinearConstraintLayout_android_orientation 0 -int[] styleable LinearLayoutCompat { 0x010100af, 0x010100c4, 0x01010126, 0x01010127, 0x01010128, 0x7f0400b0, 0x7f0400b2, 0x7f040163, 0x7f040191 } -int styleable LinearLayoutCompat_android_gravity 0 -int styleable LinearLayoutCompat_android_orientation 1 -int styleable LinearLayoutCompat_android_baselineAligned 2 -int styleable LinearLayoutCompat_android_baselineAlignedChildIndex 3 -int styleable LinearLayoutCompat_android_weightSum 4 -int styleable LinearLayoutCompat_divider 5 -int styleable LinearLayoutCompat_dividerPadding 6 -int styleable LinearLayoutCompat_measureWithLargestChild 7 -int styleable LinearLayoutCompat_showDividers 8 -int[] styleable LinearLayoutCompat_Layout { 0x010100b3, 0x010100f4, 0x010100f5, 0x01010181 } -int styleable LinearLayoutCompat_Layout_android_layout_gravity 0 -int styleable LinearLayoutCompat_Layout_android_layout_width 1 -int styleable LinearLayoutCompat_Layout_android_layout_height 2 -int styleable LinearLayoutCompat_Layout_android_layout_weight 3 -int[] styleable ListPopupWindow { 0x010102ac, 0x010102ad } -int styleable ListPopupWindow_android_dropDownHorizontalOffset 0 -int styleable ListPopupWindow_android_dropDownVerticalOffset 1 -int[] styleable MaterialButton { 0x010101b7, 0x010101b8, 0x010101b9, 0x010101ba, 0x7f040034, 0x7f040035, 0x7f0400a5, 0x7f0400f3, 0x7f0400f5, 0x7f0400f6, 0x7f0400f7, 0x7f0400f9, 0x7f0400fa, 0x7f040186, 0x7f0401a8, 0x7f0401a9 } -int styleable MaterialButton_android_insetLeft 0 -int styleable MaterialButton_android_insetRight 1 -int styleable MaterialButton_android_insetTop 2 -int styleable MaterialButton_android_insetBottom 3 -int styleable MaterialButton_backgroundTint 4 -int styleable MaterialButton_backgroundTintMode 5 -int styleable MaterialButton_cornerRadius 6 -int styleable MaterialButton_icon 7 -int styleable MaterialButton_iconGravity 8 -int styleable MaterialButton_iconPadding 9 -int styleable MaterialButton_iconSize 10 -int styleable MaterialButton_iconTint 11 -int styleable MaterialButton_iconTintMode 12 -int styleable MaterialButton_rippleColor 13 -int styleable MaterialButton_strokeColor 14 -int styleable MaterialButton_strokeWidth 15 -int[] styleable MaterialCardView { 0x7f0401a8, 0x7f0401a9 } -int styleable MaterialCardView_strokeColor 0 -int styleable MaterialCardView_strokeWidth 1 -int[] styleable MaterialComponentsTheme { 0x7f040043, 0x7f040044, 0x7f04006b, 0x7f040075, 0x7f040079, 0x7f040087, 0x7f040088, 0x7f04008e, 0x7f04008f, 0x7f040090, 0x7f0400ba, 0x7f0400d6, 0x7f04015e, 0x7f04015f, 0x7f040169, 0x7f040188, 0x7f040198, 0x7f0401cb, 0x7f0401d0, 0x7f0401d1, 0x7f0401d2, 0x7f0401d3, 0x7f0401d4, 0x7f0401d5, 0x7f0401d6, 0x7f0401d7, 0x7f0401d8, 0x7f0401d9, 0x7f0401de, 0x7f0401e3, 0x7f0401e4, 0x7f0401e8 } -int styleable MaterialComponentsTheme_bottomSheetDialogTheme 0 -int styleable MaterialComponentsTheme_bottomSheetStyle 1 -int styleable MaterialComponentsTheme_chipGroupStyle 2 -int styleable MaterialComponentsTheme_chipStandaloneStyle 3 -int styleable MaterialComponentsTheme_chipStyle 4 -int styleable MaterialComponentsTheme_colorAccent 5 -int styleable MaterialComponentsTheme_colorBackgroundFloating 6 -int styleable MaterialComponentsTheme_colorPrimary 7 -int styleable MaterialComponentsTheme_colorPrimaryDark 8 -int styleable MaterialComponentsTheme_colorSecondary 9 -int styleable MaterialComponentsTheme_editTextStyle 10 -int styleable MaterialComponentsTheme_floatingActionButtonStyle 11 -int styleable MaterialComponentsTheme_materialButtonStyle 12 -int styleable MaterialComponentsTheme_materialCardViewStyle 13 -int styleable MaterialComponentsTheme_navigationViewStyle 14 -int styleable MaterialComponentsTheme_scrimBackground 15 -int styleable MaterialComponentsTheme_snackbarButtonStyle 16 -int styleable MaterialComponentsTheme_tabStyle 17 -int styleable MaterialComponentsTheme_textAppearanceBody1 18 -int styleable MaterialComponentsTheme_textAppearanceBody2 19 -int styleable MaterialComponentsTheme_textAppearanceButton 20 -int styleable MaterialComponentsTheme_textAppearanceCaption 21 -int styleable MaterialComponentsTheme_textAppearanceHeadline1 22 -int styleable MaterialComponentsTheme_textAppearanceHeadline2 23 -int styleable MaterialComponentsTheme_textAppearanceHeadline3 24 -int styleable MaterialComponentsTheme_textAppearanceHeadline4 25 -int styleable MaterialComponentsTheme_textAppearanceHeadline5 26 -int styleable MaterialComponentsTheme_textAppearanceHeadline6 27 -int styleable MaterialComponentsTheme_textAppearanceOverline 28 -int styleable MaterialComponentsTheme_textAppearanceSubtitle1 29 -int styleable MaterialComponentsTheme_textAppearanceSubtitle2 30 -int styleable MaterialComponentsTheme_textInputStyle 31 -int[] styleable MenuGroup { 0x0101000e, 0x010100d0, 0x01010194, 0x010101de, 0x010101df, 0x010101e0 } -int styleable MenuGroup_android_enabled 0 -int styleable MenuGroup_android_id 1 -int styleable MenuGroup_android_visible 2 -int styleable MenuGroup_android_menuCategory 3 -int styleable MenuGroup_android_orderInCategory 4 -int styleable MenuGroup_android_checkableBehavior 5 -int[] styleable MenuItem { 0x01010002, 0x0101000e, 0x010100d0, 0x01010106, 0x01010194, 0x010101de, 0x010101df, 0x010101e1, 0x010101e2, 0x010101e3, 0x010101e4, 0x010101e5, 0x0101026f, 0x7f04000d, 0x7f04001f, 0x7f040020, 0x7f040028, 0x7f040096, 0x7f0400f9, 0x7f0400fa, 0x7f04016a, 0x7f040190, 0x7f040204 } -int styleable MenuItem_android_icon 0 -int styleable MenuItem_android_enabled 1 -int styleable MenuItem_android_id 2 -int styleable MenuItem_android_checked 3 -int styleable MenuItem_android_visible 4 -int styleable MenuItem_android_menuCategory 5 -int styleable MenuItem_android_orderInCategory 6 -int styleable MenuItem_android_title 7 -int styleable MenuItem_android_titleCondensed 8 -int styleable MenuItem_android_alphabeticShortcut 9 -int styleable MenuItem_android_numericShortcut 10 -int styleable MenuItem_android_checkable 11 -int styleable MenuItem_android_onClick 12 -int styleable MenuItem_actionLayout 13 -int styleable MenuItem_actionProviderClass 14 -int styleable MenuItem_actionViewClass 15 -int styleable MenuItem_alphabeticModifiers 16 -int styleable MenuItem_contentDescription 17 -int styleable MenuItem_iconTint 18 -int styleable MenuItem_iconTintMode 19 -int styleable MenuItem_numericModifiers 20 -int styleable MenuItem_showAsAction 21 -int styleable MenuItem_tooltipText 22 -int[] styleable MenuView { 0x010100ae, 0x0101012c, 0x0101012d, 0x0101012e, 0x0101012f, 0x01010130, 0x01010131, 0x7f04017b, 0x7f0401aa } -int styleable MenuView_android_windowAnimationStyle 0 -int styleable MenuView_android_itemTextAppearance 1 -int styleable MenuView_android_horizontalDivider 2 -int styleable MenuView_android_verticalDivider 3 -int styleable MenuView_android_headerBackground 4 -int styleable MenuView_android_itemBackground 5 -int styleable MenuView_android_itemIconDisabledAlpha 6 -int styleable MenuView_preserveIconSpacing 7 -int styleable MenuView_subMenuArrow 8 -int[] styleable NavigationView { 0x010100d4, 0x010100dd, 0x0101011f, 0x7f0400bb, 0x7f0400e5, 0x7f040101, 0x7f040102, 0x7f040104, 0x7f040106, 0x7f040109, 0x7f04010c, 0x7f040164 } -int styleable NavigationView_android_background 0 -int styleable NavigationView_android_fitsSystemWindows 1 -int styleable NavigationView_android_maxWidth 2 -int styleable NavigationView_elevation 3 -int styleable NavigationView_headerLayout 4 -int styleable NavigationView_itemBackground 5 -int styleable NavigationView_itemHorizontalPadding 6 -int styleable NavigationView_itemIconPadding 7 -int styleable NavigationView_itemIconTint 8 -int styleable NavigationView_itemTextAppearance 9 -int styleable NavigationView_itemTextColor 10 -int styleable NavigationView_menu 11 -int[] styleable PopupWindow { 0x01010176, 0x010102c9, 0x7f04016b } -int styleable PopupWindow_android_popupBackground 0 -int styleable PopupWindow_android_popupAnimationStyle 1 -int styleable PopupWindow_overlapAnchor 2 -int[] styleable PopupWindowBackgroundState { 0x7f0401a1 } -int styleable PopupWindowBackgroundState_state_above_anchor 0 -int[] styleable RecycleListView { 0x7f04016c, 0x7f04016f } -int styleable RecycleListView_paddingBottomNoButtons 0 -int styleable RecycleListView_paddingTopNoTitle 1 -int[] styleable RecyclerView { 0x010100c4, 0x010100f1, 0x7f0400d0, 0x7f0400d1, 0x7f0400d2, 0x7f0400d3, 0x7f0400d4, 0x7f040111, 0x7f040185, 0x7f04019a, 0x7f0401a0 } -int styleable RecyclerView_android_orientation 0 -int styleable RecyclerView_android_descendantFocusability 1 -int styleable RecyclerView_fastScrollEnabled 2 -int styleable RecyclerView_fastScrollHorizontalThumbDrawable 3 -int styleable RecyclerView_fastScrollHorizontalTrackDrawable 4 -int styleable RecyclerView_fastScrollVerticalThumbDrawable 5 -int styleable RecyclerView_fastScrollVerticalTrackDrawable 6 -int styleable RecyclerView_layoutManager 7 -int styleable RecyclerView_reverseLayout 8 -int styleable RecyclerView_spanCount 9 -int styleable RecyclerView_stackFromEnd 10 -int[] styleable ScrimInsetsFrameLayout { 0x7f0400ff } -int styleable ScrimInsetsFrameLayout_insetForeground 0 -int[] styleable ScrollingViewBehavior_Layout { 0x7f04003c } -int styleable ScrollingViewBehavior_Layout_behavior_overlapTop 0 -int[] styleable SearchView { 0x010100da, 0x0101011f, 0x01010220, 0x01010264, 0x7f04007a, 0x7f040092, 0x7f0400ab, 0x7f0400e4, 0x7f0400fb, 0x7f040110, 0x7f04017f, 0x7f040180, 0x7f04018a, 0x7f04018b, 0x7f0401ab, 0x7f0401b0, 0x7f04020b } -int styleable SearchView_android_focusable 0 -int styleable SearchView_android_maxWidth 1 -int styleable SearchView_android_inputType 2 -int styleable SearchView_android_imeOptions 3 -int styleable SearchView_closeIcon 4 -int styleable SearchView_commitIcon 5 -int styleable SearchView_defaultQueryHint 6 -int styleable SearchView_goIcon 7 -int styleable SearchView_iconifiedByDefault 8 -int styleable SearchView_layout 9 -int styleable SearchView_queryBackground 10 -int styleable SearchView_queryHint 11 -int styleable SearchView_searchHintIcon 12 -int styleable SearchView_searchIcon 13 -int styleable SearchView_submitBackground 14 -int styleable SearchView_suggestionRowLayout 15 -int styleable SearchView_voiceIcon 16 -int[] styleable Snackbar { 0x7f040198, 0x7f040199 } -int styleable Snackbar_snackbarButtonStyle 0 -int styleable Snackbar_snackbarStyle 1 -int[] styleable SnackbarLayout { 0x0101011f, 0x7f0400bb, 0x7f040160 } -int styleable SnackbarLayout_android_maxWidth 0 -int styleable SnackbarLayout_elevation 1 -int styleable SnackbarLayout_maxActionInlineWidth 2 -int[] styleable Spinner { 0x010100b2, 0x01010176, 0x0101017b, 0x01010262, 0x7f040179 } -int styleable Spinner_android_entries 0 -int styleable Spinner_android_popupBackground 1 -int styleable Spinner_android_prompt 2 -int styleable Spinner_android_dropDownWidth 3 -int styleable Spinner_popupTheme 4 -int[] styleable StateListDrawable { 0x0101011c, 0x01010194, 0x01010195, 0x01010196, 0x0101030c, 0x0101030d } -int styleable StateListDrawable_android_dither 0 -int styleable StateListDrawable_android_visible 1 -int styleable StateListDrawable_android_variablePadding 2 -int styleable StateListDrawable_android_constantSize 3 -int styleable StateListDrawable_android_enterFadeDuration 4 -int styleable StateListDrawable_android_exitFadeDuration 5 -int[] styleable StateListDrawableItem { 0x01010199 } -int styleable StateListDrawableItem_android_drawable 0 -int[] styleable SwitchCompat { 0x01010124, 0x01010125, 0x01010142, 0x7f040193, 0x7f04019e, 0x7f0401b1, 0x7f0401b2, 0x7f0401b4, 0x7f0401ec, 0x7f0401ed, 0x7f0401ee, 0x7f040205, 0x7f040206, 0x7f040207 } -int styleable SwitchCompat_android_textOn 0 -int styleable SwitchCompat_android_textOff 1 -int styleable SwitchCompat_android_thumb 2 -int styleable SwitchCompat_showText 3 -int styleable SwitchCompat_splitTrack 4 -int styleable SwitchCompat_switchMinWidth 5 -int styleable SwitchCompat_switchPadding 6 -int styleable SwitchCompat_switchTextAppearance 7 -int styleable SwitchCompat_thumbTextPadding 8 -int styleable SwitchCompat_thumbTint 9 -int styleable SwitchCompat_thumbTintMode 10 -int styleable SwitchCompat_track 11 -int styleable SwitchCompat_trackTint 12 -int styleable SwitchCompat_trackTintMode 13 -int[] styleable TabItem { 0x01010002, 0x010100f2, 0x0101014f } -int styleable TabItem_android_icon 0 -int styleable TabItem_android_layout 1 -int styleable TabItem_android_text 2 -int[] styleable TabLayout { 0x7f0401b5, 0x7f0401b6, 0x7f0401b7, 0x7f0401b8, 0x7f0401b9, 0x7f0401ba, 0x7f0401bb, 0x7f0401bc, 0x7f0401bd, 0x7f0401be, 0x7f0401bf, 0x7f0401c0, 0x7f0401c1, 0x7f0401c2, 0x7f0401c3, 0x7f0401c4, 0x7f0401c5, 0x7f0401c6, 0x7f0401c7, 0x7f0401c8, 0x7f0401c9, 0x7f0401ca, 0x7f0401cc, 0x7f0401cd, 0x7f0401ce } -int styleable TabLayout_tabBackground 0 -int styleable TabLayout_tabContentStart 1 -int styleable TabLayout_tabGravity 2 -int styleable TabLayout_tabIconTint 3 -int styleable TabLayout_tabIconTintMode 4 -int styleable TabLayout_tabIndicator 5 -int styleable TabLayout_tabIndicatorAnimationDuration 6 -int styleable TabLayout_tabIndicatorColor 7 -int styleable TabLayout_tabIndicatorFullWidth 8 -int styleable TabLayout_tabIndicatorGravity 9 -int styleable TabLayout_tabIndicatorHeight 10 -int styleable TabLayout_tabInlineLabel 11 -int styleable TabLayout_tabMaxWidth 12 -int styleable TabLayout_tabMinWidth 13 -int styleable TabLayout_tabMode 14 -int styleable TabLayout_tabPadding 15 -int styleable TabLayout_tabPaddingBottom 16 -int styleable TabLayout_tabPaddingEnd 17 -int styleable TabLayout_tabPaddingStart 18 -int styleable TabLayout_tabPaddingTop 19 -int styleable TabLayout_tabRippleColor 20 -int styleable TabLayout_tabSelectedTextColor 21 -int styleable TabLayout_tabTextAppearance 22 -int styleable TabLayout_tabTextColor 23 -int styleable TabLayout_tabUnboundedRipple 24 -int[] styleable TextAppearance { 0x01010095, 0x01010096, 0x01010097, 0x01010098, 0x0101009a, 0x0101009b, 0x01010161, 0x01010162, 0x01010163, 0x01010164, 0x010103ac, 0x7f0400d8, 0x7f0401cf } -int styleable TextAppearance_android_textSize 0 -int styleable TextAppearance_android_typeface 1 -int styleable TextAppearance_android_textStyle 2 -int styleable TextAppearance_android_textColor 3 -int styleable TextAppearance_android_textColorHint 4 -int styleable TextAppearance_android_textColorLink 5 -int styleable TextAppearance_android_shadowColor 6 -int styleable TextAppearance_android_shadowDx 7 -int styleable TextAppearance_android_shadowDy 8 -int styleable TextAppearance_android_shadowRadius 9 -int styleable TextAppearance_android_fontFamily 10 -int styleable TextAppearance_fontFamily 11 -int styleable TextAppearance_textAllCaps 12 -int[] styleable TextInputLayout { 0x0101009a, 0x01010150, 0x7f040045, 0x7f040046, 0x7f040047, 0x7f040048, 0x7f040049, 0x7f04004a, 0x7f04004b, 0x7f04004c, 0x7f04004d, 0x7f0400a6, 0x7f0400a7, 0x7f0400a8, 0x7f0400a9, 0x7f0400bf, 0x7f0400c0, 0x7f0400e7, 0x7f0400e8, 0x7f0400e9, 0x7f0400ed, 0x7f0400ee, 0x7f0400ef, 0x7f040173, 0x7f040174, 0x7f040175, 0x7f040176, 0x7f040177 } -int styleable TextInputLayout_android_textColorHint 0 -int styleable TextInputLayout_android_hint 1 -int styleable TextInputLayout_boxBackgroundColor 2 -int styleable TextInputLayout_boxBackgroundMode 3 -int styleable TextInputLayout_boxCollapsedPaddingTop 4 -int styleable TextInputLayout_boxCornerRadiusBottomEnd 5 -int styleable TextInputLayout_boxCornerRadiusBottomStart 6 -int styleable TextInputLayout_boxCornerRadiusTopEnd 7 -int styleable TextInputLayout_boxCornerRadiusTopStart 8 -int styleable TextInputLayout_boxStrokeColor 9 -int styleable TextInputLayout_boxStrokeWidth 10 -int styleable TextInputLayout_counterEnabled 11 -int styleable TextInputLayout_counterMaxLength 12 -int styleable TextInputLayout_counterOverflowTextAppearance 13 -int styleable TextInputLayout_counterTextAppearance 14 -int styleable TextInputLayout_errorEnabled 15 -int styleable TextInputLayout_errorTextAppearance 16 -int styleable TextInputLayout_helperText 17 -int styleable TextInputLayout_helperTextEnabled 18 -int styleable TextInputLayout_helperTextTextAppearance 19 -int styleable TextInputLayout_hintAnimationEnabled 20 -int styleable TextInputLayout_hintEnabled 21 -int styleable TextInputLayout_hintTextAppearance 22 -int styleable TextInputLayout_passwordToggleContentDescription 23 -int styleable TextInputLayout_passwordToggleDrawable 24 -int styleable TextInputLayout_passwordToggleEnabled 25 -int styleable TextInputLayout_passwordToggleTint 26 -int styleable TextInputLayout_passwordToggleTintMode 27 -int[] styleable ThemeEnforcement { 0x01010034, 0x7f0400bd, 0x7f0400be } -int styleable ThemeEnforcement_android_textAppearance 0 -int styleable ThemeEnforcement_enforceMaterialTheme 1 -int styleable ThemeEnforcement_enforceTextAppearance 2 -int[] styleable Toolbar { 0x010100af, 0x01010140, 0x7f040053, 0x7f040082, 0x7f040083, 0x7f040097, 0x7f040098, 0x7f040099, 0x7f04009a, 0x7f04009b, 0x7f04009c, 0x7f04015c, 0x7f04015d, 0x7f040161, 0x7f040166, 0x7f040167, 0x7f040179, 0x7f0401ac, 0x7f0401ad, 0x7f0401ae, 0x7f0401f4, 0x7f0401f6, 0x7f0401f7, 0x7f0401f8, 0x7f0401f9, 0x7f0401fa, 0x7f0401fb, 0x7f0401fc, 0x7f0401fd } -int styleable Toolbar_android_gravity 0 -int styleable Toolbar_android_minHeight 1 -int styleable Toolbar_buttonGravity 2 -int styleable Toolbar_collapseContentDescription 3 -int styleable Toolbar_collapseIcon 4 -int styleable Toolbar_contentInsetEnd 5 -int styleable Toolbar_contentInsetEndWithActions 6 -int styleable Toolbar_contentInsetLeft 7 -int styleable Toolbar_contentInsetRight 8 -int styleable Toolbar_contentInsetStart 9 -int styleable Toolbar_contentInsetStartWithNavigation 10 -int styleable Toolbar_logo 11 -int styleable Toolbar_logoDescription 12 -int styleable Toolbar_maxButtonHeight 13 -int styleable Toolbar_navigationContentDescription 14 -int styleable Toolbar_navigationIcon 15 -int styleable Toolbar_popupTheme 16 -int styleable Toolbar_subtitle 17 -int styleable Toolbar_subtitleTextAppearance 18 -int styleable Toolbar_subtitleTextColor 19 -int styleable Toolbar_title 20 -int styleable Toolbar_titleMargin 21 -int styleable Toolbar_titleMarginBottom 22 -int styleable Toolbar_titleMarginEnd 23 -int styleable Toolbar_titleMarginStart 24 -int styleable Toolbar_titleMarginTop 25 -int styleable Toolbar_titleMargins 26 -int styleable Toolbar_titleTextAppearance 27 -int styleable Toolbar_titleTextColor 28 -int[] styleable View { 0x01010000, 0x010100da, 0x7f04016d, 0x7f04016e, 0x7f0401ea } -int styleable View_android_theme 0 -int styleable View_android_focusable 1 -int styleable View_paddingEnd 2 -int styleable View_paddingStart 3 -int styleable View_theme 4 -int[] styleable ViewBackgroundHelper { 0x010100d4, 0x7f040034, 0x7f040035 } -int styleable ViewBackgroundHelper_android_background 0 -int styleable ViewBackgroundHelper_backgroundTint 1 -int styleable ViewBackgroundHelper_backgroundTintMode 2 -int[] styleable ViewStubCompat { 0x010100d0, 0x010100f2, 0x010100f3 } -int styleable ViewStubCompat_android_id 0 -int styleable ViewStubCompat_android_layout 1 -int styleable ViewStubCompat_android_inflatedId 2 diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/0.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/0.jar deleted file mode 100755 index a2b3f96..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/0.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/1.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/1.jar deleted file mode 100755 index e9fd640..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/1.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/10.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/10.jar deleted file mode 100755 index 4aa405e..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/10.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/11.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/11.jar deleted file mode 100755 index 5d84506..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/11.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/12.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/12.jar deleted file mode 100755 index 816f384..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/12.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/13.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/13.jar deleted file mode 100755 index a7435a9..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/13.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/14.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/14.jar deleted file mode 100755 index 170aeb7..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/14.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/15.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/15.jar deleted file mode 100755 index e156fcf..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/15.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/16.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/16.jar deleted file mode 100755 index 86b29ab..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/16.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/17.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/17.jar deleted file mode 100755 index 7b40d21..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/17.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/18.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/18.jar deleted file mode 100755 index c48f82c..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/18.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/19.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/19.jar deleted file mode 100755 index c746b0f..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/19.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/2.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/2.jar deleted file mode 100755 index 8aa2769..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/2.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/20.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/20.jar deleted file mode 100755 index d2b9fab..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/20.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/21.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/21.jar deleted file mode 100755 index 7395490..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/21.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/22.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/22.jar deleted file mode 100755 index dd98caa..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/22.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/23.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/23.jar deleted file mode 100755 index 814a0c0..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/23.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/24.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/24.jar deleted file mode 100755 index 81064cb..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/24.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/25.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/25.jar deleted file mode 100755 index 29b3ebd..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/25.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/26.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/26.jar deleted file mode 100755 index 4d48bcf..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/26.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/27.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/27.jar deleted file mode 100755 index cec72b7..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/27.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/28.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/28.jar deleted file mode 100755 index 4364aa2..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/28.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/29.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/29.jar deleted file mode 100755 index 05c087c..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/29.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/3.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/3.jar deleted file mode 100755 index 5853e18..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/3.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/30.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/30.jar deleted file mode 100755 index 1dc12dd..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/30.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/31.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/31.jar deleted file mode 100755 index 6d64979..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/31.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/32.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/32.jar deleted file mode 100755 index 9a41b99..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/32.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/33.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/33.jar deleted file mode 100755 index b1685bb..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/33.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/34.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/34.jar deleted file mode 100755 index e21b23b..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/34.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/35.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/35.jar deleted file mode 100755 index c4a8ac4..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/35.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$attr.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$attr.dex deleted file mode 100755 index e9d79bc..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$attr.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$color.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$color.dex deleted file mode 100755 index 3cedfa0..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$color.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$dimen.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$dimen.dex deleted file mode 100755 index 8fc1925..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$dimen.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$drawable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$drawable.dex deleted file mode 100755 index 268d0cf..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$drawable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$id.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$id.dex deleted file mode 100755 index 8eeb123..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$id.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$integer.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$integer.dex deleted file mode 100755 index 4db7cce..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$integer.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$layout.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$layout.dex deleted file mode 100755 index 30aa1be..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$layout.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$string.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$string.dex deleted file mode 100755 index bdf3a9a..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$string.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$style.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$style.dex deleted file mode 100755 index 620f7cd..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$style.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$styleable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$styleable.dex deleted file mode 100755 index 524fbda..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R$styleable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R.dex deleted file mode 100755 index bd54b3c..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/36/android/support/slidingpanelayout/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/constraint/R$attr.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/constraint/R$attr.dex deleted file mode 100755 index 25c349e..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/constraint/R$attr.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/constraint/R$id.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/constraint/R$id.dex deleted file mode 100755 index 4e78048..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/constraint/R$id.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/constraint/R$styleable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/constraint/R$styleable.dex deleted file mode 100755 index a657f49..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/constraint/R$styleable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/constraint/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/constraint/R.dex deleted file mode 100755 index a8c8e7d..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/constraint/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$attr.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$attr.dex deleted file mode 100755 index c0d7acc..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$attr.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$color.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$color.dex deleted file mode 100755 index d993fb7..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$color.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$dimen.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$dimen.dex deleted file mode 100755 index deec15c..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$dimen.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$drawable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$drawable.dex deleted file mode 100755 index 1520a33..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$drawable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$id.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$id.dex deleted file mode 100755 index ff3cd0a..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$id.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$integer.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$integer.dex deleted file mode 100755 index 059244c..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$integer.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$layout.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$layout.dex deleted file mode 100755 index a4598fb..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$layout.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$string.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$string.dex deleted file mode 100755 index 7c4d210..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$string.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$style.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$style.dex deleted file mode 100755 index b4595ad..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$style.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$styleable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$styleable.dex deleted file mode 100755 index a4a2802..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R$styleable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R.dex deleted file mode 100755 index b69776e..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/swiperefreshlayout/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$attr.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$attr.dex deleted file mode 100755 index 787b286..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$attr.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$color.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$color.dex deleted file mode 100755 index 58a24e2..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$color.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$dimen.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$dimen.dex deleted file mode 100755 index f28d8ce..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$dimen.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$drawable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$drawable.dex deleted file mode 100755 index b0cbf30..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$drawable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$id.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$id.dex deleted file mode 100755 index 799177a..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$id.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$integer.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$integer.dex deleted file mode 100755 index 8959b2a..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$integer.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$layout.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$layout.dex deleted file mode 100755 index 144f5aa..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$layout.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$string.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$string.dex deleted file mode 100755 index 18f367f..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$string.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$style.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$style.dex deleted file mode 100755 index 8fb3221..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$style.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$styleable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$styleable.dex deleted file mode 100755 index 8a1e96a..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R$styleable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R.dex deleted file mode 100755 index 245f7bf..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/transition/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$attr.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$attr.dex deleted file mode 100755 index 1e04fcf..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$attr.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$color.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$color.dex deleted file mode 100755 index a408e18..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$color.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$dimen.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$dimen.dex deleted file mode 100755 index 02c5db4..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$dimen.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$drawable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$drawable.dex deleted file mode 100755 index 9b38d37..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$drawable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$id.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$id.dex deleted file mode 100755 index 7f75c98..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$id.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$integer.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$integer.dex deleted file mode 100755 index b187483..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$integer.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$layout.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$layout.dex deleted file mode 100755 index 84446d8..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$layout.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$string.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$string.dex deleted file mode 100755 index 0471069..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$string.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$style.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$style.dex deleted file mode 100755 index 1640bcb..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$style.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$styleable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$styleable.dex deleted file mode 100755 index f5a6600..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R$styleable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R.dex deleted file mode 100755 index 03b4e84..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/37/android/support/v7/viewpager/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$attr.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$attr.dex deleted file mode 100755 index 8dee0c5..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$attr.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$color.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$color.dex deleted file mode 100755 index 31863ae..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$color.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$dimen.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$dimen.dex deleted file mode 100755 index fcb0540..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$dimen.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$drawable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$drawable.dex deleted file mode 100755 index 59691a9..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$drawable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$id.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$id.dex deleted file mode 100755 index db37c30..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$id.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$integer.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$integer.dex deleted file mode 100755 index e1ecd8f..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$integer.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$layout.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$layout.dex deleted file mode 100755 index 2a39099..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$layout.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$string.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$string.dex deleted file mode 100755 index 28fe318..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$string.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$style.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$style.dex deleted file mode 100755 index d50ba80..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$style.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$styleable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$styleable.dex deleted file mode 100755 index d09e0d5..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R$styleable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R.dex deleted file mode 100755 index 18bc393..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/compat/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$anim.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$anim.dex deleted file mode 100755 index 0724621..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$anim.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$animator.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$animator.dex deleted file mode 100755 index 8e99d77..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$animator.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$attr.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$attr.dex deleted file mode 100755 index 15cd9d3..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$attr.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$bool.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$bool.dex deleted file mode 100755 index 7ce0e1e..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$bool.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$color.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$color.dex deleted file mode 100755 index 4ccc33b..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$color.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$dimen.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$dimen.dex deleted file mode 100755 index 9a3c688..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$dimen.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$drawable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$drawable.dex deleted file mode 100755 index 74e989c..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$drawable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$id.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$id.dex deleted file mode 100755 index c522da2..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$id.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$integer.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$integer.dex deleted file mode 100755 index 09033aa..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$integer.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$interpolator.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$interpolator.dex deleted file mode 100755 index a97a7ed..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$interpolator.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$layout.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$layout.dex deleted file mode 100755 index 425799c..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$layout.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$string.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$string.dex deleted file mode 100755 index 77a477f..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$string.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$style.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$style.dex deleted file mode 100755 index d788297..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$style.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$styleable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$styleable.dex deleted file mode 100755 index be96c54..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R$styleable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R.dex deleted file mode 100755 index 5b879b8..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/38/android/support/design/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/android/arch/lifecycle/livedata/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/android/arch/lifecycle/livedata/R.dex deleted file mode 100755 index 317b5f4..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/android/arch/lifecycle/livedata/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/android/support/print/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/android/support/print/R.dex deleted file mode 100755 index 9d8e31f..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/android/support/print/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/BuildConfig.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/BuildConfig.dex deleted file mode 100755 index f6daf74..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/BuildConfig.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/Church.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/Church.dex deleted file mode 100755 index 054d9940..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/Church.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/MainActivity$1.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/MainActivity$1.dex deleted file mode 100755 index 1848bda..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/MainActivity$1.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/MainActivity.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/MainActivity.dex deleted file mode 100755 index 580edb4..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/MainActivity.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$anim.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$anim.dex deleted file mode 100755 index 9d71890..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$anim.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$animator.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$animator.dex deleted file mode 100755 index fefa79a..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$animator.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$array.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$array.dex deleted file mode 100755 index 84f5c02..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$array.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$attr.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$attr.dex deleted file mode 100755 index 3b6ead2..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$attr.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$bool.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$bool.dex deleted file mode 100755 index 07cee17..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$bool.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$color.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$color.dex deleted file mode 100755 index db8e9e2..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$color.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$dimen.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$dimen.dex deleted file mode 100755 index 221dd8c..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$dimen.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$drawable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$drawable.dex deleted file mode 100755 index cd73f35..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$drawable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$id.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$id.dex deleted file mode 100755 index cbcacc0..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$id.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$integer.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$integer.dex deleted file mode 100755 index bff4281..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$integer.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$interpolator.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$interpolator.dex deleted file mode 100755 index 4ede80e..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$interpolator.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$layout.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$layout.dex deleted file mode 100755 index 3041057..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$layout.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$menu.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$menu.dex deleted file mode 100755 index c194cb0..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$menu.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$mipmap.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$mipmap.dex deleted file mode 100755 index 62171c3..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$mipmap.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$string.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$string.dex deleted file mode 100755 index 0f6c016..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$string.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$style.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$style.dex deleted file mode 100755 index 7d3298f..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$style.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$styleable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$styleable.dex deleted file mode 100755 index da5c65f..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R$styleable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R.dex deleted file mode 100755 index 707b2f1..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/Settings$1.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/Settings$1.dex deleted file mode 100755 index ddc7d80..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/Settings$1.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/Settings$2.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/Settings$2.dex deleted file mode 100755 index 525dab7..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/Settings$2.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/Settings$3.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/Settings$3.dex deleted file mode 100755 index 048450f..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/Settings$3.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/Settings$4.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/Settings$4.dex deleted file mode 100755 index c162607..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/Settings$4.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/Settings.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/Settings.dex deleted file mode 100755 index dd8baa8..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/Settings.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/Song.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/Song.dex deleted file mode 100755 index 307d0a5..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/Song.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/songRequest.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/songRequest.dex deleted file mode 100755 index 7b0fe45..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/39/com/scriptor/songRequest.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/4.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/4.jar deleted file mode 100755 index 9ef14ea..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/4.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$attr.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$attr.dex deleted file mode 100755 index 2565730..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$attr.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$color.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$color.dex deleted file mode 100755 index 9aa6b0e..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$color.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$dimen.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$dimen.dex deleted file mode 100755 index bc75452..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$dimen.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$drawable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$drawable.dex deleted file mode 100755 index 834271a..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$drawable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$id.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$id.dex deleted file mode 100755 index 1ea4cc7..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$id.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$integer.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$integer.dex deleted file mode 100755 index 5454f6e..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$integer.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$layout.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$layout.dex deleted file mode 100755 index a56266b..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$layout.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$string.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$string.dex deleted file mode 100755 index 9b62721..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$string.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$style.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$style.dex deleted file mode 100755 index d86c65f..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$style.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$styleable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$styleable.dex deleted file mode 100755 index a366353..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R$styleable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R.dex deleted file mode 100755 index d36cbb8..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/40/android/support/coordinatorlayout/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/arch/lifecycle/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/arch/lifecycle/R.dex deleted file mode 100755 index 28f07eb..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/arch/lifecycle/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/arch/lifecycle/viewmodel/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/arch/lifecycle/viewmodel/R.dex deleted file mode 100755 index c6f5ee3..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/arch/lifecycle/viewmodel/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$attr.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$attr.dex deleted file mode 100755 index 18af208..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$attr.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$color.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$color.dex deleted file mode 100755 index fef7a9a..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$color.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$dimen.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$dimen.dex deleted file mode 100755 index 643735d..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$dimen.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$drawable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$drawable.dex deleted file mode 100755 index 6162c75..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$drawable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$id.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$id.dex deleted file mode 100755 index 994a67e..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$id.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$integer.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$integer.dex deleted file mode 100755 index aaa6c14..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$integer.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$layout.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$layout.dex deleted file mode 100755 index 67e7e58..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$layout.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$string.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$string.dex deleted file mode 100755 index 4137c08..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$string.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$style.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$style.dex deleted file mode 100755 index e4f0ad7..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$style.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$styleable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$styleable.dex deleted file mode 100755 index fc067d7..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R$styleable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R.dex deleted file mode 100755 index a3d3bce..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/asynclayoutinflater/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$attr.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$attr.dex deleted file mode 100755 index ccfea90..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$attr.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$color.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$color.dex deleted file mode 100755 index 2aaefba..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$color.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$dimen.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$dimen.dex deleted file mode 100755 index 126891b..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$dimen.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$drawable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$drawable.dex deleted file mode 100755 index c2e764c..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$drawable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$id.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$id.dex deleted file mode 100755 index 15400b1..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$id.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$integer.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$integer.dex deleted file mode 100755 index 33299f8..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$integer.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$layout.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$layout.dex deleted file mode 100755 index 9a79cb7..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$layout.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$string.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$string.dex deleted file mode 100755 index c07bfc7..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$string.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$style.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$style.dex deleted file mode 100755 index 0f7a6bc..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$style.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$styleable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$styleable.dex deleted file mode 100755 index 2f43f67..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R$styleable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R.dex deleted file mode 100755 index 5a03de4..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/coreui/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/cursoradapter/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/cursoradapter/R.dex deleted file mode 100755 index 6d5ace2..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/cursoradapter/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/documentfile/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/documentfile/R.dex deleted file mode 100755 index 19c11da..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/documentfile/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$attr.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$attr.dex deleted file mode 100755 index 920ae2e..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$attr.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$color.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$color.dex deleted file mode 100755 index 1917444..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$color.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$dimen.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$dimen.dex deleted file mode 100755 index a8ab987..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$dimen.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$drawable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$drawable.dex deleted file mode 100755 index 37f8e44..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$drawable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$id.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$id.dex deleted file mode 100755 index b2374cd..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$id.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$integer.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$integer.dex deleted file mode 100755 index e2b0eed..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$integer.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$layout.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$layout.dex deleted file mode 100755 index 9af1996..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$layout.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$string.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$string.dex deleted file mode 100755 index 2e44b04..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$string.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$style.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$style.dex deleted file mode 100755 index 8fe77a5..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$style.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$styleable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$styleable.dex deleted file mode 100755 index 0d7d91d..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R$styleable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R.dex deleted file mode 100755 index 5d45ac0..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/drawerlayout/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$attr.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$attr.dex deleted file mode 100755 index 6a1bc22..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$attr.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$color.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$color.dex deleted file mode 100755 index ce958de..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$color.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$dimen.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$dimen.dex deleted file mode 100755 index d727151..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$dimen.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$drawable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$drawable.dex deleted file mode 100755 index d99e3b8..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$drawable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$id.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$id.dex deleted file mode 100755 index 24ea28d..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$id.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$integer.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$integer.dex deleted file mode 100755 index 2e1a7f0..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$integer.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$layout.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$layout.dex deleted file mode 100755 index 2c62fc5..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$layout.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$string.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$string.dex deleted file mode 100755 index 534fb62..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$string.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$style.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$style.dex deleted file mode 100755 index 38d168e..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$style.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$styleable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$styleable.dex deleted file mode 100755 index 256bb3b..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R$styleable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R.dex deleted file mode 100755 index 464822d..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/graphics/drawable/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/localbroadcastmanager/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/localbroadcastmanager/R.dex deleted file mode 100755 index 62c8100..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/android/support/localbroadcastmanager/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/androidx/versionedparcelable/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/androidx/versionedparcelable/R.dex deleted file mode 100755 index cc52d49..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/41/androidx/versionedparcelable/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/arch/core/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/arch/core/R.dex deleted file mode 100755 index 6f0bc00..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/arch/core/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$attr.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$attr.dex deleted file mode 100755 index 4077759..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$attr.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$color.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$color.dex deleted file mode 100755 index ff4949a..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$color.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$dimen.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$dimen.dex deleted file mode 100755 index 3d1b566..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$dimen.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$drawable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$drawable.dex deleted file mode 100755 index b34e221..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$drawable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$id.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$id.dex deleted file mode 100755 index ef3410b..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$id.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$integer.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$integer.dex deleted file mode 100755 index 54ed990..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$integer.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$layout.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$layout.dex deleted file mode 100755 index d2c1afc..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$layout.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$string.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$string.dex deleted file mode 100755 index aae459f..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$string.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$style.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$style.dex deleted file mode 100755 index b798cd6..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$style.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$styleable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$styleable.dex deleted file mode 100755 index 3ecbd42..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R$styleable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R.dex deleted file mode 100755 index 1d0b4d8..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/customview/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$attr.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$attr.dex deleted file mode 100755 index 06a2918..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$attr.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$color.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$color.dex deleted file mode 100755 index 5dcd6e7..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$color.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$dimen.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$dimen.dex deleted file mode 100755 index b46faf8..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$dimen.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$drawable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$drawable.dex deleted file mode 100755 index 0d9bcd2..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$drawable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$id.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$id.dex deleted file mode 100755 index f8cda89..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$id.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$integer.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$integer.dex deleted file mode 100755 index 6863394..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$integer.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$layout.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$layout.dex deleted file mode 100755 index 37d99d8..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$layout.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$string.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$string.dex deleted file mode 100755 index 7ad22e5..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$string.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$style.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$style.dex deleted file mode 100755 index 7075cea..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$style.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$styleable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$styleable.dex deleted file mode 100755 index 1c5f46c..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R$styleable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R.dex deleted file mode 100755 index 909be95..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/42/android/support/fragment/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/interpolator/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/interpolator/R.dex deleted file mode 100755 index 794792d..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/interpolator/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$attr.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$attr.dex deleted file mode 100755 index b73cdeb..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$attr.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$color.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$color.dex deleted file mode 100755 index e089eb7..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$color.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$dimen.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$dimen.dex deleted file mode 100755 index b463d24..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$dimen.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$drawable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$drawable.dex deleted file mode 100755 index 051c685..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$drawable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$id.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$id.dex deleted file mode 100755 index 8d38ad6..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$id.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$integer.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$integer.dex deleted file mode 100755 index 7c17a16..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$integer.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$layout.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$layout.dex deleted file mode 100755 index 1a5f6a3..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$layout.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$string.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$string.dex deleted file mode 100755 index e9f33e2..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$string.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$style.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$style.dex deleted file mode 100755 index 53125e1..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$style.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$styleable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$styleable.dex deleted file mode 100755 index d523926..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R$styleable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R.dex deleted file mode 100755 index 2e81d46..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/43/android/support/v7/recyclerview/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/arch/lifecycle/livedata/core/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/arch/lifecycle/livedata/core/R.dex deleted file mode 100755 index dd2d1d2..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/arch/lifecycle/livedata/core/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$attr.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$attr.dex deleted file mode 100755 index 1e9b310..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$attr.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$color.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$color.dex deleted file mode 100755 index 23d1eea..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$color.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$dimen.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$dimen.dex deleted file mode 100755 index 1ccedd8..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$dimen.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$drawable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$drawable.dex deleted file mode 100755 index 69d5113..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$drawable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$id.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$id.dex deleted file mode 100755 index eaabd1c..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$id.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$integer.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$integer.dex deleted file mode 100755 index 77b0944..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$integer.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$layout.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$layout.dex deleted file mode 100755 index 2335026..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$layout.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$string.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$string.dex deleted file mode 100755 index 980f98f..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$string.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$style.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$style.dex deleted file mode 100755 index 5ebbf0f..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$style.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$styleable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$styleable.dex deleted file mode 100755 index c01bf64..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R$styleable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R.dex deleted file mode 100755 index 8a1660c..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/coreutils/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$anim.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$anim.dex deleted file mode 100755 index 05127ff..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$anim.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$attr.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$attr.dex deleted file mode 100755 index f7f8fc3..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$attr.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$bool.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$bool.dex deleted file mode 100755 index 64c13c7..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$bool.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$color.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$color.dex deleted file mode 100755 index 9ed31b3..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$color.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$dimen.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$dimen.dex deleted file mode 100755 index d26ed6c..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$dimen.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$drawable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$drawable.dex deleted file mode 100755 index 63e98ea..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$drawable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$id.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$id.dex deleted file mode 100755 index 116fb20..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$id.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$integer.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$integer.dex deleted file mode 100755 index dba2408..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$integer.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$layout.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$layout.dex deleted file mode 100755 index 70b2c74..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$layout.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$string.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$string.dex deleted file mode 100755 index 59ad4c4..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$string.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$style.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$style.dex deleted file mode 100755 index 85b56b5..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$style.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$styleable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$styleable.dex deleted file mode 100755 index 5bddd2f..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R$styleable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R.dex deleted file mode 100755 index 74d5890..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/appcompat/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/cardview/R$attr.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/cardview/R$attr.dex deleted file mode 100755 index af87ab6..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/cardview/R$attr.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/cardview/R$color.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/cardview/R$color.dex deleted file mode 100755 index 9fa6846..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/cardview/R$color.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/cardview/R$dimen.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/cardview/R$dimen.dex deleted file mode 100755 index 3e4dc95..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/cardview/R$dimen.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/cardview/R$style.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/cardview/R$style.dex deleted file mode 100755 index d8352b1..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/cardview/R$style.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/cardview/R$styleable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/cardview/R$styleable.dex deleted file mode 100755 index c2e6676..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/cardview/R$styleable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/cardview/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/cardview/R.dex deleted file mode 100755 index e3c838c..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/44/android/support/v7/cardview/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$attr.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$attr.dex deleted file mode 100755 index 117b217..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$attr.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$color.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$color.dex deleted file mode 100755 index 20fd3c0..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$color.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$dimen.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$dimen.dex deleted file mode 100755 index 0bd8c57..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$dimen.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$drawable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$drawable.dex deleted file mode 100755 index ffed98a..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$drawable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$id.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$id.dex deleted file mode 100755 index 7ccf79c..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$id.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$integer.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$integer.dex deleted file mode 100755 index 7baaf27..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$integer.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$layout.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$layout.dex deleted file mode 100755 index 0a94b87..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$layout.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$string.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$string.dex deleted file mode 100755 index 2418982..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$string.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$style.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$style.dex deleted file mode 100755 index 2e63c86..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$style.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$styleable.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$styleable.dex deleted file mode 100755 index 3edf7f9..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R$styleable.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R.dex b/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R.dex deleted file mode 100755 index d3eae5b..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/45/android/support/loader/R.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/46.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/46.jar deleted file mode 100755 index 8ba81f6..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/46.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/47.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/47.jar deleted file mode 100755 index b555f87..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/47.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/48.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/48.jar deleted file mode 100755 index 1b48572..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/48.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/49.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/49.jar deleted file mode 100755 index 7d30f19..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/49.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/5.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/5.jar deleted file mode 100755 index 3929b81..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/5.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/50.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/50.jar deleted file mode 100755 index 6a758d3..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/50.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/51.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/51.jar deleted file mode 100755 index 5cbdb70..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/51.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/52.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/52.jar deleted file mode 100755 index 1b6dcef..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/52.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/53.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/53.jar deleted file mode 100755 index 021f9f0..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/53.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/54.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/54.jar deleted file mode 100755 index 29c4846..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/54.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/55.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/55.jar deleted file mode 100755 index b9ef9d2..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/55.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/57.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/57.jar deleted file mode 100755 index fd1a5d3..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/57.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/6.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/6.jar deleted file mode 100755 index 001de9a..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/6.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/7.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/7.jar deleted file mode 100755 index 124f151..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/7.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/8.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/8.jar deleted file mode 100755 index 9c403ef..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/8.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/9.jar b/code/Android App/build/intermediates/transforms/dexBuilder/debug/9.jar deleted file mode 100755 index 3abf36d..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexBuilder/debug/9.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexBuilder/debug/__content__.json b/code/Android App/build/intermediates/transforms/dexBuilder/debug/__content__.json deleted file mode 100755 index d2b66f9..0000000 --- a/code/Android App/build/intermediates/transforms/dexBuilder/debug/__content__.json +++ /dev/null @@ -1 +0,0 @@ -[{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\design-28.0.0.aar\\a8fdf681d833477cb2a65eb7f903a3d5\\jars\\classes.jar","index":0,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\appcompat-v7-28.0.0.aar\\98c842e7c54fabd76cb985fd3e0a712b\\jars\\classes.jar","index":1,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\constraint-layout-1.1.3.aar\\78c302b72b1c55c024ab2e374fc3bb28\\jars\\classes.jar","index":2,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-fragment-28.0.0.aar\\6d4336038f9d8141c008082b95c1add8\\jars\\classes.jar","index":3,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\animated-vector-drawable-28.0.0.aar\\081ef2f23f18acdd2c912771a6bf7070\\jars\\classes.jar","index":4,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\recyclerview-v7-28.0.0.aar\\d6e16f2b4f256229a87f783389106887\\jars\\classes.jar","index":5,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-core-ui-28.0.0.aar\\e628a55ddd21834b717cb67580acd9c9\\jars\\classes.jar","index":6,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-core-utils-28.0.0.aar\\0f496186d26b8a0ab04cb65da016e902\\jars\\classes.jar","index":7,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-vector-drawable-28.0.0.aar\\d554b25393fc06e10aa84ac466ea2f12\\jars\\classes.jar","index":8,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\transition-28.0.0.aar\\83dbb9ccdea7ebbe8e380df93f21d851\\jars\\classes.jar","index":9,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\loader-28.0.0.aar\\86bd80c1dddf990bd827d8b54c3fc90f\\jars\\classes.jar","index":10,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\viewpager-28.0.0.aar\\92e1470b097e3a5107d09803098567b1\\jars\\classes.jar","index":11,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\coordinatorlayout-28.0.0.aar\\c4bd9e34079f8fa4e6d0c7db3f4a75c4\\jars\\classes.jar","index":12,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\drawerlayout-28.0.0.aar\\ebd0c61ea462b6aa0dfb824e135a2b7b\\jars\\classes.jar","index":13,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\slidingpanelayout-28.0.0.aar\\0a8db2b49ef283eb80448d7ad7164ea6\\jars\\classes.jar","index":14,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\customview-28.0.0.aar\\ccb0eed7a763ebae2fb9d306496f6bac\\jars\\classes.jar","index":15,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\swiperefreshlayout-28.0.0.aar\\4acf215b8960dcbfa1d96d88e544d065\\jars\\classes.jar","index":16,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\asynclayoutinflater-28.0.0.aar\\045398c595368aef51d279da09c8086d\\jars\\classes.jar","index":17,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\support-compat-28.0.0.aar\\ba8ba156f29bd88e4fbb205a95242bcd\\jars\\classes.jar","index":18,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\versionedparcelable-28.0.0.aar\\a290bac5b4d3d101a1d1c1f83625f0c1\\jars\\classes.jar","index":19,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\modules-2\\files-2.1\\com.android.support\\collections\\28.0.0\\c1bcdade4d3cc2836130424a3f3e4182c666a745\\collections-28.0.0.jar","index":20,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\cursoradapter-28.0.0.aar\\2300ef89a498ed59e9e2822ff5526ad9\\jars\\classes.jar","index":21,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\cardview-v7-28.0.0.aar\\3b87ab57366b6cf64018eb749db2a1b4\\jars\\classes.jar","index":22,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\runtime-1.1.1.aar\\f0afe86db60f8395edf4122c7eed9a46\\jars\\classes.jar","index":23,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\documentfile-28.0.0.aar\\0380ee5fbd8092e41e9f16e8f8aea825\\jars\\classes.jar","index":24,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\localbroadcastmanager-28.0.0.aar\\63c4186256bdae50acd394f88f1a5f76\\jars\\classes.jar","index":25,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\print-28.0.0.aar\\f79ce65c00287d15ba798f71559f9f58\\jars\\classes.jar","index":26,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\viewmodel-1.1.1.aar\\3ab379c65ed8ecaca3533077157df379\\jars\\classes.jar","index":27,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\interpolator-28.0.0.aar\\b06515bd8d0756506b551709fc30836c\\jars\\classes.jar","index":28,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\livedata-1.1.1.aar\\3cfd45c4ff66de2b8f21ed4cc4020248\\jars\\classes.jar","index":29,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\livedata-core-1.1.1.aar\\9c647c6eb537574203d1f625fbaa0b35\\jars\\classes.jar","index":30,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\modules-2\\files-2.1\\android.arch.lifecycle\\common\\1.1.1\\207a6efae6a3555e326de41f76bdadd9a239cbce\\common-1.1.1.jar","index":31,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\transforms-1\\files-1.1\\runtime-1.1.1.aar\\bcedb934df539be06412556560380613\\jars\\classes.jar","index":32,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\modules-2\\files-2.1\\android.arch.core\\common\\1.1.1\\e55b70d1f5620db124b3e85a7f4bdc7bd48d9f95\\common-1.1.1.jar","index":33,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\modules-2\\files-2.1\\com.android.support\\support-annotations\\28.0.0\\ed73f5337a002d1fd24339d5fb08c2c9d9ca60d8\\support-annotations-28.0.0.jar","index":34,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\.gradle\\caches\\modules-2\\files-2.1\\com.android.support.constraint\\constraint-layout-solver\\1.1.3\\bde0667d7414c16ed62d3cfe993cff7f9d732373\\constraint-layout-solver-1.1.3.jar","index":35,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"slice_0","index":36,"scopes":["PROJECT","SUB_PROJECTS"],"types":["DEX_ARCHIVE"],"format":"DIRECTORY","present":true},{"name":"slice_1","index":37,"scopes":["PROJECT","SUB_PROJECTS"],"types":["DEX_ARCHIVE"],"format":"DIRECTORY","present":true},{"name":"slice_2","index":38,"scopes":["PROJECT","SUB_PROJECTS"],"types":["DEX_ARCHIVE"],"format":"DIRECTORY","present":true},{"name":"slice_3","index":39,"scopes":["PROJECT","SUB_PROJECTS"],"types":["DEX_ARCHIVE"],"format":"DIRECTORY","present":true},{"name":"slice_4","index":40,"scopes":["PROJECT","SUB_PROJECTS"],"types":["DEX_ARCHIVE"],"format":"DIRECTORY","present":true},{"name":"slice_5","index":41,"scopes":["PROJECT","SUB_PROJECTS"],"types":["DEX_ARCHIVE"],"format":"DIRECTORY","present":true},{"name":"slice_6","index":42,"scopes":["PROJECT","SUB_PROJECTS"],"types":["DEX_ARCHIVE"],"format":"DIRECTORY","present":true},{"name":"slice_7","index":43,"scopes":["PROJECT","SUB_PROJECTS"],"types":["DEX_ARCHIVE"],"format":"DIRECTORY","present":true},{"name":"slice_8","index":44,"scopes":["PROJECT","SUB_PROJECTS"],"types":["DEX_ARCHIVE"],"format":"DIRECTORY","present":true},{"name":"slice_9","index":45,"scopes":["PROJECT","SUB_PROJECTS"],"types":["DEX_ARCHIVE"],"format":"DIRECTORY","present":true},{"name":"C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental-runtime-classes\\debug\\instant-run.jar-0","index":46,"scopes":["MAIN_SPLIT"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental-runtime-classes\\debug\\instant-run.jar-1","index":47,"scopes":["MAIN_SPLIT"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental-runtime-classes\\debug\\instant-run.jar-2","index":48,"scopes":["MAIN_SPLIT"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental-runtime-classes\\debug\\instant-run.jar-3","index":49,"scopes":["MAIN_SPLIT"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental-runtime-classes\\debug\\instant-run.jar-4","index":50,"scopes":["MAIN_SPLIT"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental-runtime-classes\\debug\\instant-run.jar-5","index":51,"scopes":["MAIN_SPLIT"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental-runtime-classes\\debug\\instant-run.jar-6","index":52,"scopes":["MAIN_SPLIT"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental-runtime-classes\\debug\\instant-run.jar-7","index":53,"scopes":["MAIN_SPLIT"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental-runtime-classes\\debug\\instant-run.jar-8","index":54,"scopes":["MAIN_SPLIT"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\incremental-runtime-classes\\debug\\instant-run.jar-9","index":55,"scopes":["MAIN_SPLIT"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true},{"name":"C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\instant_run_app_info_output_file\\debug\\generateDebugInstantRunAppInfo\\instant-run-bootstrap.jar-1","index":57,"scopes":["MAIN_SPLIT"],"types":["DEX_ARCHIVE"],"format":"JAR","present":true}] \ No newline at end of file diff --git a/code/Android App/build/intermediates/transforms/dexMerger/debug/0/classes.dex b/code/Android App/build/intermediates/transforms/dexMerger/debug/0/classes.dex deleted file mode 100755 index 3df0bef..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexMerger/debug/0/classes.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexMerger/debug/1/classes.dex b/code/Android App/build/intermediates/transforms/dexMerger/debug/1/classes.dex deleted file mode 100755 index 5075d01..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexMerger/debug/1/classes.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexMerger/debug/10/classes.dex b/code/Android App/build/intermediates/transforms/dexMerger/debug/10/classes.dex deleted file mode 100755 index b7edd85..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexMerger/debug/10/classes.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexMerger/debug/11/classes.dex b/code/Android App/build/intermediates/transforms/dexMerger/debug/11/classes.dex deleted file mode 100755 index 897e8ea..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexMerger/debug/11/classes.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexMerger/debug/12/classes.dex b/code/Android App/build/intermediates/transforms/dexMerger/debug/12/classes.dex deleted file mode 100755 index 3771592..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexMerger/debug/12/classes.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexMerger/debug/13/classes.dex b/code/Android App/build/intermediates/transforms/dexMerger/debug/13/classes.dex deleted file mode 100755 index 63efe42..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexMerger/debug/13/classes.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexMerger/debug/14/classes.dex b/code/Android App/build/intermediates/transforms/dexMerger/debug/14/classes.dex deleted file mode 100755 index 765f02c..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexMerger/debug/14/classes.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexMerger/debug/15/classes.dex b/code/Android App/build/intermediates/transforms/dexMerger/debug/15/classes.dex deleted file mode 100755 index 6ab47db..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexMerger/debug/15/classes.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexMerger/debug/16/classes.dex b/code/Android App/build/intermediates/transforms/dexMerger/debug/16/classes.dex deleted file mode 100755 index d68572b..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexMerger/debug/16/classes.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexMerger/debug/17/classes.dex b/code/Android App/build/intermediates/transforms/dexMerger/debug/17/classes.dex deleted file mode 100755 index 084c71a..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexMerger/debug/17/classes.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexMerger/debug/18/classes.dex b/code/Android App/build/intermediates/transforms/dexMerger/debug/18/classes.dex deleted file mode 100755 index 0aa4507..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexMerger/debug/18/classes.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexMerger/debug/19/classes.dex b/code/Android App/build/intermediates/transforms/dexMerger/debug/19/classes.dex deleted file mode 100755 index 1ec762d..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexMerger/debug/19/classes.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexMerger/debug/2/classes.dex b/code/Android App/build/intermediates/transforms/dexMerger/debug/2/classes.dex deleted file mode 100755 index 700299c..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexMerger/debug/2/classes.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexMerger/debug/20/classes.dex b/code/Android App/build/intermediates/transforms/dexMerger/debug/20/classes.dex deleted file mode 100755 index 5d80c5a..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexMerger/debug/20/classes.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexMerger/debug/21/classes.dex b/code/Android App/build/intermediates/transforms/dexMerger/debug/21/classes.dex deleted file mode 100755 index 43e309f..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexMerger/debug/21/classes.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexMerger/debug/3/classes.dex b/code/Android App/build/intermediates/transforms/dexMerger/debug/3/classes.dex deleted file mode 100755 index 8e5c515..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexMerger/debug/3/classes.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexMerger/debug/4/classes.dex b/code/Android App/build/intermediates/transforms/dexMerger/debug/4/classes.dex deleted file mode 100755 index 186022d..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexMerger/debug/4/classes.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexMerger/debug/5/classes.dex b/code/Android App/build/intermediates/transforms/dexMerger/debug/5/classes.dex deleted file mode 100755 index 3ae9d68..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexMerger/debug/5/classes.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexMerger/debug/6/classes.dex b/code/Android App/build/intermediates/transforms/dexMerger/debug/6/classes.dex deleted file mode 100755 index 914b555..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexMerger/debug/6/classes.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexMerger/debug/7/classes.dex b/code/Android App/build/intermediates/transforms/dexMerger/debug/7/classes.dex deleted file mode 100755 index f178c7a..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexMerger/debug/7/classes.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexMerger/debug/8/classes.dex b/code/Android App/build/intermediates/transforms/dexMerger/debug/8/classes.dex deleted file mode 100755 index e7e7d75..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexMerger/debug/8/classes.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexMerger/debug/9/classes.dex b/code/Android App/build/intermediates/transforms/dexMerger/debug/9/classes.dex deleted file mode 100755 index 882ae4e..0000000 Binary files a/code/Android App/build/intermediates/transforms/dexMerger/debug/9/classes.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/dexMerger/debug/__content__.json b/code/Android App/build/intermediates/transforms/dexMerger/debug/__content__.json deleted file mode 100755 index 9a02855..0000000 --- a/code/Android App/build/intermediates/transforms/dexMerger/debug/__content__.json +++ /dev/null @@ -1 +0,0 @@ -[{"name":"slice_0","index":0,"scopes":["PROJECT","SUB_PROJECTS"],"types":["DEX"],"format":"DIRECTORY","present":true},{"name":"slice_1","index":1,"scopes":["PROJECT","SUB_PROJECTS"],"types":["DEX"],"format":"DIRECTORY","present":true},{"name":"slice_2","index":2,"scopes":["PROJECT","SUB_PROJECTS"],"types":["DEX"],"format":"DIRECTORY","present":true},{"name":"slice_3","index":3,"scopes":["PROJECT","SUB_PROJECTS"],"types":["DEX"],"format":"DIRECTORY","present":true},{"name":"slice_4","index":4,"scopes":["PROJECT","SUB_PROJECTS"],"types":["DEX"],"format":"DIRECTORY","present":true},{"name":"slice_5","index":5,"scopes":["PROJECT","SUB_PROJECTS"],"types":["DEX"],"format":"DIRECTORY","present":true},{"name":"slice_6","index":6,"scopes":["PROJECT","SUB_PROJECTS"],"types":["DEX"],"format":"DIRECTORY","present":true},{"name":"slice_7","index":7,"scopes":["PROJECT","SUB_PROJECTS"],"types":["DEX"],"format":"DIRECTORY","present":true},{"name":"slice_8","index":8,"scopes":["PROJECT","SUB_PROJECTS"],"types":["DEX"],"format":"DIRECTORY","present":true},{"name":"slice_9","index":9,"scopes":["PROJECT","SUB_PROJECTS"],"types":["DEX"],"format":"DIRECTORY","present":true},{"name":"C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\externalLibsDexMerger\\debug\\0","index":10,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX"],"format":"DIRECTORY","present":true},{"name":"C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexBuilder\\debug\\46.jar","index":11,"scopes":["MAIN_SPLIT"],"types":["DEX"],"format":"DIRECTORY","present":true},{"name":"C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexBuilder\\debug\\47.jar","index":12,"scopes":["MAIN_SPLIT"],"types":["DEX"],"format":"DIRECTORY","present":true},{"name":"C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexBuilder\\debug\\48.jar","index":13,"scopes":["MAIN_SPLIT"],"types":["DEX"],"format":"DIRECTORY","present":true},{"name":"C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexBuilder\\debug\\49.jar","index":14,"scopes":["MAIN_SPLIT"],"types":["DEX"],"format":"DIRECTORY","present":true},{"name":"C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexBuilder\\debug\\50.jar","index":15,"scopes":["MAIN_SPLIT"],"types":["DEX"],"format":"DIRECTORY","present":true},{"name":"C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexBuilder\\debug\\51.jar","index":16,"scopes":["MAIN_SPLIT"],"types":["DEX"],"format":"DIRECTORY","present":true},{"name":"C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexBuilder\\debug\\52.jar","index":17,"scopes":["MAIN_SPLIT"],"types":["DEX"],"format":"DIRECTORY","present":true},{"name":"C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexBuilder\\debug\\53.jar","index":18,"scopes":["MAIN_SPLIT"],"types":["DEX"],"format":"DIRECTORY","present":true},{"name":"C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexBuilder\\debug\\54.jar","index":19,"scopes":["MAIN_SPLIT"],"types":["DEX"],"format":"DIRECTORY","present":true},{"name":"C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexBuilder\\debug\\55.jar","index":20,"scopes":["MAIN_SPLIT"],"types":["DEX"],"format":"DIRECTORY","present":true},{"name":"C:\\Users\\Adrian\\Downloads\\Scriptor2\\app\\build\\intermediates\\transforms\\dexBuilder\\debug\\57.jar","index":21,"scopes":["MAIN_SPLIT"],"types":["DEX"],"format":"DIRECTORY","present":true},{"name":"externalLibs","index":22,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX"],"format":"DIRECTORY","present":true}] \ No newline at end of file diff --git a/code/Android App/build/intermediates/transforms/externalLibsDexMerger/debug/0/classes.dex b/code/Android App/build/intermediates/transforms/externalLibsDexMerger/debug/0/classes.dex deleted file mode 100755 index b7edd85..0000000 Binary files a/code/Android App/build/intermediates/transforms/externalLibsDexMerger/debug/0/classes.dex and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/externalLibsDexMerger/debug/__content__.json b/code/Android App/build/intermediates/transforms/externalLibsDexMerger/debug/__content__.json deleted file mode 100755 index 30a17cd..0000000 --- a/code/Android App/build/intermediates/transforms/externalLibsDexMerger/debug/__content__.json +++ /dev/null @@ -1 +0,0 @@ -[{"name":"main","index":0,"scopes":["EXTERNAL_LIBRARIES"],"types":["DEX_ARCHIVE"],"format":"DIRECTORY","present":true}] \ No newline at end of file diff --git a/code/Android App/build/intermediates/transforms/extractJars/debug/__content__.json b/code/Android App/build/intermediates/transforms/extractJars/debug/__content__.json deleted file mode 100755 index 0637a08..0000000 --- a/code/Android App/build/intermediates/transforms/extractJars/debug/__content__.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/arch/core/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/arch/core/R.class deleted file mode 100755 index f74ab6f..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/arch/core/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/arch/lifecycle/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/arch/lifecycle/R.class deleted file mode 100755 index c52407b..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/arch/lifecycle/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/arch/lifecycle/livedata/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/arch/lifecycle/livedata/R.class deleted file mode 100755 index 80ab4ab..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/arch/lifecycle/livedata/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/arch/lifecycle/livedata/core/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/arch/lifecycle/livedata/core/R.class deleted file mode 100755 index 85462a4..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/arch/lifecycle/livedata/core/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/arch/lifecycle/viewmodel/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/arch/lifecycle/viewmodel/R.class deleted file mode 100755 index 53678cf..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/arch/lifecycle/viewmodel/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$attr.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$attr.class deleted file mode 100755 index 39dadfb..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$color.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$color.class deleted file mode 100755 index 2e9a066..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$dimen.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$dimen.class deleted file mode 100755 index a2b44d7..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$drawable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$drawable.class deleted file mode 100755 index 514746a..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$id.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$id.class deleted file mode 100755 index c84f040..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$integer.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$integer.class deleted file mode 100755 index a0f398d..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$layout.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$layout.class deleted file mode 100755 index 2a6ff44..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$string.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$string.class deleted file mode 100755 index 2fb1b65..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$style.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$style.class deleted file mode 100755 index aeca33e..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$styleable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$styleable.class deleted file mode 100755 index 345f7ab..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R.class deleted file mode 100755 index 0874dd7..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/asynclayoutinflater/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$attr.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$attr.class deleted file mode 100755 index 196b27e..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$color.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$color.class deleted file mode 100755 index 616f58f..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$dimen.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$dimen.class deleted file mode 100755 index abf2ed4..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$drawable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$drawable.class deleted file mode 100755 index 3d60819..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$id.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$id.class deleted file mode 100755 index c4b2468..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$integer.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$integer.class deleted file mode 100755 index b6596a8..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$layout.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$layout.class deleted file mode 100755 index 5297a3e..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$string.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$string.class deleted file mode 100755 index 3cc2fec..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$style.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$style.class deleted file mode 100755 index f292e7f..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$styleable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$styleable.class deleted file mode 100755 index 446d0a8..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R.class deleted file mode 100755 index 57ad7c8..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/compat/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/constraint/R$attr.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/constraint/R$attr.class deleted file mode 100755 index e4ee068..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/constraint/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/constraint/R$id.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/constraint/R$id.class deleted file mode 100755 index a51a6f1..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/constraint/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/constraint/R$styleable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/constraint/R$styleable.class deleted file mode 100755 index 7da88e3..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/constraint/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/constraint/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/constraint/R.class deleted file mode 100755 index 237278c..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/constraint/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$attr.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$attr.class deleted file mode 100755 index 6313118..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$color.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$color.class deleted file mode 100755 index f867707..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$dimen.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$dimen.class deleted file mode 100755 index e3770ae..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$drawable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$drawable.class deleted file mode 100755 index e3a0e58..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$id.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$id.class deleted file mode 100755 index dae400f..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$integer.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$integer.class deleted file mode 100755 index 6647fd8..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$layout.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$layout.class deleted file mode 100755 index eed28af..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$string.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$string.class deleted file mode 100755 index 96343be..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$style.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$style.class deleted file mode 100755 index 4813ed8..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$styleable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$styleable.class deleted file mode 100755 index 469323d..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R.class deleted file mode 100755 index 8fbdcbb..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coordinatorlayout/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$attr.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$attr.class deleted file mode 100755 index 5d1d245..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$color.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$color.class deleted file mode 100755 index d6f1bb6..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$dimen.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$dimen.class deleted file mode 100755 index ae5b0ca..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$drawable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$drawable.class deleted file mode 100755 index 6fe94b0..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$id.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$id.class deleted file mode 100755 index 9c8f312..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$integer.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$integer.class deleted file mode 100755 index 2717f23..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$layout.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$layout.class deleted file mode 100755 index 1abb971..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$string.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$string.class deleted file mode 100755 index ce71049..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$style.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$style.class deleted file mode 100755 index 6a4bf04..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$styleable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$styleable.class deleted file mode 100755 index 30d59ab..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R.class deleted file mode 100755 index 120ef93..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreui/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$attr.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$attr.class deleted file mode 100755 index 9dc48f3..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$color.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$color.class deleted file mode 100755 index 4d2dbb0..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$dimen.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$dimen.class deleted file mode 100755 index 550daf7..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$drawable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$drawable.class deleted file mode 100755 index 76a4337..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$id.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$id.class deleted file mode 100755 index 998bb0e..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$integer.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$integer.class deleted file mode 100755 index 7534c58..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$layout.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$layout.class deleted file mode 100755 index 58f06b5..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$string.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$string.class deleted file mode 100755 index c4be0d6..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$style.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$style.class deleted file mode 100755 index 1468bdf..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$styleable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$styleable.class deleted file mode 100755 index 8b6cc31..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R.class deleted file mode 100755 index a92c243..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/coreutils/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/cursoradapter/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/cursoradapter/R.class deleted file mode 100755 index f9da80e..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/cursoradapter/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$attr.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$attr.class deleted file mode 100755 index d28e3e2..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$color.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$color.class deleted file mode 100755 index c53736f..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$dimen.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$dimen.class deleted file mode 100755 index 2338981..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$drawable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$drawable.class deleted file mode 100755 index 84216bc..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$id.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$id.class deleted file mode 100755 index 96b9fac..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$integer.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$integer.class deleted file mode 100755 index c67e4f8..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$layout.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$layout.class deleted file mode 100755 index 9e44720..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$string.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$string.class deleted file mode 100755 index 5bfbf9e..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$style.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$style.class deleted file mode 100755 index 131a48d..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$styleable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$styleable.class deleted file mode 100755 index 4294c06..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R.class deleted file mode 100755 index e47774a..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/customview/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$anim.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$anim.class deleted file mode 100755 index 20db283..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$anim.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$animator.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$animator.class deleted file mode 100755 index 84f5c88..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$animator.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$attr.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$attr.class deleted file mode 100755 index e1d77af..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$bool.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$bool.class deleted file mode 100755 index 3092f59..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$bool.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$color.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$color.class deleted file mode 100755 index e3f2a8f..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$dimen.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$dimen.class deleted file mode 100755 index acfb746..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$drawable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$drawable.class deleted file mode 100755 index e1a6547..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$id.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$id.class deleted file mode 100755 index 02a7978..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$integer.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$integer.class deleted file mode 100755 index 1937648..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$interpolator.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$interpolator.class deleted file mode 100755 index 34e1744..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$interpolator.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$layout.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$layout.class deleted file mode 100755 index 11608d9..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$string.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$string.class deleted file mode 100755 index fa2d93c..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$style.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$style.class deleted file mode 100755 index 8c2567d..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$styleable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$styleable.class deleted file mode 100755 index a0bbba8..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R.class deleted file mode 100755 index d3ada39..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/design/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/documentfile/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/documentfile/R.class deleted file mode 100755 index 8808028..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/documentfile/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$attr.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$attr.class deleted file mode 100755 index 6f3432e..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$color.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$color.class deleted file mode 100755 index 1b47111..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$dimen.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$dimen.class deleted file mode 100755 index 21aa3b3..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$drawable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$drawable.class deleted file mode 100755 index efa7e94..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$id.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$id.class deleted file mode 100755 index f7b6937..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$integer.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$integer.class deleted file mode 100755 index 77253ca..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$layout.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$layout.class deleted file mode 100755 index 701db2b..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$string.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$string.class deleted file mode 100755 index 1d4f378..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$style.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$style.class deleted file mode 100755 index 0f8bbc7..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$styleable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$styleable.class deleted file mode 100755 index 718d9b1..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R.class deleted file mode 100755 index ce9c72a..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/drawerlayout/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$attr.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$attr.class deleted file mode 100755 index 7d89f92..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$color.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$color.class deleted file mode 100755 index 20f010a..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$dimen.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$dimen.class deleted file mode 100755 index 3c31a78..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$drawable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$drawable.class deleted file mode 100755 index e99f0d4..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$id.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$id.class deleted file mode 100755 index b501812..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$integer.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$integer.class deleted file mode 100755 index ff3240a..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$layout.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$layout.class deleted file mode 100755 index 24af21d..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$string.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$string.class deleted file mode 100755 index 62a8352..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$style.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$style.class deleted file mode 100755 index 64d8ed3..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$styleable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$styleable.class deleted file mode 100755 index 4dc3949..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R.class deleted file mode 100755 index 030d8ce..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/fragment/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$attr.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$attr.class deleted file mode 100755 index 3a17d54..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$color.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$color.class deleted file mode 100755 index f0cbe41..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$dimen.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$dimen.class deleted file mode 100755 index 3ca1f4b..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$drawable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$drawable.class deleted file mode 100755 index 914ba1e..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$id.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$id.class deleted file mode 100755 index b120e4d..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$integer.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$integer.class deleted file mode 100755 index 5682edc..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$layout.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$layout.class deleted file mode 100755 index 7ac4e51..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$string.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$string.class deleted file mode 100755 index ffb5a42..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$style.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$style.class deleted file mode 100755 index 26f5b7a..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$styleable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$styleable.class deleted file mode 100755 index 2b37487..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R.class deleted file mode 100755 index 0219482..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/graphics/drawable/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/interpolator/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/interpolator/R.class deleted file mode 100755 index 0a83688..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/interpolator/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$attr.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$attr.class deleted file mode 100755 index df8a07c..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$color.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$color.class deleted file mode 100755 index ce2065e..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$dimen.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$dimen.class deleted file mode 100755 index e017d28..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$drawable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$drawable.class deleted file mode 100755 index 28a805a..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$id.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$id.class deleted file mode 100755 index 09d42f8..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$integer.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$integer.class deleted file mode 100755 index 5f71633..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$layout.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$layout.class deleted file mode 100755 index f34db2d..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$string.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$string.class deleted file mode 100755 index c6f18b7..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$style.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$style.class deleted file mode 100755 index f5e4d4d..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$styleable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$styleable.class deleted file mode 100755 index 5db0853..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R.class deleted file mode 100755 index 70da916..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/loader/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/localbroadcastmanager/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/localbroadcastmanager/R.class deleted file mode 100755 index a29b974..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/localbroadcastmanager/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/print/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/print/R.class deleted file mode 100755 index b8761d9..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/print/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$attr.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$attr.class deleted file mode 100755 index a04f67b..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$color.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$color.class deleted file mode 100755 index 1312866..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$dimen.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$dimen.class deleted file mode 100755 index a531fe4..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$drawable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$drawable.class deleted file mode 100755 index c1d5d0a..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$id.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$id.class deleted file mode 100755 index 958cba9..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$integer.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$integer.class deleted file mode 100755 index dccad09..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$layout.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$layout.class deleted file mode 100755 index 1aabfb5..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$string.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$string.class deleted file mode 100755 index 8a494ea..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$style.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$style.class deleted file mode 100755 index 841d660..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$styleable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$styleable.class deleted file mode 100755 index 201bc95..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R.class deleted file mode 100755 index 155b8a9..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/slidingpanelayout/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$attr.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$attr.class deleted file mode 100755 index c8b6066..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$color.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$color.class deleted file mode 100755 index 12b7876..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$dimen.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$dimen.class deleted file mode 100755 index a23a55a..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$drawable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$drawable.class deleted file mode 100755 index f4874a4..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$id.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$id.class deleted file mode 100755 index 841a5bd..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$integer.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$integer.class deleted file mode 100755 index 6a71362..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$layout.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$layout.class deleted file mode 100755 index 39eb317..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$string.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$string.class deleted file mode 100755 index 11e50b7..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$style.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$style.class deleted file mode 100755 index b2b5d33..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$styleable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$styleable.class deleted file mode 100755 index 527f746..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R.class deleted file mode 100755 index 069da82..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/swiperefreshlayout/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$attr.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$attr.class deleted file mode 100755 index 9159a65..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$color.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$color.class deleted file mode 100755 index ea65d10..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$dimen.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$dimen.class deleted file mode 100755 index 44c0d8f..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$drawable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$drawable.class deleted file mode 100755 index 2f08b95..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$id.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$id.class deleted file mode 100755 index 3983f98..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$integer.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$integer.class deleted file mode 100755 index e53fb28..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$layout.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$layout.class deleted file mode 100755 index 0375edd..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$string.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$string.class deleted file mode 100755 index 61e5dcd..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$style.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$style.class deleted file mode 100755 index 1ce25c5..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$styleable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$styleable.class deleted file mode 100755 index 9cb7778..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R.class deleted file mode 100755 index 889270a..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/transition/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$anim.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$anim.class deleted file mode 100755 index 1ab5b25..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$anim.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$attr.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$attr.class deleted file mode 100755 index b74e8d1..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$bool.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$bool.class deleted file mode 100755 index 921bfae..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$bool.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$color.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$color.class deleted file mode 100755 index 00e4d1d..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$dimen.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$dimen.class deleted file mode 100755 index eb76120..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$drawable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$drawable.class deleted file mode 100755 index 579c285..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$id.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$id.class deleted file mode 100755 index e673dee..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$integer.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$integer.class deleted file mode 100755 index 415e124..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$layout.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$layout.class deleted file mode 100755 index 1eaa2fc..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$string.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$string.class deleted file mode 100755 index 751c9f7..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$style.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$style.class deleted file mode 100755 index 6e4cd80..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$styleable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$styleable.class deleted file mode 100755 index 96a18be..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R.class deleted file mode 100755 index c2e3955..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/appcompat/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/cardview/R$attr.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/cardview/R$attr.class deleted file mode 100755 index be164b8..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/cardview/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/cardview/R$color.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/cardview/R$color.class deleted file mode 100755 index 66468f9..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/cardview/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/cardview/R$dimen.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/cardview/R$dimen.class deleted file mode 100755 index 4d19b1a..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/cardview/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/cardview/R$style.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/cardview/R$style.class deleted file mode 100755 index 964af87..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/cardview/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/cardview/R$styleable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/cardview/R$styleable.class deleted file mode 100755 index 79a2892..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/cardview/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/cardview/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/cardview/R.class deleted file mode 100755 index 18455b8..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/cardview/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$attr.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$attr.class deleted file mode 100755 index aff1355..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$color.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$color.class deleted file mode 100755 index b90abfd..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$dimen.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$dimen.class deleted file mode 100755 index f3a6868..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$drawable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$drawable.class deleted file mode 100755 index 28cd8be..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$id.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$id.class deleted file mode 100755 index fe202ee..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$integer.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$integer.class deleted file mode 100755 index ae89370..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$layout.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$layout.class deleted file mode 100755 index 023729e..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$string.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$string.class deleted file mode 100755 index 0e64a0e..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$style.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$style.class deleted file mode 100755 index 899d603..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$styleable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$styleable.class deleted file mode 100755 index 9c1648e..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R.class deleted file mode 100755 index 9796eb9..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/recyclerview/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$attr.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$attr.class deleted file mode 100755 index 8a87fa9..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$color.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$color.class deleted file mode 100755 index cf47beb..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$dimen.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$dimen.class deleted file mode 100755 index 4d8702c..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$drawable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$drawable.class deleted file mode 100755 index 2ea9a91..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$id.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$id.class deleted file mode 100755 index f8991c9..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$integer.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$integer.class deleted file mode 100755 index 0b92dea..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$layout.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$layout.class deleted file mode 100755 index 733fb59..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$string.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$string.class deleted file mode 100755 index fe3a314..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$style.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$style.class deleted file mode 100755 index 2e6f257..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$styleable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$styleable.class deleted file mode 100755 index b95e2d8..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R.class deleted file mode 100755 index 4785c9b..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/android/support/v7/viewpager/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/androidx/versionedparcelable/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/androidx/versionedparcelable/R.class deleted file mode 100755 index 79a4038..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/androidx/versionedparcelable/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/BuildConfig.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/BuildConfig.class deleted file mode 100755 index 0cf9b04..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/BuildConfig.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/Church.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/Church.class deleted file mode 100755 index 94fbeb4..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/Church.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/MainActivity$1.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/MainActivity$1.class deleted file mode 100755 index 5cbf18f..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/MainActivity$1.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/MainActivity.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/MainActivity.class deleted file mode 100755 index a0b444a..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/MainActivity.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$anim.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$anim.class deleted file mode 100755 index da905dd..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$anim.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$animator.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$animator.class deleted file mode 100755 index c8d6b65..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$animator.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$array.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$array.class deleted file mode 100755 index eb17369..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$array.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$attr.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$attr.class deleted file mode 100755 index 2bf2e29..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$attr.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$bool.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$bool.class deleted file mode 100755 index 429ea8e..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$bool.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$color.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$color.class deleted file mode 100755 index 160abbe..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$color.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$dimen.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$dimen.class deleted file mode 100755 index 04fe9c6..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$dimen.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$drawable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$drawable.class deleted file mode 100755 index d345435..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$drawable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$id.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$id.class deleted file mode 100755 index 119b67c..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$id.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$integer.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$integer.class deleted file mode 100755 index 06f7732..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$integer.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$interpolator.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$interpolator.class deleted file mode 100755 index 9c80c79..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$interpolator.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$layout.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$layout.class deleted file mode 100755 index 659a317..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$layout.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$menu.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$menu.class deleted file mode 100755 index 5b9d613..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$menu.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$mipmap.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$mipmap.class deleted file mode 100755 index 0221244..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$mipmap.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$string.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$string.class deleted file mode 100755 index 114fce3..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$string.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$style.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$style.class deleted file mode 100755 index 4e0a074..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$style.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$styleable.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$styleable.class deleted file mode 100755 index 3da0bb7..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R$styleable.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R.class deleted file mode 100755 index 84178e9..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/R.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/Settings$1.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/Settings$1.class deleted file mode 100755 index db8bde3..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/Settings$1.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/Settings$2.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/Settings$2.class deleted file mode 100755 index bdc5cd7..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/Settings$2.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/Settings$3.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/Settings$3.class deleted file mode 100755 index 6069680..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/Settings$3.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/Settings$4.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/Settings$4.class deleted file mode 100755 index ee29d08..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/Settings$4.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/Settings.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/Settings.class deleted file mode 100755 index f000271..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/Settings.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/Song.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/Song.class deleted file mode 100755 index 40dfca5..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/Song.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/songRequest.class b/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/songRequest.class deleted file mode 100755 index 3071b94..0000000 Binary files a/code/Android App/build/intermediates/transforms/instantRun/debug/0/com/scriptor/songRequest.class and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/instantRun/debug/__content__.json b/code/Android App/build/intermediates/transforms/instantRun/debug/__content__.json deleted file mode 100755 index 7572ec2..0000000 --- a/code/Android App/build/intermediates/transforms/instantRun/debug/__content__.json +++ /dev/null @@ -1 +0,0 @@ -[{"name":"classes","index":0,"scopes":["PROJECT","SUB_PROJECTS"],"types":["CLASSES"],"format":"DIRECTORY","present":true},{"name":"enhanced_classes","index":1,"scopes":["PROJECT","SUB_PROJECTS"],"types":["CLASSES_ENHANCED"],"format":"DIRECTORY","present":true}] \ No newline at end of file diff --git a/code/Android App/build/intermediates/transforms/instantRunDependenciesApk/debug/__content__.json b/code/Android App/build/intermediates/transforms/instantRunDependenciesApk/debug/__content__.json deleted file mode 100755 index 0637a08..0000000 --- a/code/Android App/build/intermediates/transforms/instantRunDependenciesApk/debug/__content__.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/code/Android App/build/intermediates/transforms/instantRunSlicesApk/debug/__content__.json b/code/Android App/build/intermediates/transforms/instantRunSlicesApk/debug/__content__.json deleted file mode 100755 index 0637a08..0000000 --- a/code/Android App/build/intermediates/transforms/instantRunSlicesApk/debug/__content__.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/code/Android App/build/intermediates/transforms/mergeJavaRes/debug/0.jar b/code/Android App/build/intermediates/transforms/mergeJavaRes/debug/0.jar deleted file mode 100755 index d75b355..0000000 Binary files a/code/Android App/build/intermediates/transforms/mergeJavaRes/debug/0.jar and /dev/null differ diff --git a/code/Android App/build/intermediates/transforms/mergeJavaRes/debug/__content__.json b/code/Android App/build/intermediates/transforms/mergeJavaRes/debug/__content__.json deleted file mode 100755 index bd29a84..0000000 --- a/code/Android App/build/intermediates/transforms/mergeJavaRes/debug/__content__.json +++ /dev/null @@ -1 +0,0 @@ -[{"name":"resources","index":0,"scopes":["PROJECT","SUB_PROJECTS","EXTERNAL_LIBRARIES"],"types":["RESOURCES"],"format":"JAR","present":true}] \ No newline at end of file diff --git a/code/Android App/build/intermediates/transforms/mergeJniLibs/debug/__content__.json b/code/Android App/build/intermediates/transforms/mergeJniLibs/debug/__content__.json deleted file mode 100755 index 90f92f5..0000000 --- a/code/Android App/build/intermediates/transforms/mergeJniLibs/debug/__content__.json +++ /dev/null @@ -1 +0,0 @@ -[{"name":"resources","index":0,"scopes":["PROJECT","SUB_PROJECTS","EXTERNAL_LIBRARIES"],"types":["NATIVE_LIBS"],"format":"DIRECTORY","present":false}] \ No newline at end of file diff --git a/code/Android App/build/outputs/apk/debug/app-debug.apk b/code/Android App/build/outputs/apk/debug/app-debug.apk deleted file mode 100755 index df609a0..0000000 Binary files a/code/Android App/build/outputs/apk/debug/app-debug.apk and /dev/null differ diff --git a/code/Android App/build/outputs/apk/debug/output.json b/code/Android App/build/outputs/apk/debug/output.json deleted file mode 100755 index f20a39f..0000000 --- a/code/Android App/build/outputs/apk/debug/output.json +++ /dev/null @@ -1 +0,0 @@ -[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-debug.apk","fullName":"debug","baseName":"debug"},"path":"app-debug.apk","properties":{}}] \ No newline at end of file diff --git a/code/Android App/build/outputs/logs/manifest-merger-debug-report.txt b/code/Android App/build/outputs/logs/manifest-merger-debug-report.txt deleted file mode 100755 index 2671344..0000000 --- a/code/Android App/build/outputs/logs/manifest-merger-debug-report.txt +++ /dev/null @@ -1,186 +0,0 @@ --- Merging decision tree log --- -manifest -ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:2:1-29:12 -INJECTED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:2:1-29:12 -INJECTED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:2:1-29:12 -INJECTED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:2:1-29:12 -MERGED from [com.android.support:design:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\design-28.0.0.aar\a8fdf681d833477cb2a65eb7f903a3d5\AndroidManifest.xml:17:1-24:12 -MERGED from [com.android.support:appcompat-v7:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\appcompat-v7-28.0.0.aar\98c842e7c54fabd76cb985fd3e0a712b\AndroidManifest.xml:17:1-22:12 -MERGED from [com.android.support.constraint:constraint-layout:1.1.3] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\constraint-layout-1.1.3.aar\78c302b72b1c55c024ab2e374fc3bb28\AndroidManifest.xml:2:1-11:12 -MERGED from [com.android.support:support-fragment:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\support-fragment-28.0.0.aar\6d4336038f9d8141c008082b95c1add8\AndroidManifest.xml:17:1-22:12 -MERGED from [com.android.support:animated-vector-drawable:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\animated-vector-drawable-28.0.0.aar\081ef2f23f18acdd2c912771a6bf7070\AndroidManifest.xml:17:1-22:12 -MERGED from [com.android.support:recyclerview-v7:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\recyclerview-v7-28.0.0.aar\d6e16f2b4f256229a87f783389106887\AndroidManifest.xml:17:1-22:12 -MERGED from [com.android.support:support-core-ui:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\support-core-ui-28.0.0.aar\e628a55ddd21834b717cb67580acd9c9\AndroidManifest.xml:17:1-22:12 -MERGED from [com.android.support:support-core-utils:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\support-core-utils-28.0.0.aar\0f496186d26b8a0ab04cb65da016e902\AndroidManifest.xml:17:1-22:12 -MERGED from [com.android.support:support-vector-drawable:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\support-vector-drawable-28.0.0.aar\d554b25393fc06e10aa84ac466ea2f12\AndroidManifest.xml:17:1-22:12 -MERGED from [com.android.support:transition:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\transition-28.0.0.aar\83dbb9ccdea7ebbe8e380df93f21d851\AndroidManifest.xml:17:1-22:12 -MERGED from [com.android.support:loader:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\loader-28.0.0.aar\86bd80c1dddf990bd827d8b54c3fc90f\AndroidManifest.xml:17:1-22:12 -MERGED from [com.android.support:viewpager:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\viewpager-28.0.0.aar\92e1470b097e3a5107d09803098567b1\AndroidManifest.xml:17:1-22:12 -MERGED from [com.android.support:coordinatorlayout:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\coordinatorlayout-28.0.0.aar\c4bd9e34079f8fa4e6d0c7db3f4a75c4\AndroidManifest.xml:17:1-22:12 -MERGED from [com.android.support:drawerlayout:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\drawerlayout-28.0.0.aar\ebd0c61ea462b6aa0dfb824e135a2b7b\AndroidManifest.xml:17:1-22:12 -MERGED from [com.android.support:slidingpanelayout:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\slidingpanelayout-28.0.0.aar\0a8db2b49ef283eb80448d7ad7164ea6\AndroidManifest.xml:17:1-22:12 -MERGED from [com.android.support:customview:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\customview-28.0.0.aar\ccb0eed7a763ebae2fb9d306496f6bac\AndroidManifest.xml:17:1-22:12 -MERGED from [com.android.support:swiperefreshlayout:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\swiperefreshlayout-28.0.0.aar\4acf215b8960dcbfa1d96d88e544d065\AndroidManifest.xml:17:1-22:12 -MERGED from [com.android.support:asynclayoutinflater:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\asynclayoutinflater-28.0.0.aar\045398c595368aef51d279da09c8086d\AndroidManifest.xml:17:1-22:12 -MERGED from [com.android.support:support-compat:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\support-compat-28.0.0.aar\ba8ba156f29bd88e4fbb205a95242bcd\AndroidManifest.xml:17:1-24:12 -MERGED from [com.android.support:versionedparcelable:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\versionedparcelable-28.0.0.aar\a290bac5b4d3d101a1d1c1f83625f0c1\AndroidManifest.xml:17:1-25:12 -MERGED from [com.android.support:cursoradapter:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\cursoradapter-28.0.0.aar\2300ef89a498ed59e9e2822ff5526ad9\AndroidManifest.xml:17:1-22:12 -MERGED from [com.android.support:cardview-v7:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\cardview-v7-28.0.0.aar\3b87ab57366b6cf64018eb749db2a1b4\AndroidManifest.xml:17:1-22:12 -MERGED from [android.arch.lifecycle:runtime:1.1.1] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\runtime-1.1.1.aar\f0afe86db60f8395edf4122c7eed9a46\AndroidManifest.xml:17:1-22:12 -MERGED from [com.android.support:documentfile:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\documentfile-28.0.0.aar\0380ee5fbd8092e41e9f16e8f8aea825\AndroidManifest.xml:17:1-22:12 -MERGED from [com.android.support:localbroadcastmanager:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\localbroadcastmanager-28.0.0.aar\63c4186256bdae50acd394f88f1a5f76\AndroidManifest.xml:17:1-22:12 -MERGED from [com.android.support:print:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\print-28.0.0.aar\f79ce65c00287d15ba798f71559f9f58\AndroidManifest.xml:17:1-22:12 -MERGED from [android.arch.lifecycle:viewmodel:1.1.1] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\viewmodel-1.1.1.aar\3ab379c65ed8ecaca3533077157df379\AndroidManifest.xml:17:1-22:12 -MERGED from [com.android.support:interpolator:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\interpolator-28.0.0.aar\b06515bd8d0756506b551709fc30836c\AndroidManifest.xml:17:1-22:12 -MERGED from [android.arch.lifecycle:livedata:1.1.1] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\livedata-1.1.1.aar\3cfd45c4ff66de2b8f21ed4cc4020248\AndroidManifest.xml:17:1-22:12 -MERGED from [android.arch.lifecycle:livedata-core:1.1.1] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\livedata-core-1.1.1.aar\9c647c6eb537574203d1f625fbaa0b35\AndroidManifest.xml:17:1-22:12 -MERGED from [android.arch.core:runtime:1.1.1] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\runtime-1.1.1.aar\bcedb934df539be06412556560380613\AndroidManifest.xml:17:1-22:12 -INJECTED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:2:1-29:12 -INJECTED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:2:1-29:12 -INJECTED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:2:1-29:12 - package - ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:3:5-27 - INJECTED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml - INJECTED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml - android:versionName - INJECTED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml - ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:2:1-29:12 - INJECTED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml - android:versionCode - INJECTED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml - ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:2:1-29:12 - INJECTED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml - xmlns:android - ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:2:11-69 -uses-permission#android.permission.INTERNET -ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:4:5-67 - android:name - ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:4:22-64 -application -ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:5:5-27:19 -MERGED from [com.android.support:design:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\design-28.0.0.aar\a8fdf681d833477cb2a65eb7f903a3d5\AndroidManifest.xml:22:5-20 -MERGED from [com.android.support:design:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\design-28.0.0.aar\a8fdf681d833477cb2a65eb7f903a3d5\AndroidManifest.xml:22:5-20 -MERGED from [com.android.support.constraint:constraint-layout:1.1.3] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\constraint-layout-1.1.3.aar\78c302b72b1c55c024ab2e374fc3bb28\AndroidManifest.xml:9:5-20 -MERGED from [com.android.support.constraint:constraint-layout:1.1.3] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\constraint-layout-1.1.3.aar\78c302b72b1c55c024ab2e374fc3bb28\AndroidManifest.xml:9:5-20 -MERGED from [com.android.support:support-compat:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\support-compat-28.0.0.aar\ba8ba156f29bd88e4fbb205a95242bcd\AndroidManifest.xml:22:5-94 -MERGED from [com.android.support:support-compat:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\support-compat-28.0.0.aar\ba8ba156f29bd88e4fbb205a95242bcd\AndroidManifest.xml:22:5-94 -MERGED from [com.android.support:versionedparcelable:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\versionedparcelable-28.0.0.aar\a290bac5b4d3d101a1d1c1f83625f0c1\AndroidManifest.xml:22:5-23:19 -MERGED from [com.android.support:versionedparcelable:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\versionedparcelable-28.0.0.aar\a290bac5b4d3d101a1d1c1f83625f0c1\AndroidManifest.xml:22:5-23:19 - android:appComponentFactory - ADDED from [com.android.support:support-compat:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\support-compat-28.0.0.aar\ba8ba156f29bd88e4fbb205a95242bcd\AndroidManifest.xml:22:18-91 - android:supportsRtl - ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:10:9-35 - android:label - ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:8:9-41 - android:roundIcon - ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:9:9-54 - android:icon - ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:7:9-43 - android:allowBackup - ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:6:9-35 - android:theme - ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:12:9-40 - android:usesCleartextTraffic - ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:11:9-44 -activity#com.scriptor.Settings -ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:13:9-16:68 - android:label - ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:15:13-60 - android:theme - ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:16:13-56 - android:name - ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:14:13-37 -activity#com.scriptor.MainActivity -ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:17:9-26:20 - android:label - ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:19:13-45 - android:theme - ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:20:13-56 - android:name - ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:18:13-41 -intent-filter#action:name:android.intent.action.MAIN+category:name:android.intent.category.LAUNCHER -ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:21:13-25:29 -action#android.intent.action.MAIN -ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:22:17-69 - android:name - ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:22:25-66 -category#android.intent.category.LAUNCHER -ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:24:17-77 - android:name - ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml:24:27-74 -uses-sdk -INJECTED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml reason: use-sdk injection requested -INJECTED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml -INJECTED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml -MERGED from [com.android.support:design:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\design-28.0.0.aar\a8fdf681d833477cb2a65eb7f903a3d5\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:design:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\design-28.0.0.aar\a8fdf681d833477cb2a65eb7f903a3d5\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:appcompat-v7:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\appcompat-v7-28.0.0.aar\98c842e7c54fabd76cb985fd3e0a712b\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:appcompat-v7:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\appcompat-v7-28.0.0.aar\98c842e7c54fabd76cb985fd3e0a712b\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support.constraint:constraint-layout:1.1.3] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\constraint-layout-1.1.3.aar\78c302b72b1c55c024ab2e374fc3bb28\AndroidManifest.xml:5:5-7:41 -MERGED from [com.android.support.constraint:constraint-layout:1.1.3] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\constraint-layout-1.1.3.aar\78c302b72b1c55c024ab2e374fc3bb28\AndroidManifest.xml:5:5-7:41 -MERGED from [com.android.support:support-fragment:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\support-fragment-28.0.0.aar\6d4336038f9d8141c008082b95c1add8\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:support-fragment:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\support-fragment-28.0.0.aar\6d4336038f9d8141c008082b95c1add8\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:animated-vector-drawable:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\animated-vector-drawable-28.0.0.aar\081ef2f23f18acdd2c912771a6bf7070\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:animated-vector-drawable:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\animated-vector-drawable-28.0.0.aar\081ef2f23f18acdd2c912771a6bf7070\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:recyclerview-v7:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\recyclerview-v7-28.0.0.aar\d6e16f2b4f256229a87f783389106887\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:recyclerview-v7:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\recyclerview-v7-28.0.0.aar\d6e16f2b4f256229a87f783389106887\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:support-core-ui:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\support-core-ui-28.0.0.aar\e628a55ddd21834b717cb67580acd9c9\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:support-core-ui:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\support-core-ui-28.0.0.aar\e628a55ddd21834b717cb67580acd9c9\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:support-core-utils:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\support-core-utils-28.0.0.aar\0f496186d26b8a0ab04cb65da016e902\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:support-core-utils:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\support-core-utils-28.0.0.aar\0f496186d26b8a0ab04cb65da016e902\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:support-vector-drawable:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\support-vector-drawable-28.0.0.aar\d554b25393fc06e10aa84ac466ea2f12\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:support-vector-drawable:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\support-vector-drawable-28.0.0.aar\d554b25393fc06e10aa84ac466ea2f12\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:transition:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\transition-28.0.0.aar\83dbb9ccdea7ebbe8e380df93f21d851\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:transition:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\transition-28.0.0.aar\83dbb9ccdea7ebbe8e380df93f21d851\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:loader:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\loader-28.0.0.aar\86bd80c1dddf990bd827d8b54c3fc90f\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:loader:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\loader-28.0.0.aar\86bd80c1dddf990bd827d8b54c3fc90f\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:viewpager:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\viewpager-28.0.0.aar\92e1470b097e3a5107d09803098567b1\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:viewpager:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\viewpager-28.0.0.aar\92e1470b097e3a5107d09803098567b1\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:coordinatorlayout:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\coordinatorlayout-28.0.0.aar\c4bd9e34079f8fa4e6d0c7db3f4a75c4\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:coordinatorlayout:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\coordinatorlayout-28.0.0.aar\c4bd9e34079f8fa4e6d0c7db3f4a75c4\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:drawerlayout:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\drawerlayout-28.0.0.aar\ebd0c61ea462b6aa0dfb824e135a2b7b\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:drawerlayout:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\drawerlayout-28.0.0.aar\ebd0c61ea462b6aa0dfb824e135a2b7b\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:slidingpanelayout:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\slidingpanelayout-28.0.0.aar\0a8db2b49ef283eb80448d7ad7164ea6\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:slidingpanelayout:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\slidingpanelayout-28.0.0.aar\0a8db2b49ef283eb80448d7ad7164ea6\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:customview:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\customview-28.0.0.aar\ccb0eed7a763ebae2fb9d306496f6bac\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:customview:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\customview-28.0.0.aar\ccb0eed7a763ebae2fb9d306496f6bac\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:swiperefreshlayout:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\swiperefreshlayout-28.0.0.aar\4acf215b8960dcbfa1d96d88e544d065\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:swiperefreshlayout:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\swiperefreshlayout-28.0.0.aar\4acf215b8960dcbfa1d96d88e544d065\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:asynclayoutinflater:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\asynclayoutinflater-28.0.0.aar\045398c595368aef51d279da09c8086d\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:asynclayoutinflater:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\asynclayoutinflater-28.0.0.aar\045398c595368aef51d279da09c8086d\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:support-compat:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\support-compat-28.0.0.aar\ba8ba156f29bd88e4fbb205a95242bcd\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:support-compat:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\support-compat-28.0.0.aar\ba8ba156f29bd88e4fbb205a95242bcd\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:versionedparcelable:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\versionedparcelable-28.0.0.aar\a290bac5b4d3d101a1d1c1f83625f0c1\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:versionedparcelable:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\versionedparcelable-28.0.0.aar\a290bac5b4d3d101a1d1c1f83625f0c1\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:cursoradapter:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\cursoradapter-28.0.0.aar\2300ef89a498ed59e9e2822ff5526ad9\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:cursoradapter:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\cursoradapter-28.0.0.aar\2300ef89a498ed59e9e2822ff5526ad9\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:cardview-v7:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\cardview-v7-28.0.0.aar\3b87ab57366b6cf64018eb749db2a1b4\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:cardview-v7:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\cardview-v7-28.0.0.aar\3b87ab57366b6cf64018eb749db2a1b4\AndroidManifest.xml:20:5-44 -MERGED from [android.arch.lifecycle:runtime:1.1.1] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\runtime-1.1.1.aar\f0afe86db60f8395edf4122c7eed9a46\AndroidManifest.xml:20:5-44 -MERGED from [android.arch.lifecycle:runtime:1.1.1] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\runtime-1.1.1.aar\f0afe86db60f8395edf4122c7eed9a46\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:documentfile:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\documentfile-28.0.0.aar\0380ee5fbd8092e41e9f16e8f8aea825\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:documentfile:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\documentfile-28.0.0.aar\0380ee5fbd8092e41e9f16e8f8aea825\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:localbroadcastmanager:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\localbroadcastmanager-28.0.0.aar\63c4186256bdae50acd394f88f1a5f76\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:localbroadcastmanager:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\localbroadcastmanager-28.0.0.aar\63c4186256bdae50acd394f88f1a5f76\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:print:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\print-28.0.0.aar\f79ce65c00287d15ba798f71559f9f58\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:print:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\print-28.0.0.aar\f79ce65c00287d15ba798f71559f9f58\AndroidManifest.xml:20:5-44 -MERGED from [android.arch.lifecycle:viewmodel:1.1.1] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\viewmodel-1.1.1.aar\3ab379c65ed8ecaca3533077157df379\AndroidManifest.xml:20:5-44 -MERGED from [android.arch.lifecycle:viewmodel:1.1.1] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\viewmodel-1.1.1.aar\3ab379c65ed8ecaca3533077157df379\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:interpolator:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\interpolator-28.0.0.aar\b06515bd8d0756506b551709fc30836c\AndroidManifest.xml:20:5-44 -MERGED from [com.android.support:interpolator:28.0.0] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\interpolator-28.0.0.aar\b06515bd8d0756506b551709fc30836c\AndroidManifest.xml:20:5-44 -MERGED from [android.arch.lifecycle:livedata:1.1.1] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\livedata-1.1.1.aar\3cfd45c4ff66de2b8f21ed4cc4020248\AndroidManifest.xml:20:5-44 -MERGED from [android.arch.lifecycle:livedata:1.1.1] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\livedata-1.1.1.aar\3cfd45c4ff66de2b8f21ed4cc4020248\AndroidManifest.xml:20:5-44 -MERGED from [android.arch.lifecycle:livedata-core:1.1.1] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\livedata-core-1.1.1.aar\9c647c6eb537574203d1f625fbaa0b35\AndroidManifest.xml:20:5-44 -MERGED from [android.arch.lifecycle:livedata-core:1.1.1] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\livedata-core-1.1.1.aar\9c647c6eb537574203d1f625fbaa0b35\AndroidManifest.xml:20:5-44 -MERGED from [android.arch.core:runtime:1.1.1] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\runtime-1.1.1.aar\bcedb934df539be06412556560380613\AndroidManifest.xml:20:5-44 -MERGED from [android.arch.core:runtime:1.1.1] C:\Users\Adrian\.gradle\caches\transforms-1\files-1.1\runtime-1.1.1.aar\bcedb934df539be06412556560380613\AndroidManifest.xml:20:5-44 -INJECTED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml -INJECTED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml - android:targetSdkVersion - INJECTED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml - ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml - INJECTED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml - android:minSdkVersion - INJECTED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml - ADDED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml - INJECTED from C:\Users\Adrian\Downloads\Scriptor2\app\src\main\AndroidManifest.xml diff --git a/code/Android App/proguard-rules.pro b/code/Android App/proguard-rules.pro deleted file mode 100755 index f1b4245..0000000 --- a/code/Android App/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/code/Android App/src/androidTest/java/com/scriptor/ExampleInstrumentedTest.java b/code/Android App/src/androidTest/java/com/scriptor/ExampleInstrumentedTest.java deleted file mode 100755 index 4d92f6e..0000000 --- a/code/Android App/src/androidTest/java/com/scriptor/ExampleInstrumentedTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.scriptor; - -import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("com.scriptor", appContext.getPackageName()); - } -} diff --git a/code/Android App/src/main/java/com/scriptor/.DS_Store b/code/Android App/src/main/java/com/scriptor/.DS_Store deleted file mode 100644 index 5008ddf..0000000 Binary files a/code/Android App/src/main/java/com/scriptor/.DS_Store and /dev/null differ diff --git a/code/Android App/src/main/java/com/scriptor/Church.java b/code/Android App/src/main/java/com/scriptor/Church.java index 990a2d8..0b8b770 100755 --- a/code/Android App/src/main/java/com/scriptor/Church.java +++ b/code/Android App/src/main/java/com/scriptor/Church.java @@ -1,6 +1,9 @@ package com.scriptor; +import android.content.Context; +import android.content.SharedPreferences; import android.os.AsyncTask; +import android.preference.PreferenceManager; import android.util.Log; import java.io.BufferedReader; @@ -11,18 +14,38 @@ import java.net.ProtocolException; import java.net.URL; import java.util.ArrayList; + import org.json.*; public class Church { private String name; private String address; + private static Church selectedChurch; private ArrayList songList; - public Church(String churchName) + + public Church(String churchName, String churchAddress) { - this.name = churchName; + name = churchName; + address = churchAddress; songList = new ArrayList(); } + public static void setCurrentChurch(Church c) + { + selectedChurch = c; + } + + public static Church getSelectedChurch() + { + // If church has not been selected, use the first church in array as default + if(selectedChurch == null) + { + selectedChurch = Settings.getChurches()[0]; + } + + return selectedChurch; + } + public String getName() { return name; @@ -32,53 +55,199 @@ public String getAddress() return address; } - public void displaySongList() + public String toString() { - for(Song song: songList) - { - System.out.println(song); + return name + ": " + address; + } + + public static Church[] retrieveChurchInfo() throws IOException + { + String response = ""; + Church[] churches = null; + String[] churchNames; + String[] churchAddresses; + + // Opens church database + churchRequest churchReq = new churchRequest(); + churchReq.execute(new URL("http://34.73.45.124:8080/getChurches")); + + // Checks if get request was successful + try { + response = churchReq.get(); + } catch (Exception e) { + e.printStackTrace(); + } + + // Checks if response was recorded from database + try { + String responseString = response; + + JSONArray jsonArr = new JSONArray(responseString); + int arrLength = jsonArr.length(); + + churches = new Church[arrLength]; + churchNames = new String[arrLength]; + churchAddresses = new String[arrLength]; + + for(int i = 0; i < arrLength; i++) { + JSONObject jsonObj = jsonArr.getJSONObject(i); + churchNames[i] = jsonObj.getString("name"); + churchAddresses[i] = jsonObj.getString("address"); + churches[i] = new Church(churchNames[i], churchAddresses[i]); + Log.i("Success!", churchNames[i]); + } + + + } catch (JSONException e){ + Log.e("Error:", e.toString()); } + return churches; } - public String retrieveSongs() throws IOException { + //Creates correct format of URL for get request + public String appendedURL() + { + String appendedURL = "http://34.73.45.124:8080/getData"; + String name = this.getName().replace(" ", "%20"); + + String date = SavedDate.getSavedDate().toString(); + + String address = this.getAddress().replace(" ", "%20"); + + appendedURL = appendedURL + "?church=" + name + "&currDate=" + date + "&churchAddress=" + address; + + return appendedURL; + } + + + public ArrayList retrieveSongs() throws IOException + { + ArrayList songList = new ArrayList(); String response = ""; + + URL url = new URL(appendedURL()); + // Opens song database songRequest songReq = new songRequest(); - songReq.execute(new URL("http://35.238.47.23/getData")); + songReq.execute(url); + + //Checks if get request was successful try { response = songReq.get(); } catch (Exception e){ e.printStackTrace(); } + // Checks if response was recorded + try { + String responseString = response; - int stop = 0; - - //my part... + if(responseString.equals("N/A")) + return null; - String songText = null; - try { - String responseString = response.toString(); + //Log.i("response", responseString); JSONArray jsonArr = new JSONArray(responseString); - JSONObject jsonObj = jsonArr.getJSONObject(0); - songText = jsonObj.getString("mainText"); - Log.i("Success!", songText); + int arrLength = jsonArr.length(); + + for(int i = 0; i < arrLength; i++) + { + JSONObject jsonObj = jsonArr.getJSONObject(i); + Song song = new Song(jsonObj.getString("mainText")); + songList.add(song); + Log.i("Success!", songList.get(i).getName()); + } + this.setSongList(songList); } catch (JSONException e){ Log.e("Error:",e.toString()); + } + + return songList; + } + + public ArrayList getSongList() { + return songList; + } + + public void setSongList(ArrayList songList) { + this.songList = songList; + } +} + +class churchRequest extends AsyncTask { + + @Override + protected String doInBackground(URL... urls) { + + URL url = null; + HttpURLConnection con = null; + StringBuffer response = new StringBuffer(); + + // Opens URL + try { + url = new URL("http://34.73.45.124:8080/getChurches"); + } catch (MalformedURLException e){ + Log.e("Error:", e.toString()); + } + + try { + con = (HttpURLConnection) url.openConnection(); + } catch (IOException e) { + e.printStackTrace(); + } + // Get request of URL + try { + con.setRequestMethod("GET"); + } catch (ProtocolException e) { + e.printStackTrace(); } - return songText; - //----------- + // Reading in the file + try { + BufferedReader in = new BufferedReader( + new InputStreamReader(con.getInputStream())); + String inputLine; + while ((inputLine = in.readLine()) != null) { + response.append(inputLine); + } + in.close(); + } catch (Exception e){ + Log.e("Error:", e.toString()); + } + String responseString = response.toString(); + return responseString; } + @Override + protected void onPreExecute() { + super.onPreExecute(); + } -} + @Override + protected void onPostExecute(String s) { + + super.onPostExecute(s); + } + @Override + protected void onProgressUpdate(Integer... values) { + super.onProgressUpdate(values); + } + + @Override + protected void onCancelled(String s) { + super.onCancelled(s); + } + + @Override + protected void onCancelled() { + super.onCancelled(); + } +} class songRequest extends AsyncTask { @@ -87,32 +256,37 @@ class songRequest extends AsyncTask { protected String doInBackground(URL... urls) { URL url = null; + HttpURLConnection con = null; + StringBuffer response = new StringBuffer(); + Church c = Church.getSelectedChurch(); + + // Opens URL try { - url = new URL("http://35.238.47.23/getData"); + url = new URL(c.appendedURL()); } catch (MalformedURLException e){ Log.e("Error:", e.toString()); } - HttpURLConnection con = null; + try { con = (HttpURLConnection) url.openConnection(); } catch (IOException e) { e.printStackTrace(); } + + // Get request of URL try { con.setRequestMethod("GET"); } catch (ProtocolException e) { e.printStackTrace(); } - StringBuffer response = new StringBuffer(); - try { - + // Reading in the file + try { BufferedReader in = new BufferedReader( new InputStreamReader(con.getInputStream())); String inputLine; - while ((inputLine = in.readLine()) != null) { response.append(inputLine); } diff --git a/code/Android App/src/main/java/com/scriptor/MainActivity.java b/code/Android App/src/main/java/com/scriptor/MainActivity.java index a4d2939..6fd06e7 100755 --- a/code/Android App/src/main/java/com/scriptor/MainActivity.java +++ b/code/Android App/src/main/java/com/scriptor/MainActivity.java @@ -1,13 +1,10 @@ package com.scriptor; -import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; import android.os.Bundle; -import android.support.design.widget.FloatingActionButton; -import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; +import android.text.method.ScrollingMovementMethod; import android.util.Log; import android.view.View; import android.view.Menu; @@ -16,13 +13,9 @@ import android.widget.TextView; import java.io.IOException; +import java.util.ArrayList; public class MainActivity extends AppCompatActivity { - - public SharedPreferences sharedPref; - //public int fontSize; - - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -31,9 +24,23 @@ protected void onCreate(Bundle savedInstanceState) { setSupportActionBar(toolbar); openSongList(); + + setTextSize(); } + // Sets text size to elements on Main Activity page + public void setTextSize() + { + TextSize ts = new TextSize(); + + // Where songs are displayed + TextView songDisplay = findViewById(R.id.songDisplay); + songDisplay.setTextSize(ts.getTextSize()); + // "Click to download songs" button + TextView buttonText = findViewById(R.id.button); + buttonText.setTextSize(ts.getTextSize()); + } public void openSongList() { @@ -49,20 +56,38 @@ public void onClick(View v) { button.setVisibility(View.GONE); // Will display database is future Sprint - TextView churchInfoDisplay = findViewById(R.id.churchInfo); + TextView songDisplay = findViewById(R.id.songDisplay); + + // Grabs selected church + Church selectedChurch = Church.getSelectedChurch(); - churchInfoDisplay.setText("List of Songs and Sermons Here:"); + ArrayList response = null; - Church c = new Church("Church1"); - String response = null; + // Attempts to retrieve songs try { - response = c.retrieveSongs(); + response = selectedChurch.retrieveSongs(); } catch (IOException e){ Log.e("Error:", e.toString()); } - churchInfoDisplay.setText(response); + + // If the response is empty, display to the user there are no songs + if(response == null || response.isEmpty()) + songDisplay.setText("No songs available"); + else{ + String songs = ""; + // Transfers text + for(int i = 0; i < response.size(); i++) + { + songs = songs + response.get(i).getName() + "\n"; + } + songDisplay.setText(songs); + } + + // Allows scrolling ability + songDisplay.setMovementMethod(new ScrollingMovementMethod()); } }); + } diff --git a/code/Android App/src/main/java/com/scriptor/SavedDate.java b/code/Android App/src/main/java/com/scriptor/SavedDate.java new file mode 100644 index 0000000..5adfd93 --- /dev/null +++ b/code/Android App/src/main/java/com/scriptor/SavedDate.java @@ -0,0 +1,94 @@ +package com.scriptor; + + +import java.text.SimpleDateFormat; +import java.util.Date; + +public class SavedDate extends Date { + private static int month, day, year; + private static SavedDate savedDate; + + public SavedDate() + { + super(); + } + + public SavedDate(int month, int day, int year) + { + this.month = month; + this.day = day; + this.year = year; + setSavedDate(this); + } + + public int getMonth() { + return month; + } + + public int getDay() { + return day; + } + + public int getYear() { + return year; + } + + public void setMonth(int month) { + this.month = month; + } + + public void setDay(int day) { + this.day = day; + } + + public void setYear(int year) { + this.year = year; + } + + public static SavedDate getSavedDate() + { + if(savedDate == null) + { + SavedDate date = new SavedDate(); + + SimpleDateFormat formattedDate = new SimpleDateFormat("MM/dd/yyyy"); + + String dateString = formattedDate.format(date); + + int month = Integer.parseInt(dateString.substring(0,2)); + int day = Integer.parseInt(dateString.substring(3,5)); + int year = Integer.parseInt(dateString.substring(6,10)); + + date.setMonth(month); + date.setDay(day); + date.setYear(year); + + savedDate = date; + + return date; + } + + return savedDate; + } + + public static void setSavedDate(SavedDate d) + { + savedDate = d; + savedDate.setMonth(d.getMonth()); + savedDate.setDay(d.getDay()); + savedDate.setYear(d.getYear()); + } + + public String toString() + { + String monthString = "" + month; + String dayString = "" + day; + + if(month > 0 && month < 10) + monthString = "0" + month; + if(day > 0 && day < 10) + dayString = "0" + day; + + return monthString + "_" + dayString + "_" + year; + } +} diff --git a/code/Android App/src/main/java/com/scriptor/Settings.java b/code/Android App/src/main/java/com/scriptor/Settings.java old mode 100755 new mode 100644 index c9a512c..05b88d7 --- a/code/Android App/src/main/java/com/scriptor/Settings.java +++ b/code/Android App/src/main/java/com/scriptor/Settings.java @@ -1,31 +1,37 @@ package com.scriptor; -import android.content.Context; +import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; -import android.support.design.widget.FloatingActionButton; -import android.support.design.widget.Snackbar; +import android.preference.PreferenceManager; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; +import android.util.Log; +import android.view.Menu; +import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; +import android.widget.EditText; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; +import java.io.IOException; +import java.text.SimpleDateFormat; + + public class Settings extends AppCompatActivity implements AdapterView.OnItemSelectedListener{ // Various font sizes - public static final int LARGE = 20; - public static final int MEDIUM = 18; - public static final int NORMAL = 14; - public static final int SMALL = 12; - - public SharedPreferences sharedPref; + private static final int LARGE = 20; + private static final int MEDIUM = 18; + private static final int NORMAL = 14; + private static final int SMALL = 12; - static int fontSize; + private SharedPreferences sharedPref; + private Spinner dropDown; @Override protected void onCreate(Bundle savedInstanceState) { @@ -37,26 +43,137 @@ protected void onCreate(Bundle savedInstanceState) { // Activates function changeFontSize(); + setTextSize(); + dropDownMenuInitializer(); - //setTheme(R.style.LargeText); + // Sets current date if not selected yet + setCurrentDate(); + + // Checks to see if new date is inputted in order to save + saveDate(); + } + + // Sets date in settings to current date + public void setCurrentDate() + { + SavedDate currentDate = new SavedDate(); + + // Formats date + SimpleDateFormat formattedDate = new SimpleDateFormat("MM/dd/yyyy"); + + // Converts formatted date into a string + String dateString = formattedDate.format(currentDate); + + // Grabs month, day, and year contents from string + int month = Integer.parseInt(dateString.substring(0,2)); + int day = Integer.parseInt(dateString.substring(3,5)); + int year = Integer.parseInt(dateString.substring(6,10)); + + // Sets everything in object + currentDate.setMonth(month); + currentDate.setDay(day); + currentDate.setYear(year); + + // Sets date for future use + SavedDate.setSavedDate(currentDate); + + TextView date = findViewById(R.id.date_input); + + // Sets text of date input box to current date + date.setText(dateString); + } + + + public void saveDate() + { + // Grabs date text box + final EditText date = findViewById(R.id.date_input); + + // Used in case of date being changed + final SavedDate newDate = new SavedDate(); + + // Saves date selected from user + sharedPref = PreferenceManager.getDefaultSharedPreferences(this); + date.setText(sharedPref.getString("date", newDate.toString())); + + // Gives functionality to "Save Date" button + Button save = findViewById(R.id.saveDate); + save.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + // Grabs what is typed in text box + String dateString = String.valueOf(date.getText()); + Log.i("dateView", dateString); + + // Correctly grabs each part of date + int ind = dateString.indexOf('/'); + int month = Integer.parseInt(dateString.substring(0,ind)); + + int dInd = dateString.indexOf('/', ind+ 1); + int day = Integer.parseInt(dateString.substring(ind + 1, dInd)); + + int year = Integer.parseInt(dateString.substring(dInd+1)); + + // Sets the date to the SavedDate object + newDate.setMonth(month); + newDate.setDay(day); + newDate.setYear(year); + + SharedPreferences sharedPref = (SharedPreferences) PreferenceManager.getDefaultSharedPreferences(Settings.this); + SharedPreferences.Editor editor = sharedPref.edit(); + + // Applies info to shared preferences + editor.putString("date", newDate.getMonth() + "/" + newDate.getDay() + "/" + newDate.getYear()); + editor.apply(); + + // Sets the new date for future use + SavedDate.setSavedDate(newDate); + + Log.d("Button clicked:", newDate.toString()); + } + }); } + // Sets Text Size for all features on Settings Page + public void setTextSize() + { + TextSize ts = new TextSize(); + + //"Preferred Font Size" text on screen + TextView fontSizePrompt = findViewById(R.id.fontSizePrompt); + fontSizePrompt.setTextSize(ts.getTextSize()); + + // "Select Your Church Here" text on screen + TextView churchSelectPrompt = findViewById(R.id.churchSelectPrompt); + churchSelectPrompt.setTextSize(ts.getTextSize()); + + // "Change Date Here:" text on screen + TextView dateSelectPrompt = findViewById(R.id.date_prompt); + dateSelectPrompt.setTextSize(ts.getTextSize()); + + // Where the date is typed + TextView dateInput = findViewById(R.id.date_input); + dateInput.setTextSize(ts.getTextSize()); + + // "Save Date" Button + TextView dateButton = findViewById(R.id.saveDate); + dateButton.setTextSize(ts.getTextSize()); + } + + // Handles button commands for font size public void changeFontSize() { - // Gathers text info to modify - final TextView fontSizePrompt = findViewById(R.id.fontSizePrompt); - final TextView churchSelectPrompt = findViewById(R.id.churchSelectPrompt); + final TextSize ts = new TextSize(); Button large = (Button) findViewById(R.id.largeSize); - large.setOnClickListener(new View.OnClickListener() - { + large.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - fontSize = LARGE; - fontSizePrompt.setTextSize(fontSize); - churchSelectPrompt.setTextSize(fontSize); + ts.setTextSize(LARGE); + setTextSize(); } }); @@ -66,9 +183,8 @@ public void onClick(View v) @Override public void onClick(View v) { - fontSize = MEDIUM; - fontSizePrompt.setTextSize(fontSize); - churchSelectPrompt.setTextSize(fontSize); + ts.setTextSize(MEDIUM); + setTextSize(); } }); @@ -78,9 +194,8 @@ public void onClick(View v) @Override public void onClick(View v) { - fontSize = NORMAL; - fontSizePrompt.setTextSize(fontSize); - churchSelectPrompt.setTextSize(fontSize); + ts.setTextSize(NORMAL); + setTextSize(); } }); @@ -90,18 +205,50 @@ public void onClick(View v) @Override public void onClick(View v) { - fontSize = SMALL; - fontSizePrompt.setTextSize(fontSize); - churchSelectPrompt.setTextSize(fontSize); + ts.setTextSize(SMALL); + setTextSize(); } }); + + } + + // Retrieves churches + static Church[] getChurches(){ + Church[] churches = null; + + try { + churches = Church.retrieveChurchInfo(); + } catch (IOException e) { + e.printStackTrace(); + } + + return churches; } - public void dropDownMenuInitializer() + // Converts church contents into a string array for drop down menu later + public static String[] getChurchInfo() { - Spinner dropDown = (Spinner) findViewById(R.id.church_selection); - ArrayAdapter adapter = ArrayAdapter.createFromResource(this, - R.array.church_array, android.R.layout.simple_spinner_item); + Church[] churches = getChurches(); + String[] churchNames; + + churchNames = new String[churches.length]; + + for(int i = 0; i < churches.length; i++) + { + churchNames[i] = churches[i].toString(); + } + + return churchNames; + } + + public void dropDownMenuInitializer() { + dropDown = (Spinner) findViewById(R.id.church_selection); + + String[] churchInfo = getChurchInfo(); + String defaultChurch = churchInfo[0]; + + // Creates drop down menu of churches + ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, churchInfo); // Specify the layout to use when the list of choices appears adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); @@ -110,12 +257,47 @@ public void dropDownMenuInitializer() dropDown.setAdapter(adapter); dropDown.setOnItemSelectedListener(this); + + // Sets default church + sharedPref = PreferenceManager.getDefaultSharedPreferences(this); + String church = sharedPref.getString("church", defaultChurch); + + for(int i = 0; i < churchInfo.length; i++) { + if (getChurchInfo()[i].equalsIgnoreCase(church)) { + Church.setCurrentChurch(getChurches()[i]); + break; + } + } + + // If a new church selection is made, this will make sure it is saved + if (!church.equalsIgnoreCase(defaultChurch)) { + int spinnerPosition = adapter.getPosition(church); + dropDown.setSelection(spinnerPosition); + } } + @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { + String item = parent.getItemAtPosition(position).toString(); + // Saves newly selected item + SharedPreferences.Editor editor = sharedPref.edit(); + editor.putString("church", dropDown.getSelectedItem().toString()); + editor.apply(); + + // Finds the church selected and informs code what the current church is for future use + for(int i = 0; i < getChurchInfo().length; i++) + { + if(getChurchInfo()[i].equalsIgnoreCase(item)) + { + Church.setCurrentChurch(getChurches()[i]); + //selectedChurch = getChurches()[i]; + break; + } + } + Toast.makeText(parent.getContext(), item, Toast.LENGTH_SHORT).show(); } @@ -124,4 +306,27 @@ public void onNothingSelected(AdapterView parent) { } + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.menu_settings, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // Handle action bar item clicks here. The action bar will + // automatically handle clicks on the Home/Up button, so long + // as you specify a parent activity in AndroidManifest.xml. + int id = item.getItemId(); + + //noinspection SimplifiableIfStatement + if (id == R.id.home_button) { + startActivity(new Intent(Settings.this, MainActivity.class)); + return true; + } + + return super.onOptionsItemSelected(item); + } + } diff --git a/code/Android App/src/main/java/com/scriptor/Song.java b/code/Android App/src/main/java/com/scriptor/Song.java old mode 100755 new mode 100644 index 5f3a0a0..4c04b1c --- a/code/Android App/src/main/java/com/scriptor/Song.java +++ b/code/Android App/src/main/java/com/scriptor/Song.java @@ -1,23 +1,24 @@ package com.scriptor; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.ProtocolException; -import java.net.URL; import java.util.ArrayList; public class Song { - String name; - String lyrics; - private ArrayList songList; + + private String name; + private String lyrics; public Song(String name){ this.name = name; } + public String getName() { + return name; + } + + public String getLyrics() { + return lyrics; + } + public void setLyrics(String lyrics) { this.lyrics = lyrics; diff --git a/code/Android App/src/main/java/com/scriptor/TextSize.java b/code/Android App/src/main/java/com/scriptor/TextSize.java new file mode 100644 index 0000000..ee40af7 --- /dev/null +++ b/code/Android App/src/main/java/com/scriptor/TextSize.java @@ -0,0 +1,15 @@ +package com.scriptor; + +public class TextSize { + // Will start the font size at normal size as default + private static int textSize = 14; + + public void setTextSize(int textSize) { + this.textSize = textSize; + } + + public int getTextSize() + { + return textSize; + } +} diff --git a/code/Android App/src/main/res/drawable-v24/ic_launcher_foreground.xml b/code/Android App/src/main/res/drawable-v24/ic_launcher_foreground.xml old mode 100755 new mode 100644 diff --git a/code/Android App/src/main/res/drawable/ic_launcher_background.xml b/code/Android App/src/main/res/drawable/ic_launcher_background.xml old mode 100755 new mode 100644 diff --git a/code/Android App/src/main/res/layout/activity_main.xml b/code/Android App/src/main/res/layout/activity_main.xml old mode 100755 new mode 100644 index 1b78829..664ecac --- a/code/Android App/src/main/res/layout/activity_main.xml +++ b/code/Android App/src/main/res/layout/activity_main.xml @@ -2,6 +2,7 @@ diff --git a/code/Android App/src/main/res/layout/activity_settings.xml b/code/Android App/src/main/res/layout/activity_settings.xml old mode 100755 new mode 100644 index db7f154..90b6a1c --- a/code/Android App/src/main/res/layout/activity_settings.xml +++ b/code/Android App/src/main/res/layout/activity_settings.xml @@ -2,6 +2,7 @@ diff --git a/code/Android App/src/main/res/layout/content_main.xml b/code/Android App/src/main/res/layout/content_main.xml old mode 100755 new mode 100644 index 9252da7..cbf68bc --- a/code/Android App/src/main/res/layout/content_main.xml +++ b/code/Android App/src/main/res/layout/content_main.xml @@ -20,6 +20,7 @@ android:layout_marginEnd="8dp" android:layout_marginRight="8dp" android:text="Scriptor" + android:textColor="@color/blackText" android:textSize="30sp" app:fontFamily="monospace" app:layout_constraintEnd_toEndOf="parent" @@ -28,6 +29,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Credit Cards - 3D Secure/BraintreeDemoThreeDSecureViewController.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Credit Cards - 3D Secure/BraintreeDemoThreeDSecureViewController.h new file mode 100644 index 0000000..799b8e3 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Credit Cards - 3D Secure/BraintreeDemoThreeDSecureViewController.h @@ -0,0 +1,9 @@ +#import + +#import "BraintreeDemoPaymentButtonBaseViewController.h" + +@class BTThreeDSecureDriver; + +@interface BraintreeDemoThreeDSecureViewController : BraintreeDemoPaymentButtonBaseViewController + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Credit Cards - 3D Secure/BraintreeDemoThreeDSecureViewController.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Credit Cards - 3D Secure/BraintreeDemoThreeDSecureViewController.m new file mode 100644 index 0000000..971b284 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Credit Cards - 3D Secure/BraintreeDemoThreeDSecureViewController.m @@ -0,0 +1,126 @@ +#import "BraintreeDemoThreeDSecureViewController.h" +#import "ALView+PureLayout.h" + +#import +#import + +@interface BraintreeDemoThreeDSecureViewController () +@property (nonatomic, strong) BTUICardFormView *cardFormView; +@property (nonatomic, strong) UILabel *callbackCountLabel; +@property (nonatomic) int callbackCount; +@end + +@implementation BraintreeDemoThreeDSecureViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + self.title = NSLocalizedString(@"3DS", nil); + + self.cardFormView = [[BTUICardFormView alloc] initForAutoLayout]; + self.cardFormView.optionalFields = BTUICardFormOptionalFieldsNone; + [self.view addSubview:self.cardFormView]; + [self.cardFormView autoPinEdgeToSuperviewEdge:ALEdgeTop]; + [self.cardFormView autoPinEdgeToSuperviewEdge:ALEdgeLeft]; + [self.cardFormView autoPinEdgeToSuperviewEdge:ALEdgeRight]; +} + +- (UIView *)createPaymentButton { + UIButton *verifyNewCardButton = [UIButton buttonWithType:UIButtonTypeSystem]; + [verifyNewCardButton setTitle:NSLocalizedString(@"Tokenize and Verify New Card", nil) forState:UIControlStateNormal]; + [verifyNewCardButton addTarget:self action:@selector(tappedToVerifyNewCard) forControlEvents:UIControlEventTouchUpInside]; + + UIView *threeDSecureButtonsContainer = [[UIView alloc] initForAutoLayout]; + [threeDSecureButtonsContainer addSubview:verifyNewCardButton]; + + [verifyNewCardButton autoPinEdgeToSuperviewEdge:ALEdgeTop]; + + [verifyNewCardButton autoAlignAxisToSuperviewMarginAxis:ALAxisVertical]; + + self.callbackCountLabel = [[UILabel alloc] initForAutoLayout]; + self.callbackCountLabel.textAlignment = NSTextAlignmentCenter; + self.callbackCountLabel.font = [UIFont systemFontOfSize:UIFont.smallSystemFontSize]; + [threeDSecureButtonsContainer addSubview:self.callbackCountLabel]; + [self.callbackCountLabel autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:verifyNewCardButton withOffset:20]; + [self.callbackCountLabel autoPinEdgeToSuperviewEdge:ALEdgeLeft]; + [self.callbackCountLabel autoPinEdgeToSuperviewEdge:ALEdgeRight]; + self.callbackCount = 0; + [self updateCallbackCount]; + + return threeDSecureButtonsContainer; +} + +- (BTCard *)newCard { + BTCard *card = [[BTCard alloc] init]; + if (self.cardFormView.valid && + self.cardFormView.number && + self.cardFormView.expirationMonth && + self.cardFormView.expirationYear) { + card.number = self.cardFormView.number; + card.expirationMonth = self.cardFormView.expirationMonth; + card.expirationYear = self.cardFormView.expirationYear; + } else { + [self.cardFormView showTopLevelError:@"Not valid. Using default 3DS test card..."]; + card.number = @"4000000000000002"; + card.expirationMonth = @"12"; + card.expirationYear = @"2020"; + } + return card; +} + +- (void)updateCallbackCount { + self.callbackCountLabel.text = [NSString stringWithFormat:@"Callback Count: %i", self.callbackCount]; +} + +/// "Tokenize and Verify New Card" +- (void)tappedToVerifyNewCard { + self.callbackCount = 0; + [self updateCallbackCount]; + + BTCard *card = [self newCard]; + + self.progressBlock([NSString stringWithFormat:@"Tokenizing card ending in %@", [card.number substringFromIndex:(card.number.length - 4)]]); + + BTCardClient *client = [[BTCardClient alloc] initWithAPIClient:self.apiClient]; + [client tokenizeCard:card completion:^(BTCardNonce * _Nullable tokenizedCard, NSError * _Nullable error) { + + if (error) { + self.progressBlock(error.localizedDescription); + return; + } + + self.progressBlock(@"Tokenized card, now verifying with 3DS"); + + BTThreeDSecureDriver *threeDSecure = [[BTThreeDSecureDriver alloc] initWithAPIClient:self.apiClient delegate:self]; + + [threeDSecure verifyCardWithNonce:tokenizedCard.nonce + amount:[NSDecimalNumber decimalNumberWithString:@"10"] + completion:^(BTThreeDSecureCardNonce * _Nullable threeDSecureCard, NSError * _Nullable error) + { + self.callbackCount++; + [self updateCallbackCount]; + if (error) { + self.progressBlock(error.localizedDescription); + } else if (threeDSecureCard) { + self.completionBlock(threeDSecureCard); + + if (threeDSecureCard.liabilityShiftPossible && threeDSecureCard.liabilityShifted) { + self.progressBlock(@"Liability shift possible and liability shifted"); + } else { + self.progressBlock(@"3D Secure authentication was attempted but liability shift is not possible"); + } + } else { + self.progressBlock(@"Cancelled🎲"); + } + }]; + }]; +} + +- (void)paymentDriver:(__unused id)driver requestsPresentationOfViewController:(UIViewController *)viewController { + [self presentViewController:viewController animated:YES completion:nil]; +} + +- (void)paymentDriver:(__unused id)driver requestsDismissalOfViewController:(__unused UIViewController *)viewController { + [self dismissViewControllerAnimated:YES completion:nil]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Drop In Old/BraintreeDemoDropInLegacyViewController.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Drop In Old/BraintreeDemoDropInLegacyViewController.h new file mode 100644 index 0000000..dd74f49 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Drop In Old/BraintreeDemoDropInLegacyViewController.h @@ -0,0 +1,7 @@ +#import + +#import "BraintreeDemoBaseViewController.h" + +@interface BraintreeDemoDropInLegacyViewController : BraintreeDemoBaseViewController + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Drop In Old/BraintreeDemoDropInLegacyViewController.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Drop In Old/BraintreeDemoDropInLegacyViewController.m new file mode 100644 index 0000000..b9e4523 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Drop In Old/BraintreeDemoDropInLegacyViewController.m @@ -0,0 +1,97 @@ +#import "BraintreeDemoDropInLegacyViewController.h" + +#import +#import +#import +#import +#import "BraintreeDemoSettings.h" + +@interface BraintreeDemoDropInLegacyViewController () + +@property (nonatomic, strong) BTAPIClient *apiClient; + +@end + +@implementation BraintreeDemoDropInLegacyViewController + +- (instancetype)initWithAuthorization:(NSString *)authorization { + if (self = [super initWithAuthorization:authorization]) { + _apiClient = [[BTAPIClient alloc] initWithAuthorization:authorization]; + } + return self; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + self.title = NSLocalizedString(@"Drop In (Legacy)", nil); + + UIButton *dropInButton = [UIButton buttonWithType:UIButtonTypeSystem]; + dropInButton.translatesAutoresizingMaskIntoConstraints = NO; + [dropInButton addTarget:self action:@selector(tappedToShowDropIn) forControlEvents:UIControlEventTouchUpInside]; + [dropInButton setBackgroundColor:[UIColor redColor]]; + [dropInButton setTitleColor:[UIColor whiteColor]forState:UIControlStateNormal]; + dropInButton.layer.cornerRadius = 5.0f; + dropInButton.contentEdgeInsets = UIEdgeInsetsMake(8, 8, 8, 8); + [dropInButton setTitle:NSLocalizedString(@"Buy Now", nil) forState:UIControlStateNormal]; + [dropInButton sizeToFit]; + + [self.view addSubview:dropInButton]; + [dropInButton autoCenterInSuperview]; + + self.progressBlock(@"Ready to present Drop In (Old)"); +} + +- (void)tappedToShowDropIn { + BTPaymentRequest *paymentRequest = [[BTPaymentRequest alloc] init]; + paymentRequest.summaryTitle = @"Our Fancy Magazine"; + paymentRequest.summaryDescription = @"53 Week Subscription"; + paymentRequest.displayAmount = @"$19.00"; + paymentRequest.callToActionText = @"$19 - Subscribe Now"; + paymentRequest.shouldHideCallToAction = NO; + BTDropInViewController *dropIn = [[BTDropInViewController alloc] initWithAPIClient:self.apiClient]; + dropIn.delegate = self; + dropIn.paymentRequest = paymentRequest; + dropIn.title = NSLocalizedString(@"Check Out", nil); + + if ([BraintreeDemoSettings useModalPresentation]) { + self.progressBlock(@"Presenting Drop In Modally"); + dropIn.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(tappedCancel)]; + UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:dropIn]; + [self presentViewController:nav animated:YES completion:nil]; + } else { + self.progressBlock(@"Pushing Drop In on nav stack"); + [self.navigationController pushViewController:dropIn animated:YES]; + } +} + + +- (void)tappedCancel { + self.progressBlock(@"Dismissing Drop In"); + [self dismissViewControllerAnimated:YES completion:nil]; +} + +#pragma mark - BTDropInViewControllerDelegate + +// Renamed from -dropInViewController:didSucceedWithPaymentMethod: +- (void)dropInViewController:(BTDropInViewController *)viewController didSucceedWithTokenization:(BTPaymentMethodNonce *)paymentMethodNonce { + if ([BraintreeDemoSettings useModalPresentation]) { + [viewController dismissViewControllerAnimated:YES completion:^{ + self.completionBlock(paymentMethodNonce); + }]; + } else { + [self.navigationController popViewControllerAnimated:YES]; + self.completionBlock(paymentMethodNonce); + } +} + +- (void)dropInViewControllerWillComplete:(__unused BTDropInViewController *)viewController { + self.progressBlock(@"Drop In Will Complete"); +} + +- (void)dropInViewControllerDidCancel:(BTDropInViewController *)viewController { + self.progressBlock(@"User Canceled Drop In"); + [viewController dismissViewControllerAnimated:YES completion:nil]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Drop In/BraintreeDemoDropInViewController.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Drop In/BraintreeDemoDropInViewController.h new file mode 100644 index 0000000..0696111 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Drop In/BraintreeDemoDropInViewController.h @@ -0,0 +1,7 @@ +#import + +#import "BraintreeDemoBaseViewController.h" + +@interface BraintreeDemoDropInViewController : BraintreeDemoBaseViewController + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Drop In/BraintreeDemoDropInViewController.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Drop In/BraintreeDemoDropInViewController.m new file mode 100644 index 0000000..c633221 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Drop In/BraintreeDemoDropInViewController.m @@ -0,0 +1,328 @@ +#import "BraintreeDemoDropInViewController.h" + +#import +#import +#import +#import +#import "BraintreeUIKit.h" +#import "BraintreeDemoSettings.h" +#import "BTPaymentSelectionViewController.h" +#import + +@interface BraintreeDemoDropInViewController () + +@property (nonatomic, strong) BTUIKPaymentOptionCardView *paymentMethodTypeIcon; +@property (nonatomic, strong) UILabel *paymentMethodTypeLabel; +@property (nonatomic, strong) UILabel *cartLabel; +@property (nonatomic, strong) UILabel *itemLabel; +@property (nonatomic, strong) UILabel *priceLabel; +@property (nonatomic, strong) UILabel *paymentMethodHeaderLabel; +@property (nonatomic, strong) UIButton *dropInButton; +@property (nonatomic, strong) UIButton *purchaseButton; +@property (nonatomic, strong) UISegmentedControl *dropinThemeSwitch; +@property (nonatomic, strong) NSString *authorizationString; +@property (nonatomic) BOOL useApplePay; +@property (nonatomic, strong) BTPaymentMethodNonce *selectedNonce; +@property (nonatomic, strong) NSArray *checkoutConstraints; +@end + +@implementation BraintreeDemoDropInViewController + +- (instancetype)initWithAuthorization:(NSString *)authorization { + if (self = [super initWithAuthorization:authorization]) { + + self.authorizationString = authorization; + } + return self; +} + +- (void) updatePaymentMethod:(BTPaymentMethodNonce*)paymentMethodNonce { + self.paymentMethodTypeLabel.hidden = paymentMethodNonce == nil; + self.paymentMethodTypeIcon.hidden = paymentMethodNonce == nil; + if (paymentMethodNonce != nil) { + BTUIKPaymentOptionType paymentMethodType = [BTUIKViewUtil paymentOptionTypeForPaymentInfoType:paymentMethodNonce.type]; + self.paymentMethodTypeIcon.paymentOptionType = paymentMethodType; + [self.paymentMethodTypeLabel setText:paymentMethodNonce.localizedDescription]; + } + [self updatePaymentMethodConstraints]; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + self.title = NSLocalizedString(@"Drop-in", nil); + self.cartLabel = [[UILabel alloc] init]; + [self.cartLabel setText:NSLocalizedString(@"CART", nil)]; + self.cartLabel.font = [UIFont systemFontOfSize:[UIFont smallSystemFontSize]]; + [self.cartLabel setTextColor:[UIColor grayColor]]; + self.cartLabel.translatesAutoresizingMaskIntoConstraints = NO; + [self.view addSubview:self.cartLabel]; + + self.itemLabel = [[UILabel alloc] init]; + [self.itemLabel setText:NSLocalizedString(@"1 Sock", nil)]; + self.itemLabel.translatesAutoresizingMaskIntoConstraints = NO; + [self.view addSubview:self.itemLabel]; + + self.priceLabel = [[UILabel alloc] init]; + [self.priceLabel setText:NSLocalizedString(@"$100", nil)]; + self.priceLabel.translatesAutoresizingMaskIntoConstraints = NO; + [self.view addSubview:self.priceLabel]; + + self.paymentMethodHeaderLabel = [[UILabel alloc] init]; + [self.paymentMethodHeaderLabel setText:NSLocalizedString(@"PAYMENT METHODS", nil)]; + [self.paymentMethodHeaderLabel setTextColor:[UIColor grayColor]]; + self.paymentMethodHeaderLabel.font = [UIFont systemFontOfSize:[UIFont smallSystemFontSize]]; + self.paymentMethodHeaderLabel.translatesAutoresizingMaskIntoConstraints = NO; + [self.view addSubview:self.paymentMethodHeaderLabel]; + + self.dropInButton = [[UIButton alloc] init]; + [self.dropInButton setTitle:NSLocalizedString(@"Select Payment Method", nil) forState:UIControlStateNormal]; + [self.dropInButton setTitleColor:self.view.tintColor forState:UIControlStateNormal]; + self.dropInButton.translatesAutoresizingMaskIntoConstraints = NO; + [self.dropInButton addTarget:self action:@selector(tappedToShowDropIn) forControlEvents:UIControlEventTouchUpInside]; + [self.view addSubview:self.dropInButton]; + + self.purchaseButton = [[UIButton alloc] init]; + [self.purchaseButton setTitle:NSLocalizedString(@"Complete Purchase", nil) forState:UIControlStateNormal]; + [self.purchaseButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + [self.purchaseButton setTitleColor:[[UIColor whiteColor] colorWithAlphaComponent:0.8] forState:UIControlStateHighlighted]; + self.purchaseButton.backgroundColor = self.view.tintColor; + self.purchaseButton.translatesAutoresizingMaskIntoConstraints = NO; + + [self.purchaseButton addTarget:self action:@selector(purchaseButtonPressed) forControlEvents:UIControlEventTouchUpInside]; + self.purchaseButton.layer.cornerRadius = 4.0; + [self.view addSubview:self.purchaseButton]; + + self.paymentMethodTypeIcon = [BTUIKPaymentOptionCardView new]; + self.paymentMethodTypeIcon.translatesAutoresizingMaskIntoConstraints = NO; + [self.view addSubview:self.paymentMethodTypeIcon]; + self.paymentMethodTypeIcon.hidden = YES; + + self.paymentMethodTypeLabel = [[UILabel alloc] init]; + self.paymentMethodTypeLabel.translatesAutoresizingMaskIntoConstraints = NO; + [self.view addSubview:self.paymentMethodTypeLabel]; + self.paymentMethodTypeLabel.hidden = YES; + + self.dropinThemeSwitch = [[UISegmentedControl alloc] initWithItems:@[@"Light Theme", @"Dark Theme"]]; + self.dropinThemeSwitch.translatesAutoresizingMaskIntoConstraints = NO; + self.dropinThemeSwitch.selectedSegmentIndex = 0; + [self.view addSubview:self.dropinThemeSwitch]; + + [self updatePaymentMethodConstraints]; + + self.progressBlock(@"Fetching customer's payment methods..."); + self.useApplePay = NO; + + [BTDropInResult fetchDropInResultForAuthorization:self.authorizationString handler:^(BTDropInResult * _Nullable result, NSError * _Nullable error) { + if (error) { + self.progressBlock([NSString stringWithFormat:@"Error: %@", error.localizedDescription]); + NSLog(@"Error: %@", error); + } else { + if (result.paymentOptionType == BTUIKPaymentOptionTypeApplePay) { + self.progressBlock(@"Ready for checkout..."); + [self setupApplePay]; + } else { + self.useApplePay = NO; + self.selectedNonce = result.paymentMethod; + self.progressBlock(@"Ready for checkout..."); + [self updatePaymentMethod:self.selectedNonce]; + } + } + }]; +} + +- (void) setupApplePay { + self.paymentMethodTypeLabel.hidden = NO; + self.paymentMethodTypeIcon.hidden = NO; + self.paymentMethodTypeIcon.paymentOptionType = BTUIKPaymentOptionTypeApplePay; + [self.paymentMethodTypeLabel setText:NSLocalizedString(@"Apple Pay", nil)]; + self.useApplePay = YES; + [self updatePaymentMethodConstraints]; +} + +#pragma mark Constraints + +- (void)updatePaymentMethodConstraints { + if (self.checkoutConstraints) { + [NSLayoutConstraint deactivateConstraints:self.checkoutConstraints]; + } + NSDictionary *viewBindings = @{ + @"view": self, + @"cartLabel": self.cartLabel, + @"itemLabel": self.itemLabel, + @"priceLabel": self.priceLabel, + @"paymentMethodHeaderLabel": self.paymentMethodHeaderLabel, + @"dropInButton": self.dropInButton, + @"paymentMethodTypeIcon": self.paymentMethodTypeIcon, + @"paymentMethodTypeLabel": self.paymentMethodTypeLabel, + @"purchaseButton":self.purchaseButton, + @"dropinThemeSwitch":self.dropinThemeSwitch + }; + + NSMutableArray *newConstraints = [NSMutableArray new]; + [newConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[cartLabel]-|" options:0 metrics:nil views:viewBindings]]; + [newConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[purchaseButton]-|" options:0 metrics:nil views:viewBindings]]; + [newConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(20)-[cartLabel]-[itemLabel]-[paymentMethodHeaderLabel]" options:0 metrics:nil views:viewBindings]]; + + [newConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[itemLabel]-[priceLabel]-|" options:NSLayoutFormatAlignAllTop metrics:nil views:viewBindings]]; + + [newConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[paymentMethodHeaderLabel]-|" options:0 metrics:nil views:viewBindings]]; + + if (!self.paymentMethodTypeIcon.hidden && !self.paymentMethodTypeLabel.hidden) { + [newConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[paymentMethodHeaderLabel]-[paymentMethodTypeIcon(29)]-[dropInButton]" options:0 metrics:nil views:viewBindings]]; + + [newConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[paymentMethodTypeIcon(45)]-[paymentMethodTypeLabel]" options:NSLayoutFormatAlignAllCenterY metrics:nil views:viewBindings]]; + [newConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[dropInButton]-|" options:0 metrics:nil views:viewBindings]]; + [self.dropInButton setTitle:NSLocalizedString(@"Change Payment Method", nil) forState:UIControlStateNormal]; + self.purchaseButton.backgroundColor = self.view.tintColor; + self.purchaseButton.enabled = YES; + } else { + [newConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[paymentMethodHeaderLabel]-[dropInButton]" options:0 metrics:nil views:viewBindings]]; + + [newConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[dropInButton]-|" options:0 metrics:nil views:viewBindings]]; + [self.dropInButton setTitle:NSLocalizedString(@"Add Payment Method", nil) forState:UIControlStateNormal]; + self.purchaseButton.backgroundColor = [UIColor lightGrayColor]; + self.purchaseButton.enabled = NO; + } + + [newConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[dropInButton]-(20)-[purchaseButton]-(20)-[dropinThemeSwitch]" options:0 metrics:nil views:viewBindings]]; + + [newConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[dropinThemeSwitch]-|" options:0 metrics:nil views:viewBindings]]; + + self.checkoutConstraints = newConstraints; + [self.view addConstraints:self.checkoutConstraints]; +} + +#pragma mark Button Handlers + +- (void)purchaseButtonPressed { + if (self.useApplePay) { + + PKPaymentRequest *paymentRequest = [[PKPaymentRequest alloc] init]; + paymentRequest.paymentSummaryItems = @[ + [PKPaymentSummaryItem summaryItemWithLabel:@"Socks" amount:[NSDecimalNumber decimalNumberWithString:@"100"]] + ]; + paymentRequest.supportedNetworks = @[PKPaymentNetworkVisa, PKPaymentNetworkMasterCard, PKPaymentNetworkAmex, PKPaymentNetworkDiscover]; + paymentRequest.merchantCapabilities = PKMerchantCapability3DS; + paymentRequest.currencyCode = @"USD"; + paymentRequest.countryCode = @"US"; + + switch ([BraintreeDemoSettings currentEnvironment]) { + case BraintreeDemoTransactionServiceEnvironmentSandboxBraintreeSampleMerchant: + paymentRequest.merchantIdentifier = @"merchant.com.braintreepayments.sandbox.Braintree-Demo"; + break; + case BraintreeDemoTransactionServiceEnvironmentProductionExecutiveSampleMerchant: + paymentRequest.merchantIdentifier = @"merchant.com.braintreepayments.Braintree-Demo"; + break; + case BraintreeDemoTransactionServiceEnvironmentCustomMerchant: + self.progressBlock(@"Direct Apple Pay integration does not support custom environments in this Demo App"); + break; + } + + PKPaymentAuthorizationViewController *viewController = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:paymentRequest]; + viewController.delegate = self; + + self.progressBlock(@"Presenting Apple Pay Sheet"); + [self presentViewController:viewController animated:YES completion:nil]; + } else { + self.completionBlock(self.selectedNonce); + self.transactionBlock(); + } +} + +- (void)tappedToShowDropIn { + BTDropInRequest *dropInRequest = [[BTDropInRequest alloc] init]; + // To test 3DS + //dropInRequest.amount = @"10.00"; + //dropInRequest.threeDSecureVerification = YES; + if (self.dropinThemeSwitch.selectedSegmentIndex == 0) { + [BTUIKAppearance lightTheme]; + } else { + [BTUIKAppearance darkTheme]; + } + BTDropInController *dropIn = [[BTDropInController alloc] initWithAuthorization:self.authorizationString request:dropInRequest handler:^(BTDropInController * _Nonnull dropInController, BTDropInResult * _Nullable result, NSError * _Nullable error) { + if (error) { + self.progressBlock([NSString stringWithFormat:@"Error: %@", error.localizedDescription]); + NSLog(@"Error: %@", error); + } else if (result.isCancelled) { + self.progressBlock(@"Cancelled🎲"); + } else { + if (result.paymentOptionType == BTUIKPaymentOptionTypeApplePay) { + self.progressBlock(@"Ready for checkout..."); + [self setupApplePay]; + } else { + self.useApplePay = NO; + self.selectedNonce = result.paymentMethod; + self.progressBlock(@"Ready for checkout..."); + [self updatePaymentMethod:self.selectedNonce]; + } + } + [dropInController dismissViewControllerAnimated:YES completion:nil]; + }]; + + [self presentViewController:dropIn animated:YES completion:nil]; +} + +#pragma mark PKPaymentAuthorizationViewControllerDelegate + +- (void)paymentAuthorizationViewController:(__unused PKPaymentAuthorizationViewController *)controller + didSelectShippingMethod:(PKShippingMethod *)shippingMethod + completion:(void (^)(PKPaymentAuthorizationStatus, NSArray * _Nonnull))completion +{ + PKPaymentSummaryItem *testItem = [PKPaymentSummaryItem summaryItemWithLabel:@"SOME ITEM" amount:[NSDecimalNumber decimalNumberWithString:@"10"]]; + if ([shippingMethod.identifier isEqualToString:@"fast"]) { + completion(PKPaymentAuthorizationStatusSuccess, + @[ + testItem, + [PKPaymentSummaryItem summaryItemWithLabel:@"SHIPPING" amount:shippingMethod.amount], + [PKPaymentSummaryItem summaryItemWithLabel:@"BRAINTREE" amount:[testItem.amount decimalNumberByAdding:shippingMethod.amount]], + ]); + } else if ([shippingMethod.identifier isEqualToString:@"fail"]) { + completion(PKPaymentAuthorizationStatusFailure, @[testItem]); + } else { + completion(PKPaymentAuthorizationStatusSuccess, @[testItem]); + } +} + +- (void)paymentAuthorizationViewControllerDidFinish:(__unused PKPaymentAuthorizationViewController *)controller { + [controller dismissViewControllerAnimated:YES completion:nil]; +} + +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000 +- (void)paymentAuthorizationViewController:(__unused PKPaymentAuthorizationViewController *)controller didAuthorizePayment:(PKPayment *)payment handler:(void (^)(PKPaymentAuthorizationResult * _Nonnull))completion API_AVAILABLE(ios(11.0), watchos(4.0)) { + self.progressBlock(@"Apple Pay Did Authorize Payment"); + BTAPIClient *client = [[BTAPIClient alloc] initWithAuthorization:self.authorizationString]; + BTApplePayClient *applePayClient = [[BTApplePayClient alloc] initWithAPIClient:client]; + [applePayClient tokenizeApplePayPayment:payment completion:^(BTApplePayCardNonce * _Nullable tokenizedApplePayPayment, NSError * _Nullable error) { + if (error) { + self.progressBlock(error.localizedDescription); + completion([[PKPaymentAuthorizationResult alloc] initWithStatus:PKPaymentAuthorizationStatusFailure errors:nil]); + } else { + self.completionBlock(tokenizedApplePayPayment); + completion([[PKPaymentAuthorizationResult alloc] initWithStatus:PKPaymentAuthorizationStatusSuccess errors:nil]); + } + }]; +} +#endif + +- (void)paymentAuthorizationViewController:(__unused PKPaymentAuthorizationViewController *)controller + didAuthorizePayment:(PKPayment *)payment + completion:(void (^)(PKPaymentAuthorizationStatus status))completion { + self.progressBlock(@"Apple Pay Did Authorize Payment"); + BTAPIClient *client = [[BTAPIClient alloc] initWithAuthorization:self.authorizationString]; + BTApplePayClient *applePayClient = [[BTApplePayClient alloc] initWithAPIClient:client]; + [applePayClient tokenizeApplePayPayment:payment completion:^(BTApplePayCardNonce * _Nullable tokenizedApplePayPayment, NSError * _Nullable error) { + if (error) { + self.progressBlock(error.localizedDescription); + completion(PKPaymentAuthorizationStatusFailure); + } else { + self.completionBlock(tokenizedApplePayPayment); + completion(PKPaymentAuthorizationStatusSuccess); + } + }]; +} + +- (void)paymentAuthorizationViewControllerWillAuthorizePayment:(__unused PKPaymentAuthorizationViewController *)controller { + self.progressBlock(@"Apple Pay will Authorize Payment"); +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Fraud Protection - BTDataCollector/BraintreeDemoBTDataCollectorViewController.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Fraud Protection - BTDataCollector/BraintreeDemoBTDataCollectorViewController.h new file mode 100644 index 0000000..801bf94 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Fraud Protection - BTDataCollector/BraintreeDemoBTDataCollectorViewController.h @@ -0,0 +1,7 @@ +#import + +#import "BraintreeDemoBaseViewController.h" + +@interface BraintreeDemoBTDataCollectorViewController : BraintreeDemoBaseViewController + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Fraud Protection - BTDataCollector/BraintreeDemoBTDataCollectorViewController.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Fraud Protection - BTDataCollector/BraintreeDemoBTDataCollectorViewController.m new file mode 100644 index 0000000..a820646 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Fraud Protection - BTDataCollector/BraintreeDemoBTDataCollectorViewController.m @@ -0,0 +1,117 @@ +#import "BraintreeDemoBTDataCollectorViewController.h" +#import "BTDataCollector.h" +#import +#import "PPDataCollector.h" +#import + +@interface BraintreeDemoBTDataCollectorViewController () +/// Retain BTDataCollector for entire lifecycle of view controller +@property (nonatomic, strong) BTDataCollector *dataCollector; +@property (nonatomic, strong) UILabel *dataLabel; +@property (nonatomic, strong) BTAPIClient *apiClient; +@end + +@implementation BraintreeDemoBTDataCollectorViewController + +- (instancetype)initWithAuthorization:(NSString *)authorization { + if (self = [super initWithAuthorization:authorization]) { + _apiClient = [[BTAPIClient alloc] initWithAuthorization:authorization]; + } + + return self; +} + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.title = NSLocalizedString(@"BTDataCollector Protection", nil); + + UIButton *collectButton = [UIButton buttonWithType:UIButtonTypeSystem]; + [collectButton setTitle:NSLocalizedString(@"Collect All Data", nil) forState:UIControlStateNormal]; + [collectButton addTarget:self action:@selector(tappedCollect) forControlEvents:UIControlEventTouchUpInside]; + + UIButton *collectKountButton = [UIButton buttonWithType:UIButtonTypeSystem]; + [collectKountButton setTitle:NSLocalizedString(@"Collect Kount Data", nil) forState:UIControlStateNormal]; + [collectKountButton addTarget:self action:@selector(tappedCollectKount) forControlEvents:UIControlEventTouchUpInside]; + + UIButton *collectDysonButton = [UIButton buttonWithType:UIButtonTypeSystem]; + [collectDysonButton setTitle:NSLocalizedString(@"Collect PayPal Data", nil) forState:UIControlStateNormal]; + [collectDysonButton addTarget:self action:@selector(tappedCollectDyson) forControlEvents:UIControlEventTouchUpInside]; + + UIButton *obtainLocationPermissionButton = [UIButton buttonWithType:UIButtonTypeSystem]; + [obtainLocationPermissionButton setTitle:NSLocalizedString(@"Obtain Location Permission", nil) forState:UIControlStateNormal]; + [obtainLocationPermissionButton addTarget:self action:@selector(tappedRequestLocationAuthorization:) forControlEvents:UIControlEventTouchUpInside]; + + self.dataLabel = [[UILabel alloc] init]; + self.dataLabel.numberOfLines = 0; + + [self.view addSubview:collectButton]; + [self.view addSubview:collectKountButton]; + [self.view addSubview:collectDysonButton]; + [self.view addSubview:obtainLocationPermissionButton]; + [self.view addSubview:self.dataLabel]; + + [collectButton autoCenterInSuperviewMargins]; + [collectKountButton autoAlignAxis:ALAxisVertical toSameAxisOfView:collectButton]; + [collectDysonButton autoAlignAxis:ALAxisVertical toSameAxisOfView:collectButton]; + [collectKountButton autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:collectButton]; + [collectDysonButton autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:collectKountButton]; + + [obtainLocationPermissionButton autoPinEdgeToSuperviewEdge:ALEdgeBottom withInset:20]; + [obtainLocationPermissionButton autoAlignAxisToSuperviewMarginAxis:ALAxisVertical]; + + [self.dataLabel autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:collectDysonButton]; + [self.dataLabel autoPinEdgeToSuperviewEdge:ALEdgeLeft]; + [self.dataLabel autoPinEdgeToSuperviewEdge:ALEdgeRight]; + [self.dataLabel autoAlignAxisToSuperviewMarginAxis:ALAxisVertical]; + + self.dataCollector = [[BTDataCollector alloc] initWithAPIClient:self.apiClient]; + self.dataCollector.delegate = self; +} + +- (IBAction)tappedCollect +{ self.progressBlock(@"Started collecting all data..."); + [self.dataCollector collectFraudData:^(NSString * _Nonnull deviceData) { + self.dataLabel.text = deviceData; + }]; +} + +- (IBAction)tappedCollectKount { + self.progressBlock(@"Started collecting Kount data..."); + [self.dataCollector collectCardFraudData:^(NSString * _Nonnull deviceData) { + self.dataLabel.text = deviceData; + }]; +} + +- (IBAction)tappedCollectDyson { + self.dataLabel.text = [PPDataCollector collectPayPalDeviceData]; + self.progressBlock(@"Collected PayPal clientMetadataID!"); +} + +- (IBAction)tappedRequestLocationAuthorization:(__unused id)sender { + CLLocationManager *locationManager = [[CLLocationManager alloc] init]; + [locationManager requestWhenInUseAuthorization]; +} + +#pragma mark - BTDataCollectorDelegate + +/// The collector has started. +- (void)dataCollectorDidStart:(__unused BTDataCollector *)dataCollector { + self.progressBlock(@"Data collector did start..."); +} + +/// The collector finished successfully. +- (void)dataCollectorDidComplete:(__unused BTDataCollector *)dataCollector { + self.progressBlock(@"Data collector did complete."); +} + +/// An error occurred. +/// +/// @param error Triggering error +- (void)dataCollector:(__unused BTDataCollector *)dataCollector didFailWithError:(NSError *)error { + self.progressBlock(@"Error collecting data."); + NSLog(@"Error collecting data. error = %@", error); +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Ideal/BraintreeDemoIdealViewController.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Ideal/BraintreeDemoIdealViewController.h new file mode 100644 index 0000000..9a66ce0 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Ideal/BraintreeDemoIdealViewController.h @@ -0,0 +1,7 @@ +#import + +#import "BraintreeDemoPaymentButtonBaseViewController.h" + +@interface BraintreeDemoIdealViewController : BraintreeDemoPaymentButtonBaseViewController + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Ideal/BraintreeDemoIdealViewController.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Ideal/BraintreeDemoIdealViewController.m new file mode 100644 index 0000000..96aa578 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Ideal/BraintreeDemoIdealViewController.m @@ -0,0 +1,104 @@ +#import "BraintreeDemoIdealViewController.h" +#import +#import +#import "BraintreeDemoMerchantAPI.h" + +@interface BraintreeDemoIdealViewController () +@property (nonatomic, strong) BTPaymentFlowDriver *paymentFlowDriver; +@property (nonatomic, weak) UILabel *paymentIDLabel; +@end + +@implementation BraintreeDemoIdealViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + self.progressBlock(@"Loading iDEAL Merchant Account..."); + self.paymentButton.hidden = NO; + [self setUpPaymentIDField]; + self.progressBlock(@"Ready!"); + self.title = NSLocalizedString(@"iDEAL", nil); +} + +- (UIView *)createPaymentButton { + UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; + [button setTitle:NSLocalizedString(@"Pay With iDEAL", nil) forState:UIControlStateNormal]; + [button setTitleColor:[UIColor bt_colorFromHex:@"3D95CE" alpha:1.0f] forState:UIControlStateNormal]; + [button setTitleColor:[[UIColor bt_colorFromHex:@"3D95CE" alpha:1.0f] bt_adjustedBrightness:0.7] forState:UIControlStateHighlighted]; + [button addTarget:self action:@selector(idealButtonTapped) forControlEvents:UIControlEventTouchUpInside]; + return button; +} + +- (void)setUpPaymentIDField { + UILabel *paymentIDLabel = [[UILabel alloc] init]; + paymentIDLabel.translatesAutoresizingMaskIntoConstraints = NO; + paymentIDLabel.numberOfLines = 0; + [self.view addSubview:paymentIDLabel]; + [paymentIDLabel.leadingAnchor constraintEqualToAnchor:self.view.layoutMarginsGuide.leadingAnchor constant:8.0].active = YES; + [paymentIDLabel.trailingAnchor constraintEqualToAnchor:self.view.layoutMarginsGuide.trailingAnchor constant:8.0].active = YES; + [paymentIDLabel.topAnchor constraintEqualToAnchor:self.paymentButton.bottomAnchor constant:8.0].active = YES; + [paymentIDLabel.bottomAnchor constraintEqualToAnchor:self.view.layoutMarginsGuide.bottomAnchor constant:8.0].active = YES; + self.paymentIDLabel = paymentIDLabel; +} + +- (void)idealButtonTapped { + self.paymentIDLabel.text = nil; + [self startPaymentWithBank]; +} + +- (void)startPaymentWithBank { + BTAPIClient *client = [[BTAPIClient alloc] initWithAuthorization:@"sandbox_f252zhq7_hh4cpc39zq4rgjcg"]; + self.paymentFlowDriver = [[BTPaymentFlowDriver alloc] initWithAPIClient:client]; + self.paymentFlowDriver.viewControllerPresentingDelegate = self; + + BTLocalPaymentRequest *request = [[BTLocalPaymentRequest alloc] init]; + request.paymentType = @"ideal"; + request.currencyCode = @"EUR"; + request.amount = @"1.01"; + request.givenName = @"Linh"; + request.surname = @"Ngo"; + request.phone = @"639847934"; + request.address = [BTPostalAddress new]; + request.address.countryCodeAlpha2 = @"NL"; + request.address.postalCode = @"2585 GJ"; + request.address.streetAddress = @"836486 of 22321 Park Lake"; + request.address.locality = @"Den Haag"; + request.email = @"lingo-buyer@paypal.com"; + request.shippingAddressRequired = NO; + request.localPaymentFlowDelegate = self; + + void (^paymentFlowCompletionBlock)(BTPaymentFlowResult *, NSError *) = ^(BTPaymentFlowResult * _Nullable result, NSError * _Nullable error) { + if (error) { + if (error.code == BTPaymentFlowDriverErrorTypeCanceled) { + self.progressBlock(@"Cancelled🎲"); + } else { + self.progressBlock([NSString stringWithFormat:@"Error: %@", error]); + } + } else if (result) { + BTLocalPaymentResult *localPaymentResult = (BTLocalPaymentResult *)result; + BTPaymentMethodNonce *n = [[BTPaymentMethodNonce alloc] initWithNonce:localPaymentResult.nonce localizedDescription:localPaymentResult.localizedDescription]; + self.completionBlock(n); + } + }; + + [self.paymentFlowDriver startPaymentFlow:request completion:paymentFlowCompletionBlock]; +} + +#pragma mark BTAppSwitchDelegate + +- (void)paymentDriver:(__unused id)driver requestsPresentationOfViewController:(UIViewController *)viewController { + [self presentViewController:viewController animated:YES completion:nil]; +} + +- (void)paymentDriver:(__unused id)driver requestsDismissalOfViewController:(UIViewController *)viewController { + [viewController dismissViewControllerAnimated:YES completion:nil]; +} + +#pragma mark BTIdealRequestDelegate + +- (void)localPaymentStarted:(__unused BTLocalPaymentRequest *)request paymentId:(NSString *)paymentId start:(void (^)(void))start { + self.paymentIDLabel.text = [NSString stringWithFormat:@"LocalPayment ID: %@", paymentId]; + // Do preprocessing if necessary before calling start() + start(); +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - BTUIPayPalButton/BraintreeDemoBTUIPayPalButtonViewController.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - BTUIPayPalButton/BraintreeDemoBTUIPayPalButtonViewController.h new file mode 100644 index 0000000..e7ab625 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - BTUIPayPalButton/BraintreeDemoBTUIPayPalButtonViewController.h @@ -0,0 +1,6 @@ +#import + +#import "BraintreeDemoPaymentButtonBaseViewController.h" + +@interface BraintreeDemoBTUIPayPalButtonViewController : BraintreeDemoPaymentButtonBaseViewController +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - BTUIPayPalButton/BraintreeDemoBTUIPayPalButtonViewController.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - BTUIPayPalButton/BraintreeDemoBTUIPayPalButtonViewController.m new file mode 100644 index 0000000..a96c939 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - BTUIPayPalButton/BraintreeDemoBTUIPayPalButtonViewController.m @@ -0,0 +1,61 @@ +#import "BraintreeDemoBTUIPayPalButtonViewController.h" +#import "BTUIPaymentButtonCollectionViewCell.h" +#import +#import + +@interface BraintreeDemoBTUIPayPalButtonViewController () +@end + +@implementation BraintreeDemoBTUIPayPalButtonViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + self.title = NSLocalizedString(@"BTUIPayPalButton", nil); + + self.paymentButton.hidden = YES; + [self.apiClient fetchOrReturnRemoteConfiguration:^(BTConfiguration * _Nullable configuration, NSError * _Nullable error) { + if (error) { + self.progressBlock(@"Failed to fetch configuration"); + NSLog(@"Failed to fetch configuration: %@", error); + return; + } + + if (!configuration.isPayPalEnabled) { + self.progressBlock(@"canCreatePaymentMethodWithProviderType: returns NO, hiding PayPal button"); + } else { + self.paymentButton.hidden = NO; + } + }]; +} + +- (UIView *)createPaymentButton { + BTUIPayPalButton *payPalButton = [[BTUIPayPalButton alloc] init]; + [payPalButton addTarget:self action:@selector(tappedPayPalButton) forControlEvents:UIControlEventTouchUpInside]; + return payPalButton; +} + +- (void)tappedPayPalButton { + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:self.apiClient]; + payPalDriver.viewControllerPresentingDelegate = self; + [payPalDriver authorizeAccountWithCompletion:^(BTPayPalAccountNonce * _Nullable tokenizedPayPalAccount, NSError * _Nullable error) { + if (tokenizedPayPalAccount) { + self.progressBlock(@"Got a nonce 💎!"); + NSLog(@"%@", [tokenizedPayPalAccount debugDescription]); + self.completionBlock(tokenizedPayPalAccount); + } else if (error) { + self.progressBlock(error.localizedDescription); + } else { + self.progressBlock(@"Canceled 🔰"); + } + }]; +} + +- (void)paymentDriver:(__unused id)driver requestsPresentationOfViewController:(UIViewController *)viewController { + [self presentViewController:viewController animated:YES completion:nil]; +} + +- (void)paymentDriver:(__unused id)driver requestsDismissalOfViewController:(UIViewController *)viewController { + [viewController dismissViewControllerAnimated:YES completion:nil]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Billing Agreement/BraintreeDemoPayPalBillingAgreementViewController.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Billing Agreement/BraintreeDemoPayPalBillingAgreementViewController.h new file mode 100644 index 0000000..e271f91 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Billing Agreement/BraintreeDemoPayPalBillingAgreementViewController.h @@ -0,0 +1,5 @@ +#import "BraintreeDemoPaymentButtonBaseViewController.h" + +@interface BraintreeDemoPayPalBillingAgreementViewController : BraintreeDemoPaymentButtonBaseViewController + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Billing Agreement/BraintreeDemoPayPalBillingAgreementViewController.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Billing Agreement/BraintreeDemoPayPalBillingAgreementViewController.m new file mode 100644 index 0000000..e9bbeca --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Billing Agreement/BraintreeDemoPayPalBillingAgreementViewController.m @@ -0,0 +1,86 @@ +#import "BraintreeDemoPayPalBillingAgreementViewController.h" + +#import + +@interface BraintreeDemoPayPalBillingAgreementViewController () +@property(nonatomic, strong) UITextView *infoTextView; + +@end + +@implementation BraintreeDemoPayPalBillingAgreementViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + + self.infoTextView = [[UITextView alloc] initWithFrame:CGRectMake((self.view.bounds.size.width / 2) - 100, (self.view.bounds.size.width / 8) * 7, 200, 100)]; + [self.view addSubview:self.infoTextView]; + self.infoTextView.backgroundColor = [UIColor clearColor]; +} + +- (UIView *)createPaymentButton { + UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; + [button setTitle:NSLocalizedString(@"Billing Agreement with PayPal", nil) forState:UIControlStateNormal]; + [button setTitleColor:[UIColor blueColor] forState:UIControlStateNormal]; + [button setTitleColor:[UIColor colorWithRed:50.0/255 green:50.0/255 blue:255.0/255 alpha:1.0] forState:UIControlStateHighlighted]; + [button setTitleColor:[UIColor lightGrayColor] forState:UIControlStateDisabled]; + [button addTarget:self action:@selector(tappedPayPalCheckout:) forControlEvents:UIControlEventTouchUpInside]; + return button; +} + +- (void)tappedPayPalCheckout:(UIButton *)sender { + self.progressBlock(@"Tapped PayPal - initiating checkout using BTPayPalDriver"); + self.infoTextView.text = @""; + [sender setTitle:NSLocalizedString(@"Processing...", nil) forState:UIControlStateDisabled]; + [sender setEnabled:NO]; + + BTPayPalDriver *driver = [[BTPayPalDriver alloc] initWithAPIClient:self.apiClient]; + driver.appSwitchDelegate = self; + driver.viewControllerPresentingDelegate = self; + BTPayPalRequest *checkout = [[BTPayPalRequest alloc] init]; + [driver requestBillingAgreement:checkout completion:^(BTPayPalAccountNonce * _Nullable tokenizedPayPalCheckout, NSError * _Nullable error) { + [sender setEnabled:YES]; + + if (error) { + self.progressBlock(error.localizedDescription); + } else if (tokenizedPayPalCheckout) { + self.completionBlock(tokenizedPayPalCheckout); + } else { + self.progressBlock(@"Cancelled"); + } + }]; +} + +#pragma mark BTAppSwitchDelegate + +- (void)appSwitcherWillPerformAppSwitch:(__unused id)appSwitcher { + self.progressBlock(@"paymentDriverWillPerformAppSwitch:"); +} + +- (void)appSwitcherWillProcessPaymentInfo:(__unused id)appSwitcher { + self.progressBlock(@"paymentDriverWillProcessPaymentInfo:"); +} + +- (void)appSwitcher:(__unused id)appSwitcher didPerformSwitchToTarget:(BTAppSwitchTarget)target { + switch (target) { + case BTAppSwitchTargetWebBrowser: + self.progressBlock(@"appSwitcher:didPerformSwitchToTarget: browser"); + break; + case BTAppSwitchTargetNativeApp: + self.progressBlock(@"appSwitcher:didPerformSwitchToTarget: app"); + break; + case BTAppSwitchTargetUnknown: + self.progressBlock(@"appSwitcher:didPerformSwitchToTarget: unknown"); + break; + } +} + +- (void)paymentDriver:(__unused id)driver requestsPresentationOfViewController:(UIViewController *)viewController { + [self presentViewController:viewController animated:YES completion:nil]; +} + +- (void)paymentDriver:(__unused id)driver requestsDismissalOfViewController:(UIViewController *)viewController { + self.infoTextView.text = NSLocalizedString(@"DismissalOfViewController Called", nil); + [viewController dismissViewControllerAnimated:YES completion:nil]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Checkout/BraintreeDemoPayPalOneTimePaymentViewController.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Checkout/BraintreeDemoPayPalOneTimePaymentViewController.h new file mode 100644 index 0000000..e3ce31b --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Checkout/BraintreeDemoPayPalOneTimePaymentViewController.h @@ -0,0 +1,5 @@ +#import "BraintreeDemoPaymentButtonBaseViewController.h" + +@interface BraintreeDemoPayPalOneTimePaymentViewController : BraintreeDemoPaymentButtonBaseViewController + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Checkout/BraintreeDemoPayPalOneTimePaymentViewController.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Checkout/BraintreeDemoPayPalOneTimePaymentViewController.m new file mode 100644 index 0000000..d21c2b8 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Checkout/BraintreeDemoPayPalOneTimePaymentViewController.m @@ -0,0 +1,76 @@ +#import "BraintreeDemoPayPalOneTimePaymentViewController.h" + +#import + +@interface BraintreeDemoPayPalOneTimePaymentViewController () + +@end + +@implementation BraintreeDemoPayPalOneTimePaymentViewController + +- (UIView *)createPaymentButton { + UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; + [button setTitle:NSLocalizedString(@"PayPal one-time payment", nil) forState:UIControlStateNormal]; + [button setTitleColor:[UIColor blueColor] forState:UIControlStateNormal]; + [button setTitleColor:[UIColor colorWithRed:50.0/255 green:50.0/255 blue:255.0/255 alpha:1.0] forState:UIControlStateHighlighted]; + [button setTitleColor:[UIColor lightGrayColor] forState:UIControlStateDisabled]; + [button addTarget:self action:@selector(tappedPayPalOneTimePayment:) forControlEvents:UIControlEventTouchUpInside]; + return button; +} + +- (void)tappedPayPalOneTimePayment:(UIButton *)sender { + self.progressBlock(@"Tapped PayPal - initiating one-time payment using BTPayPalDriver"); + + [sender setTitle:NSLocalizedString(@"Processing...", nil) forState:UIControlStateDisabled]; + [sender setEnabled:NO]; + + BTPayPalDriver *driver = [[BTPayPalDriver alloc] initWithAPIClient:self.apiClient]; + driver.appSwitchDelegate = self; + driver.viewControllerPresentingDelegate = self; + BTPayPalRequest *request = [[BTPayPalRequest alloc] initWithAmount:@"4.30"]; + [driver requestOneTimePayment:request completion:^(BTPayPalAccountNonce * _Nullable payPalAccount, NSError * _Nullable error) { + [sender setEnabled:YES]; + + if (error) { + self.progressBlock(error.localizedDescription); + } else if (payPalAccount) { + self.completionBlock(payPalAccount); + } else { + self.progressBlock(@"Cancelled"); + } + }]; +} + +#pragma mark BTAppSwitchDelegate + +- (void)appSwitcherWillPerformAppSwitch:(__unused id)appSwitcher { + self.progressBlock(@"paymentDriverWillPerformAppSwitch:"); +} + +- (void)appSwitcherWillProcessPaymentInfo:(__unused id)appSwitcher { + self.progressBlock(@"paymentDriverWillProcessPaymentInfo:"); +} + +- (void)appSwitcher:(__unused id)appSwitcher didPerformSwitchToTarget:(BTAppSwitchTarget)target { + switch (target) { + case BTAppSwitchTargetWebBrowser: + self.progressBlock(@"appSwitcher:didPerformSwitchToTarget: browser"); + break; + case BTAppSwitchTargetNativeApp: + self.progressBlock(@"appSwitcher:didPerformSwitchToTarget: app"); + break; + case BTAppSwitchTargetUnknown: + self.progressBlock(@"appSwitcher:didPerformSwitchToTarget: unknown"); + break; + } +} + +- (void)paymentDriver:(__unused id)driver requestsPresentationOfViewController:(UIViewController *)viewController { + [self presentViewController:viewController animated:YES completion:nil]; +} + +- (void)paymentDriver:(__unused id)driver requestsDismissalOfViewController:(UIViewController *)viewController { + [viewController dismissViewControllerAnimated:YES completion:nil]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Credit/BraintreeDemoPayPalCreditPaymentViewController.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Credit/BraintreeDemoPayPalCreditPaymentViewController.h new file mode 100644 index 0000000..294b49e --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Credit/BraintreeDemoPayPalCreditPaymentViewController.h @@ -0,0 +1,5 @@ +#import "BraintreeDemoPaymentButtonBaseViewController.h" + +@interface BraintreeDemoPayPalCreditPaymentViewController : BraintreeDemoPaymentButtonBaseViewController + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Credit/BraintreeDemoPayPalCreditPaymentViewController.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Credit/BraintreeDemoPayPalCreditPaymentViewController.m new file mode 100644 index 0000000..834fc99 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Credit/BraintreeDemoPayPalCreditPaymentViewController.m @@ -0,0 +1,116 @@ +#import "BraintreeDemoPayPalCreditPaymentViewController.h" + +#import + +@interface BraintreeDemoPayPalCreditPaymentViewController () +@property (nonatomic, strong) UISegmentedControl *paypalTypeSwitch; +@end + +@implementation BraintreeDemoPayPalCreditPaymentViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + + self.paypalTypeSwitch = [[UISegmentedControl alloc] initWithItems:@[@"Checkout", @"Billing Agreement"]]; + self.paypalTypeSwitch.translatesAutoresizingMaskIntoConstraints = NO; + self.paypalTypeSwitch.selectedSegmentIndex = 0; + [self.view addSubview:self.paypalTypeSwitch]; + NSDictionary *viewBindings = @{ + @"view": self, + @"paypalTypeSwitch":self.paypalTypeSwitch + }; + + [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[paypalTypeSwitch]-(50)-|" options:0 metrics:nil views:viewBindings]]; + + [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[paypalTypeSwitch]-|" options:0 metrics:nil views:viewBindings]]; + +} + +- (UIView *)createPaymentButton { + UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; + [button setTitle:NSLocalizedString(@"PayPal with Credit Offered", nil) forState:UIControlStateNormal]; + [button setTitleColor:[UIColor blueColor] forState:UIControlStateNormal]; + [button setTitleColor:[UIColor colorWithRed:50.0/255 green:50.0/255 blue:255.0/255 alpha:1.0] forState:UIControlStateHighlighted]; + [button setTitleColor:[UIColor lightGrayColor] forState:UIControlStateDisabled]; + [button addTarget:self action:@selector(tappedPayPalOneTimePayment:) forControlEvents:UIControlEventTouchUpInside]; + return button; +} + +- (void)tappedPayPalOneTimePayment:(UIButton *)sender { + + if (self.paypalTypeSwitch.selectedSegmentIndex == 0) { + self.progressBlock(@"Tapped - initiating Checkout payment with credit offered"); + } else { + self.progressBlock(@"Tapped - initiating Billing Agreement payment with credit offered"); + } + + [sender setTitle:NSLocalizedString(@"Processing...", nil) forState:UIControlStateDisabled]; + [sender setEnabled:NO]; + + BTPayPalDriver *driver = [[BTPayPalDriver alloc] initWithAPIClient:self.apiClient]; + driver.appSwitchDelegate = self; + driver.viewControllerPresentingDelegate = self; + BTPayPalRequest *request = [[BTPayPalRequest alloc] initWithAmount:@"4.30"]; + + request.offerCredit = YES; + + if (self.paypalTypeSwitch.selectedSegmentIndex == 0) { + [driver requestOneTimePayment:request completion:^(BTPayPalAccountNonce * _Nullable payPalAccount, NSError * _Nullable error) { + [sender setEnabled:YES]; + + if (error) { + self.progressBlock(error.localizedDescription); + } else if (payPalAccount) { + self.completionBlock(payPalAccount); + } else { + self.progressBlock(@"Cancelled"); + } + }]; + } else { + [driver requestBillingAgreement:request completion:^(BTPayPalAccountNonce * _Nullable payPalAccount, NSError * _Nullable error) { + [sender setEnabled:YES]; + + if (error) { + self.progressBlock(error.localizedDescription); + } else if (payPalAccount) { + self.completionBlock(payPalAccount); + } else { + self.progressBlock(@"Cancelled"); + } + }]; + } +} + +#pragma mark BTAppSwitchDelegate + +- (void)appSwitcherWillPerformAppSwitch:(__unused id)appSwitcher { + self.progressBlock(@"paymentDriverWillPerformAppSwitch:"); +} + +- (void)appSwitcherWillProcessPaymentInfo:(__unused id)appSwitcher { + self.progressBlock(@"paymentDriverWillProcessPaymentInfo:"); +} + +- (void)appSwitcher:(__unused id)appSwitcher didPerformSwitchToTarget:(BTAppSwitchTarget)target { + switch (target) { + case BTAppSwitchTargetWebBrowser: + self.progressBlock(@"appSwitcher:didPerformSwitchToTarget: browser"); + break; + case BTAppSwitchTargetNativeApp: + self.progressBlock(@"appSwitcher:didPerformSwitchToTarget: app"); + break; + case BTAppSwitchTargetUnknown: + self.progressBlock(@"appSwitcher:didPerformSwitchToTarget: unknown"); + break; + } +} + +- (void)paymentDriver:(__unused id)driver requestsPresentationOfViewController:(UIViewController *)viewController { + [self presentViewController:viewController animated:YES completion:nil]; +} + +- (void)paymentDriver:(__unused id)driver requestsDismissalOfViewController:(UIViewController *)viewController { + [viewController dismissViewControllerAnimated:YES completion:nil]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Custom Button/BraintreeDemoCustomPayPalButtonViewController.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Custom Button/BraintreeDemoCustomPayPalButtonViewController.h new file mode 100644 index 0000000..8ef68dc --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Custom Button/BraintreeDemoCustomPayPalButtonViewController.h @@ -0,0 +1,7 @@ +#import + +#import "BraintreeDemoPaymentButtonBaseViewController.h" + +@interface BraintreeDemoCustomPayPalButtonViewController : BraintreeDemoPaymentButtonBaseViewController + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Custom Button/BraintreeDemoCustomPayPalButtonViewController.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Custom Button/BraintreeDemoCustomPayPalButtonViewController.m new file mode 100644 index 0000000..4d26b19 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Custom Button/BraintreeDemoCustomPayPalButtonViewController.m @@ -0,0 +1,62 @@ +#import "BraintreeDemoCustomPayPalButtonViewController.h" +#import +#import + +@interface BraintreeDemoCustomPayPalButtonViewController () +@end + +@implementation BraintreeDemoCustomPayPalButtonViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + self.title = NSLocalizedString(@"PayPal (custom button)", nil); + + self.paymentButton.hidden = YES; + [self.apiClient fetchOrReturnRemoteConfiguration:^(BTConfiguration * _Nullable configuration, NSError * _Nullable error) { + if (error) { + self.progressBlock(error.localizedDescription); + return; + } + + if (!configuration.isPayPalEnabled) { + self.progressBlock(@"canCreatePaymentMethodWithProviderType: returns NO, hiding custom PayPal button"); + } else { + self.paymentButton.hidden = NO; + } + }]; +} + +- (UIView *)createPaymentButton { + UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; + [button setTitle:NSLocalizedString(@"PayPal (custom button)", nil) forState:UIControlStateNormal]; + [button setTitleColor:[UIColor blueColor] forState:UIControlStateNormal]; + [button setTitleColor:[[UIColor blueColor] bt_adjustedBrightness:0.5] forState:UIControlStateHighlighted]; + [button addTarget:self action:@selector(tappedCustomPayPal) forControlEvents:UIControlEventTouchUpInside]; + return button; +} + +- (void)tappedCustomPayPal { + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:self.apiClient]; + payPalDriver.viewControllerPresentingDelegate = self; + [payPalDriver authorizeAccountWithCompletion:^(BTPayPalAccountNonce * _Nullable tokenizedPayPalAccount, NSError * _Nullable error) { + if (tokenizedPayPalAccount) { + self.progressBlock(@"Got a nonce 💎!"); + NSLog(@"%@", [tokenizedPayPalAccount debugDescription]); + self.completionBlock(tokenizedPayPalAccount); + } else if (error) { + self.progressBlock(error.localizedDescription); + } else { + self.progressBlock(@"Canceled 🔰"); + } + }]; +} + +- (void)paymentDriver:(__unused id)driver requestsPresentationOfViewController:(UIViewController *)viewController { + [self presentViewController:viewController animated:YES completion:nil]; +} + +- (void)paymentDriver:(__unused id)driver requestsDismissalOfViewController:(UIViewController *)viewController { + [viewController dismissViewControllerAnimated:YES completion:nil]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Force Future Payment/BraintreeDemoPayPalForceFuturePaymentViewController.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Force Future Payment/BraintreeDemoPayPalForceFuturePaymentViewController.h new file mode 100644 index 0000000..52e6555 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Force Future Payment/BraintreeDemoPayPalForceFuturePaymentViewController.h @@ -0,0 +1,7 @@ +#import + +#import "BraintreeDemoPaymentButtonBaseViewController.h" + +@interface BraintreeDemoPayPalForceFuturePaymentViewController : BraintreeDemoPaymentButtonBaseViewController + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Force Future Payment/BraintreeDemoPayPalForceFuturePaymentViewController.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Force Future Payment/BraintreeDemoPayPalForceFuturePaymentViewController.m new file mode 100644 index 0000000..0575071 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Force Future Payment/BraintreeDemoPayPalForceFuturePaymentViewController.m @@ -0,0 +1,63 @@ +#import "BraintreeDemoPayPalForceFuturePaymentViewController.h" +#import +#import +#import + +@interface BraintreeDemoPayPalForceFuturePaymentViewController () +@end + +@implementation BraintreeDemoPayPalForceFuturePaymentViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + self.title = NSLocalizedString(@"PayPal (future payment button)", nil); + + self.paymentButton.hidden = YES; + [self.apiClient fetchOrReturnRemoteConfiguration:^(BTConfiguration * _Nullable configuration, NSError * _Nullable error) { + if (error) { + self.progressBlock(error.localizedDescription); + return; + } + + if (!configuration.isPayPalEnabled) { + self.progressBlock(@"canCreatePaymentMethodWithProviderType: returns NO, hiding custom PayPal button"); + } else { + self.paymentButton.hidden = NO; + } + }]; +} + +- (UIView *)createPaymentButton { + UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; + [button setTitle:NSLocalizedString(@"PayPal (future payment button)", nil) forState:UIControlStateNormal]; + [button setTitleColor:[UIColor blueColor] forState:UIControlStateNormal]; + [button setTitleColor:[[UIColor blueColor] bt_adjustedBrightness:0.5] forState:UIControlStateHighlighted]; + [button addTarget:self action:@selector(tappedCustomPayPal) forControlEvents:UIControlEventTouchUpInside]; + return button; +} + +- (void)tappedCustomPayPal { + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:self.apiClient]; + payPalDriver.viewControllerPresentingDelegate = self; + [payPalDriver authorizeAccountWithAdditionalScopes:[NSSet set] forceFuturePaymentFlow:true completion:^(BTPayPalAccountNonce * _Nullable tokenizedPayPalAccount, NSError * _Nullable error) { + if (tokenizedPayPalAccount) { + self.progressBlock(@"Got a nonce 💎!"); + NSLog(@"%@", [tokenizedPayPalAccount debugDescription]); + self.completionBlock(tokenizedPayPalAccount); + } else if (error) { + self.progressBlock(error.localizedDescription); + } else { + self.progressBlock(@"Canceled 🔰"); + } + }]; +} + +- (void)paymentDriver:(__unused id)driver requestsPresentationOfViewController:(UIViewController *)viewController { + [self presentViewController:viewController animated:YES completion:nil]; +} + +- (void)paymentDriver:(__unused id)driver requestsDismissalOfViewController:(UIViewController *)viewController { + [viewController dismissViewControllerAnimated:YES completion:nil]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Scopes/BraintreeDemoPayPalScopesViewController.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Scopes/BraintreeDemoPayPalScopesViewController.h new file mode 100644 index 0000000..b516695 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Scopes/BraintreeDemoPayPalScopesViewController.h @@ -0,0 +1,6 @@ +@import Foundation; + +#import "BraintreeDemoPaymentButtonBaseViewController.h" + +@interface BraintreeDemoPayPalScopesViewController : BraintreeDemoPaymentButtonBaseViewController +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Scopes/BraintreeDemoPayPalScopesViewController.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Scopes/BraintreeDemoPayPalScopesViewController.m new file mode 100644 index 0000000..3cd94f7 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/PayPal - Scopes/BraintreeDemoPayPalScopesViewController.m @@ -0,0 +1,70 @@ +#import "BraintreeDemoPayPalScopesViewController.h" + +#import +#import + +@interface BraintreeDemoPayPalScopesViewController () +@property(nonatomic, strong) UITextView *addressTextView; +@end + +@implementation BraintreeDemoPayPalScopesViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + + self.addressTextView = [[UITextView alloc] initWithFrame:CGRectMake((self.view.bounds.size.width / 2) - 100, (self.view.bounds.size.width / 8) * 7, 200, 100)]; + [self.view addSubview:self.addressTextView]; + self.addressTextView.backgroundColor = [UIColor clearColor]; + + self.paymentButton.hidden = YES; + [self.apiClient fetchOrReturnRemoteConfiguration:^(BTConfiguration * _Nullable configuration, NSError * _Nullable error) { + if (error) { + self.progressBlock(error.localizedDescription); + return; + } + + if (!configuration.isPayPalEnabled) { + self.progressBlock(@"canCreatePaymentMethodWithProviderType: returns NO, hiding custom PayPal button"); + } else { + self.paymentButton.hidden = NO; + } + }]; +} + +- (UIView *)createPaymentButton { + UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; + [button setTitle:NSLocalizedString(@"PayPal (Address Scope)", nil) forState:UIControlStateNormal]; + [button setTitleColor:[UIColor blueColor] forState:UIControlStateNormal]; + [button setTitleColor:[[UIColor blueColor] bt_adjustedBrightness:0.5] forState:UIControlStateHighlighted]; + [button addTarget:self action:@selector(tappedCustomPayPal) forControlEvents:UIControlEventTouchUpInside]; + return button; +} + +- (void)tappedCustomPayPal { + BTPayPalDriver *driver = [[BTPayPalDriver alloc] initWithAPIClient:self.apiClient]; + driver.viewControllerPresentingDelegate = self; + self.progressBlock(@"Tapped PayPal - initiating authorization using BTPayPalDriver"); + + [driver authorizeAccountWithAdditionalScopes:[NSSet setWithArray:@[@"address"]] completion:^(BTPayPalAccountNonce *tokenizedPayPalAccount, NSError *error) { + if (error) { + self.progressBlock(error.localizedDescription); + } else if (tokenizedPayPalAccount) { + self.completionBlock(tokenizedPayPalAccount); + + BTPostalAddress *address = tokenizedPayPalAccount.shippingAddress; + self.addressTextView.text = [NSString stringWithFormat:@"Address:\n%@\n%@\n%@ %@\n%@ %@", address.streetAddress, address.extendedAddress, address.locality, address.region, address.postalCode, address.countryCodeAlpha2]; + } else { + self.progressBlock(@"Cancelled"); + } + }]; +} + +- (void)paymentDriver:(__unused id)driver requestsPresentationOfViewController:(UIViewController *)viewController { + [self presentViewController:viewController animated:YES completion:nil]; +} + +- (void)paymentDriver:(__unused id)driver requestsDismissalOfViewController:(UIViewController *)viewController { + [viewController dismissViewControllerAnimated:YES completion:nil]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/BraintreeDemoCardHintViewController.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/BraintreeDemoCardHintViewController.h new file mode 100644 index 0000000..b735402 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/BraintreeDemoCardHintViewController.h @@ -0,0 +1,5 @@ +#import + +@interface BraintreeDemoCardHintViewController : UIViewController + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/BraintreeDemoCardHintViewController.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/BraintreeDemoCardHintViewController.m new file mode 100644 index 0000000..4923b47 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/BraintreeDemoCardHintViewController.m @@ -0,0 +1,40 @@ +#import "BraintreeDemoCardHintViewController.h" + +#import "BTUICardHint.h" + +@interface BraintreeDemoCardHintViewController () +@property (weak, nonatomic) IBOutlet BTUICardHint *cardHintView; +@property (weak, nonatomic) IBOutlet BTUICardHint *smallCardHintView; +@end + +@implementation BraintreeDemoCardHintViewController + +- (IBAction)selectedCardType:(UISegmentedControl *)sender { + BTUIPaymentOptionType type = BTUIPaymentOptionTypeUnknown; + switch(sender.selectedSegmentIndex) { + case 0: + type = BTUIPaymentOptionTypeUnknown; + break; + case 1: + type = BTUIPaymentOptionTypeVisa; + break; + case 2: + type = BTUIPaymentOptionTypeMasterCard; + break; + case 3: + type = BTUIPaymentOptionTypeAMEX; + break; + case 4: + type = BTUIPaymentOptionTypeDiscover; + break; + } + [self.cardHintView setCardType:type animated:YES]; + [self.smallCardHintView setCardType:type animated:YES]; +} + +- (IBAction)selectedHintMode:(UISegmentedControl *)sender { + [self.cardHintView setDisplayMode:(sender.selectedSegmentIndex == 0 ? BTCardHintDisplayModeCardType : BTCardHintDisplayModeCVVHint) animated:YES]; + [self.smallCardHintView setDisplayMode:(sender.selectedSegmentIndex == 0 ? BTCardHintDisplayModeCardType : BTCardHintDisplayModeCVVHint) animated:YES]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/BraintreeDemoCreditCardEntryViewController.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/BraintreeDemoCreditCardEntryViewController.h new file mode 100644 index 0000000..85b3869 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/BraintreeDemoCreditCardEntryViewController.h @@ -0,0 +1,7 @@ +#import +#import + +@interface BraintreeDemoCreditCardEntryViewController : UIViewController +@property (weak, nonatomic) IBOutlet BTUICardFormView *cardFormView; + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/BraintreeDemoCreditCardEntryViewController.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/BraintreeDemoCreditCardEntryViewController.m new file mode 100644 index 0000000..e7f107a --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/BraintreeDemoCreditCardEntryViewController.m @@ -0,0 +1,94 @@ +#import "BraintreeDemoCreditCardEntryViewController.h" +#import + +@interface BraintreeDemoCreditCardEntryViewController () +@property (weak, nonatomic) IBOutlet UITextView *successOutputTextView; + +@end + +@implementation BraintreeDemoCreditCardEntryViewController + +- (void)cardFormViewDidChange:(BTUICardFormView *)cardFormView { + if (cardFormView.valid) { + self.successOutputTextView.text = [NSString stringWithFormat: + @"😍 YOU DID IT \n" + "Number: %@\n" + "Expiration: %@/%@\n" + "CVV: %@\n" + "Postal: %@", + cardFormView.number, + cardFormView.expirationMonth, + cardFormView.expirationYear, + cardFormView.cvv, + cardFormView.postalCode]; + } else { + self.successOutputTextView.text = @"INVALID 🐴"; + } +} +- (IBAction)toggleCVV:(__unused id)sender { + self.cardFormView.optionalFields = self.cardFormView.optionalFields ^ BTUICardFormOptionalFieldsCvv; +} +- (IBAction)togglePostalCode:(__unused id)sender { + self.cardFormView.optionalFields = self.cardFormView.optionalFields ^ BTUICardFormOptionalFieldsPostalCode; +} +- (IBAction)toggleVibrate:(UISwitch *)sender { + self.cardFormView.vibrate = sender.on; +} + +#pragma mark card.io + +- (IBAction)cardIoPressed:(__unused id)sender { + if (![CardIOUtilities canReadCardWithCamera]) { + // Hide your "Scan Card" button, or take other appropriate action... + NSLog(@"can NOT read card with camera"); + + [self addCardFormWithInfo:nil]; + } else { + CardIOPaymentViewController *v = [[CardIOPaymentViewController alloc] initWithPaymentDelegate:self]; + + [self presentViewController:v + animated:YES + completion:nil]; + } +} + +- (void)userDidProvideCreditCardInfo:(CardIOCreditCardInfo *)cardInfo inPaymentViewController:(CardIOPaymentViewController *)paymentViewController { + // The full card number is available as info.cardNumber, but don't log that! + NSLog(@"Received card info. Number: %@, expiry: %02lu/%lu, cvv: %@.", cardInfo.redactedCardNumber, (unsigned long)cardInfo.expiryMonth, (unsigned long)cardInfo.expiryYear, cardInfo.cvv); + // Use the card info... + + [paymentViewController dismissViewControllerAnimated:YES completion:^{ + [self addCardFormWithInfo:cardInfo]; + }]; +} + +- (void)userDidCancelPaymentViewController:(CardIOPaymentViewController *)paymentViewController { + [paymentViewController dismissViewControllerAnimated:YES + completion:nil]; +} + +- (void)addCardFormWithInfo:(CardIOCreditCardInfo *)info { + BTUICardFormView *cardForm = self.cardFormView; + + if (info) { + cardForm.number = info.cardNumber; + + NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; + dateComponents.month = info.expiryMonth; + dateComponents.year = info.expiryYear; + dateComponents.calendar = [NSCalendar calendarWithIdentifier:NSGregorianCalendar]; + + [cardForm setExpirationDate:dateComponents.date]; + [cardForm setCvv:info.cvv]; + [cardForm setPostalCode:info.postalCode]; + } else { + cardForm.number = @"4111111111111111"; + [cardForm setExpirationDate:[NSDate date]]; + [cardForm setCvv:@"123"]; + [cardForm setPostalCode:@"60606"]; + } + + [self.view addSubview:cardForm]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/BraintreeDemoCreditCardEntryViewController.xib b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/BraintreeDemoCreditCardEntryViewController.xib new file mode 100644 index 0000000..f4fbebd --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/BraintreeDemoCreditCardEntryViewController.xib @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/BraintreeDemoPaymentsUIComponentsViewController.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/BraintreeDemoPaymentsUIComponentsViewController.h new file mode 100644 index 0000000..71efe8d --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/BraintreeDemoPaymentsUIComponentsViewController.h @@ -0,0 +1,4 @@ +#import + +@interface BraintreeDemoPaymentsUIComponentsViewController : UIViewController +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/BraintreeDemoPaymentsUIComponentsViewController.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/BraintreeDemoPaymentsUIComponentsViewController.m new file mode 100644 index 0000000..fc0d120 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/BraintreeDemoPaymentsUIComponentsViewController.m @@ -0,0 +1,35 @@ +#import "BraintreeDemoBraintreeUIKitComponentsViewController.h" +#import "BTUIPaymentMethodView.h" +#import "BTUICTAControl.h" + +@interface BraintreeDemoPaymentsUIComponentsViewController () +@property (nonatomic, weak) IBOutlet BTUIPaymentMethodView *cardPaymentMethodView; +@property (nonatomic, weak) IBOutlet UISwitch *processingSwitch; +@property (nonatomic, weak) IBOutlet BTUICTAControl *ctaControl; +@end + +@implementation BraintreeDemoPaymentsUIComponentsViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + [self.processingSwitch setOn:self.cardPaymentMethodView.isProcessing]; +} + +- (IBAction)tappedCTAControl:(__unused id)sender { + NSLog(@"Tapped CTA"); +} + +- (IBAction)tappedSwapCardType { + [self.cardPaymentMethodView setType:((self.cardPaymentMethodView.type+1) % (BTUIPaymentOptionTypePayPal+1))]; +} + +- (IBAction)toggledProcessingState:(UISwitch *)sender { + self.cardPaymentMethodView.processing = sender.on; +} +- (IBAction)toggledCTAEnabled:(UISwitch *)sender { + self.ctaControl.enabled = sender.on; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/BraintreeDemoUIWidgetsViewController.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/BraintreeDemoUIWidgetsViewController.h new file mode 100644 index 0000000..ee632a2 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/BraintreeDemoUIWidgetsViewController.h @@ -0,0 +1,7 @@ +#import + +#import "BraintreeDemoBaseViewController.h" + +@interface BraintreeDemoUIWidgetsViewController : BraintreeDemoBaseViewController + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/BraintreeDemoUIWidgetsViewController.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/BraintreeDemoUIWidgetsViewController.m new file mode 100644 index 0000000..8ddf64e --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/BraintreeDemoUIWidgetsViewController.m @@ -0,0 +1,32 @@ +#import "BraintreeDemoUIWidgetsViewController.h" + + +@interface BraintreeDemoUIWidgetsViewController () +@end + +@implementation BraintreeDemoUIWidgetsViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + self.title = @"UI Components"; + + UIStoryboard *uiStoryboard = [UIStoryboard storyboardWithName:@"UI" bundle:nil]; + + UIViewController *v = [uiStoryboard instantiateInitialViewController]; + + [self addChildViewController:v]; + [self.view addSubview:v.view]; + [v didMoveToParentViewController:self]; +} + +- (void)viewWillAppear:(BOOL)animated { + [super viewWillAppear:animated]; + [self.navigationController setToolbarHidden:YES animated:animated]; +} + +- (void)viewWillDisappear:(BOOL)animated { + [super viewWillDisappear:animated]; + [self.navigationController setToolbarHidden:NO animated:animated]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/UI.storyboard b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/UI.storyboard new file mode 100644 index 0000000..6605cf1 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UI Components/UI.storyboard @@ -0,0 +1,344 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UnionPay/BraintreeDemoUnionPayViewController.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UnionPay/BraintreeDemoUnionPayViewController.h new file mode 100644 index 0000000..6400d0b --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UnionPay/BraintreeDemoUnionPayViewController.h @@ -0,0 +1,5 @@ +#import "BraintreeDemoBaseViewController.h" + +@interface BraintreeDemoUnionPayViewController : BraintreeDemoBaseViewController + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UnionPay/BraintreeDemoUnionPayViewController.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UnionPay/BraintreeDemoUnionPayViewController.m new file mode 100644 index 0000000..d3783d3 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/UnionPay/BraintreeDemoUnionPayViewController.m @@ -0,0 +1,221 @@ +#import "BraintreeDemoUnionPayViewController.h" +#import +#import "BTUICardFormView.h" + +@interface BraintreeDemoUnionPayViewController () + +@property (nonatomic, strong) IBOutlet UITextField *cardNumberField; +@property (nonatomic, strong) IBOutlet UITextField *expirationMonthField; +@property (nonatomic, strong) IBOutlet UITextField *expirationYearField; +@property (nonatomic, strong) BTUICardFormView *cardForm; +@property (nonatomic, strong) UIButton *submitButton; +@property (nonatomic, strong) UIButton *smsButton; +@property (nonatomic, strong) BTAPIClient *apiClient; +@property (nonatomic, strong) BTCardClient *cardClient; +@property (nonatomic, copy) NSString *lastCardNumber; + +@end + +@implementation BraintreeDemoUnionPayViewController + + +- (instancetype)initWithAuthorization:(NSString *)authorization { + if (self = [super initWithAuthorization:authorization]) { + _apiClient = [[BTAPIClient alloc] initWithAuthorization:authorization]; + _cardClient = [[BTCardClient alloc] initWithAPIClient:_apiClient]; + } + return self; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + self.title = NSLocalizedString(@"UnionPay", nil); + self.edgesForExtendedLayout = UIRectEdgeBottom; + + self.cardForm = [[BTUICardFormView alloc] init]; + self.cardForm.optionalFields = BTUICardFormOptionalFieldsCvv; + self.cardForm.translatesAutoresizingMaskIntoConstraints = NO; + self.cardForm.delegate = self; + [self.view addSubview:self.cardForm]; + + self.submitButton = [UIButton buttonWithType:UIButtonTypeSystem]; + self.submitButton.translatesAutoresizingMaskIntoConstraints = NO; + [self.submitButton setTitle:NSLocalizedString(@"Submit", nil) forState:UIControlStateNormal]; + [self.submitButton addTarget:self action:@selector(submit:) forControlEvents:UIControlEventTouchUpInside]; + [self.view addSubview:self.submitButton]; + + self.smsButton = [UIButton buttonWithType:UIButtonTypeSystem]; + self.smsButton.translatesAutoresizingMaskIntoConstraints = NO; + self.smsButton.hidden = YES; + [self.smsButton setTitle:NSLocalizedString(@"Send SMS", nil) forState:UIControlStateNormal]; + [self.smsButton addTarget:self action:@selector(enroll:) forControlEvents:UIControlEventTouchUpInside]; + [self.view addSubview:self.smsButton]; + + [self.view addConstraints:[NSLayoutConstraint + constraintsWithVisualFormat:@"H:|[cardForm]|" + options:NSLayoutFormatDirectionLeadingToTrailing + metrics:nil + views:@{@"cardForm" : self.cardForm}]]; + [self.view addConstraint:[NSLayoutConstraint + constraintWithItem:self.submitButton + attribute:NSLayoutAttributeCenterX + relatedBy:NSLayoutRelationEqual + toItem:self.view + attribute:NSLayoutAttributeCenterX + multiplier:1 + constant:0]]; + [self.view addConstraint:[NSLayoutConstraint + constraintWithItem:self.smsButton + attribute:NSLayoutAttributeCenterX + relatedBy:NSLayoutRelationEqual + toItem:self.view + attribute:NSLayoutAttributeCenterX + multiplier:1 + constant:0]]; + [self.view addConstraint:[NSLayoutConstraint + constraintWithItem:self.cardForm + attribute:NSLayoutAttributeTop + relatedBy:NSLayoutRelationEqual + toItem:self.view + attribute:NSLayoutAttributeTop + multiplier:1 + constant:0]]; + [self.view addConstraint:[NSLayoutConstraint + constraintWithItem:self.cardForm + attribute:NSLayoutAttributeBottom + relatedBy:NSLayoutRelationEqual + toItem:self.smsButton + attribute:NSLayoutAttributeTop + multiplier:1 + constant:0]]; + [self.view addConstraint:[NSLayoutConstraint + constraintWithItem:self.smsButton + attribute:NSLayoutAttributeBottom + relatedBy:NSLayoutRelationEqual + toItem:self.submitButton + attribute:NSLayoutAttributeTop + multiplier:1 + constant:0]]; + [self.view addConstraint:[NSLayoutConstraint + constraintWithItem:self.submitButton + attribute:NSLayoutAttributeBottom + relatedBy:NSLayoutRelationEqual + toItem:self.view + attribute:NSLayoutAttributeBottom + multiplier:1 + constant:0]]; +} + +#pragma mark - Actions + +- (void)enroll:(__unused UIButton *)button { + self.progressBlock(@"Enrolling card"); + + BTCard *card = [[BTCard alloc] initWithNumber:self.cardForm.number expirationMonth:self.cardForm.expirationMonth expirationYear:self.cardForm.expirationYear cvv:self.cardForm.cvv]; +// card.shouldValidate = YES; + BTCardRequest *request = [[BTCardRequest alloc] initWithCard:card]; + request.mobileCountryCode = @"62"; + request.mobilePhoneNumber = self.cardForm.phoneNumber; + + [self.cardClient enrollCard:request completion:^(NSString * _Nullable enrollmentID, BOOL smsCodeRequired, NSError * _Nullable error) { + if (error) { + NSMutableString *errorMessage = [NSMutableString stringWithFormat:@"Error enrolling card: %@", error.localizedDescription]; + if (error.localizedFailureReason) { + [errorMessage appendString:[NSString stringWithFormat:@". %@", error.localizedFailureReason]]; + } + self.progressBlock(errorMessage); + return; + } + + request.enrollmentID = enrollmentID; + + if (smsCodeRequired) { + UIAlertController *alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"SMS Auth Code", nil) message:NSLocalizedString(@"SMSAuthCodeMessage", nil) preferredStyle:UIAlertControllerStyleAlert]; + [alertController addTextFieldWithConfigurationHandler:nil]; + [alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"Submit", nil) style:UIAlertActionStyleDefault handler:^(__unused UIAlertAction * _Nonnull action) { + UITextField *codeTextField = [alertController.textFields firstObject]; + NSString *authCode = codeTextField.text; + request.smsCode = authCode; + + self.progressBlock(@"Tokenizing card"); + + [self.cardClient tokenizeCard:request options:nil completion:^(BTCardNonce * _Nullable tokenizedCard, NSError * _Nullable error) { + if (error) { + self.progressBlock([NSString stringWithFormat:@"Error tokenizing card: %@", error.localizedDescription]); + return; + } + + self.completionBlock(tokenizedCard); + }]; + }]]; + + [self presentViewController:alertController animated:YES completion:nil]; + } else { + [self.cardClient tokenizeCard:request options:nil completion:^(BTCardNonce * _Nullable tokenizedCard, NSError * _Nullable error) { + if (error) { + NSMutableString *errorMessage = [NSMutableString stringWithFormat:@"Error tokenizing card: %@", error.localizedDescription]; + if (error.localizedFailureReason) { + [errorMessage appendString:[NSString stringWithFormat:@". %@", error.localizedFailureReason]]; + } + self.progressBlock(errorMessage); + return; + } + + self.completionBlock(tokenizedCard); + }]; + } + }]; +} + +- (void)submit:(__unused UIButton *)button { + self.progressBlock(@"Tokenizing card"); + + BTCard *card = [[BTCard alloc] initWithNumber:self.cardForm.number expirationMonth:self.cardForm.expirationMonth expirationYear:self.cardForm.expirationYear cvv:self.cardForm.cvv]; + [self.cardClient tokenizeCard:card completion:^(BTCardNonce * _Nullable tokenizedCard, NSError * _Nullable error) { + if (error) { + self.progressBlock([NSString stringWithFormat:@"Error tokenizing card: %@", error.localizedDescription]); + return; + } + + self.completionBlock(tokenizedCard); + }]; +} + +#pragma mark - Private methods + +- (void)fetchCapabilities:(NSString *)cardNumber { + [self.cardClient fetchCapabilities:cardNumber completion:^(BTCardCapabilities * _Nullable cardCapabilities, NSError * _Nullable error) { + if (error) { + self.progressBlock([NSString stringWithFormat:@"Error fetching capabilities: %@", error.localizedDescription]); + return; + } + + if (cardCapabilities.isSupported) { + self.cardForm.optionalFields = self.cardForm.optionalFields | BTUICardFormOptionalFieldsPhoneNumber; + self.smsButton.hidden = NO; + self.submitButton.hidden = NO; + } else { + self.progressBlock([NSString stringWithFormat:@"This UnionPay card cannot be processed, please try another card."]); + self.submitButton.hidden = YES; + } + + if (cardCapabilities.isDebit) { + NSLog(@"Debit card"); + } else { + NSLog(@"Credit card"); + } + }]; +} + +#pragma mark - BTUICardFormViewDelegate methods + +- (void)cardFormViewDidEndEditing:(BTUICardFormView *)cardFormView { + if (cardFormView.number && + ![cardFormView.number isEqualToString:self.lastCardNumber]) { + [self fetchCapabilities:cardFormView.number]; + self.lastCardNumber = cardFormView.number; + } +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Venmo - BTUIVenmoButton/BraintreeDemoBTUIVenmoButtonViewController.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Venmo - BTUIVenmoButton/BraintreeDemoBTUIVenmoButtonViewController.h new file mode 100644 index 0000000..66c34c1 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Venmo - BTUIVenmoButton/BraintreeDemoBTUIVenmoButtonViewController.h @@ -0,0 +1,6 @@ +#import + +#import "BraintreeDemoPaymentButtonBaseViewController.h" + +@interface BraintreeDemoBTUIVenmoButtonViewController : BraintreeDemoPaymentButtonBaseViewController +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Venmo - BTUIVenmoButton/BraintreeDemoBTUIVenmoButtonViewController.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Venmo - BTUIVenmoButton/BraintreeDemoBTUIVenmoButtonViewController.m new file mode 100644 index 0000000..ab68d78 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Venmo - BTUIVenmoButton/BraintreeDemoBTUIVenmoButtonViewController.m @@ -0,0 +1,52 @@ +#import "BraintreeDemoBTUIVenmoButtonViewController.h" +#import +#import + +@interface BraintreeDemoBTUIVenmoButtonViewController () +@property (nonatomic, strong) BTUIVenmoButton *venmoButton; +@end + +@implementation BraintreeDemoBTUIVenmoButtonViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + self.title = NSLocalizedString(@"BTUIVenmoButton", nil); + self.venmoButton.hidden = YES; + [self.apiClient fetchOrReturnRemoteConfiguration:^(BTConfiguration * _Nullable __unused configuration, NSError * _Nullable error) { + dispatch_async(dispatch_get_main_queue(), ^{ + if (error) { + self.progressBlock(error.localizedDescription); + NSLog(@"Failed to fetch configuration: %@", error); + return; + } + }); + }]; +} + +- (UIView *)createPaymentButton { + if (!self.venmoButton) { + self.venmoButton = [[BTUIVenmoButton alloc] init]; + [self.venmoButton addTarget:self action:@selector(tappedPayPalButton) forControlEvents:UIControlEventTouchUpInside]; + } + return self.venmoButton; +} + +- (void)tappedPayPalButton { + self.progressBlock(@"Tapped Venmo - initiating Venmo auth"); + + BTVenmoDriver *driver = [[BTVenmoDriver alloc] initWithAPIClient:self.apiClient]; + + [driver authorizeAccountAndVault:YES completion:^(BTVenmoAccountNonce * _Nullable venmoAccount, NSError * _Nullable error) { + if (venmoAccount) { + self.progressBlock(@"Got a nonce 💎!"); + NSLog(@"%@", [venmoAccount debugDescription]); + self.completionBlock(venmoAccount); + } else if (error) { + self.progressBlock(error.localizedDescription); + } else { + self.progressBlock(@"Canceled 🔰"); + } + }]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Venmo - Custom Button/BraintreeDemoCustomVenmoButtonViewController.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Venmo - Custom Button/BraintreeDemoCustomVenmoButtonViewController.h new file mode 100644 index 0000000..f17bc9e --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Venmo - Custom Button/BraintreeDemoCustomVenmoButtonViewController.h @@ -0,0 +1,7 @@ +#import + +#import "BraintreeDemoPaymentButtonBaseViewController.h" + +@interface BraintreeDemoCustomVenmoButtonViewController : BraintreeDemoPaymentButtonBaseViewController + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Venmo - Custom Button/BraintreeDemoCustomVenmoButtonViewController.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Venmo - Custom Button/BraintreeDemoCustomVenmoButtonViewController.m new file mode 100644 index 0000000..a329915 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Features/Venmo - Custom Button/BraintreeDemoCustomVenmoButtonViewController.m @@ -0,0 +1,43 @@ +#import "BraintreeDemoCustomVenmoButtonViewController.h" +#import +#import + + +@interface BraintreeDemoCustomVenmoButtonViewController () +@property (nonatomic, strong) BTVenmoDriver *venmoDriver; +@end + +@implementation BraintreeDemoCustomVenmoButtonViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + self.venmoDriver = [[BTVenmoDriver alloc] initWithAPIClient:self.apiClient]; + self.title = NSLocalizedString(@"Custom Venmo Button", nil); + self.paymentButton.hidden = ![self.venmoDriver isiOSAppAvailableForAppSwitch]; +} + +- (UIView *)createPaymentButton { + UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; + [button setTitle:NSLocalizedString(@"Venmo (custom button)", nil) forState:UIControlStateNormal]; + [button setTitleColor:[UIColor bt_colorFromHex:@"3D95CE" alpha:1.0f] forState:UIControlStateNormal]; + [button setTitleColor:[[UIColor bt_colorFromHex:@"3D95CE" alpha:1.0f] bt_adjustedBrightness:0.7] forState:UIControlStateHighlighted]; + [button addTarget:self action:@selector(tappedCustomVenmo) forControlEvents:UIControlEventTouchUpInside]; + return button; +} + +- (void)tappedCustomVenmo { + self.progressBlock(@"Tapped Venmo - initiating Venmo auth"); + [self.venmoDriver authorizeAccountAndVault:NO completion:^(BTVenmoAccountNonce * _Nullable venmoAccount, NSError * _Nullable error) { + if (venmoAccount) { + self.progressBlock(@"Got a nonce 💎!"); + NSLog(@"%@", [venmoAccount debugDescription]); + self.completionBlock(venmoAccount); + } else if (error) { + self.progressBlock(error.localizedDescription); + } else { + self.progressBlock(@"Canceled 🔰"); + } + }]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/AppIcon.appiconset/120 - iPhone App Icon-ipad-spotlight@1x.png b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/AppIcon.appiconset/120 - iPhone App Icon-ipad-spotlight@1x.png new file mode 100644 index 0000000..3d059cb Binary files /dev/null and b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/AppIcon.appiconset/120 - iPhone App Icon-ipad-spotlight@1x.png differ diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/AppIcon.appiconset/120 - iPhone App Icon-ipad-spotlight@2x.png b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/AppIcon.appiconset/120 - iPhone App Icon-ipad-spotlight@2x.png new file mode 100644 index 0000000..f3bfe7c Binary files /dev/null and b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/AppIcon.appiconset/120 - iPhone App Icon-ipad-spotlight@2x.png differ diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/AppIcon.appiconset/120 - iPhone App Icon-ipad@1x.png b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/AppIcon.appiconset/120 - iPhone App Icon-ipad@1x.png new file mode 100644 index 0000000..c47b775 Binary files /dev/null and b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/AppIcon.appiconset/120 - iPhone App Icon-ipad@1x.png differ diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/AppIcon.appiconset/120 - iPhone App Icon-ipad@2x.png b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/AppIcon.appiconset/120 - iPhone App Icon-ipad@2x.png new file mode 100644 index 0000000..a8c050c Binary files /dev/null and b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/AppIcon.appiconset/120 - iPhone App Icon-ipad@2x.png differ diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/AppIcon.appiconset/120 - iPhone App Icon-spotlight.png b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/AppIcon.appiconset/120 - iPhone App Icon-spotlight.png new file mode 100644 index 0000000..f3bfe7c Binary files /dev/null and b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/AppIcon.appiconset/120 - iPhone App Icon-spotlight.png differ diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/AppIcon.appiconset/120 - iPhone App Icon@2x.png b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/AppIcon.appiconset/120 - iPhone App Icon@2x.png new file mode 100644 index 0000000..728c48c Binary files /dev/null and b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/AppIcon.appiconset/120 - iPhone App Icon@2x.png differ diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/AppIcon.appiconset/120 - iPhone Pro App Icon-ipad@2x.png b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/AppIcon.appiconset/120 - iPhone Pro App Icon-ipad@2x.png new file mode 100644 index 0000000..c94ea17 Binary files /dev/null and b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/AppIcon.appiconset/120 - iPhone Pro App Icon-ipad@2x.png differ diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/AppIcon.appiconset/Contents.json b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..aada345 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,106 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "120 - iPhone App Icon-spotlight.png", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "120 - iPhone App Icon@2x.png", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "120 - iPhone App Icon-ipad-spotlight@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "120 - iPhone App Icon-ipad-spotlight@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "120 - iPhone App Icon-ipad@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "120 - iPhone App Icon-ipad@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "120 - iPhone Pro App Icon-ipad@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "unused-1024-logo.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/AppIcon.appiconset/unused-1024-logo.png b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/AppIcon.appiconset/unused-1024-logo.png new file mode 100644 index 0000000..ddc718f Binary files /dev/null and b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/AppIcon.appiconset/unused-1024-logo.png differ diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/LaunchImage.launchimage/Contents.json b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/LaunchImage.launchimage/Contents.json new file mode 100644 index 0000000..b8710e7 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/LaunchImage.launchimage/Contents.json @@ -0,0 +1,53 @@ +{ + "images" : [ + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "filename" : "LaunchImageR4.png", + "scale" : "2x" + }, + { + "extent" : "full-screen", + "idiom" : "iphone", + "subtype" : "retina4", + "filename" : "LaunchImage@2x.png", + "minimum-system-version" : "7.0", + "orientation" : "portrait", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "1x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "1x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/LaunchImage.launchimage/LaunchImage@2x.png b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/LaunchImage.launchimage/LaunchImage@2x.png new file mode 100644 index 0000000..e50e754 Binary files /dev/null and b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/LaunchImage.launchimage/LaunchImage@2x.png differ diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/LaunchImage.launchimage/LaunchImageR4.png b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/LaunchImage.launchimage/LaunchImageR4.png new file mode 100644 index 0000000..814612e Binary files /dev/null and b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Images.xcassets/LaunchImage.launchimage/LaunchImageR4.png differ diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Localizable.strings b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Localizable.strings new file mode 100644 index 0000000..9a937b3 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Localizable.strings @@ -0,0 +1,63 @@ +/* + Localizable.strings + Braintree + + Created by Shin, Richard on 3/30/18. + +*/ +"Card Tokenization" = "Card Tokenization"; +"Braintree" = "Braintree"; +"Settings" = "Settings"; +"Ready" = "Ready"; +"Custom Venmo Button" = "Custom Venmo Button"; +"Venmo (custom button)" = "Venmo (custom button)"; +"Drop In (Legacy)" = "Drop In (Legacy)"; +"Buy Now" = "Buy Now"; +"Check Out" = "Check Out"; +"3D Secure - Payment Flow" = "3D Secure - Payment Flow"; +"Tokenize and Verify New Card" = "Tokenize and Verify New Card"; +"Apple Pay" = "Apple Pay"; +"Apple Pay via PassKit" = "Apple Pay via PassKit"; +"PAY WITH APPLE PAY" = "PAY WITH APPLE PAY"; +"PayPal (custom button)" = "PayPal (custom button)"; +"PayPal one-time payment" = "PayPal one-time payment"; +"Processing..." = "Processing..."; +"iDEAL" = "iDEAL"; +"Pay With iDEAL" = "Pay With iDEAL"; +"Cancel" = "Cancel"; +"OK" = "OK"; +"Custom Payment Button" = "Custom Payment Button"; +"Venmo" = "Venmo"; +"PayPal" = "PayPal"; +"Amex" = "Amex"; +"Get rewards balance" = "Get rewards balance"; +"Integrations" = "Integrations"; +"3DS" = "3DS"; +"Tokenize and Verify New Card" = "Tokenize and Verify New Card"; +"PayPal with Credit Offered" = "PayPal with Credit Offered"; +"BTUIPayPalButton" = "BTUIPayPalButton"; +"Drop-in" = "Drop-in"; +"CART" = "CART"; +"1 Sock" = "1 Sock"; +"$100" = "$100"; +"PAYMENT METHODS" = "PAYMENT METHODS"; +"Select Payment Method" = "Select Payment Method"; +"Complete Purchase" = "Complete Purchase"; +"PayPal (future payment button)" = "PayPal (future payment button)"; +"BTUIVenmoButton" = "BTUIVenmoButton"; +"UnionPay" = "UnionPay"; +"Submit" = "Submit"; +"Send SMS" = "Send SMS"; +"SMS Auth Code" = "SMS Auth Code"; +"SMSAuthCodeMessage" = "An authorization code has been sent to your mobile phone number. Please enter it here"; +"PayPal (Address Scope)" = "PayPal (Address Scope)"; +"Payment Button" = "Payment Button"; +"Change Payment Method" = "Change Payment Method"; +"Add Payment Method" = "Add Payment Method"; +"Billing Agreement with PayPal" = "Billing Agreement with PayPal"; +"BTDataCollector Protection" = "BTDataCollector Protection"; +"Collect All Data" = "Collect All Data"; +"Collect Kount Data" = "Collect Kount Data"; +"Collect PayPal Data" = "Collect PayPal Data"; +"Obtain Location Permission" = "Obtain Location Permission"; +"DismissalOfViewController Called" = "DismissalOfViewController Called"; diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Merchant API Client/BraintreeDemoMerchantAPI.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Merchant API Client/BraintreeDemoMerchantAPI.h new file mode 100644 index 0000000..40940c3 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Merchant API Client/BraintreeDemoMerchantAPI.h @@ -0,0 +1,15 @@ +#import + +extern NSString *BraintreeDemoMerchantAPIEnvironmentDidChangeNotification; + +@interface BraintreeDemoMerchantAPI : NSObject + ++ (instancetype)sharedService; + +- (void)fetchMerchantConfigWithCompletion:(void (^)(NSString *merchantId, NSError *error))completionBlock; +- (void)fetchClientTokenWithMerchantAccountId:(NSString *)merchantAccountId completion:(void (^)(NSString *, NSError *))completionBlock; +- (void)createCustomerAndFetchClientTokenWithCompletion:(void (^)(NSString *clientToken, NSError *error))completionBlock; +- (void)makeTransactionWithPaymentMethodNonce:(NSString *)paymentMethodNonce completion:(void (^)(NSString *transactionId, NSError *error))completionBlock; +- (void)makeTransactionWithPaymentMethodNonce:(NSString *)paymentMethodNonce merchantAccountId:(NSString *)merchantAccountId completion:(void (^)(NSString *transactionId, NSError *error))completionBlock; + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Merchant API Client/BraintreeDemoMerchantAPI.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Merchant API Client/BraintreeDemoMerchantAPI.m new file mode 100644 index 0000000..e6bbf79 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Merchant API Client/BraintreeDemoMerchantAPI.m @@ -0,0 +1,136 @@ +#import "BraintreeDemoMerchantAPI.h" +#import + +#import "BraintreeDemoSettings.h" + +NSString *BraintreeDemoMerchantAPIEnvironmentDidChangeNotification = @"BraintreeDemoTransactionServiceEnvironmentDidChangeNotification"; + +@interface BraintreeDemoMerchantAPI () +@property (nonatomic, strong) AFHTTPSessionManager *sessionManager; +@property (nonatomic, assign) NSString *currentEnvironmentURLString; +@property (nonatomic, assign) BraintreeDemoTransactionServiceThreeDSecureRequiredStatus threeDSecureRequiredStatus; +@end + +@implementation BraintreeDemoMerchantAPI + ++ (instancetype)sharedService { + static BraintreeDemoMerchantAPI *instance; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + instance = [[self alloc] init]; + }); + return instance; +} + +- (id)init { + self = [super init]; + if (self) { + self.threeDSecureRequiredStatus = -1; + [self setupSessionManager:nil]; + + // Use KVO because we don't want to be notified while the user types each character of a Custom URL + [[NSUserDefaults standardUserDefaults] addObserver:self forKeyPath:BraintreeDemoSettingsEnvironmentDefaultsKey options:NSKeyValueObservingOptionNew context:NULL]; + [[NSUserDefaults standardUserDefaults] addObserver:self forKeyPath:BraintreeDemoSettingsThreeDSecureRequiredDefaultsKey options:NSKeyValueObservingOptionNew context:NULL]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(setupSessionManager:) name:UITextFieldTextDidEndEditingNotification object:nil]; + } + return self; +} + +- (void)dealloc { + [[NSUserDefaults standardUserDefaults] removeObserver:self forKeyPath:BraintreeDemoSettingsEnvironmentDefaultsKey]; + [[NSUserDefaults standardUserDefaults] removeObserver:self forKeyPath:BraintreeDemoSettingsThreeDSecureRequiredDefaultsKey]; + [[NSNotificationCenter defaultCenter] removeObserver:self name:NSUserDefaultsDidChangeNotification object:nil]; +} + +- (void)observeValueForKeyPath:(__unused NSString *)keyPath ofObject:(__unused id)object change:(__unused NSDictionary *)change context:(__unused void *)context { + [self setupSessionManager:nil]; +} + +- (void)setupSessionManager:(__unused NSNotification *)notif { + if (![self.currentEnvironmentURLString isEqualToString:[BraintreeDemoSettings currentEnvironmentURLString]] || + self.threeDSecureRequiredStatus != [BraintreeDemoSettings threeDSecureRequiredStatus]) + { + self.currentEnvironmentURLString = [BraintreeDemoSettings currentEnvironmentURLString]; + self.threeDSecureRequiredStatus = [BraintreeDemoSettings threeDSecureRequiredStatus]; + self.sessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:[BraintreeDemoSettings currentEnvironmentURLString]]]; + [[NSNotificationCenter defaultCenter] postNotificationName:BraintreeDemoMerchantAPIEnvironmentDidChangeNotification object:self]; + } +} + +- (void)fetchMerchantConfigWithCompletion:(void (^)(NSString *merchantId, NSError *error))completionBlock { + [self.sessionManager GET:@"/config/current" + parameters:nil + progress:nil + success:^(__unused NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + if (completionBlock) { + completionBlock(responseObject[@"merchant_id"], nil); + } + } failure:^(__unused NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { + completionBlock(nil, error); + }]; +} + +- (void)fetchClientTokenWithMerchantAccountId:(NSString * _Nullable)merchantAccountId completion:(void (^)(NSString *, NSError *))completionBlock { + NSMutableDictionary *parameters = [@{@"version":[BraintreeDemoSettings clientTokenVersion]} mutableCopy]; + if ([BraintreeDemoSettings customerPresent]) { + if ([BraintreeDemoSettings customerIdentifier].length > 0) { + parameters[@"customer_id"] = [BraintreeDemoSettings customerIdentifier]; + } else { + parameters[@"customer_id"] = [[NSUUID UUID] UUIDString]; + } + } + if (merchantAccountId) { + parameters[@"merchant_account_id"] = merchantAccountId; + } + + [self.sessionManager GET:@"/client_token" + parameters:parameters + progress:nil + success:^(__unused NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + completionBlock(responseObject[@"client_token"], nil); + } failure:^(__unused NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { + completionBlock(nil, error); + }]; +} + +- (void)createCustomerAndFetchClientTokenWithCompletion:(void (^)(NSString *, NSError *))completionBlock { + [self fetchClientTokenWithMerchantAccountId:nil completion:completionBlock]; +} + +- (void)makeTransactionWithPaymentMethodNonce:(NSString *)paymentMethodNonce completion:(void (^)(NSString *transactionId, NSError *error))completionBlock { + [self makeTransactionWithPaymentMethodNonce:paymentMethodNonce + merchantAccountId:nil + completion:completionBlock]; +} + +- (void)makeTransactionWithPaymentMethodNonce:(NSString *)paymentMethodNonce merchantAccountId:(NSString *)merchantAccountId completion:(void (^)(NSString *transactionId, NSError *error))completionBlock { + NSLog(@"Creating a transaction with nonce: %@", paymentMethodNonce); + NSMutableDictionary *parameters; + + switch ([BraintreeDemoSettings threeDSecureRequiredStatus]) { + case BraintreeDemoTransactionServiceThreeDSecureRequiredStatusDefault: + parameters = [@{ @"payment_method_nonce": paymentMethodNonce } mutableCopy]; + break; + case BraintreeDemoTransactionServiceThreeDSecureRequiredStatusRequired: + parameters = [@{ @"payment_method_nonce": paymentMethodNonce, @"three_d_secure_required": @YES, } mutableCopy]; + break; + case BraintreeDemoTransactionServiceThreeDSecureRequiredStatusNotRequired: + parameters = [@{ @"payment_method_nonce": paymentMethodNonce, @"three_d_secure_required": @NO, } mutableCopy]; + break; + } + + if (merchantAccountId != nil) { + [parameters setObject:merchantAccountId forKey:@"merchant_account_id"]; + } + + [self.sessionManager POST:@"/nonce/transaction" + parameters:parameters + progress:nil + success:^(__unused NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + completionBlock(responseObject[@"message"], nil); + } failure:^(__unused NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { + completionBlock(nil, error); + }]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/README.md b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/README.md new file mode 100644 index 0000000..da5a97d --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/README.md @@ -0,0 +1,43 @@ +# Braintree Demo + +This is a universal iOS app that exercises just about every feature of Braintree iOS. + +You can take a look at the classes under [Features](./Features) to get a sense of how this SDK can be used. + +## Usage + +This app allows you to switch between the different features, or sample integrations, that it showcases. Each integration starts with loading a client token from a sample merchant server. This happens automatically when you open the app. Once the client token is loaded, the current integration is shown. + +You can switch between features using the `Settings` menu. This app will remember which feature you last looked at; the in-app settings are synchronized with the iOS Settings app. + +You can reload the current integration by tapping on the the reload button on the upper left. + +The current status is shown on the bottom toolbar. If you've created a payment method nonce, you tap on the status toolbar to create a transaction. + +### Compatibility + +This app should be compiled with a 8.x Base SDK (Xcode 6.x) and has a deployment target of iOS 7.0. + +## Implementation + +This codebase has three primary sections: + +* **Demo Base** - contains boilerplate code that facilitates switching between demo integrations. +* **Merchant API Client** - contains an API client that might be similar to one found in a real app; note that it consumes a _hypothetical merchant_ API, not Braintree's API. +* **Features** - contains a number of Braintree iOS demo integrations. + +Each demo integration must provide a `BraintreeDemoBaseViewController` subclass. Most importantly, the demo provides a `paymentButton`, which is presented to the user when the demo is selected. + +To add a new demo, you will additionally need to register the demo in the [Settings bundle](./Demo Base/Settings/Settings.bundle/Root.plist), identifying the view controller by class name. + +The most common class of integration, which involves presenting the user with a single button—to trigger whatever type of payment experience you choose—can be powered by another base class, `BraintreeDemoPaymentButtonBaseViewController`. + +Your demo view controller may call its `progressBlock` or `completionBlock` in order to update the rest of the app (and the user) about the payment method creation lifecycle. + +### Steps to Add a New Demo + +1. Create a new `BraintreeDemoBaseViewController` subclass in a new directory under Features. +2. Utilize `self.braintree` to implement a Braintree integration, and call `completionBlock` upon successfully creating a payment method. +3. Register this class in the Settings bundle, by adding new items in the `Integration` multi value item, under `titles` and `values`. + +💸👍🏻 diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Supporting Files/Braintree-Demo-Info.plist b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Supporting Files/Braintree-Demo-Info.plist new file mode 100644 index 0000000..2c82785 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Supporting Files/Braintree-Demo-Info.plist @@ -0,0 +1,110 @@ + + + + + CFBundleDevelopmentRegion + en_US + CFBundleDisplayName + SDK Demo + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleLocalizations + + da + de + en_AU + en_CA + en_GB + en + es_ES + es + fr_CA + fr_FR + fr + he + it + nb + nl + pl + pt + ru + sv + tr + zh-Hans + + CFBundleName + Braintree iOS SDK Demo + CFBundlePackageType + APPL + CFBundleShortVersionString + 4.23.0 + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + com.braintreepayments.Demo + CFBundleURLSchemes + + com.braintreepayments.Demo.payments + + + + CFBundleVersion + 4.23.0 + LSApplicationQueriesSchemes + + com.braintreepayments.Demo.payments + com.venmo.touch.v2 + + LSRequiresIPhoneOS + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + NSLocationWhenInUseUsageDescription + + UILaunchStoryboardName + Launch Screen + UIRequiredDeviceCapabilities + + armv7 + + UIRequiresFullScreen + + UIStatusBarHidden + + UIStatusBarStyle + UIStatusBarStyleLightContent + UIStatusBarTintParameters + + UINavigationBar + + Style + UIBarStyleDefault + Translucent + + + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationLandscapeLeft + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Supporting Files/Braintree-Demo-Prefix.pch b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Supporting Files/Braintree-Demo-Prefix.pch new file mode 100644 index 0000000..3d611af --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Supporting Files/Braintree-Demo-Prefix.pch @@ -0,0 +1,2 @@ +#import +#import diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Supporting Files/en.lproj/InfoPlist.strings b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Supporting Files/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Supporting Files/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Supporting Files/en.lproj/Main.strings b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Supporting Files/en.lproj/Main.strings new file mode 100644 index 0000000..fdcb495 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Supporting Files/en.lproj/Main.strings @@ -0,0 +1,63 @@ + +/* Class = "IBUILabel"; text = "[braintree payPalControlWithCompletion:];"; ObjectID = "2E9-9x-5fB"; */ +"2E9-9x-5fB.text" = "[braintree paymentButtonWithDelegate:…]"; + +/* Class = "IBUILabel"; text = "Transmit nonce to your server → 💰"; ObjectID = "2q2-ZJ-xOe"; */ +"2q2-ZJ-xOe.text" = "Transmit nonce to your server → 💰"; + +/* Class = "IBUILabel"; text = "Transaction"; ObjectID = "4hk-mK-yky"; */ +"4hk-mK-yky.text" = "Transaction"; + +/* Class = "IBUILabel"; text = "[braintree dropinViewControllerWithCompletion:];"; ObjectID = "9x8-Nu-myL"; */ +"9x8-Nu-myL.text" = "[braintree dropinViewControllerWithCompletion:…];"; + +/* Class = "IBUITableViewSection"; headerTitle = "Step 2: Create Nonce"; ObjectID = "LJb-7g-SHk"; */ +"LJb-7g-SHk.headerTitle" = "Create a Payment Method"; + +/* Class = "IBUILabel"; text = "One Touch"; ObjectID = "PaT-fr-JHw"; */ +"PaT-fr-JHw.text" = "Payment Buttons & One Touch"; + +/* Class = "IBUILabel"; text = "[braintree tokenizeCardWithNumber:…];"; ObjectID = "Rp4-mk-GPh"; */ +"Rp4-mk-GPh.text" = "[braintree tokenizeCardWithNumber:…];"; + +/* Class = "IBUILabel"; text = "(nil)"; ObjectID = "TF6-8A-TuS"; */ +"TF6-8A-TuS.text" = "(nil)"; + +/* Class = "IBUILabel"; text = "Nonce"; ObjectID = "Wbo-0U-3Vw"; */ +"Wbo-0U-3Vw.text" = "Nonce"; + +/* Class = "IBUILabel"; text = "Make a Transaction"; ObjectID = "Wop-mr-JDF"; */ +"Wop-mr-JDF.text" = "Make a Transaction"; + +/* Class = "IBUINavigationItem"; title = "Braintree SDK for iOS"; ObjectID = "ZEn-QI-hbv"; */ +"ZEn-QI-hbv.title" = "v.zero"; + +/* Class = "IBUILabel"; text = "Braintree"; ObjectID = "cV4-n0-2WW"; */ +"cV4-n0-2WW.text" = "Merchant"; + +/* Class = "IBUILabel"; text = "[Braintree braintreeWithClientToken:];"; ObjectID = "ccE-ej-MeD"; */ +"ccE-ej-MeD.text" = "[Braintree braintreeWithClientToken:];"; + +/* Class = "IBUILabel"; text = "Initialize with a Client Token"; ObjectID = "cdT-q9-6cH"; */ +"cdT-q9-6cH.text" = "Initialize with a Client Token"; + +/* Class = "IBUITableViewSection"; headerTitle = "Step 3: Make a Transaction"; ObjectID = "fYo-pp-MTy"; */ +"fYo-pp-MTy.headerTitle" = "Create a Transaction"; + +/* Class = "IBUILabel"; text = "Card Tokenization"; ObjectID = "g1s-7X-ara"; */ +"g1s-7X-ara.text" = "Card Tokenization"; + +/* Class = "IBUILabel"; text = "Drop-In"; ObjectID = "hWi-9S-SNj"; */ +"hWi-9S-SNj.text" = "Drop-In"; + +/* Class = "IBUITableViewSection"; headerTitle = "Library Version"; ObjectID = "hnV-8l-v2h"; */ +"hnV-8l-v2h.headerTitle" = "Library Version"; + +/* Class = "IBUILabel"; text = "pod \"Braintree\""; ObjectID = "ocb-oW-K0r"; */ +"ocb-oW-K0r.text" = "pod \"Braintree\""; + +/* Class = "IBUILabel"; text = "(nil)"; ObjectID = "pZN-Ur-Ks9"; */ +"pZN-Ur-Ks9.text" = "(nil)"; + +/* Class = "IBUILabel"; text = "(nil)"; ObjectID = "zaP-r6-4Ld"; */ +"zaP-r6-4Ld.text" = "(nil)"; diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Supporting Files/main.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Supporting Files/main.m new file mode 100644 index 0000000..f4e520f --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Demo/Supporting Files/main.m @@ -0,0 +1,10 @@ +#import + +#import "BraintreeDemoAppDelegate.h" + +int main(int argc, char * argv[]) +{ + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([BraintreeDemoAppDelegate class])); + } +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/Braintree-4.0-Migration-Guide.md b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/Braintree-4.0-Migration-Guide.md new file mode 100644 index 0000000..a522919 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/Braintree-4.0-Migration-Guide.md @@ -0,0 +1 @@ +## This document has moved to [Braintree iOS SDK 4.0 Migration Guide](https://developers.braintreepayments.com/guides/client-sdk/migration/ios/v4) diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/Braintree-Static-Integration-Guide.md b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/Braintree-Static-Integration-Guide.md new file mode 100644 index 0000000..3331c76 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/Braintree-Static-Integration-Guide.md @@ -0,0 +1,52 @@ +Static Library Integration Guide +------------------------------------ + +Please follow these instructions to integrate Braintree iOS into your app using the provided static library. + +> Note: We assume that you are using Xcode 8+ and iOS 9.0+ as your Base SDK. + +1. Add the Braintree iOS SDK code to your repository + - [Download the SDK as a ZIP file from GitHub](https://github.com/braintree/braintree_ios/archive/master.zip) and unzip it into your app's root directory in Finder + +2. Open up your app in Xcode + +3. Add Braintree as a subproject + - Open your project and drag the Braintree.xcodeproj file to your Project Navigator under your project. Be sure *NOT* to have the Braintree.xcodeproj open while doing this step. + + ![Screenshot of adding Braintree as a subproject](bt_static_screenshot_sub_project.png) + +4. Add `Braintree` to your build phases (`[Your App Target]` > `Build Phases`) + - `Target Dependencies` + - Click the `+` and add `Braintree` + + ![Screenshot of adding Braintree to Target Dependencies](bt_static_screenshot_target_dependency.gif) + + - `Link Binary With Libraries` + - Click the `+` and add `libBraintree.a` + + ![Screenshot of adding Braintree to Link Bunary With Libraries](bt_static_screenshot_link_binary.gif) + +5. Add `localized strings` to `Copy Bundle Resources` (`[Your App Target]` > `Build Phases`) + - In the Project Navigator, locate the `UI.strings` (`Braintree.xcodeproj` > `BraintreeUI` > `Localization` > `UI.strings`) + - Drag the `UI.strings` file from the Navigator to the `Copy Bundle Resources` panel and drop it + - Repeat for remaining localized strings + - `Drop-In.strings` (`Braintree.xcodeproj` > `BraintreeUI` > `Drop-In` > `Localization` > `Drop-In.strings`) + - `Three-D-Secure.strings` (`Braintree.xcodeproj` > `Braintree3DSecure` > `Localization` > `Three-D-Secure.strings`) + + ![Screenshot of adding localized strings to Copy Bundle Resources](bt_static_screenshot_strings.gif) + +6. Modify your build settings (`[Your App Target]` > `Build Settings`) + - Update `Header Search Paths` + - Add `$(PROJECT_DIR)/braintree_ios` (or whatever the name of the braintree folder at the top level of your project is) + - Be sure to select recursive from the drop down at the right + + ![Screenshot of updating Header Search Paths](bt_static_screenshot_header_search_paths.png) + + - Update `Other Linker Flags` + - Add `-ObjC` + + ![Screenshot of updating Header Search Paths](bt_static_screenshot_linker_flags.png) + +7. `Build and Run` your app to test out the integration + +8. [Integrate the SDK in your checkout form](https://developers.braintreepayments.com/ios/start/overview) diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/Braintree-Umbrella-Header.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/Braintree-Umbrella-Header.h new file mode 100644 index 0000000..b6910ab --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/Braintree-Umbrella-Header.h @@ -0,0 +1,18 @@ +#import "BraintreeCore/Public/BraintreeCore.h" +#import "BraintreeCard/Public/BraintreeCard.h" +#import "Braintree3DSecure/Public/Braintree3DSecure.h" +#import "BraintreeApplePay/Public/BraintreeApplePay.h" +#import "BraintreeDataCollector/Public/BraintreeDataCollector.h" +#import "BraintreePayPal/Public/BraintreePayPal.h" +#import "BraintreeUnionPay/Public/BraintreeUnionPay.h" +#import "BraintreeVenmo/Public/BraintreeVenmo.h" +#import "BraintreeAmericanExpress/Public/BraintreeAmericanExpress.h" +//Payment Flows +#import "BraintreePaymentFlow/Public/BraintreePaymentFlow.h" +#import "BraintreePaymentFlow/Public/LocalPayment/Configuration+LocalPayment.h" +#import "BraintreePaymentFlow/Public/LocalPayment/BTLocalPaymentResult.h" +#import "BraintreePaymentFlow/Public/LocalPayment/BTLocalPaymentRequest.h" +#import "BraintreePaymentFlow/Public/LocalPayment/BTPaymentFlowDriver+LocalPayment.h" +#import "BraintreePaymentFlow/Public/ThreeDSecure/BTThreeDSecureResult.h" +#import "BraintreePaymentFlow/Public/ThreeDSecure/BTThreeDSecureRequest.h" +#import "BraintreePaymentFlow/Public/ThreeDSecure/BTPaymentFlowDriver+ThreeDSecure.h" diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/Drop-In-Update.md b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/Drop-In-Update.md new file mode 100644 index 0000000..2004035 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/Drop-In-Update.md @@ -0,0 +1,5 @@ +Drop-In Update (Beta) +------------------------------------ + +Please see the [Braintree iOS Drop-In repository](https://github.com/braintree/braintree-ios-drop-in) for the latest Drop-In code. + diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/Frameworks.md b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/Frameworks.md new file mode 100644 index 0000000..f4f81a6 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/Frameworks.md @@ -0,0 +1,124 @@ +# Frameworks + +The Braintree iOS SDK is organized into a family of frameworks. + +### Differences from Braintree-iOS 3.x +* Frameworks and Carthage support +* Tokenization key support +* `BTAPIClient` instead of `BTClient` +* `BTTokenized` instead of `BTPaymentMethod` +* Refactored tests and added tests in Swift + + +## BraintreeCore + +This is the core set of models and networking needed to use Braintree in an app or extension. All other frameworks depend on this. + +PRIMARY CLASS: +### `BTAPIClient`: Braintree API client +* Authentication with tokenization key / client token +* Access configuration from gateway +* Analytics +* HTTP methods on Braintree API endpoints + +#### Other Classes + +* `BTAppSwitch`: Class and protocol for authentication via app switch +* `BTJSON`: JSON parser + +## Payment Options + +The Braintree iOS SDK currently supports 6 payment options. + +1. `BraintreeCard`: Credit and debit card + * No dependencies other than `BraintreeCore` +2. `BraintreeApplePay`: Apple Pay + * Depends on `PassKit` +3. `BraintreePayPal`: PayPal + * No dependencies other than `BraintreeCore` + * Use `BTPaymentDriverDelegate` to receive app switch lifecycle events +4. `BraintreeVenmo`: Venmo + * Depends on `BraintreeCard` +5. `Braintree3DSecure`: 3D Secure + * Depends on `BraintreeCard` + * Use `BTViewControllerPresentingDelegate` (required) for cases when a view controller must be presented for buyer verification + +## BraintreeCard + +Tokenizes credit or debit cards. + +PRIMARY CLASS: +### `BTCardTokenizationClient`: Tokenizes credit and debit card info + +#### Other Classes + +* `BTCardTokenizationRequest`: Raw credit or debit card data provided by the customer +* `BTTokenizedCard`: A tokenized card that contains a payment method nonce + + +## BraintreeUI + +A pre-built payment form and payment button. + +Optionally uses these payment option frameworks, if present: `BraintreeCard`, `BraintreePayPal`, `BraintreeVenmo`. + +### Features + +* UI + * Card form +* Drop-in + + +## BraintreePayPal + +Accept payments with PayPal app via PayPal One Touch. + +### Features + +* `BTPayPalDriver`: Coordinates paying with PayPal by switching to the PayPal app or the web browser +* **Future payments** via `-authorizeAccount...` + * `BTTokenizedPayPalAccount`: A tokenized PayPal account that contains a payment method nonce +* **Single payments** via `-checkoutWithCheckoutRequest...` + * `BTTokenizedPayPalCheckout`: A tokenized PayPal checkout that contains a payment method nonce +* `BTPayPalCheckoutRequest`: Options for a PayPal checkout flow + + +## BraintreeVenmo + +**Depends on BraintreeCard.** + +Accept payments with a credit or debit card from the Venmo app via Venmo One Touch. + +### Features + +* `BTVenmoDriver`: Coordinates switching to the Venmo app for the buyer to select a card +* `BTVenmoTokenizedCard`: A tokenized card from Venmo that contains a payment method nonce + + +## BraintreeApplePay + +**Depends on `PassKit`.** + +Accept Apple Pay by using Braintree to process payments. + +### Features + +* `BTApplePayTokenizationClient`: Performs tokenization of a `PKPayment` and returns a tokenized Apple Pay payment instrument +* `BTTokenizedApplePayPayment`: A tokenized Apple Pay payment that contains a payment method nonce + + +## Braintree3DSecure + +**Depends on `BraintreeCard`.** + +Perform 3D Secure verification. + +### Features + +* `BTThreeDSecureDriver`: Coordinates 3D Secure verification via in-app web view +* `BTThreeDSecureVerification`: Card/transactions details to be verified +* `BTThreeDSecureTokenizedCard`: A tokenized card that contains a payment method nonce + * `liabilityShifted`: 3D Secure worked and authentication succeeded. This will also be true if the issuing bank does not support 3D Secure, but the payment method does + * `liabilityShiftPossible`: The payment method was eligible for 3D Secure + * These parameters pass through the client-side first and should not be trusted for your server-side risk assessment + diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/Manual Integration.md b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/Manual Integration.md new file mode 100644 index 0000000..56c53ff --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/Manual Integration.md @@ -0,0 +1,56 @@ +Manual Integration Without CocoaPods +------------------------------------ + +Please follow these instructions to integrate Braintree iOS into your app without CocoaPods. + +> Note: We assume that you are using Xcode 8+ and iOS 9.0+ as your Base SDK. + +1. Add the Braintree iOS SDK code to your repository + - Use git: `git submodule add https://github.com/braintree/braintree_ios.git` + - Alternatively, you can [download the SDK as a ZIP file from GitHub](https://github.com/braintree/braintree_ios/archive/master.zip) and unzip it into your app's root directory in Finder + - Delete the following folders: `Braintree-Demo`, `Docs`, `IntegrationTests`, `Specs`, `Unit Tests` +2. Open up your app in Xcode +3. Create a new framework target called `Braintree` (please use this exact name) + - In Xcode, select `File` > `New` > `Target` + - Select `Framework & Library` > `Cocoa Touch Framework` + - Use the following options + - Product Name: `Braintree` + - Language: `Objective C` + - Embed in Application: `[your app target]` + - You will now see a new `Braintree` Target Dependency in your main app target (in the first section of `Build Phases`). +4. Add the Braintree code to project + - In Xcode, select `File` > `Add Files to [...]...` + - Navigate to `[Your app project root]/braintree-ios` and select the `Braintree` directory + - Under `Add to targets`, make sure your newly-created framework target `Braintree` is checked and that `[your app target]` is unchecked + - Optionally check `Copy items if needed` + - Click `Add` + ![Screenshot of adding the Braintree files to Braintree target](screenshot_add_files.png) +5. Modify the `Braintree` target's build phases (`Project` > `Braintree` > `Build Phases`) + - In `Compile Sources`, delete all `.md` files (tip: filter by `.md`) + - In `Headers` + - Under `Public`, delete `Braintree.h` + - Select all files under `Project` and drag them to `Public` + - In `Link Binary With Libraries` + - Add the following system frameworks: + - `Contacts` + - `CoreLocation` + - `Foundation` + - `MessageUI` + - `PassKit` + - `SystemConfiguration` + - `UIKit` + - Update `Contacts` to be weak linked by changing its status to `Optional`. + - In `Copy Bundle Resources`, remove everything except the `.strings` files. +6. Modify `Braintree` build settings (`Project` > `Braintree` > `Build Settings`) + - Edit `Public Headers Folder Path` by appending `/Braintree` (e.g. `$(CONTENTS_FOLDER_PATH)/Headers/Braintree`) + - Edit `Other Linker Flags` by adding `-lc++ -ObjC` +7. Modify `[your app target]` build settings (`Project` > `[your app]` > `Build Settings`) + - Set `Always Search User Paths` to `Yes` +8. Modify `[your app target]` build phases (select the `[your app]` target, then `Build Phases`) + - In `Copy Bundle Resources`, add `Drop-In.strings`, `UI.strings` and `Three-D-Secure.strings` from the Braintree framework target (tip: filter by `.strings`) + ![Screenshot of copying bundle resources for i18n](screenshot_copy_bundles.png) +9. Remove the `Braintree` scheme + - In Xcode, select `Product` > `Scheme` > `Manage Schemes...` + - Select the `Braintree` scheme and press the `-` button +10. Build and Run your app to test out the integration +11. [Integrate the SDK in your checkout form](https://developers.braintreepayments.com/ios/start/overview) diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/bt_static_screenshot_header_search_paths.png b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/bt_static_screenshot_header_search_paths.png new file mode 100644 index 0000000..9c45931 Binary files /dev/null and b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/bt_static_screenshot_header_search_paths.png differ diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/bt_static_screenshot_link_binary.gif b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/bt_static_screenshot_link_binary.gif new file mode 100644 index 0000000..380aa99 Binary files /dev/null and b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/bt_static_screenshot_link_binary.gif differ diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/bt_static_screenshot_linker_flags.png b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/bt_static_screenshot_linker_flags.png new file mode 100644 index 0000000..074daee Binary files /dev/null and b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/bt_static_screenshot_linker_flags.png differ diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/bt_static_screenshot_strings.gif b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/bt_static_screenshot_strings.gif new file mode 100644 index 0000000..21c81cc Binary files /dev/null and b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/bt_static_screenshot_strings.gif differ diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/bt_static_screenshot_sub_project.png b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/bt_static_screenshot_sub_project.png new file mode 100644 index 0000000..49975c7 Binary files /dev/null and b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/bt_static_screenshot_sub_project.png differ diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/bt_static_screenshot_target_dependency.gif b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/bt_static_screenshot_target_dependency.gif new file mode 100644 index 0000000..2c429db Binary files /dev/null and b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/bt_static_screenshot_target_dependency.gif differ diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/saved-payment-methods-dark.png b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/saved-payment-methods-dark.png new file mode 100644 index 0000000..1d8bff8 Binary files /dev/null and b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/saved-payment-methods-dark.png differ diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/saved-payment-methods.png b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/saved-payment-methods.png new file mode 100644 index 0000000..5369faa Binary files /dev/null and b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/saved-payment-methods.png differ diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/saved-paypal-method.png b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/saved-paypal-method.png new file mode 100644 index 0000000..deb6449 Binary files /dev/null and b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/saved-paypal-method.png differ diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/screenshot.png b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/screenshot.png new file mode 100644 index 0000000..4b8c014 Binary files /dev/null and b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/screenshot.png differ diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/screenshot_add_apple_pay.png b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/screenshot_add_apple_pay.png new file mode 100644 index 0000000..45deb38 Binary files /dev/null and b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/screenshot_add_apple_pay.png differ diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/screenshot_add_files.png b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/screenshot_add_files.png new file mode 100644 index 0000000..ae64811 Binary files /dev/null and b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/screenshot_add_files.png differ diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/screenshot_copy_bundles.png b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/screenshot_copy_bundles.png new file mode 100644 index 0000000..5625a51 Binary files /dev/null and b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Docs/screenshot_copy_bundles.png differ diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Gemfile b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Gemfile new file mode 100644 index 0000000..2d9a782 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Gemfile @@ -0,0 +1,10 @@ +source "https://rubygems.org" + +gem 'cocoapods' +gem 'rake' +gem 'git-pairing' +gem 'highline', :require => 'highline/import' +gem 'rake_commit' +gem 'shenzhen' +gem 'xcpretty' +gem 'jazzy', '0.9.1' diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Gemfile.lock b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Gemfile.lock new file mode 100644 index 0000000..88cd061 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Gemfile.lock @@ -0,0 +1,161 @@ +GEM + remote: https://rubygems.org/ + specs: + CFPropertyList (3.0.0) + activesupport (4.2.10) + i18n (~> 0.7) + minitest (~> 5.1) + thread_safe (~> 0.3, >= 0.3.4) + tzinfo (~> 1.1) + atomos (0.1.3) + awesome_print (1.8.0) + aws-sdk (1.67.0) + aws-sdk-v1 (= 1.67.0) + aws-sdk-v1 (1.67.0) + json (~> 1.4) + nokogiri (~> 1) + claide (1.0.2) + cocoapods (1.5.3) + activesupport (>= 4.0.2, < 5) + claide (>= 1.0.2, < 2.0) + cocoapods-core (= 1.5.3) + cocoapods-deintegrate (>= 1.0.2, < 2.0) + cocoapods-downloader (>= 1.2.0, < 2.0) + cocoapods-plugins (>= 1.0.0, < 2.0) + cocoapods-search (>= 1.0.0, < 2.0) + cocoapods-stats (>= 1.0.0, < 2.0) + cocoapods-trunk (>= 1.3.0, < 2.0) + cocoapods-try (>= 1.1.0, < 2.0) + colored2 (~> 3.1) + escape (~> 0.0.4) + fourflusher (~> 2.0.1) + gh_inspector (~> 1.0) + molinillo (~> 0.6.5) + nap (~> 1.0) + ruby-macho (~> 1.1) + xcodeproj (>= 1.5.7, < 2.0) + cocoapods-core (1.5.3) + activesupport (>= 4.0.2, < 6) + fuzzy_match (~> 2.0.4) + nap (~> 1.0) + cocoapods-deintegrate (1.0.2) + cocoapods-downloader (1.2.2) + cocoapods-plugins (1.0.0) + nap + cocoapods-search (1.0.0) + cocoapods-stats (1.0.0) + cocoapods-trunk (1.3.1) + nap (>= 0.8, < 2.0) + netrc (~> 0.11) + cocoapods-try (1.1.0) + colored2 (3.1.2) + commander (4.4.6) + highline (~> 1.7.2) + concurrent-ruby (1.0.5) + dotenv (2.5.0) + escape (0.0.4) + faraday (0.15.3) + multipart-post (>= 1.2, < 3) + faraday_middleware (0.12.2) + faraday (>= 0.7.4, < 1.0) + ffi (1.9.25) + fourflusher (2.0.1) + fuzzy_match (2.0.4) + gh_inspector (1.1.3) + git-pairing (0.5.3) + awesome_print (>= 1.1.0) + highline (>= 1.6.15) + paint (>= 0.8.5) + trollop (>= 2.0) + highline (1.7.10) + i18n (0.9.5) + concurrent-ruby (~> 1.0) + jazzy (0.9.1) + cocoapods (~> 1.0) + mustache (~> 0.99) + open4 + redcarpet (~> 3.2) + rouge (>= 2.0.6, < 4.0) + sass (~> 3.4) + sqlite3 (~> 1.3) + xcinvoke (~> 0.3.0) + json (1.8.6) + liferaft (0.0.6) + mini_portile2 (2.3.0) + minitest (5.11.3) + molinillo (0.6.6) + multipart-post (2.0.0) + mustache (0.99.8) + nanaimo (0.2.6) + nap (1.1.0) + net-sftp (2.1.2) + net-ssh (>= 2.6.5) + net-ssh (5.0.2) + netrc (0.11.0) + nokogiri (1.8.5) + mini_portile2 (~> 2.3.0) + open4 (1.3.4) + paint (2.0.1) + plist (3.1.0) + rake (12.3.1) + rake_commit (1.2.0) + rb-fsevent (0.10.3) + rb-inotify (0.9.10) + ffi (>= 0.5.0, < 2) + redcarpet (3.4.0) + rouge (2.0.7) + ruby-macho (1.3.1) + rubyzip (1.2.2) + sass (3.6.0) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + security (0.1.3) + shenzhen (0.14.3) + aws-sdk (~> 1.0) + commander (~> 4.3) + dotenv (>= 0.7) + faraday (~> 0.9) + faraday_middleware (~> 0.9) + highline (>= 1.7.2) + json (~> 1.8) + net-sftp (~> 2.1.2) + plist (~> 3.1.0) + rubyzip (~> 1.1) + security (~> 0.1.3) + terminal-table (~> 1.4) + sqlite3 (1.3.13) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + thread_safe (0.3.6) + trollop (2.9.9) + tzinfo (1.2.5) + thread_safe (~> 0.1) + unicode-display_width (1.4.0) + xcinvoke (0.3.0) + liferaft (~> 0.0.6) + xcodeproj (1.6.0) + CFPropertyList (>= 2.3.3, < 4.0) + atomos (~> 0.1.3) + claide (>= 1.0.2, < 2.0) + colored2 (~> 3.1) + nanaimo (~> 0.2.6) + xcpretty (0.3.0) + rouge (~> 2.0.7) + +PLATFORMS + ruby + +DEPENDENCIES + cocoapods + git-pairing + highline + jazzy (= 0.9.1) + rake + rake_commit + shenzhen + xcpretty + +BUNDLED WITH + 1.16.6 diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/BTAPIClient_IntegrationTests.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/BTAPIClient_IntegrationTests.m new file mode 100644 index 0000000..19e9375 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/BTAPIClient_IntegrationTests.m @@ -0,0 +1,53 @@ +#import +#import +#import + +@interface BTAPIClient_IntegrationTests : XCTestCase +@end + +@implementation BTAPIClient_IntegrationTests + +- (void)testFetchConfiguration_withTokenizationKey_returnsTheConfiguration { + BTAPIClient *client = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_TOKENIZATION_KEY]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Fetch configuration"]; + [client fetchOrReturnRemoteConfiguration:^(BTConfiguration *configuration, NSError *error) { + XCTAssertEqualObjects([configuration.json[@"merchantId"] asString], @"dcpspy2brwdjr3qn"); + XCTAssertNil(error); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testFetchConfiguration_withClientToken_returnsTheConfiguration { + BTAPIClient *client = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_CLIENT_TOKEN]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Fetch configuration"]; + [client fetchOrReturnRemoteConfiguration:^(BTConfiguration *configuration, NSError *error) { + // Note: client token uses a different merchant ID than the merchant whose tokenization key + // we use in the other test + XCTAssertEqualObjects([configuration.json[@"merchantId"] asString], @"348pk9cgf3bgyw2b"); + XCTAssertNil(error); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testFetchConfiguration_withVersionThreeClientToken_returnsTheConfiguration { + BTAPIClient *client = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_CLIENT_TOKEN_VERSION_3]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Fetch configuration"]; + [client fetchOrReturnRemoteConfiguration:^(BTConfiguration *configuration, NSError *error) { + // Note: client token uses a different merchant ID than the merchant whose tokenization key + // we use in the other test + XCTAssertEqualObjects([configuration.json[@"merchantId"] asString], @"dcpspy2brwdjr3qn"); + XCTAssertNil(error); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/BTHTTPSSLPinning_IntegrationTests.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/BTHTTPSSLPinning_IntegrationTests.m new file mode 100644 index 0000000..69e97d6 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/BTHTTPSSLPinning_IntegrationTests.m @@ -0,0 +1,135 @@ +#import "BTHTTP.h" +#import "BTAPIHTTP.h" +#import + +@interface BTHTTPSSLPinning_IntegrationTests : XCTestCase +@end + +@implementation BTHTTPSSLPinning_IntegrationTests + +// Will work when we comply with ATS +- (void)testBTHTTP_whenUsingProductionEnvironmentWithTrustedSSLCertificates_allowsNetworkCommunication { + NSURL *url = [NSURL URLWithString:@"https://api.braintreegateway.com"]; + BTHTTP *http = [[BTHTTP alloc] initWithBaseURL:url tokenizationKey:@"development_testing_integration_merchant_id"]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Callback invoked"]; + [http GET:@"/heartbeat.json" completion:^(BTJSON *body, __unused NSHTTPURLResponse *response, NSError *error) { + XCTAssertEqualObjects([body[@"heartbeat"] asString], @"d2765eaa0dad9b300b971f074-production"); + XCTAssertNil(error); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testBTHTTP_whenUsingSandboxEnvironmentWithTrustedSSLCertificates_allowsNetworkCommunication { + NSURL *url = [NSURL URLWithString:@"https://api.sandbox.braintreegateway.com"]; + BTHTTP *http = [[BTHTTP alloc] initWithBaseURL:url tokenizationKey:@"development_testing_integration_merchant_id"]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Callback invoked"]; + [http GET:@"/heartbeat.json" completion:^(BTJSON *body, __unused NSHTTPURLResponse *response, NSError *error) { + XCTAssertEqualObjects([body[@"heartbeat"] asString], @"d2765eaa0dad9b300b971f074-sandbox"); + XCTAssertNil(error); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testBTHTTP_whenUsingProductionEnvironmentWithTrustedSSLCertificates_allowsNetworkCommunication_toBraintreeAPI { + NSURL *url = [NSURL URLWithString:@"https://payments.braintree-api.com"]; + BTAPIHTTP *http = [[BTAPIHTTP alloc] initWithBaseURL:url accessToken:@""]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Callback invoked"]; + [http GET:@"/ping" completion:^(__unused BTJSON *body, __unused NSHTTPURLResponse *response, NSError *error) { + XCTAssertNil(error); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testBTHTTP_whenUsingSandboxEnvironmentWithTrustedSSLCertificates_allowsNetworkCommunication_toBraintreeAPI { + NSURL *url = [NSURL URLWithString:@"https://payments.sandbox.braintree-api.com"]; + BTAPIHTTP *http = [[BTAPIHTTP alloc] initWithBaseURL:url accessToken:@""]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Callback invoked"]; + [http GET:@"/ping" completion:^(__unused BTJSON *body, __unused NSHTTPURLResponse *response, NSError *error) { + XCTAssertNil(error); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testBTHTTP_whenUsingAServerWithValidCertificateChainWithARootCAThatWeDoNotExplicitlyTrust_doesNotAllowNetworkCommunication { + NSURL *url = [NSURL URLWithString:@"https://www.globalsign.com"]; + BTHTTP *http = [[BTHTTP alloc] initWithBaseURL:url tokenizationKey:@"development_testing_integration_merchant_id"]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Callback invoked"]; + [http GET:@"/heartbeat.json" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNil(body); + XCTAssertNil(response); + XCTAssertEqualObjects(error.domain, NSURLErrorDomain); + XCTAssertEqual(error.code, NSURLErrorServerCertificateUntrusted); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +#pragma mark - SSL Pinning + +#ifdef RUN_SSL_PINNING_SPECS + +- (void)testBTHTTP_whenUsingTrustedPinnedRootCertificates_allowsNetworkCommunication { + NSURL *url = [NSURL URLWithString:@"https://localhost:9443"]; + BTHTTP *http = [[BTHTTP alloc] initWithBaseURL:url tokenizationKey:@"development_testing_integration_merchant_id"]; + http.pinnedCertificates = @[[NSData dataWithContentsOfFile:[[NSBundle bundleForClass:[self class]] pathForResource:@"good_root_cert" ofType:@"der"]]]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Callback invoked"]; + [http GET:@"/" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testBTHTTP_whenUsingUntrustedUnpinnedRootCertificatesFromLegitimateHosts_doesNotallowNetworkCommunication { + NSURL *url = [NSURL URLWithString:@"https://localhost:9444"]; + BTHTTP *http = [[BTHTTP alloc] initWithBaseURL:url tokenizationKey:@"development_testing_integration_merchant_id"]; + http.pinnedCertificates = @[[NSData dataWithContentsOfFile:[[NSBundle bundleForClass:[self class]] pathForResource:@"good_root_cert" ofType:@"der"]]]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Callback invoked"]; + [http GET:@"heartbeat" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNil(body); + XCTAssertNil(response); + XCTAssertEqualObjects(error.domain, NSURLErrorDomain); + XCTAssertEqual(error.code, NSURLErrorServerCertificateUntrusted); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testBTHTTP_whenUsingNonSSLConnection_allowsNetworkCommunication { + NSURL *url = [NSURL URLWithString:@"http://localhost:9445/"]; + BTHTTP *http = [[BTHTTP alloc] initWithBaseURL:url tokenizationKey:@"development_testing_integration_merchant_id"]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Callback invoked"]; + [http GET:@"heartbeat" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +#endif + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/evil_root_cert.der b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/evil_root_cert.der new file mode 100644 index 0000000..45dec5c Binary files /dev/null and b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/evil_root_cert.der differ diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/evil_root_cert.pem b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/evil_root_cert.pem new file mode 100644 index 0000000..4d33be0 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/evil_root_cert.pem @@ -0,0 +1,63 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + c4:3f:63:74:d1:c2:3f:8b + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=CA, ST=California, O=All That is Evil, OU=All That is Evil Root CA + Validity + Not Before: Jun 4 17:46:36 2014 GMT + Not After : May 11 17:46:36 2114 GMT + Subject: C=CA, ST=California, O=All That is Evil, OU=All That is Evil Root CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:aa:cc:0d:cf:8c:f6:be:8f:61:af:69:09:d8:b4: + 9c:e3:7f:f1:81:1d:4d:c7:72:8f:cc:00:b4:60:01: + 4f:15:39:14:42:34:7f:f5:7c:76:ec:29:20:17:b1: + 44:e8:b8:ad:3a:8f:e1:6c:0f:4f:5d:82:d2:e0:8c: + 91:18:3d:bd:84:a6:58:06:90:d4:06:d3:93:0a:27: + 65:41:9b:8e:46:2d:28:d8:e4:60:d3:ec:ab:08:d5: + 9b:1e:34:1d:c2:ad:e1:23:9b:23:9f:7d:90:57:b5: + e8:8d:a3:12:84:88:7a:e0:79:7b:a1:18:3d:30:2e: + f0:bf:e8:07:e0:bf:2d:32:47 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + C5:27:18:DE:1E:17:5D:AA:D5:49:75:16:A6:45:E1:A6:49:1A:43:E3 + X509v3 Authority Key Identifier: + keyid:C5:27:18:DE:1E:17:5D:AA:D5:49:75:16:A6:45:E1:A6:49:1A:43:E3 + DirName:/C=CA/ST=California/O=All That is Evil/OU=All That is Evil Root CA + serial:C4:3F:63:74:D1:C2:3F:8B + + X509v3 Basic Constraints: + CA:TRUE + Signature Algorithm: sha1WithRSAEncryption + a3:8e:07:86:f8:70:56:dc:df:f2:fa:57:fe:a2:b6:fc:db:6e: + a7:b7:ec:f0:51:3a:f0:77:a3:6e:d7:2f:3b:cf:d8:b7:8a:7f: + fd:d0:50:ca:85:77:b4:ce:d2:bf:f4:d2:70:31:ce:c1:9f:f9: + 66:9a:74:7f:2b:97:c1:aa:3c:d2:96:ff:37:e1:1d:c2:10:31: + f4:8b:05:1e:1b:52:0e:52:66:12:eb:0a:b0:2a:4a:88:25:94: + ed:2a:9c:16:03:90:7b:6c:2b:30:78:ce:65:6b:24:e0:f9:e8: + 87:65:2a:e1:5d:3d:ed:ec:84:db:60:3d:23:ab:0f:7e:80:99: + 60:55 +-----BEGIN CERTIFICATE----- +MIIDBjCCAm+gAwIBAgIJAMQ/Y3TRwj+LMA0GCSqGSIb3DQEBBQUAMGAxCzAJBgNV +BAYTAkNBMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRkwFwYDVQQKExBBbGwgVGhhdCBp +cyBFdmlsMSEwHwYDVQQLExhBbGwgVGhhdCBpcyBFdmlsIFJvb3QgQ0EwIBcNMTQw +NjA0MTc0NjM2WhgPMjExNDA1MTExNzQ2MzZaMGAxCzAJBgNVBAYTAkNBMRMwEQYD +VQQIEwpDYWxpZm9ybmlhMRkwFwYDVQQKExBBbGwgVGhhdCBpcyBFdmlsMSEwHwYD +VQQLExhBbGwgVGhhdCBpcyBFdmlsIFJvb3QgQ0EwgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBAKrMDc+M9r6PYa9pCdi0nON/8YEdTcdyj8wAtGABTxU5FEI0f/V8 +duwpIBexROi4rTqP4WwPT12C0uCMkRg9vYSmWAaQ1AbTkwonZUGbjkYtKNjkYNPs +qwjVmx40HcKt4SObI599kFe16I2jEoSIeuB5e6EYPTAu8L/oB+C/LTJHAgMBAAGj +gcUwgcIwHQYDVR0OBBYEFMUnGN4eF12q1Ul1FqZF4aZJGkPjMIGSBgNVHSMEgYow +gYeAFMUnGN4eF12q1Ul1FqZF4aZJGkPjoWSkYjBgMQswCQYDVQQGEwJDQTETMBEG +A1UECBMKQ2FsaWZvcm5pYTEZMBcGA1UEChMQQWxsIFRoYXQgaXMgRXZpbDEhMB8G +A1UECxMYQWxsIFRoYXQgaXMgRXZpbCBSb290IENBggkAxD9jdNHCP4swDAYDVR0T +BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQCjjgeG+HBW3N/y+lf+orb8226nt+zw +UTrwd6Nu1y87z9i3in/90FDKhXe0ztK/9NJwMc7Bn/lmmnR/K5fBqjzSlv834R3C +EDH0iwUeG1IOUmYS6wqwKkqIJZTtKpwWA5B7bCsweM5layTg+eiHZSrhXT3t7ITb +YD0jqw9+gJlgVQ== +-----END CERTIFICATE----- diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/evil_root_key.pem b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/evil_root_key.pem new file mode 100644 index 0000000..2c86951 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/evil_root_key.pem @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXAIBAAKBgQCqzA3PjPa+j2GvaQnYtJzjf/GBHU3Hco/MALRgAU8VORRCNH/1 +fHbsKSAXsUTouK06j+FsD09dgtLgjJEYPb2EplgGkNQG05MKJ2VBm45GLSjY5GDT +7KsI1ZseNB3CreEjmyOffZBXteiNoxKEiHrgeXuhGD0wLvC/6Afgvy0yRwIDAQAB +AoGAfdQbEJ9PYRCM7Qe7Y1Wch9ZIe9C07o0t9yNFv7z3IDGPBT9cTeTGUDH0HMBS +fgkgRhaeAlg9Ji0tYpTsiClkJtLx8CRnOJE2ON4DSjV7X24Me4zeEobimWlfNU/6 +R1KGcbHBHlIedf+l0okPdMgveDp/25a/ekZZiv0sYHwI2IECQQDgRzHda1/AMtkH +Wq6Ycemwfu6CYiTDXvK/0ZOLZA/CrOBcWIkSPEAm3Obd5Zkc9XR6og4C7vm86JRo +g4k51honAkEAwvRiWiUGAPDw6htOiSGICBRtjThiwyvTgtQkcqqfilLrMjkLOZ8m +K8dsByfnkpCrv8ZRCTiznBRF43ohtk3a4QJAZsY5Q44AwsKKUaRsfc81l3uTMIxo +7F6GPwB67FVeI4e1CJxJs+GIREbWRLkCARM53TiF0zJPnxG1cG9WYvqJ4QJBAJWg +MRgUkE4KnixfNuCCrr/cxdP8Mbivm08u+KZVE8t7Jm5OX7Ii1o4FKYE4fD/97wNp +9uoH7bndyWH0a4laqaECQFxpY99GqpxsMkcbhsWWDvj4LxocCSfD4vgs8nJJprh5 +mQqau9VfIQFU6ify4C/2I662AG+DkgvFjt1rtow8rMU= +-----END RSA PRIVATE KEY----- diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/evil_site_cert.pem b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/evil_site_cert.pem new file mode 100644 index 0000000..1ddee35 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/evil_site_cert.pem @@ -0,0 +1,47 @@ +Certificate: + Data: + Version: 1 (0x0) + Serial Number: 1 (0x1) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=CA, ST=California, O=All That is Evil, OU=All That is Evil Root CA + Validity + Not Before: Jun 4 17:46:36 2014 GMT + Not After : May 11 17:46:36 2114 GMT + Subject: C=CA, ST=California, O=All That is Evil, OU=All That is Evil Site, CN=* + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:c4:d2:3f:0a:ad:03:b7:fb:fb:c4:0e:b1:39:78: + 18:02:b5:aa:4f:61:4d:6b:55:2c:01:f8:3d:83:32: + 5c:5d:7c:d6:13:cc:e2:c3:15:0b:ed:92:58:35:90: + 49:47:0a:10:36:dc:36:9c:c4:22:75:64:b7:69:8e: + 10:30:bc:64:ac:d8:cf:a5:5d:eb:27:b2:e7:a5:db: + 2e:47:4f:b2:f5:b6:97:da:1a:0a:6e:15:14:fc:4b: + 86:6a:16:b8:93:63:30:32:7f:dd:87:39:01:cc:17: + 27:6c:4e:cc:be:4f:02:75:44:46:fe:52:58:7b:43: + da:a1:36:5b:ec:83:b3:3f:db + Exponent: 65537 (0x10001) + Signature Algorithm: sha1WithRSAEncryption + a8:fe:44:33:5e:88:2c:e5:b7:ea:6a:04:62:92:d8:47:4c:bc: + fd:2f:c3:33:fb:6a:41:67:c8:f4:ae:87:86:89:a9:08:c4:a2: + 56:54:73:42:25:fa:62:59:b4:4f:39:43:9b:63:97:3b:a0:ee: + c9:bd:ff:1f:00:ae:92:52:82:b0:96:34:c9:bd:7a:ec:57:ef: + ba:cf:72:cf:62:bd:17:db:47:b8:58:b5:5b:e9:e4:25:0e:2f: + 7a:41:7a:68:7d:fd:c7:7d:e1:7b:e0:b9:6c:4a:d9:5c:aa:5e: + a1:61:62:80:09:69:59:16:7d:71:18:2b:8e:8f:2f:d5:94:93: + 3c:29 +-----BEGIN CERTIFICATE----- +MIICOjCCAaMCAQEwDQYJKoZIhvcNAQEFBQAwYDELMAkGA1UEBhMCQ0ExEzARBgNV +BAgTCkNhbGlmb3JuaWExGTAXBgNVBAoTEEFsbCBUaGF0IGlzIEV2aWwxITAfBgNV +BAsTGEFsbCBUaGF0IGlzIEV2aWwgUm9vdCBDQTAgFw0xNDA2MDQxNzQ2MzZaGA8y +MTE0MDUxMTE3NDYzNlowaTELMAkGA1UEBhMCQ0ExEzARBgNVBAgTCkNhbGlmb3Ju +aWExGTAXBgNVBAoTEEFsbCBUaGF0IGlzIEV2aWwxHjAcBgNVBAsTFUFsbCBUaGF0 +IGlzIEV2aWwgU2l0ZTEKMAgGA1UEAxQBKjCBnzANBgkqhkiG9w0BAQEFAAOBjQAw +gYkCgYEAxNI/Cq0Dt/v7xA6xOXgYArWqT2FNa1UsAfg9gzJcXXzWE8ziwxUL7ZJY +NZBJRwoQNtw2nMQidWS3aY4QMLxkrNjPpV3rJ7LnpdsuR0+y9baX2hoKbhUU/EuG +aha4k2MwMn/dhzkBzBcnbE7Mvk8CdURG/lJYe0PaoTZb7IOzP9sCAwEAATANBgkq +hkiG9w0BAQUFAAOBgQCo/kQzXogs5bfqagRikthHTLz9L8Mz+2pBZ8j0roeGiakI +xKJWVHNCJfpiWbRPOUObY5c7oO7Jvf8fAK6SUoKwljTJvXrsV++6z3LPYr0X20e4 +WLVb6eQlDi96QXpoff3HfeF74LlsStlcql6hYWKACWlZFn1xGCuOjy/VlJM8KQ== +-----END CERTIFICATE----- diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/evil_site_key.pem b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/evil_site_key.pem new file mode 100644 index 0000000..8373ca6 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/evil_site_key.pem @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQDE0j8KrQO3+/vEDrE5eBgCtapPYU1rVSwB+D2DMlxdfNYTzOLD +FQvtklg1kElHChA23DacxCJ1ZLdpjhAwvGSs2M+lXesnsuel2y5HT7L1tpfaGgpu +FRT8S4ZqFriTYzAyf92HOQHMFydsTsy+TwJ1REb+Ulh7Q9qhNlvsg7M/2wIDAQAB +AoGBAIHDO90GBJWghHTWWvHQw8PFkeuT8z74gHMr/yIoac0ZKOsVAcwsbBjNi2qF +Hkq/z8DbnwXsKevL40CscPAwxQ4oP4G8K66cdifBd/ErdvuCeynIPleMoCnUc6Ql +q+9sy6UopSoeW6hZ8FpBZN3GdQaGDeFab1Znxd4Ey/kOf0kBAkEA47L7dBw6+iGC +6fZ8icnBZuK7QCQIu089sXwVmnnxjaz4PIjce6H+680ItB2sBlSRUCV+fcM1Sk9S +ta2MR8480QJBAN1Ix7SMK8LXdZuSBgBOH0H4QlUivE9Aa90f2G9yUFn5PRTdxlou +m/vbAQ1YqywUz43RipaIwU+whxSx/a11rOsCQHYg1PNX8gDygch/Z/zT/tIxrpOI +Hj+OzKLXjR2nRfoKUn6VQk2hrW8H4AwRmL1wAjNiQE1eiLcUkARRFQXrqQECQQCy +OH7XdBl+uKd5H5eDwWe9aySJiwtdTQZStuZLhCcg//LpDmFFmsp4gv+K70IVo8Ey +eHSFHymKdCOnUF9+yAr3AkAzTmtyM1fd72u87sIIXP/cwDKBkMTiR9LuMTVY/KWb +JmhCbgijP+58ZvHOOHbmWKDSTK81r0AvBI8F3SyVHPm3 +-----END RSA PRIVATE KEY----- diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/evil_site_request.pem b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/evil_site_request.pem new file mode 100644 index 0000000..9fef5f0 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/evil_site_request.pem @@ -0,0 +1,40 @@ +Certificate Request: + Data: + Version: 0 (0x0) + Subject: C=CA, ST=California, O=All That is Evil, OU=All That is Evil Site, CN=* + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:c4:d2:3f:0a:ad:03:b7:fb:fb:c4:0e:b1:39:78: + 18:02:b5:aa:4f:61:4d:6b:55:2c:01:f8:3d:83:32: + 5c:5d:7c:d6:13:cc:e2:c3:15:0b:ed:92:58:35:90: + 49:47:0a:10:36:dc:36:9c:c4:22:75:64:b7:69:8e: + 10:30:bc:64:ac:d8:cf:a5:5d:eb:27:b2:e7:a5:db: + 2e:47:4f:b2:f5:b6:97:da:1a:0a:6e:15:14:fc:4b: + 86:6a:16:b8:93:63:30:32:7f:dd:87:39:01:cc:17: + 27:6c:4e:cc:be:4f:02:75:44:46:fe:52:58:7b:43: + da:a1:36:5b:ec:83:b3:3f:db + Exponent: 65537 (0x10001) + Attributes: + a0:00 + Signature Algorithm: sha1WithRSAEncryption + 35:7e:59:a7:c3:2e:56:7d:3f:8e:e3:63:0d:cc:de:b8:d7:6c: + 3a:d4:10:ab:08:90:ad:bd:af:c4:44:e2:b1:dc:b3:2a:de:1d: + 4c:35:93:fd:4a:95:86:9a:63:64:02:d5:fe:59:57:0a:b1:08: + cc:b5:4a:1b:c8:1d:08:2e:cc:05:98:85:92:5a:69:5f:de:7c: + a2:dc:d0:ef:ad:da:82:a6:a1:7e:0e:72:22:bf:a9:ca:7b:bc: + 3a:11:f7:9e:68:c3:04:40:ad:20:93:fe:d1:32:ab:86:fa:36: + 7c:96:ce:7b:d6:12:ab:3c:e9:a5:62:f6:2c:2d:b3:3d:06:b7: + 3d:f8 +-----BEGIN CERTIFICATE REQUEST----- +MIIBqTCCARICAQAwaTELMAkGA1UEBhMCQ0ExEzARBgNVBAgTCkNhbGlmb3JuaWEx +GTAXBgNVBAoTEEFsbCBUaGF0IGlzIEV2aWwxHjAcBgNVBAsTFUFsbCBUaGF0IGlz +IEV2aWwgU2l0ZTEKMAgGA1UEAxQBKjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC +gYEAxNI/Cq0Dt/v7xA6xOXgYArWqT2FNa1UsAfg9gzJcXXzWE8ziwxUL7ZJYNZBJ +RwoQNtw2nMQidWS3aY4QMLxkrNjPpV3rJ7LnpdsuR0+y9baX2hoKbhUU/EuGaha4 +k2MwMn/dhzkBzBcnbE7Mvk8CdURG/lJYe0PaoTZb7IOzP9sCAwEAAaAAMA0GCSqG +SIb3DQEBBQUAA4GBADV+WafDLlZ9P47jYw3M3rjXbDrUEKsIkK29r8RE4rHcsyre +HUw1k/1KlYaaY2QC1f5ZVwqxCMy1ShvIHQguzAWYhZJaaV/efKLc0O+t2oKmoX4O +ciK/qcp7vDoR955owwRArSCT/tEyq4b6NnyWznvWEqs86aVi9iwtsz0Gtz34 +-----END CERTIFICATE REQUEST----- diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/good_root_cert.pem b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/good_root_cert.pem new file mode 100644 index 0000000..21352d8 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/good_root_cert.pem @@ -0,0 +1,63 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + b9:6f:f6:ef:ab:b7:31:a9 + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=CA, ST=California, O=All That is Good, OU=All That is Good Root CA + Validity + Not Before: Jun 4 17:46:36 2014 GMT + Not After : May 11 17:46:36 2114 GMT + Subject: C=CA, ST=California, O=All That is Good, OU=All That is Good Root CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:dd:31:54:4a:7d:8f:5c:37:bd:4c:d5:e8:54:fd: + 06:d2:b9:0e:bd:89:d1:1d:22:17:7a:7e:14:0c:f2: + e6:4f:89:b4:41:ed:08:8d:2a:d1:4d:8e:05:92:ae: + 0c:83:f6:59:59:94:58:ae:15:2b:78:12:94:70:89: + 8a:af:9c:c8:a2:e8:c7:fd:e9:2e:d2:b1:7a:f5:bf: + 18:4c:a9:56:0c:b7:3b:8b:00:96:c6:25:02:ab:f7: + 97:94:30:7c:a0:bf:86:2a:55:2b:56:da:e1:d9:eb: + c1:ed:b1:8b:96:08:9e:26:f8:58:cb:ae:4a:cf:d9: + 4c:73:b2:83:4d:db:d7:68:a7 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + C2:D0:38:78:7D:3C:A3:CE:48:F2:25:FD:F9:AC:5B:80:DE:4B:F6:8B + X509v3 Authority Key Identifier: + keyid:C2:D0:38:78:7D:3C:A3:CE:48:F2:25:FD:F9:AC:5B:80:DE:4B:F6:8B + DirName:/C=CA/ST=California/O=All That is Good/OU=All That is Good Root CA + serial:B9:6F:F6:EF:AB:B7:31:A9 + + X509v3 Basic Constraints: + CA:TRUE + Signature Algorithm: sha1WithRSAEncryption + d1:3b:85:b0:7a:cb:cb:10:4d:cb:97:28:ad:7b:ea:a6:d5:1d: + 98:c7:b4:8c:d9:47:06:bc:ba:c3:aa:64:d5:97:65:d8:78:79: + c9:66:87:9f:8c:aa:eb:ac:d6:65:95:c5:8b:ba:bd:f3:15:54: + 01:64:21:0e:82:98:e8:2a:9c:de:80:a3:90:4f:5f:5a:69:7f: + d2:76:f9:f3:74:99:e2:9e:02:46:af:8c:04:e4:ea:5e:56:ee: + ef:93:ff:0a:72:44:4d:6a:b6:96:de:92:17:a9:3b:8f:86:77: + 49:2a:0a:64:0e:2e:8d:26:04:c5:f6:e6:15:ea:ad:86:62:67: + 14:6c +-----BEGIN CERTIFICATE----- +MIIDBjCCAm+gAwIBAgIJALlv9u+rtzGpMA0GCSqGSIb3DQEBBQUAMGAxCzAJBgNV +BAYTAkNBMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRkwFwYDVQQKExBBbGwgVGhhdCBp +cyBHb29kMSEwHwYDVQQLExhBbGwgVGhhdCBpcyBHb29kIFJvb3QgQ0EwIBcNMTQw +NjA0MTc0NjM2WhgPMjExNDA1MTExNzQ2MzZaMGAxCzAJBgNVBAYTAkNBMRMwEQYD +VQQIEwpDYWxpZm9ybmlhMRkwFwYDVQQKExBBbGwgVGhhdCBpcyBHb29kMSEwHwYD +VQQLExhBbGwgVGhhdCBpcyBHb29kIFJvb3QgQ0EwgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBAN0xVEp9j1w3vUzV6FT9BtK5Dr2J0R0iF3p+FAzy5k+JtEHtCI0q +0U2OBZKuDIP2WVmUWK4VK3gSlHCJiq+cyKLox/3pLtKxevW/GEypVgy3O4sAlsYl +Aqv3l5QwfKC/hipVK1ba4dnrwe2xi5YInib4WMuuSs/ZTHOyg03b12inAgMBAAGj +gcUwgcIwHQYDVR0OBBYEFMLQOHh9PKPOSPIl/fmsW4DeS/aLMIGSBgNVHSMEgYow +gYeAFMLQOHh9PKPOSPIl/fmsW4DeS/aLoWSkYjBgMQswCQYDVQQGEwJDQTETMBEG +A1UECBMKQ2FsaWZvcm5pYTEZMBcGA1UEChMQQWxsIFRoYXQgaXMgR29vZDEhMB8G +A1UECxMYQWxsIFRoYXQgaXMgR29vZCBSb290IENBggkAuW/276u3MakwDAYDVR0T +BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQDRO4WwesvLEE3Llyite+qm1R2Yx7SM +2UcGvLrDqmTVl2XYeHnJZoefjKrrrNZllcWLur3zFVQBZCEOgpjoKpzegKOQT19a +aX/SdvnzdJningJGr4wE5OpeVu7vk/8KckRNaraW3pIXqTuPhndJKgpkDi6NJgTF +9uYV6q2GYmcUbA== +-----END CERTIFICATE----- diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/good_root_key.pem b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/good_root_key.pem new file mode 100644 index 0000000..c9c229a --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/good_root_key.pem @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXAIBAAKBgQDdMVRKfY9cN71M1ehU/QbSuQ69idEdIhd6fhQM8uZPibRB7QiN +KtFNjgWSrgyD9llZlFiuFSt4EpRwiYqvnMii6Mf96S7SsXr1vxhMqVYMtzuLAJbG +JQKr95eUMHygv4YqVStW2uHZ68HtsYuWCJ4m+FjLrkrP2UxzsoNN29dopwIDAQAB +AoGBAKmOrOzFP2YTnFsQBp9PrzFNhs0onlJU1eaiS0B52q7SAooe59U/I17uJbuB +DDsEVw3iN/CKbd4HcB6scNGZv/ok3spb0We3kwKgii1+qIzmZ3qwkIqnTAhxISTU +QQ9euvPMoPcG1ZyZscU+2ayFGCy+MXQmArIuANlXFMJFp+SRAkEA7t4n9zUTbBk1 +TmSn8mWOUk7C3ir9pfKuY+qEAB8XdW4UTZbPZH0QaiwS+UkPa+byhWHpY4BG8BPR +LMgXLp55MwJBAO0OpCBJcmwV3WggaCRvwdD2hO56mwhuFwJGszxFBHma6/N6iuiB +KcIV3Wg7SwdgUCXNup6SMf6TzRJ8RjTUWr0CQF1Oak4mbW/MaQY2S2RkRzPfkD84 +i9xG79gXw3hIrOEyHrwwLNMUB1Vx4fd+koeTryhrFr/HW+5rz0mu319WiAECQHvW +Ni8Xr0p/cZY/t6exKhK7dV4PdoXE3Qg3XtKRS3ErWS9sSLyFHQdi3LLipqNH0Rau +jlrgDHXtSCfr+9EFThECQAaOPqp2W5OzrXu004VRnyi7W0/zs3ObptiaJJa9meY8 +5tG8cGFBY4lcdv7OkOx1GEDYPQEIyRa6RuzNUmIXwi4= +-----END RSA PRIVATE KEY----- diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/good_site_cert.pem b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/good_site_cert.pem new file mode 100644 index 0000000..4f95c27 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/good_site_cert.pem @@ -0,0 +1,48 @@ +Certificate: + Data: + Version: 1 (0x0) + Serial Number: 1 (0x1) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=CA, ST=California, O=All That is Good, OU=All That is Good Root CA + Validity + Not Before: Jun 4 17:46:36 2014 GMT + Not After : May 11 17:46:36 2114 GMT + Subject: C=CA, ST=California, O=All That is Good, OU=All That is Good Site, CN=localhost + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:ab:c9:bb:0a:6e:7a:b5:d8:40:a2:fb:83:47:e6: + a5:87:08:47:76:d1:ea:e7:16:70:21:cd:18:79:8b: + 27:40:80:10:1a:3b:b3:f8:2f:7b:88:d3:79:1e:b2: + 54:8f:2e:73:41:83:13:6f:8c:6d:58:f8:80:26:19: + 39:ae:8f:d1:c9:c7:c0:52:45:9b:2c:50:39:13:18: + 34:12:10:22:cb:90:a0:64:85:df:b3:7f:c1:17:94: + 50:c1:6b:ee:83:23:72:95:aa:87:2b:6a:0f:89:96: + 8e:85:b4:fc:d6:00:fe:97:a3:46:69:4c:53:67:0d: + 4a:ab:f5:b5:78:c9:88:34:93 + Exponent: 65537 (0x10001) + Signature Algorithm: sha1WithRSAEncryption + 32:b4:ab:b1:27:e1:72:53:fc:74:82:f7:95:6c:7d:ec:0e:f9: + 43:c5:2b:01:46:2f:f9:fd:ac:39:4c:90:4a:69:81:88:a6:fe: + 63:63:9f:a4:23:21:b5:88:53:c5:d4:e1:cf:90:48:eb:a0:eb: + 4a:6a:26:90:b6:ca:c0:fd:04:cd:66:6e:12:e8:63:91:e8:0f: + 46:a9:ff:a8:4a:c1:cf:b4:c4:61:4d:a2:02:25:77:d7:28:05: + 38:58:5c:8e:d2:91:c8:f1:63:d4:fb:4a:4e:6f:0c:2f:66:4d: + b5:54:91:6e:27:1c:8c:d0:e5:a2:73:4c:ae:f8:8d:5a:63:2d: + 96:be +-----BEGIN CERTIFICATE----- +MIICQjCCAasCAQEwDQYJKoZIhvcNAQEFBQAwYDELMAkGA1UEBhMCQ0ExEzARBgNV +BAgTCkNhbGlmb3JuaWExGTAXBgNVBAoTEEFsbCBUaGF0IGlzIEdvb2QxITAfBgNV +BAsTGEFsbCBUaGF0IGlzIEdvb2QgUm9vdCBDQTAgFw0xNDA2MDQxNzQ2MzZaGA8y +MTE0MDUxMTE3NDYzNlowcTELMAkGA1UEBhMCQ0ExEzARBgNVBAgTCkNhbGlmb3Ju +aWExGTAXBgNVBAoTEEFsbCBUaGF0IGlzIEdvb2QxHjAcBgNVBAsTFUFsbCBUaGF0 +IGlzIEdvb2QgU2l0ZTESMBAGA1UEAxMJbG9jYWxob3N0MIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQCrybsKbnq12ECi+4NH5qWHCEd20ernFnAhzRh5iydAgBAa +O7P4L3uI03keslSPLnNBgxNvjG1Y+IAmGTmuj9HJx8BSRZssUDkTGDQSECLLkKBk +hd+zf8EXlFDBa+6DI3KVqocrag+Jlo6FtPzWAP6Xo0ZpTFNnDUqr9bV4yYg0kwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBADK0q7En4XJT/HSC95VsfewO+UPFKwFGL/n9 +rDlMkEppgYim/mNjn6QjIbWIU8XU4c+QSOug60pqJpC2ysD9BM1mbhLoY5HoD0ap +/6hKwc+0xGFNogIld9coBThYXI7SkcjxY9T7Sk5vDC9mTbVUkW4nHIzQ5aJzTK74 +jVpjLZa+ +-----END CERTIFICATE----- diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/good_site_key.pem b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/good_site_key.pem new file mode 100644 index 0000000..65a6ca5 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/good_site_key.pem @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXwIBAAKBgQCrybsKbnq12ECi+4NH5qWHCEd20ernFnAhzRh5iydAgBAaO7P4 +L3uI03keslSPLnNBgxNvjG1Y+IAmGTmuj9HJx8BSRZssUDkTGDQSECLLkKBkhd+z +f8EXlFDBa+6DI3KVqocrag+Jlo6FtPzWAP6Xo0ZpTFNnDUqr9bV4yYg0kwIDAQAB +AoGBAKo7zk4YDSIGmoboFsA5n+6gFbF5c/5sDdJxG7/WVZ9lSI+2ejGHXDPK3Eu/ +DGyW60AQVEJGNlXka5lVhgOmIYzjOcd/yEFJm9AvmlPXWVKJ1mpz9geZ1tuT4R+d +zfq15nhJsU226JK1+5Ik0XJoSxEUkct0Mt//VlfDZRlKcE+BAkEA3oIh6hwFDef8 +MbLhjpvELCSXLRPadkBYxxi6pNjsUOI8A0g7IebRKYI9C+rpmTQffOXjYCyKpqep +GqbBkRVOnwJBAMWlM9oD+VZCGnNMQqnXFqSXGCtyftkSSfRFosDZk4cQk/398pVE +v58h0lcQslfH+QC2jNYlpWU5Z4omwiIluY0CQQDePXgGTqo1s4nPUe279JTBymI8 +oeHHzoldgrOZRxjxyKVMWe7F87biELVMm/tqDAePRkYOny51OmzKs9gOQwvdAkEA +tpyU8/KIBXK+DZmAXnwkp54S7tGy8c08Fz3fyl89N6XRlvNzlwcWJWmSdm8u2Hwj +TM1eAt51mrkXOUXmSLaiYQJBAJdjC9KRBorIk0cGS/SKAUn4ysoRgbp+aB3ErHwb +xjMCdohHDaHOJIkL1O8mzt6i3LQMitw+fURcTG2vGvHsS5I= +-----END RSA PRIVATE KEY----- diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/good_site_request.pem b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/good_site_request.pem new file mode 100644 index 0000000..a36c7ef --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/good_site_request.pem @@ -0,0 +1,41 @@ +Certificate Request: + Data: + Version: 0 (0x0) + Subject: C=CA, ST=California, O=All That is Good, OU=All That is Good Site, CN=localhost + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:ab:c9:bb:0a:6e:7a:b5:d8:40:a2:fb:83:47:e6: + a5:87:08:47:76:d1:ea:e7:16:70:21:cd:18:79:8b: + 27:40:80:10:1a:3b:b3:f8:2f:7b:88:d3:79:1e:b2: + 54:8f:2e:73:41:83:13:6f:8c:6d:58:f8:80:26:19: + 39:ae:8f:d1:c9:c7:c0:52:45:9b:2c:50:39:13:18: + 34:12:10:22:cb:90:a0:64:85:df:b3:7f:c1:17:94: + 50:c1:6b:ee:83:23:72:95:aa:87:2b:6a:0f:89:96: + 8e:85:b4:fc:d6:00:fe:97:a3:46:69:4c:53:67:0d: + 4a:ab:f5:b5:78:c9:88:34:93 + Exponent: 65537 (0x10001) + Attributes: + a0:00 + Signature Algorithm: sha1WithRSAEncryption + 4d:4c:d5:31:ef:1c:04:b0:a9:50:f4:98:e9:31:66:b2:44:f2: + 3c:80:97:a0:9b:20:3c:a1:7a:69:33:7f:5a:23:2a:2f:ac:12: + 15:f4:94:54:15:4f:3c:a0:d7:d2:c2:33:7e:e1:fd:c1:10:39: + 39:f2:28:bd:c7:d6:c2:36:c6:a0:d8:5f:d7:2f:56:92:07:e6: + 9d:8b:52:d3:93:0a:34:34:c8:e7:3a:7c:3d:48:73:6c:63:14: + 1f:a7:d1:bd:38:9f:ca:f8:84:33:db:9c:6b:80:86:a2:e5:4d: + 53:7d:c6:98:b3:7e:3a:f1:87:e1:b1:5c:81:dc:50:68:a9:91: + 19:aa +-----BEGIN CERTIFICATE REQUEST----- +MIIBsTCCARoCAQAwcTELMAkGA1UEBhMCQ0ExEzARBgNVBAgTCkNhbGlmb3JuaWEx +GTAXBgNVBAoTEEFsbCBUaGF0IGlzIEdvb2QxHjAcBgNVBAsTFUFsbCBUaGF0IGlz +IEdvb2QgU2l0ZTESMBAGA1UEAxMJbG9jYWxob3N0MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQCrybsKbnq12ECi+4NH5qWHCEd20ernFnAhzRh5iydAgBAaO7P4 +L3uI03keslSPLnNBgxNvjG1Y+IAmGTmuj9HJx8BSRZssUDkTGDQSECLLkKBkhd+z +f8EXlFDBa+6DI3KVqocrag+Jlo6FtPzWAP6Xo0ZpTFNnDUqr9bV4yYg0kwIDAQAB +oAAwDQYJKoZIhvcNAQEFBQADgYEATUzVMe8cBLCpUPSY6TFmskTyPICXoJsgPKF6 +aTN/WiMqL6wSFfSUVBVPPKDX0sIzfuH9wRA5OfIovcfWwjbGoNhf1y9WkgfmnYtS +05MKNDTI5zp8PUhzbGMUH6fRvTifyviEM9uca4CGouVNU33GmLN+OvGH4bFcgdxQ +aKmRGao= +-----END CERTIFICATE REQUEST----- diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/https_server.rb b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/https_server.rb new file mode 100755 index 0000000..188f7ed --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/https_server.rb @@ -0,0 +1,97 @@ +#!/usr/bin/env ruby +require 'webrick' +require 'webrick/https' +require 'openssl' + +BEGIN { File.write("#{ $0 }.pid", $$) } +END { File.delete("#{ $0 }.pid") } + +private_key_file = "#{__dir__}/good_site_key.pem" +cert_file = "#{__dir__}/good_site_cert.pem" +root_cert_file = "#{__dir__}/good_root_cert.pem" + +pkey = OpenSSL::PKey::RSA.new(File.read(private_key_file)) +cert = OpenSSL::X509::Certificate.new(File.read(cert_file)) +root_cert = OpenSSL::X509::Certificate.new(File.read(root_cert_file)) + +def log message + puts "[https_server] #{message}" +end + +good_server = WEBrick::HTTPServer.new( + :BindAddress => '0.0.0.0', + :Port => 9443, + :Logger => WEBrick::Log::new(nil, WEBrick::Log::ERROR), + :SSLEnable => true, + :SSLVerifyClient => OpenSSL::SSL::VERIFY_NONE, + :SSLCertificate => cert, + :SSLPrivateKey => pkey, + :SSLExtraChainCert => [root_cert] +) +good_server.mount_proc '/' do |req, res| + res.body = '{ "status": "ok", "server": "good" }' + res.content_type = 'application/json' +end + +evil_private_key_file = "#{__dir__}/evil_site_key.pem" +evil_cert_file = "#{__dir__}/evil_site_cert.pem" +evil_root_cert_file = "#{__dir__}/evil_root_cert.pem" + +pkey = OpenSSL::PKey::RSA.new(File.read(evil_private_key_file)) +cert = OpenSSL::X509::Certificate.new(File.read(evil_cert_file)) +root_cert = OpenSSL::X509::Certificate.new(File.read(evil_root_cert_file)) + +evil_server = WEBrick::HTTPServer.new( + :BindAddress => '0.0.0.0', + :Port => 9444, + :Logger => WEBrick::Log::new(nil, WEBrick::Log::ERROR), + :SSLEnable => true, + :SSLVerifyClient => OpenSSL::SSL::VERIFY_NONE, + :SSLCertificate => cert, + :SSLPrivateKey => pkey, + :SSLExtraChainCert => [root_cert] +) +evil_server.mount_proc '/' do |req, res| + res.body = '{ "status": "ok", "server": "evil" }' + res.content_type = 'application/json' +end + +http_server = WEBrick::HTTPServer.new( + :BindAddress => '0.0.0.0', + :Port => 9445, + :Logger => WEBrick::Log::new(nil, WEBrick::Log::ERROR), + :SSLEnable => false, +) +http_server.mount_proc '/' do |req, res| + res.body = '{ "status": "ok", "server": "non-ssl" }' + res.content_type = 'application/json' +end + +t1 = Thread.new do + log 'Starting good server on :9443' + $stdout.flush + good_server.start +end + +t2 = Thread.new do + log 'Starting evil server on :9444' + $stdout.flush + evil_server.start +end + +t3 = Thread.new do + log 'Starting http server on :9445' + $stdout.flush + http_server.start +end + +trap("INT") do + log 'Shutting down...' + t1.kill; + t2.kill; + t3.kill +end + +t1.join +t2.join +t3.join diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/make_certs.sh b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/make_certs.sh new file mode 100755 index 0000000..e793d70 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/SSL/make_certs.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env zsh + +set -ve + +# Make Good Root CA with new key +openssl req -new -newkey rsa:1024 -keyout good_root_key.pem -nodes -x509 -days 36500 -out good_root_cert.pem -subj "/C=CA/ST=California/O=All That is Good/OU=All That is Good Root CA" -text + +# Make Good Site Req with new key +openssl req -new -newkey rsa:1024 -keyout good_site_key.pem -nodes -days 36500 -out good_site_request.pem -subj "/C=CA/ST=California/O=All That is Good/OU=All That is Good Site/CN=localhost" -text + +# Sign Good Site Req with new key +openssl x509 -in good_site_request.pem -req -CA good_root_cert.pem -CAkey good_root_key.pem -days 36500 -set_serial 1 -out good_site_cert.pem -text + +# Make Evil Root CA with new key +openssl req -new -newkey rsa:1024 -keyout evil_root_key.pem -nodes -x509 -days 36500 -out evil_root_cert.pem -subj "/C=CA/ST=California/O=All That is Evil/OU=All That is Evil Root CA" -text + +# Make Evil Site Req with new key +openssl req -new -newkey rsa:1024 -keyout evil_site_key.pem -nodes -days 36500 -out evil_site_request.pem -subj "/C=CA/ST=California/O=All That is Evil/OU=All That is Evil Site/CN=*" -text + +# Sign Evil Site Req with new key +openssl x509 -in evil_site_request.pem -req -CA evil_root_cert.pem -CAkey evil_root_key.pem -days 36500 -set_serial 1 -out evil_site_cert.pem -text + +# Encode certificates for iOS Specs +openssl x509 -in good_root_cert.pem -inform pem -out good_root_cert.der -outform der + +set +v +echo '=============================' +echo Verifying newly created certs +echo '=============================' + +# Verify +openssl verify -verbose -purpose sslclient -CAfile good_root_cert.pem good_site_cert.pem +openssl verify -verbose -purpose sslclient -CAfile evil_root_cert.pem good_site_cert.pem + +openssl verify -verbose -purpose sslclient -CAfile good_root_cert.pem evil_site_cert.pem +openssl verify -verbose -purpose sslclient -CAfile evil_root_cert.pem evil_site_cert.pem diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/good_root_cert.der b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/good_root_cert.der new file mode 100644 index 0000000..6441742 Binary files /dev/null and b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Braintree-API-Integration-Specs/good_root_cert.der differ diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/BraintreeAmericanExpress_IntegrationTests.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/BraintreeAmericanExpress_IntegrationTests.m new file mode 100644 index 0000000..f1355f7 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/BraintreeAmericanExpress_IntegrationTests.m @@ -0,0 +1,123 @@ +#import "BTIntegrationTestsHelper.h" +#import +#import +#import +#import +#import + +@interface BTAmericanExpressClient_IntegrationTests : XCTestCase +@end + +@implementation BTAmericanExpressClient_IntegrationTests + +- (void)testGetRewardsBalance_whenCardIsValid_returnsPayload_withRewardsBalance { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_CLIENT_TOKEN_VERSION_3]; + BTCardClient *client = [[BTCardClient alloc] initWithAPIClient:apiClient]; + BTAmericanExpressClient *amexClient = [[BTAmericanExpressClient alloc] initWithAPIClient:apiClient]; + BTCard *card = [self successCard]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Get rewards"]; + [client tokenizeCard:card completion:^(BTCardNonce * _Nullable tokenizedCard, NSError * _Nullable error) { + expect(error).to.beNil(); + expect(tokenizedCard.nonce.isANonce).to.beTruthy(); + NSString *nonce = tokenizedCard.nonce; + [amexClient getRewardsBalanceForNonce:nonce currencyIsoCode:@"USD" completion:^(BTAmericanExpressRewardsBalance * _Nullable payload, NSError * _Nullable error) { + expect(error).to.beNil(); + expect(payload.conversionRate).toNot.beNil(); + expect(payload.currencyAmount).toNot.beNil(); + expect(payload.currencyIsoCode).toNot.beNil(); + expect(payload.requestId).toNot.beNil(); + expect(payload.rewardsAmount).toNot.beNil(); + expect(payload.rewardsUnit).toNot.beNil(); + expect(payload.errorCode).to.beNil(); + expect(payload.errorMessage).to.beNil(); + [expectation fulfill]; + }]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testGetRewardsBalance_whenCardHasInsufficientPoints_returnsPayload_withError { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_CLIENT_TOKEN_VERSION_3]; + BTCardClient *client = [[BTCardClient alloc] initWithAPIClient:apiClient]; + BTAmericanExpressClient *amexClient = [[BTAmericanExpressClient alloc] initWithAPIClient:apiClient]; + BTCard *card = [self insufficientPointsCard]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Get rewards"]; + [client tokenizeCard:card completion:^(BTCardNonce * _Nullable tokenizedCard, NSError * _Nullable error) { + expect(error).to.beNil(); + expect(tokenizedCard.nonce.isANonce).to.beTruthy(); + NSString *nonce = tokenizedCard.nonce; + [amexClient getRewardsBalanceForNonce:nonce currencyIsoCode:@"USD" completion:^(BTAmericanExpressRewardsBalance * _Nullable payload, NSError * _Nullable error) { + expect(error).to.beNil(); + expect(payload.conversionRate).to.beNil(); + expect(payload.currencyAmount).to.beNil(); + expect(payload.currencyIsoCode).to.beNil(); + expect(payload.requestId).to.beNil(); + expect(payload.rewardsAmount).to.beNil(); + expect(payload.rewardsUnit).to.beNil(); + expect(payload.errorCode).to.match(@"INQ2003"); + expect(payload.errorMessage).toNot.beNil(); + [expectation fulfill]; + }]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testGetRewardsBalance_whenCardIsIneligible_returnsPayload_withError { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_CLIENT_TOKEN_VERSION_3]; + BTCardClient *client = [[BTCardClient alloc] initWithAPIClient:apiClient]; + BTAmericanExpressClient *amexClient = [[BTAmericanExpressClient alloc] initWithAPIClient:apiClient]; + BTCard *card = [self ineligibleCard]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Get rewards"]; + [client tokenizeCard:card completion:^(BTCardNonce * _Nullable tokenizedCard, NSError * _Nullable error) { + expect(error).to.beNil(); + expect(tokenizedCard.nonce.isANonce).to.beTruthy(); + NSString *nonce = tokenizedCard.nonce; + [amexClient getRewardsBalanceForNonce:nonce currencyIsoCode:@"USD" completion:^(BTAmericanExpressRewardsBalance * _Nullable payload, NSError * _Nullable error) { + expect(error).to.beNil(); + expect(payload.conversionRate).to.beNil(); + expect(payload.currencyAmount).to.beNil(); + expect(payload.currencyIsoCode).to.beNil(); + expect(payload.requestId).to.beNil(); + expect(payload.rewardsAmount).to.beNil(); + expect(payload.rewardsUnit).to.beNil(); + expect(payload.errorCode).to.match(@"INQ2002"); + expect(payload.errorMessage).toNot.beNil(); + [expectation fulfill]; + }]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +#pragma mark - Helpers + +- (BTCard *)successCard { + BTCard *card = [[BTCard alloc] init]; + card.number = @"371260714673002"; + card.expirationMonth = @"12"; + card.expirationYear = @"2020"; + return card; +} + +- (BTCard *)insufficientPointsCard { + BTCard *card = [[BTCard alloc] init]; + card.number = @"371544868764018"; + card.expirationMonth = @"12"; + card.expirationYear = @"2020"; + return card; +} + +- (BTCard *)ineligibleCard { + BTCard *card = [[BTCard alloc] init]; + card.number = @"378267515471109"; + card.expirationMonth = @"12"; + card.expirationYear = @"2020"; + return card; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/BraintreeApplePay_IntegrationTests.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/BraintreeApplePay_IntegrationTests.m new file mode 100644 index 0000000..685e484 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/BraintreeApplePay_IntegrationTests.m @@ -0,0 +1,43 @@ +#import +#import "BTIntegrationTestsHelper.h" +#import +#import + +@interface BraintreeApplePay_IntegrationTests : XCTestCase + +@end + +@implementation BraintreeApplePay_IntegrationTests + +- (void)testTokenizeApplePayPayment_whenApplePayEnabledInControlPanel_returnsANonce { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_TOKENIZATION_KEY]; + BTApplePayClient *client = [[BTApplePayClient alloc] initWithAPIClient:apiClient]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Tokenize Apple Pay payment"]; + [client tokenizeApplePayPayment:[[PKPayment alloc] init] + completion:^(BTApplePayCardNonce * _Nullable tokenizedApplePayPayment, NSError * _Nullable error) { + XCTAssertTrue(tokenizedApplePayPayment.nonce.isANonce); + XCTAssertNil(error); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testTokenizeApplePayPayment_whenApplePayDisabledInControlPanel_returnsError { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_TOKENIZATION_KEY_APPLE_PAY_DISABLED]; + BTApplePayClient *client = [[BTApplePayClient alloc] initWithAPIClient:apiClient]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Tokenize Apple Pay payment"]; + [client tokenizeApplePayPayment:[[PKPayment alloc] init] + completion:^(BTApplePayCardNonce * _Nullable tokenizedApplePayPayment, NSError * _Nullable error) { + XCTAssertEqualObjects(error.domain, BTApplePayErrorDomain); + XCTAssertEqual(error.code, BTApplePayErrorTypeUnsupported); + XCTAssertNil(tokenizedApplePayPayment); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/BraintreeCard_IntegrationTests.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/BraintreeCard_IntegrationTests.m new file mode 100644 index 0000000..90784cc --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/BraintreeCard_IntegrationTests.m @@ -0,0 +1,162 @@ +#import "BTIntegrationTestsHelper.h" +#import +#import +#import +#import + +@interface BTCardClient_IntegrationTests : XCTestCase +@end + +@implementation BTCardClient_IntegrationTests + +- (void)testTokenizeCard_whenCardHasValidationDisabledAndCardIsInvalid_tokenizesSuccessfully { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_TOKENIZATION_KEY]; + BTCardClient *client = [[BTCardClient alloc] initWithAPIClient:apiClient]; + BTCard *card = [self invalidCard]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Tokenize card"]; + [client tokenizeCard:card completion:^(BTCardNonce * _Nullable tokenizedCard, NSError * _Nullable error) { + expect(tokenizedCard.nonce.isANonce).to.beTruthy(); + expect(tokenizedCard.threeDSecureInfo.wasVerified).to.beFalsy(); + expect(error).to.beNil(); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testTokenizeCard_whenCardIsInvalidAndValidationIsEnabled_failsWithExpectedValidationError { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_CLIENT_TOKEN]; + BTCardClient *client = [[BTCardClient alloc] initWithAPIClient:apiClient]; + BTCard *card = [[BTCard alloc] initWithNumber:@"123" expirationMonth:@"12" expirationYear:@"2020" cvv:nil]; + card.shouldValidate = YES; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Tokenize card"]; + [client tokenizeCard:card completion:^(BTCardNonce * _Nullable tokenizedCard, NSError * _Nullable error) { + XCTAssertNil(tokenizedCard); + XCTAssertEqualObjects(error.domain, BTCardClientErrorDomain); + XCTAssertEqual(error.code, BTCardClientErrorTypeCustomerInputInvalid); + XCTAssertEqualObjects(error.localizedDescription, @"Input is invalid"); + XCTAssertEqualObjects(error.localizedFailureReason, @"Credit card number must be 12-19 digits"); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testTokenizeCard_whenCardHasValidationDisabledAndCardIsValid_tokenizesSuccessfully { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_TOKENIZATION_KEY]; + BTCardClient *client = [[BTCardClient alloc] initWithAPIClient:apiClient]; + BTCard *card = [self validCard]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Tokenize card"]; + [client tokenizeCard:card completion:^(BTCardNonce * _Nullable tokenizedCard, NSError * _Nullable error) { + expect(tokenizedCard.nonce.isANonce).to.beTruthy(); + expect(tokenizedCard.binData.prepaid).toNot.beNil(); + expect(tokenizedCard.binData.healthcare).toNot.beNil(); + expect(tokenizedCard.binData.debit).toNot.beNil(); + expect(tokenizedCard.binData.durbinRegulated).toNot.beNil(); + expect(tokenizedCard.binData.commercial).toNot.beNil(); + expect(tokenizedCard.binData.payroll).toNot.beNil(); + expect(tokenizedCard.binData.issuingBank).toNot.beNil(); + expect(tokenizedCard.binData.countryOfIssuance).toNot.beNil(); + expect(tokenizedCard.binData.productId).toNot.beNil(); + expect(tokenizedCard.threeDSecureInfo.liabilityShiftPossible).to.beFalsy(); + expect(tokenizedCard.threeDSecureInfo.liabilityShifted).to.beFalsy(); + expect(tokenizedCard.threeDSecureInfo.wasVerified).to.beFalsy(); + expect(error).to.beNil(); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + + +- (void)testTokenizeCard_whenUsingTokenizationKeyAndCardHasValidationEnabled_failsWithAuthorizationError { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_TOKENIZATION_KEY]; + BTCardClient *client = [[BTCardClient alloc] initWithAPIClient:apiClient]; + BTCard *card = [self invalidCard]; + card.shouldValidate = YES; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Tokenize card"]; + [client tokenizeCard:card completion:^(BTCardNonce * _Nullable tokenizedCard, NSError * _Nullable error) { + XCTAssertNil(tokenizedCard); + expect(error.domain).to.equal(BTHTTPErrorDomain); + expect(error.code).to.equal(BTHTTPErrorCodeClientError); + NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)error.userInfo[BTHTTPURLResponseKey]; + expect(httpResponse.statusCode).to.equal(403); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testTokenizeCard_whenUsingClientTokenAndCardHasValidationEnabledAndCardIsValid_tokenizesSuccessfully { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_CLIENT_TOKEN]; + BTCardClient *client = [[BTCardClient alloc] initWithAPIClient:apiClient]; + BTCard *card = [self validCard]; + card.shouldValidate = YES; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Tokenize card"]; + [client tokenizeCard:card completion:^(BTCardNonce * _Nullable tokenizedCard, NSError * _Nullable error) { + expect(tokenizedCard.nonce.isANonce).to.beTruthy(); + expect(tokenizedCard.threeDSecureInfo.wasVerified).to.beFalsy(); + expect(error).to.beNil(); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testTokenizeCard_whenUsingVersionThreeClientTokenAndCardHasValidationEnabledAndCardIsValid_tokenizesSuccessfully { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_CLIENT_TOKEN_VERSION_3]; + BTCardClient *client = [[BTCardClient alloc] initWithAPIClient:apiClient]; + BTCard *card = [self validCard]; + card.shouldValidate = YES; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Tokenize card"]; + [client tokenizeCard:card completion:^(BTCardNonce * _Nullable tokenizedCard, NSError * _Nullable error) { + expect(tokenizedCard.nonce.isANonce).to.beTruthy(); + expect(tokenizedCard.threeDSecureInfo.wasVerified).to.beFalsy(); + expect(error).to.beNil(); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testTokenizeCard_withCVVOnly_tokenizesSuccessfully { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_CLIENT_TOKEN_VERSION_3]; + BTCardClient *client = [[BTCardClient alloc] initWithAPIClient:apiClient]; + BTCard *card = [[BTCard alloc] init]; + card.cvv = @"123"; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Tokenize card"]; + [client tokenizeCard:card completion:^(BTCardNonce * _Nullable tokenizedCard, NSError * _Nullable error) { + expect(tokenizedCard.nonce.isANonce).to.beTruthy(); + expect(error).to.beNil(); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +#pragma mark - Helpers + +- (BTCard *)invalidCard { + BTCard *card = [[BTCard alloc] init]; + card.number = @"123123"; + card.expirationMonth = @"XX"; + card.expirationYear = @"XXXX"; + return card; +} + +- (BTCard *)validCard { + BTCard *card = [[BTCard alloc] init]; + card.number = @"4111111111111111"; + card.expirationMonth = @"12"; + card.expirationYear = @"2018"; + return card; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/BraintreeDataCollector_IntegrationTests.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/BraintreeDataCollector_IntegrationTests.m new file mode 100644 index 0000000..0ca1ac6 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/BraintreeDataCollector_IntegrationTests.m @@ -0,0 +1,114 @@ +#import "BraintreeDataCollector.h" +#import "KDataCollector.h" +#import +#import + +@interface BraintreeDataCollector_IntegrationTests : XCTestCase +@property (nonatomic, strong) BTDataCollector *dataCollector; +@end + +@implementation BraintreeDataCollector_IntegrationTests + +- (void)setUp { + [super setUp]; + BTAPIClient *client = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_TOKENIZATION_KEY]; + self.dataCollector = [[BTDataCollector alloc] initWithAPIClient:client]; +} + +- (void)tearDown { + [super tearDown]; + self.dataCollector = nil; +} + +#pragma mark - collectFraudData: + +- (void)testCollectFraudData_returnsFraudData { + XCTestExpectation *expectation = [self expectationWithDescription:@"Callback invoked"]; + + [self.dataCollector collectFraudData:^(NSString * _Nonnull deviceData) { + XCTAssertTrue([deviceData containsString:@"correlation_id"]); + XCTAssertTrue([deviceData containsString:@"device_session_id"]); + XCTAssertTrue([deviceData containsString:@"fraud_merchant_id"]); + [expectation fulfill]; + }]; + [self waitForExpectationsWithTimeout:10 handler:nil]; +} + +// Test is failing because sandbox test merchant is configured with a Kount merchant ID that causes Kount to error. +- (void)pendCollectFraudDataWithCallback_returnsFraudData { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_TOKENIZATION_KEY]; + self.dataCollector = [[BTDataCollector alloc] initWithAPIClient:apiClient]; + id delegate = OCMProtocolMock(@protocol(BTDataCollectorDelegate)); + self.dataCollector.delegate = delegate; + XCTestExpectation *expectation = [self expectationWithDescription:@"Delegate received completion callback"]; + OCMStub([delegate dataCollectorDidComplete:self.dataCollector]).andDo(^(__unused NSInvocation *invocation) { + [expectation fulfill]; + }); + + XCTestExpectation *callbackExpectation = [self expectationWithDescription:@"Callback invoked"]; + [self.dataCollector collectFraudData:^(NSString * _Nonnull deviceData) { + XCTAssertTrue([deviceData containsString:@"correlation_id"]); + [callbackExpectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:10 handler:nil]; +} + +// Test is failing because sandbox test merchant is configured with a Kount merchant ID that causes Kount to error. +- (void)pendCollectCardFraudDataWithCallback_returnsFraudDataWithNoPayPalFraudData { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_TOKENIZATION_KEY]; + self.dataCollector = [[BTDataCollector alloc] initWithAPIClient:apiClient]; + + id delegate = OCMProtocolMock(@protocol(BTDataCollectorDelegate)); + self.dataCollector.delegate = delegate; + XCTestExpectation *expectation = [self expectationWithDescription:@"Delegate received completion callback"]; + OCMStub([delegate dataCollectorDidComplete:self.dataCollector]).andDo(^(__unused NSInvocation *invocation) { + [expectation fulfill]; + }); + + XCTestExpectation *callbackExpectation = [self expectationWithDescription:@"Callback invoked"]; + [self.dataCollector collectCardFraudData:^(NSString * _Nonnull deviceData) { + XCTAssertNotNil(deviceData); + XCTAssertFalse([deviceData containsString:@"correlation_id"]); + [callbackExpectation fulfill]; + }]; + + + [self waitForExpectationsWithTimeout:10 handler:nil]; +} + +- (void)testCollectCardFraudData_returnsFraudDataWithNoPayPalFraudData { + XCTestExpectation *expectation = [self expectationWithDescription:@"Callback invoked"]; + [self.dataCollector collectCardFraudData:^(NSString * _Nonnull deviceData) { + XCTAssertNotNil(deviceData); + XCTAssertFalse([deviceData containsString:@"correlation_id"]); + [expectation fulfill]; + }]; + [self waitForExpectationsWithTimeout:10 handler:nil]; +} + +// Test is failing because Kount is no longer async and doesn't return errors +- (void)pendCollectCardFraudData_whenMerchantIDIsInvalid_invokesErrorCallback { + [self.dataCollector setFraudMerchantId:@"-1"]; + XCTestExpectation *expectation = [self expectationWithDescription:@"Error callback invoked"]; + + [self.dataCollector collectCardFraudData:^(NSString * _Nonnull deviceData) { + NSLog(@"%@", deviceData); + //XCTAssertEqualObjects(error.localizedDescription, @"Merchant ID formatted incorrectly."); + //XCTAssertEqual(error.code, (NSInteger)KDataCollectorErrorCodeBadParameter); + [expectation fulfill]; + }]; + [self waitForExpectationsWithTimeout:10 handler:nil]; +} + +- (void)testCollectPayPalClientMetadataId_returnsClientMetadataId { + XCTestExpectation *expectation = [self expectationWithDescription:@"Callback invoked"]; + [self.dataCollector collectFraudData:^(NSString * _Nonnull deviceData) { + XCTAssertTrue([deviceData containsString:@"correlation_id"]); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/BraintreePayPal_IntegrationTests.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/BraintreePayPal_IntegrationTests.m new file mode 100644 index 0000000..a5a833a --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/BraintreePayPal_IntegrationTests.m @@ -0,0 +1,672 @@ +#import +#import +#import +#import "BTIntegrationTestsHelper.h" +#import +#import + +@interface BTAppSwitchTestDelegate : NSObject +@property (nonatomic, strong) XCTestExpectation *willPerform; +@property (nonatomic, strong) XCTestExpectation *didPerform; +@property (nonatomic, strong) XCTestExpectation *willProcess; +@property (nonatomic, strong) id lastAppSwitcher; +@property (nonatomic, assign) BTAppSwitchTarget lastTarget; +@end + +@implementation BTAppSwitchTestDelegate + +- (void)appSwitcherWillPerformAppSwitch:(id)appSwitcher { + self.lastAppSwitcher = appSwitcher; + [self.willPerform fulfill]; +} + +- (void)appSwitcher:(id)appSwitcher didPerformSwitchToTarget:(BTAppSwitchTarget)target { + self.lastTarget = target; + self.lastAppSwitcher = appSwitcher; + [self.didPerform fulfill]; +} + +- (void)appSwitcherWillProcessPaymentInfo:(id)appSwitcher { + self.lastAppSwitcher = appSwitcher; + [self.willProcess fulfill]; +} + +@end + +@interface BTViewControllerPresentingTestDelegate : NSObject +@property (nonatomic, strong) XCTestExpectation *requestsPresentationExpectation; +@property (nonatomic, strong) XCTestExpectation *requestsDismissalExpectation; +@property (nonatomic, strong) id lastDriver; +@property (nonatomic, strong) id lastViewController; +@end + +@implementation BTViewControllerPresentingTestDelegate + +- (void)paymentDriver:(id)driver requestsDismissalOfViewController:(UIViewController *)viewController { + self.lastDriver = driver; + self.lastViewController = viewController; + [self.requestsDismissalExpectation fulfill]; +} + +- (void)paymentDriver:(id)driver requestsPresentationOfViewController:(UIViewController *)viewController { + self.lastDriver = driver; + self.lastViewController = viewController; + [self.requestsPresentationExpectation fulfill]; +} + +@end + +@interface BTPayPalApprovalHandlerTestDelegate : NSObject +@property (nonatomic, strong) XCTestExpectation *handleApprovalExpectation; +@property (nonatomic, strong) NSURL *url; +@property (nonatomic, assign) BOOL cancel; +@end + +@implementation BTPayPalApprovalHandlerTestDelegate + +- (void)handleApproval:(__unused PPOTRequest *)request paypalApprovalDelegate:(id)delegate { + if (self.cancel) { + [delegate onApprovalCancel]; + } else { + [delegate onApprovalComplete:self.url]; + } + [self.handleApprovalExpectation fulfill]; +} + +@end + + +@interface BraintreePayPal_IntegrationTests : XCTestCase +@property (nonatomic, strong) NSNumber *didReceiveCompletionCallback; +// We keep a reference to these stub delegates so they don't get released! +@property (nonatomic, strong) BTViewControllerPresentingTestDelegate *viewControllerPresentingDelegate; +@property (nonatomic, strong) BTAppSwitchTestDelegate *appSwitchDelegate; + +@end + + +@implementation BraintreePayPal_IntegrationTests + +NSString * const OneTouchCoreAppSwitchSuccessURLFixture = @"com.braintreepayments.Demo.payments://onetouch/v1/success?payload=eyJ2ZXJzaW9uIjoyLCJhY2NvdW50X2NvdW50cnkiOiJVUyIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiZW52aXJvbm1lbnQiOiJtb2NrIiwiZXhwaXJlc19pbiI6LTEsImRpc3BsYXlfbmFtZSI6Im1vY2tEaXNwbGF5TmFtZSIsInNjb3BlIjoiaHR0cHM6XC9cL3VyaS5wYXlwYWwuY29tXC9zZXJ2aWNlc1wvcGF5bWVudHNcL2Z1dHVyZXBheW1lbnRzIiwiZW1haWwiOiJtb2NrZW1haWxhZGRyZXNzQG1vY2suY29tIiwiYXV0aG9yaXphdGlvbl9jb2RlIjoibW9ja1RoaXJkUGFydHlBdXRob3JpemF0aW9uQ29kZSJ9&x-source=com.paypal.ppclient.touch.v1-or-v2"; + +#pragma mark - Authorization (Future Payments) + +- (void)testFuturePayments_withTokenizationKey_tokenizesPayPalAccount { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_TOKENIZATION_KEY]; + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:apiClient]; + payPalDriver.disableSFAuthenticationSession = YES; + [BTAppSwitch sharedInstance].returnURLScheme = @"com.braintreepayments.Demo.payments"; + payPalDriver.clientMetadataId = @"fake-client-metadata-id"; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Tokenized PayPal Account"]; + [payPalDriver authorizeAccountWithCompletion:^(BTPayPalAccountNonce *tokenizedPayPalAccount, NSError *error) { + XCTAssertTrue(tokenizedPayPalAccount.nonce.isANonce); + XCTAssertNil(error); + [expectation fulfill]; + }]; + + [BTPayPalDriver handleAppSwitchReturnURL:[NSURL URLWithString:OneTouchCoreAppSwitchSuccessURLFixture]]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testFuturePayments_withClientToken_tokenizesPayPalAccount { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_CLIENT_TOKEN]; + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:apiClient]; + payPalDriver.disableSFAuthenticationSession = YES; + id stubDelegate = [[BTViewControllerPresentingTestDelegate alloc] init]; + payPalDriver.viewControllerPresentingDelegate = stubDelegate; + [BTAppSwitch sharedInstance].returnURLScheme = @"com.braintreepayments.Demo.payments"; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Tokenized PayPal Account"]; + [payPalDriver authorizeAccountWithAdditionalScopes:[NSSet set] forceFuturePaymentFlow:YES completion:^(BTPayPalAccountNonce * _Nonnull tokenizedPayPalAccount, NSError * _Nonnull error) { + XCTAssertTrue(tokenizedPayPalAccount.nonce.isANonce); + XCTAssertNil(error); + [expectation fulfill]; + }]; + + [BTPayPalDriver handleAppSwitchReturnURL:[NSURL URLWithString:OneTouchCoreAppSwitchSuccessURLFixture]]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testFuturePayments_whenReturnURLSchemeIsMissing_returnsError { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_TOKENIZATION_KEY]; + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:apiClient]; + payPalDriver.disableSFAuthenticationSession = YES; + id stubDelegate = [[BTViewControllerPresentingTestDelegate alloc] init]; + payPalDriver.viewControllerPresentingDelegate = stubDelegate; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Callback invoked"]; + [payPalDriver authorizeAccountWithAdditionalScopes:[NSSet set] forceFuturePaymentFlow:YES completion:^(BTPayPalAccountNonce * _Nonnull tokenizedPayPalAccount, NSError * _Nonnull error) { + XCTAssertNil(tokenizedPayPalAccount); + XCTAssertEqualObjects(error.domain, BTPayPalDriverErrorDomain); + XCTAssertEqual(error.code, BTPayPalDriverErrorTypeIntegrationReturnURLScheme); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testFuturePayments_whenReturnURLSchemeIsInvalid_returnsError { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_TOKENIZATION_KEY]; + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:apiClient]; + payPalDriver.disableSFAuthenticationSession = YES; + id stubDelegate = [[BTViewControllerPresentingTestDelegate alloc] init]; + payPalDriver.viewControllerPresentingDelegate = stubDelegate; + [BTAppSwitch sharedInstance].returnURLScheme = @"not-my-app-bundle-id"; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Callback invoked"]; + [payPalDriver authorizeAccountWithAdditionalScopes:[NSSet set] forceFuturePaymentFlow:YES completion:^(BTPayPalAccountNonce * _Nonnull tokenizedPayPalAccount, NSError * _Nonnull error) { + XCTAssertNil(tokenizedPayPalAccount); + XCTAssertEqualObjects(error.domain, BTPayPalDriverErrorDomain); + XCTAssertEqual(error.code, BTPayPalDriverErrorTypeIntegrationReturnURLScheme); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testFuturePayments_onCancelledAppSwitchAuthorization_callsBackWithNoTokenizedAccountOrError { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_TOKENIZATION_KEY]; + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:apiClient]; + payPalDriver.disableSFAuthenticationSession = YES; + id stubDelegate = [[BTViewControllerPresentingTestDelegate alloc] init]; + payPalDriver.viewControllerPresentingDelegate = stubDelegate; + + self.didReceiveCompletionCallback = nil; + [payPalDriver authorizeAccountWithAdditionalScopes:[NSSet set] forceFuturePaymentFlow:YES completion:^(BTPayPalAccountNonce * _Nonnull tokenizedPayPalAccount, NSError * _Nonnull error) { + XCTAssertNil(tokenizedPayPalAccount); + XCTAssertNil(error); + self.didReceiveCompletionCallback = @(YES); + }]; + + [BTPayPalDriver handleAppSwitchReturnURL:[NSURL URLWithString:@"com.braintreepayments.Demo.payments://onetouch/v1/cancel?payload=eyJ2ZXJzaW9uIjozLCJtc2dfR1VJRCI6IjQ1QUZEQkE3LUJEQTYtNDNEMi04MUY2LUY4REM1QjZEOTkzQSIsImVudmlyb25tZW50IjoibW9jayJ9&x-source=com.paypal.ppclient.touch.v2"]]; + + NSPredicate *predicate = [NSPredicate predicateWithFormat:@"didReceiveCompletionCallback != nil"]; + [self expectationForPredicate:predicate evaluatedWithObject:self handler:nil]; + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +#pragma mark - One-time (Checkout) payments + +- (void)testOneTimePayment_withTokenizationKey_tokenizesPayPalAccount { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_TOKENIZATION_KEY]; + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:apiClient]; + payPalDriver.disableSFAuthenticationSession = YES; + [self stubDelegatesForPayPalDriver:payPalDriver]; + [BTAppSwitch sharedInstance].returnURLScheme = @"com.braintreepayments.Demo.payments"; + + __block XCTestExpectation *tokenizationExpectation; + BTPayPalRequest *request = [[BTPayPalRequest alloc] initWithAmount:@"1.00"]; + [payPalDriver requestOneTimePayment:request completion:^(BTPayPalAccountNonce * _Nullable tokenizedPayPalAccount, NSError * _Nullable error) { + XCTAssertTrue(tokenizedPayPalAccount.nonce.isANonce); + XCTAssertNil(error); + [tokenizationExpectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; + + tokenizationExpectation = [self expectationWithDescription:@"Tokenize one-time payment"]; + [BTPayPalDriver handleAppSwitchReturnURL:[NSURL URLWithString:OneTouchCoreAppSwitchSuccessURLFixture]]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testOneTimePayment_withClientToken_tokenizesPayPalAccount { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_CLIENT_TOKEN]; + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:apiClient]; + payPalDriver.disableSFAuthenticationSession = YES; + [self stubDelegatesForPayPalDriver:payPalDriver]; + [BTAppSwitch sharedInstance].returnURLScheme = @"com.braintreepayments.Demo.payments"; + + __block XCTestExpectation *tokenizationExpectation; + BTPayPalRequest *request = [[BTPayPalRequest alloc] initWithAmount:@"1.00"]; + [payPalDriver requestOneTimePayment:request completion:^(BTPayPalAccountNonce * _Nullable tokenizedPayPalAccount, NSError * _Nullable error) { + XCTAssertTrue(tokenizedPayPalAccount.nonce.isANonce); + XCTAssertNil(error); + [tokenizationExpectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; + + tokenizationExpectation = [self expectationWithDescription:@"Tokenize one-time payment"]; + [BTPayPalDriver handleAppSwitchReturnURL:[NSURL URLWithString:OneTouchCoreAppSwitchSuccessURLFixture]]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testOneTimePayment_withClientToken_tokenizesPayPalAccount_withCustomHandler { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_CLIENT_TOKEN]; + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:apiClient]; + payPalDriver.disableSFAuthenticationSession = YES; + [BTAppSwitch sharedInstance].returnURLScheme = @"com.braintreepayments.Demo.payments"; + + __block BTPayPalApprovalHandlerTestDelegate *testApproval = [BTPayPalApprovalHandlerTestDelegate new]; + testApproval.handleApprovalExpectation = [self expectationWithDescription:@"Delegate received handleApproval:paypalApprovalDelegate:"]; + testApproval.url = [NSURL URLWithString:OneTouchCoreAppSwitchSuccessURLFixture]; + + __block XCTestExpectation *tokenizationExpectation; + BTPayPalRequest *request = [[BTPayPalRequest alloc] initWithAmount:@"1.00"]; + [payPalDriver requestOneTimePayment:request handler:testApproval completion:^(BTPayPalAccountNonce * _Nullable tokenizedPayPalAccount, NSError * _Nullable error) { + XCTAssertTrue(tokenizedPayPalAccount.nonce.isANonce); + XCTAssertNil(error); + XCTAssertNotNil(testApproval); + [tokenizationExpectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; + + tokenizationExpectation = [self expectationWithDescription:@"Tokenize one-time payment"]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testOneTimePayment_withClientToken_returnsErrorWithMalformedURL_withCustomHandler { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_CLIENT_TOKEN]; + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:apiClient]; + payPalDriver.disableSFAuthenticationSession = YES; + [BTAppSwitch sharedInstance].returnURLScheme = @"com.braintreepayments.Demo.payments"; + + __block BTPayPalApprovalHandlerTestDelegate *testApproval = [BTPayPalApprovalHandlerTestDelegate new]; + testApproval.handleApprovalExpectation = [self expectationWithDescription:@"Delegate received handleApproval:paypalApprovalDelegate:"]; + testApproval.url = [NSURL URLWithString:@"bad://url"]; + + __block XCTestExpectation *tokenizationExpectation; + BTPayPalRequest *request = [[BTPayPalRequest alloc] initWithAmount:@"1.00"]; + [payPalDriver requestOneTimePayment:request handler:testApproval completion:^(BTPayPalAccountNonce * _Nullable tokenizedPayPalAccount, NSError * _Nullable error) { + XCTAssertNil(tokenizedPayPalAccount); + XCTAssertNotNil(error); + XCTAssertNotNil(testApproval); + [tokenizationExpectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testOneTimePayment_withClientToken_cancels_withCustomHandler { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_CLIENT_TOKEN]; + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:apiClient]; + payPalDriver.disableSFAuthenticationSession = YES; + [BTAppSwitch sharedInstance].returnURLScheme = @"com.braintreepayments.Demo.payments"; + + __block BTPayPalApprovalHandlerTestDelegate *testApproval = [BTPayPalApprovalHandlerTestDelegate new]; + testApproval.handleApprovalExpectation = [self expectationWithDescription:@"Delegate received handleApproval:paypalApprovalDelegate:"]; + testApproval.cancel = YES; + + __block XCTestExpectation *tokenizationExpectation; + BTPayPalRequest *request = [[BTPayPalRequest alloc] initWithAmount:@"1.00"]; + [payPalDriver requestOneTimePayment:request handler:testApproval completion:^(BTPayPalAccountNonce * _Nullable tokenizedPayPalAccount, NSError * _Nullable error) { + XCTAssertNil(tokenizedPayPalAccount); + XCTAssertNil(error); + XCTAssertNotNil(testApproval); + [tokenizationExpectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +#pragma mark - Billing Agreement + +- (void)testBillingAgreement_withTokenizationKey_tokenizesPayPalAccount { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_TOKENIZATION_KEY]; + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:apiClient]; + payPalDriver.disableSFAuthenticationSession = YES; + [self stubDelegatesForPayPalDriver:payPalDriver]; + [BTAppSwitch sharedInstance].returnURLScheme = @"com.braintreepayments.Demo.payments"; + + __block XCTestExpectation *tokenizationExpectation; + BTPayPalRequest *request = [[BTPayPalRequest alloc] init]; + [payPalDriver requestBillingAgreement:request completion:^(BTPayPalAccountNonce * _Nullable tokenizedPayPalAccount, NSError * _Nullable error) { + XCTAssertTrue(tokenizedPayPalAccount.nonce.isANonce); + XCTAssertNil(error); + [tokenizationExpectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; + + tokenizationExpectation = [self expectationWithDescription:@"Tokenize billing agreement payment"]; + [BTPayPalDriver handleAppSwitchReturnURL:[NSURL URLWithString:OneTouchCoreAppSwitchSuccessURLFixture]]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testBillingAgreement_withClientToken_tokenizesPayPalAccount { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_CLIENT_TOKEN]; + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:apiClient]; + payPalDriver.disableSFAuthenticationSession = YES; + [self stubDelegatesForPayPalDriver:payPalDriver]; + [BTAppSwitch sharedInstance].returnURLScheme = @"com.braintreepayments.Demo.payments"; + + __block XCTestExpectation *tokenizationExpectation; + BTPayPalRequest *request = [[BTPayPalRequest alloc] init]; + [payPalDriver requestBillingAgreement:request completion:^(BTPayPalAccountNonce * _Nullable tokenizedPayPalAccount, NSError * _Nullable error) { + XCTAssertTrue(tokenizedPayPalAccount.nonce.isANonce); + XCTAssertNil(error); + [tokenizationExpectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; + + tokenizationExpectation = [self expectationWithDescription:@"Tokenize billing agreement payment"]; + [BTPayPalDriver handleAppSwitchReturnURL:[NSURL URLWithString:OneTouchCoreAppSwitchSuccessURLFixture]]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testBillingAgreement_withClientToken_tokenizesPayPalAccount_withCustomHandler { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_CLIENT_TOKEN]; + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:apiClient]; + payPalDriver.disableSFAuthenticationSession = YES; + [BTAppSwitch sharedInstance].returnURLScheme = @"com.braintreepayments.Demo.payments"; + + __block BTPayPalApprovalHandlerTestDelegate *testApproval = [BTPayPalApprovalHandlerTestDelegate new]; + testApproval.handleApprovalExpectation = [self expectationWithDescription:@"Delegate received handleApproval:paypalApprovalDelegate:"]; + testApproval.url = [NSURL URLWithString:OneTouchCoreAppSwitchSuccessURLFixture]; + + __block XCTestExpectation *tokenizationExpectation; + BTPayPalRequest *request = [[BTPayPalRequest alloc] init]; + [payPalDriver requestBillingAgreement:request handler:testApproval completion:^(BTPayPalAccountNonce * _Nullable tokenizedPayPalAccount, NSError * _Nullable error) { + XCTAssertTrue(tokenizedPayPalAccount.nonce.isANonce); + XCTAssertNil(error); + XCTAssertNotNil(testApproval); + [tokenizationExpectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; + + tokenizationExpectation = [self expectationWithDescription:@"Tokenize billing agreement payment"]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testBillingAgreement_withClientToken_returnsErrorWithMalformedURL_withCustomHandler { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_CLIENT_TOKEN]; + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:apiClient]; + payPalDriver.disableSFAuthenticationSession = YES; + [BTAppSwitch sharedInstance].returnURLScheme = @"com.braintreepayments.Demo.payments"; + + __block BTPayPalApprovalHandlerTestDelegate *testApproval = [BTPayPalApprovalHandlerTestDelegate new]; + testApproval.handleApprovalExpectation = [self expectationWithDescription:@"Delegate received handleApproval:paypalApprovalDelegate:"]; + testApproval.url = [NSURL URLWithString:@"bad://url"]; + + __block XCTestExpectation *tokenizationExpectation = [self expectationWithDescription:@"Tokenize billing agreement payment"]; + BTPayPalRequest *request = [[BTPayPalRequest alloc] init]; + [payPalDriver requestBillingAgreement:request handler:testApproval completion:^(__unused BTPayPalAccountNonce * _Nullable tokenizedPayPalAccount,__unused NSError * _Nullable error) { + XCTAssertNil(tokenizedPayPalAccount); + XCTAssertNotNil(error); + XCTAssertNotNil(testApproval); + [tokenizationExpectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testBillingAgreement_withClientToken_cancels_withCustomHandler { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_CLIENT_TOKEN]; + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:apiClient]; + payPalDriver.disableSFAuthenticationSession = YES; + [BTAppSwitch sharedInstance].returnURLScheme = @"com.braintreepayments.Demo.payments"; + + __block BTPayPalApprovalHandlerTestDelegate *testApproval = [BTPayPalApprovalHandlerTestDelegate new]; + testApproval.handleApprovalExpectation = [self expectationWithDescription:@"Delegate received handleApproval:paypalApprovalDelegate:"]; + testApproval.cancel = YES; + + __block XCTestExpectation *tokenizationExpectation = [self expectationWithDescription:@"Tokenize billing agreement payment"]; + BTPayPalRequest *request = [[BTPayPalRequest alloc] init]; + [payPalDriver requestBillingAgreement:request handler:testApproval completion:^(__unused BTPayPalAccountNonce * _Nullable tokenizedPayPalAccount,__unused NSError * _Nullable error) { + XCTAssertNil(tokenizedPayPalAccount); + XCTAssertNil(error); + XCTAssertNotNil(testApproval); + [tokenizationExpectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +#pragma mark - Return URL handling + +- (void)testCanHandleAppSwitchReturnURL_forURLsFromBrowserSwitch_returnsYES { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_TOKENIZATION_KEY]; + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:apiClient]; + payPalDriver.disableSFAuthenticationSession = YES; + [BTAppSwitch sharedInstance].returnURLScheme = @"com.braintreepayments.Demo.payments"; + [self stubDelegatesForPayPalDriver:payPalDriver]; + + [payPalDriver authorizeAccountWithCompletion:^(BTPayPalAccountNonce *tokenizedPayPalAccount, NSError *error) { + XCTAssertNotNil(tokenizedPayPalAccount); + if (error) { + XCTFail(@"%@", error); + } + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; + + NSURL *returnURL = [NSURL URLWithString:@"com.braintreepayments.Demo.payments://onetouch/v1/success?payloadEnc=e0yvzQHOOoXyoLjKZvHBI0Rbyad6usxhOz22CjG3V1lOsguMRsuQpEqPxlIlK86VPmTuagb1jJcnDUK9QsWJE8ffe4i9Ms4ggd6r5EoymVM%2BAYgjyjaYtPPOxIgMepNGnvnYt9EKJs2Bd0wbZj0ekxSA6BzRZDPEpZ%2FjhssxJVscjbPvOwCoTnjEhuNxiOamAGSRd6fo7ln%2BishDwRCLz81qlV8cgfXNzlHrRw1P7CbTQ8XhNGn35CHD64ysuHAW97ZjAzPCRdikWbgiw2S%2BDvSePhRRnTR10e2NPDYBeVzGQFzvf6WRklrqcLeFwRcAqoa0ZneOPgMbk5nvylGY716caCCPtJKnoJAflZZK6%2F7iXcA%2F3p9qrQIrszmthu%2FbnA%2FP7dZsWRarUiT%2FZhZg32MsmV3B3fPjQOMbhB7dRv5uomhCjhNhPzXH7nFA54mKOlvAdTm1QOk5P%2Fh3AaHz0qwIKgXAhxIfwxqHgIYxtba53sdwa7OXfx14FRlcfPngrR02IAHeaulkH6vJ24ZAsoUUdNkvRfDmM1O2%2B4424%2FMINTUJJsR0%2FwrYrwzp0gC6fKoAzT%2FgFhL6QVLoUss%3D&payload=eyJ2ZXJzaW9uIjozLCJtc2dfR1VJRCI6IkMwQTkwODQ1LTJBRUQtNEZCRC04NzIwLTQzNUU2MkRGNjhFNCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiZW52aXJvbm1lbnQiOiJsaXZlIiwiZXJyb3IiOm51bGx9&x-source=com.braintree.browserswitch"]; + NSString *source = @"com.apple.mobilesafari"; + + BOOL canHandleAppSwitch = [BTPayPalDriver canHandleAppSwitchReturnURL:returnURL sourceApplication:source]; + + XCTAssertTrue(canHandleAppSwitch); +} + +- (void)testCanHandleAppSwitchReturnURL_forURLsFromWebSwitch_returnsYES { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_TOKENIZATION_KEY]; + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:apiClient]; + payPalDriver.disableSFAuthenticationSession = YES; + [BTAppSwitch sharedInstance].returnURLScheme = @"com.braintreepayments.Demo.payments"; + [self stubDelegatesForPayPalDriver:payPalDriver]; + id stubApplication = OCMPartialMock([UIApplication sharedApplication]); + OCMStub([stubApplication canOpenURL:[OCMArg any]]).andReturn(YES); + + [payPalDriver authorizeAccountWithCompletion:^(BTPayPalAccountNonce *tokenizedPayPalAccount, NSError *error) { + XCTAssertNotNil(tokenizedPayPalAccount); + if (error) { + XCTFail(@"%@", error); + } + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; + + NSURL *returnURL = [NSURL URLWithString:OneTouchCoreAppSwitchSuccessURLFixture]; + BOOL canHandleV1AppSwitch = [BTPayPalDriver canHandleAppSwitchReturnURL:returnURL sourceApplication:@"com.apple.mobilesafari"]; + BOOL canHandleV2AppSwitch = [BTPayPalDriver canHandleAppSwitchReturnURL:returnURL sourceApplication:@"com.apple.safariviewservice"]; + + XCTAssertTrue(canHandleV1AppSwitch); + XCTAssertTrue(canHandleV2AppSwitch); +} + +- (void)testCanHandleAppSwitchReturnURL_forMalformedURLs_returnsNO { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_TOKENIZATION_KEY]; + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:apiClient]; + payPalDriver.disableSFAuthenticationSession = YES; + [BTAppSwitch sharedInstance].returnURLScheme = @"com.braintreepayments.Demo.payments"; + [self stubDelegatesForPayPalDriver:payPalDriver]; + id stubApplication = OCMPartialMock([UIApplication sharedApplication]); + OCMStub([stubApplication canOpenURL:[OCMArg any]]).andReturn(YES); + + [payPalDriver authorizeAccountWithCompletion:^(BTPayPalAccountNonce *tokenizedPayPalAccount, NSError *error) { + XCTAssertNotNil(tokenizedPayPalAccount); + if (error) { + XCTFail(@"%@", error); + } + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; + + // This malformed returnURL is just missing payload + NSURL *returnURL = [NSURL URLWithString:@"com.braintreepayments.Demo.payments://onetouch/v1/success?x-source=com.paypal.ppclient.touch.v1-or-v2"]; + BOOL canHandleAppSwitch = [BTPayPalDriver canHandleAppSwitchReturnURL:returnURL sourceApplication:@"com.paypal.ppclient.touch.v1"]; + + XCTAssertFalse(canHandleAppSwitch); +} + +- (void)testCanHandleAppSwitchReturnURL_forUnsupportedSourceApplication_returnsNO { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_TOKENIZATION_KEY]; + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:apiClient]; + payPalDriver.disableSFAuthenticationSession = YES; + [BTAppSwitch sharedInstance].returnURLScheme = @"com.braintreepayments.Demo.payments"; + [self stubDelegatesForPayPalDriver:payPalDriver]; + id stubApplication = OCMPartialMock([UIApplication sharedApplication]); + OCMStub([stubApplication canOpenURL:[OCMArg any]]).andReturn(YES); + + [payPalDriver authorizeAccountWithCompletion:^(BTPayPalAccountNonce *tokenizedPayPalAccount, NSError *error) { + XCTAssertNotNil(tokenizedPayPalAccount); + if (error) { + XCTFail(@"%@", error); + } + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; + + // This malformed returnURL is just missing payload + NSURL *returnURL = [NSURL URLWithString:OneTouchCoreAppSwitchSuccessURLFixture]; + BOOL canHandleAppSwitch = [BTPayPalDriver canHandleAppSwitchReturnURL:returnURL sourceApplication:@"com.example.application"]; + + XCTAssertFalse(canHandleAppSwitch); +} + +- (void)testCanHandleAppSwitchReturnURL_whenNoAppSwitchIsInProgress_returnsNO { + [BTAppSwitch sharedInstance].returnURLScheme = @"com.braintreepayments.Demo.payments"; + id stubApplication = OCMPartialMock([UIApplication sharedApplication]); + OCMStub([stubApplication canOpenURL:[OCMArg any]]).andReturn(YES); + + NSURL *returnURL = [NSURL URLWithString:OneTouchCoreAppSwitchSuccessURLFixture]; + BOOL canHandleAppSwitch = [BTPayPalDriver canHandleAppSwitchReturnURL:returnURL sourceApplication:@"com.malicious.app"]; + + XCTAssertFalse(canHandleAppSwitch); +} + +- (void)testCanHandleAppSwitchReturnURL_afterHandlingAnAppSwitchAndBeforeInitiatingAnotherAppSwitch_returnsNO { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_TOKENIZATION_KEY]; + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:apiClient]; + payPalDriver.disableSFAuthenticationSession = YES; + [BTAppSwitch sharedInstance].returnURLScheme = @"com.braintreepayments.Demo.payments"; + [self stubDelegatesForPayPalDriver:payPalDriver]; + id stubApplication = OCMPartialMock([UIApplication sharedApplication]); + OCMStub([stubApplication canOpenURL:[OCMArg any]]).andReturn(YES); + + self.didReceiveCompletionCallback = nil; + [payPalDriver authorizeAccountWithCompletion:^(BTPayPalAccountNonce *tokenizedPayPalAccount, NSError *error) { + XCTAssertNotNil(tokenizedPayPalAccount); + if (error) { + XCTFail(@"%@", error); + } + self.didReceiveCompletionCallback = @(YES); + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; + + NSURL *returnURL = [NSURL URLWithString:OneTouchCoreAppSwitchSuccessURLFixture]; + BOOL canHandleAppSwitch = [BTPayPalDriver canHandleAppSwitchReturnURL:returnURL sourceApplication:@"com.apple.mobilesafari"]; + XCTAssertTrue(canHandleAppSwitch); + [BTPayPalDriver handleAppSwitchReturnURL:returnURL]; + + // Pause until handleAppSwitchReturnURL has finished + NSPredicate *predicate = [NSPredicate predicateWithFormat:@"didReceiveCompletionCallback != nil"]; + [self expectationForPredicate:predicate evaluatedWithObject:self handler:nil]; + [self waitForExpectationsWithTimeout:5 handler:nil]; + + canHandleAppSwitch = [BTPayPalDriver canHandleAppSwitchReturnURL:returnURL sourceApplication:@"com.apple.mobilesafari"]; + XCTAssertFalse(canHandleAppSwitch); +} + +- (void)testCanHandleAppSwitchReturnURL_whenAppSwitchReturnURLHasMismatchedCase_returnsYES { + // Motivation for this test is because of Safari's habit of downcasing URL schemes + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_TOKENIZATION_KEY]; + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:apiClient]; + payPalDriver.disableSFAuthenticationSession = YES; + [BTAppSwitch sharedInstance].returnURLScheme = @"com.braintreepayments.Demo.payments"; + [self stubDelegatesForPayPalDriver:payPalDriver]; + [payPalDriver authorizeAccountWithCompletion:^(BTPayPalAccountNonce *tokenizedPayPalAccount, NSError *error) { + XCTAssertNotNil(tokenizedPayPalAccount); + if (error) { + XCTFail(@"%@", error); + } + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; + + NSURL *returnURL = [NSURL URLWithString:@"com.braintreepayments.Demo.payments://onetouch/v1/success?payloadEnc=e0yvzQHOOoXyoLjKZvHBI0Rbyad6usxhOz22CjG3V1lOsguMRsuQpEqPxlIlK86VPmTuagb1jJcnDUK9QsWJE8ffe4i9Ms4ggd6r5EoymVM%2BAYgjyjaYtPPOxIgMepNGnvnYt9EKJs2Bd0wbZj0ekxSA6BzRZDPEpZ%2FjhssxJVscjbPvOwCoTnjEhuNxiOamAGSRd6fo7ln%2BishDwRCLz81qlV8cgfXNzlHrRw1P7CbTQ8XhNGn35CHD64ysuHAW97ZjAzPCRdikWbgiw2S%2BDvSePhRRnTR10e2NPDYBeVzGQFzvf6WRklrqcLeFwRcAqoa0ZneOPgMbk5nvylGY716caCCPtJKnoJAflZZK6%2F7iXcA%2F3p9qrQIrszmthu%2FbnA%2FP7dZsWRarUiT%2FZhZg32MsmV3B3fPjQOMbhB7dRv5uomhCjhNhPzXH7nFA54mKOlvAdTm1QOk5P%2Fh3AaHz0qwIKgXAhxIfwxqHgIYxtba53sdwa7OXfx14FRlcfPngrR02IAHeaulkH6vJ24ZAsoUUdNkvRfDmM1O2%2B4424%2FMINTUJJsR0%2FwrYrwzp0gC6fKoAzT%2FgFhL6QVLoUss%3D&payload=eyJ2ZXJzaW9uIjozLCJtc2dfR1VJRCI6IkMwQTkwODQ1LTJBRUQtNEZCRC04NzIwLTQzNUU2MkRGNjhFNCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiZW52aXJvbm1lbnQiOiJsaXZlIiwiZXJyb3IiOm51bGx9&x-source=com.braintree.browserswitch"]; + NSString *source = @"com.apple.mobilesafari"; + BOOL canHandleAppSwitch = [BTPayPalDriver canHandleAppSwitchReturnURL:returnURL sourceApplication:source]; + + XCTAssertTrue(canHandleAppSwitch); +} + +#pragma mark handleURL + +- (void)testHandleURL_whenURLIsConsideredInvalidByPayPalOTC_returnsError { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_TOKENIZATION_KEY]; + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:apiClient]; + payPalDriver.disableSFAuthenticationSession = YES; + [BTAppSwitch sharedInstance].returnURLScheme = @"com.braintreepayments.Demo.payments"; + [self stubDelegatesForPayPalDriver:payPalDriver]; + id stubApplication = OCMPartialMock([UIApplication sharedApplication]); + OCMStub([stubApplication canOpenURL:[OCMArg any]]).andReturn(YES); + + self.didReceiveCompletionCallback = nil; + [payPalDriver authorizeAccountWithCompletion:^(BTPayPalAccountNonce *tokenizedPayPalAccount, NSError *error) { + XCTAssertNil(tokenizedPayPalAccount); + XCTAssertNotNil(error); + self.didReceiveCompletionCallback = @(YES); + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; + + [BTPayPalDriver handleAppSwitchReturnURL:[NSURL URLWithString:@"com.braintreepayments.Demo.payments://----invalid----"]]; + + NSPredicate *predicate = [NSPredicate predicateWithFormat:@"didReceiveCompletionCallback != nil"]; + [self expectationForPredicate:predicate evaluatedWithObject:self handler:nil]; + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testHandleURL_whenURLIsMissingHostAndPath_returnsError { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:SANDBOX_TOKENIZATION_KEY]; + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:apiClient]; + payPalDriver.disableSFAuthenticationSession = YES; + [BTAppSwitch sharedInstance].returnURLScheme = @"com.braintreepayments.Demo.payments"; + [self stubDelegatesForPayPalDriver:payPalDriver]; + id stubApplication = OCMPartialMock([UIApplication sharedApplication]); + OCMStub([stubApplication canOpenURL:[OCMArg any]]).andReturn(YES); + + self.didReceiveCompletionCallback = nil; + [payPalDriver authorizeAccountWithCompletion:^(BTPayPalAccountNonce *tokenizedPayPalAccount, NSError *error) { + XCTAssertNil(tokenizedPayPalAccount); + XCTAssertNotNil(error); + self.didReceiveCompletionCallback = @(YES); + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; + + [BTPayPalDriver handleAppSwitchReturnURL:[NSURL URLWithString:@"com.braintreepayments.Demo.payments://"]]; + + NSPredicate *predicate = [NSPredicate predicateWithFormat:@"didReceiveCompletionCallback != nil"]; + [self expectationForPredicate:predicate evaluatedWithObject:self handler:nil]; + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +#pragma mark - Helper + +// Stubs the app switch or view controller presenting delegate, depending on which one will be used. +// The main purpose is to wait for delegate callbacks to occur in the app switch lifecycle to ensure +// that the PayPal driver's app switch return block is set and its behavior is ready to be tested. +- (void)stubDelegatesForPayPalDriver:(BTPayPalDriver *)payPalDriver { + if (!self.viewControllerPresentingDelegate) { + self.viewControllerPresentingDelegate = [[BTViewControllerPresentingTestDelegate alloc] init]; + } + if (!self.appSwitchDelegate) { + self.appSwitchDelegate = [[BTAppSwitchTestDelegate alloc] init]; + } + + if (NSClassFromString(@"SFSafariViewController")) { + self.viewControllerPresentingDelegate.requestsPresentationExpectation = [self expectationWithDescription:@"Delegate received requestsPresentation"]; + payPalDriver.viewControllerPresentingDelegate = self.viewControllerPresentingDelegate; + } else { + self.appSwitchDelegate.willPerform = [self expectationWithDescription:@"Delegate received willPerformAppSwitch"]; + self.appSwitchDelegate.didPerform = [self expectationWithDescription:@"Delegate received didPerformAppSwitch"]; + payPalDriver.appSwitchDelegate = self.appSwitchDelegate; + } +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/BraintreeUnionPay_IntegrationTests.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/BraintreeUnionPay_IntegrationTests.m new file mode 100644 index 0000000..d92fa1f --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/BraintreeUnionPay_IntegrationTests.m @@ -0,0 +1,107 @@ +#import +#import "BTIntegrationTestsHelper.h" +#import + +@interface BraintreeUnionPay_IntegrationTests : XCTestCase +@property (nonatomic, strong) BTCardClient *cardClient; +@end + +@implementation BraintreeUnionPay_IntegrationTests + +- (void)setUp { + [super setUp]; + + static NSString *clientToken; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + clientToken = [self fetchClientToken]; + }); + + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:clientToken]; + self.cardClient = [[BTCardClient alloc] initWithAPIClient:apiClient]; +} + +- (void)pendFetchCapabilities_returnsCardCapabilities { + XCTestExpectation *expectation = [self expectationWithDescription:@"Callback invoked"]; + [self.cardClient fetchCapabilities:@"6212345678901232" completion:^(BTCardCapabilities * _Nullable cardCapabilities, NSError * _Nullable error) { + XCTAssertNil(error); + XCTAssertFalse(cardCapabilities.isDebit); + XCTAssertTrue(cardCapabilities.isUnionPay); + XCTAssertTrue(cardCapabilities.isSupported); + XCTAssertTrue(cardCapabilities.supportsTwoStepAuthAndCapture); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)pendEnrollCard_whenSuccessful_returnsEnrollmentID { + BTCardRequest *request = [[BTCardRequest alloc] init]; + request.card = [[BTCard alloc] initWithNumber:@"6222821234560017" expirationMonth:@"12" expirationYear:@"2019" cvv:@"123"]; + request.mobileCountryCode = @"62"; + request.mobilePhoneNumber = @"12345678901"; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Callback invoked"]; + [self.cardClient enrollCard:request completion:^(NSString * _Nullable enrollmentID, __unused BOOL smsCodeRequired, NSError * _Nullable error) { + XCTAssertNil(error); + XCTAssertTrue([enrollmentID isKindOfClass:[NSString class]]); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)pendEnrollCard_whenCardDoesNotRequireEnrollment_returnsError { + BTCardRequest *request = [[BTCardRequest alloc] init]; + request.card = [[BTCard alloc] initWithNumber:@"6212345678900085" expirationMonth:@"12" expirationYear:@"2019" cvv:@"123"]; + request.mobileCountryCode = @"62"; + request.mobilePhoneNumber = @"12345678901"; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Callback invoked"]; + [self.cardClient enrollCard:request completion:^(NSString * _Nullable enrollmentID, __unused BOOL smsCodeRequired, NSError * _Nullable error) { + XCTAssertNil(enrollmentID); + XCTAssertEqualObjects(error.domain, BTCardClientErrorDomain); + XCTAssertEqual(error.code, BTCardClientErrorTypeCustomerInputInvalid); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)pendTokenizeCard_withEnrolledUnionPayCard_isSuccessful { + BTCardRequest *request = [[BTCardRequest alloc] init]; + request.card = [[BTCard alloc] initWithNumber:@"6212345678901232" expirationMonth:@"12" expirationYear:@"2019" cvv:@"123"]; + request.mobileCountryCode = @"62"; + request.mobilePhoneNumber = @"12345678901"; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Callback invoked"]; + [self.cardClient enrollCard:request completion:^(NSString * _Nullable enrollmentID, __unused BOOL smsCodeRequired, NSError * _Nullable error) { + XCTAssertNil(error); + request.enrollmentID = enrollmentID; + request.smsCode = @"11111"; + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; + + expectation = [self expectationWithDescription:@"Callback invoked"]; + [self.cardClient tokenizeCard:request options:nil completion:^(BTCardNonce * _Nullable tokenizedCard, NSError * _Nullable error) { + XCTAssertNil(error); + XCTAssertTrue([tokenizedCard.nonce isANonce]); + XCTAssertEqual(tokenizedCard.cardNetwork, BTCardNetworkUnionPay); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +#pragma mark - Helpers + +- (NSString *)fetchClientToken { + NSURL *url = [NSURL URLWithString:@"http://braintree-sample-merchant.herokuapp.com/client_token?merchant_account_id=fake_switch_usd"]; + NSData *data = [NSData dataWithContentsOfURL:url]; + NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL]; + return jsonResponse[@"client_token"]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Helpers/BTIntegrationTestsConstants.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Helpers/BTIntegrationTestsConstants.h new file mode 100644 index 0000000..ba07233 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Helpers/BTIntegrationTestsConstants.h @@ -0,0 +1,4 @@ +#define SANDBOX_TOKENIZATION_KEY @"sandbox_9dbg82cq_dcpspy2brwdjr3qn" +#define SANDBOX_TOKENIZATION_KEY_APPLE_PAY_DISABLED @"sandbox_g42y39zw_348pk9cgf3bgyw2b" +#define SANDBOX_CLIENT_TOKEN @"eyJ2ZXJzaW9uIjoyLCJhdXRob3JpemF0aW9uRmluZ2VycHJpbnQiOiI4MTUzNjg2M2ViY2Q2MWUyZTVkYjE1NjJiMGI5ZjkxNzM3YTQ2YjE1OWNmNTdjZTU2ZmVlZmE1OGNhOWEyZGEwfGNyZWF0ZWRfYXQ9MjAxNS0xMi0xNFQxODozMzowOS4wNzAyODE0NDQrMDAwMFx1MDAyNm1lcmNoYW50X2lkPTM0OHBrOWNnZjNiZ3l3MmJcdTAwMjZwdWJsaWNfa2V5PTJuMjQ3ZHY4OWJxOXZtcHIiLCJjb25maWdVcmwiOiJodHRwczovL2FwaS5zYW5kYm94LmJyYWludHJlZWdhdGV3YXkuY29tOjQ0My9tZXJjaGFudHMvMzQ4cGs5Y2dmM2JneXcyYi9jbGllbnRfYXBpL3YxL2NvbmZpZ3VyYXRpb24iLCJjaGFsbGVuZ2VzIjpbXSwiZW52aXJvbm1lbnQiOiJzYW5kYm94IiwiY2xpZW50QXBpVXJsIjoiaHR0cHM6Ly9hcGkuc2FuZGJveC5icmFpbnRyZWVnYXRld2F5LmNvbTo0NDMvbWVyY2hhbnRzLzM0OHBrOWNnZjNiZ3l3MmIvY2xpZW50X2FwaSIsImFzc2V0c1VybCI6Imh0dHBzOi8vYXNzZXRzLmJyYWludHJlZWdhdGV3YXkuY29tIiwiYXV0aFVybCI6Imh0dHBzOi8vYXV0aC52ZW5tby5zYW5kYm94LmJyYWludHJlZWdhdGV3YXkuY29tIiwiYW5hbHl0aWNzIjp7InVybCI6Imh0dHBzOi8vY2xpZW50LWFuYWx5dGljcy5zYW5kYm94LmJyYWludHJlZWdhdGV3YXkuY29tIn0sInRocmVlRFNlY3VyZUVuYWJsZWQiOnRydWUsInRocmVlRFNlY3VyZSI6eyJsb29rdXBVcmwiOiJodHRwczovL2FwaS5zYW5kYm94LmJyYWludHJlZWdhdGV3YXkuY29tOjQ0My9tZXJjaGFudHMvMzQ4cGs5Y2dmM2JneXcyYi90aHJlZV9kX3NlY3VyZS9sb29rdXAifSwicGF5cGFsRW5hYmxlZCI6dHJ1ZSwicGF5cGFsIjp7ImRpc3BsYXlOYW1lIjoiQWNtZSBXaWRnZXRzLCBMdGQuIChTYW5kYm94KSIsImNsaWVudElkIjpudWxsLCJwcml2YWN5VXJsIjoiaHR0cDovL2V4YW1wbGUuY29tL3BwIiwidXNlckFncmVlbWVudFVybCI6Imh0dHA6Ly9leGFtcGxlLmNvbS90b3MiLCJiYXNlVXJsIjoiaHR0cHM6Ly9hc3NldHMuYnJhaW50cmVlZ2F0ZXdheS5jb20iLCJhc3NldHNVcmwiOiJodHRwczovL2NoZWNrb3V0LnBheXBhbC5jb20iLCJkaXJlY3RCYXNlVXJsIjpudWxsLCJhbGxvd0h0dHAiOnRydWUsImVudmlyb25tZW50Tm9OZXR3b3JrIjp0cnVlLCJlbnZpcm9ubWVudCI6Im9mZmxpbmUiLCJ1bnZldHRlZE1lcmNoYW50IjpmYWxzZSwiYnJhaW50cmVlQ2xpZW50SWQiOiJtYXN0ZXJjbGllbnQzIiwiYmlsbGluZ0FncmVlbWVudHNFbmFibGVkIjp0cnVlLCJtZXJjaGFudEFjY291bnRJZCI6ImFjbWV3aWRnZXRzbHRkc2FuZGJveCIsImN1cnJlbmN5SXNvQ29kZSI6IlVTRCJ9LCJjb2luYmFzZUVuYWJsZWQiOmZhbHNlLCJtZXJjaGFudElkIjoiMzQ4cGs5Y2dmM2JneXcyYiIsInZlbm1vIjoib2ZmIn0=" +#define SANDBOX_CLIENT_TOKEN_VERSION_3 @"eyJ2ZXJzaW9uIjozLCJhdXRob3JpemF0aW9uRmluZ2VycHJpbnQiOiIxYzM5N2E5OGZmZGRkNDQwM2VjNzEzYWRjZTI3NTNiMzJlODc2MzBiY2YyN2M3NmM2OWVmZjlkMTE5MjljOTVkfGNyZWF0ZWRfYXQ9MjAxNy0wNC0wNVQwNjowNzowOC44MTUwOTkzMjUrMDAwMFx1MDAyNm1lcmNoYW50X2lkPWRjcHNweTJicndkanIzcW5cdTAwMjZwdWJsaWNfa2V5PTl3d3J6cWszdnIzdDRuYzgiLCJjb25maWdVcmwiOiJodHRwczovL2FwaS5zYW5kYm94LmJyYWludHJlZWdhdGV3YXkuY29tOjQ0My9tZXJjaGFudHMvZGNwc3B5MmJyd2RqcjNxbi9jbGllbnRfYXBpL3YxL2NvbmZpZ3VyYXRpb24ifQ==" diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Helpers/BTIntegrationTestsHelper.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Helpers/BTIntegrationTestsHelper.h new file mode 100644 index 0000000..842509b --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Helpers/BTIntegrationTestsHelper.h @@ -0,0 +1,5 @@ +#import + +@interface NSString (Nonce) +- (BOOL)isANonce; +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Helpers/BTIntegrationTestsHelper.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Helpers/BTIntegrationTestsHelper.m new file mode 100644 index 0000000..83c37fa --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Helpers/BTIntegrationTestsHelper.m @@ -0,0 +1,34 @@ +#import "BTSpecHelper.h" + +@implementation NSString (Nonce) + +- (BOOL)isANonce { + NSString *nonceRegularExpressionString = @"\\A[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\\Z"; + + NSError *error; + NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:nonceRegularExpressionString + options:0 + error:&error]; + if (error) { + NSLog(@"Error parsing regex: %@", error); + return NO; + } + + if ([regex numberOfMatchesInString:self options:0 range:NSMakeRange(0, [self length])] > 0) { + return YES; + } + + NSString *tokenizerNonceRegularExpressionString = @"\\Atokencc_[0-9a-z_]+\\Z"; + regex = [[NSRegularExpression alloc] initWithPattern:tokenizerNonceRegularExpressionString + options:0 + error:&error]; + if (error) { + NSLog(@"Error parsing regex: %@", error); + return NO; + } + + return [regex numberOfMatchesInString:self options:0 range:NSMakeRange(0, [self length])] > 0; + +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Info.plist b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/IntegrationTests.pch b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/IntegrationTests.pch new file mode 100644 index 0000000..633b5b5 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/IntegrationTests/IntegrationTests.pch @@ -0,0 +1 @@ +#import "BTIntegrationTestsConstants.h" diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/LICENSE b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/LICENSE new file mode 100644 index 0000000..b50ce6f --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2014-2016 Braintree, a division of PayPal, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Podfile b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Podfile new file mode 100644 index 0000000..1a8e891 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Podfile @@ -0,0 +1,35 @@ +source 'https://github.com/CocoaPods/Specs.git' + +platform :ios, '9.0' +workspace 'Braintree.xcworkspace' + +target 'Demo' do + platform :ios, '9.0' + + pod 'AFNetworking' + pod 'CardIO' + pod 'NSURL+QueryDictionary', '~> 1.0' + pod 'PureLayout' + pod 'InAppSettingsKit' + pod 'BraintreeDropIn', :podspec => 'BraintreeDropIn.podspec' +end + +abstract_target 'Tests' do + pod 'Specta' + pod 'Expecta' + pod 'OCMock' + pod 'OHHTTPStubs' + + target 'UnitTests' + target 'IntegrationTests' +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + if target.name == "BraintreeDropIn" + target.build_configurations.each do |config| + config.build_settings['HEADER_SEARCH_PATHS'] = '${PODS_ROOT}/../BraintreeCore/Public ${PODS_ROOT}/../BraintreeCard/Public ${PODS_ROOT}/../BraintreeUnionPay/Public ${PODS_ROOT}/../BraintreePaymentFlow/Public ${PODS_ROOT}/../BraintreePaymentFlow/Public/LocalPayment ${PODS_ROOT}/../BraintreePaymentFlow/Public/ThreeDSecure ${PODS_ROOT}/../BraintreePayPal/Public ${PODS_ROOT}/Headers/Private ${PODS_ROOT}/Headers/Private/BraintreeDropIn ${PODS_ROOT}/Headers/Public' + end + end + end +end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Podfile.lock b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Podfile.lock new file mode 100644 index 0000000..3c1129d --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Podfile.lock @@ -0,0 +1,91 @@ +PODS: + - AFNetworking (3.2.1): + - AFNetworking/NSURLSession (= 3.2.1) + - AFNetworking/Reachability (= 3.2.1) + - AFNetworking/Security (= 3.2.1) + - AFNetworking/Serialization (= 3.2.1) + - AFNetworking/UIKit (= 3.2.1) + - AFNetworking/NSURLSession (3.2.1): + - AFNetworking/Reachability + - AFNetworking/Security + - AFNetworking/Serialization + - AFNetworking/Reachability (3.2.1) + - AFNetworking/Security (3.2.1) + - AFNetworking/Serialization (3.2.1) + - AFNetworking/UIKit (3.2.1): + - AFNetworking/NSURLSession + - BraintreeDropIn (99.99.99-github-master): + - BraintreeDropIn/DropIn (= 99.99.99-github-master) + - BraintreeDropIn/UIKit (= 99.99.99-github-master) + - BraintreeDropIn/DropIn (99.99.99-github-master): + - BraintreeDropIn/UIKit + - BraintreeDropIn/UIKit (99.99.99-github-master) + - CardIO (5.4.1) + - Expecta (1.0.6) + - InAppSettingsKit (2.9.1) + - "NSURL+QueryDictionary (1.2.0)" + - OCMock (3.4.2) + - OHHTTPStubs (6.1.0): + - OHHTTPStubs/Default (= 6.1.0) + - OHHTTPStubs/Core (6.1.0) + - OHHTTPStubs/Default (6.1.0): + - OHHTTPStubs/Core + - OHHTTPStubs/JSON + - OHHTTPStubs/NSURLSession + - OHHTTPStubs/OHPathHelpers + - OHHTTPStubs/JSON (6.1.0): + - OHHTTPStubs/Core + - OHHTTPStubs/NSURLSession (6.1.0): + - OHHTTPStubs/Core + - OHHTTPStubs/OHPathHelpers (6.1.0) + - PureLayout (3.1.2) + - Specta (1.0.7) + +DEPENDENCIES: + - AFNetworking + - BraintreeDropIn (from `BraintreeDropIn.podspec`) + - CardIO + - Expecta + - InAppSettingsKit + - "NSURL+QueryDictionary (~> 1.0)" + - OCMock + - OHHTTPStubs + - PureLayout + - Specta + +SPEC REPOS: + https://github.com/cocoapods/specs.git: + - AFNetworking + - CardIO + - Expecta + - InAppSettingsKit + - "NSURL+QueryDictionary" + - OCMock + - OHHTTPStubs + - PureLayout + - Specta + +EXTERNAL SOURCES: + BraintreeDropIn: + :podspec: BraintreeDropIn.podspec + +CHECKOUT OPTIONS: + BraintreeDropIn: + :commit: a339e32364a746ec9fc3841db7fd11b157b5cd90 + :git: https://github.com/braintree/braintree-ios-drop-in.git + +SPEC CHECKSUMS: + AFNetworking: b6f891fdfaed196b46c7a83cf209e09697b94057 + BraintreeDropIn: ca284a08c31fb49485883cdcfb87c69422a9b343 + CardIO: 56983b39b62f495fc6dae9ad7cf875143df06443 + Expecta: 3b6bd90a64b9a1dcb0b70aa0e10a7f8f631667d5 + InAppSettingsKit: acb6bc78cf00bbcfa63c4a26fd67f266bc7cfcd2 + "NSURL+QueryDictionary": bae616404e2adf6409d3d5c02a093cbf44c8a236 + OCMock: ebe9ee1dca7fbed0ff9193ac0b3e2d8862ea56f6 + OHHTTPStubs: 1e21c7d2c084b8153fc53d48400d8919d2d432d0 + PureLayout: 4634d0b61e3b5021166e8ec7c18e9e0ca0720c8b + Specta: 3e1bd89c3517421982dc4d1c992503e48bd5fe66 + +PODFILE CHECKSUM: 799bc2ca2ce429e7a37b921e531bc0fb7b470462 + +COCOAPODS: 1.6.1 diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/README.md b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/README.md new file mode 100644 index 0000000..ae4a8d3 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/README.md @@ -0,0 +1,70 @@ +# Braintree iOS SDK + +[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) +[![Travis CI build status](https://travis-ci.org/braintree/braintree_ios.svg?branch=master)](https://travis-ci.org/braintree/braintree_ios) + +Welcome to Braintree's iOS SDK. This library will help you accept card and alternative payments in your iOS app. + +**The Braintree iOS SDK requires Xcode 10+ and a Base SDK of iOS 9+**. It permits a Deployment Target of iOS 8.0 or higher. + +## Supported Payment Methods + +- [Credit Cards](https://developers.braintreepayments.com/guides/credit-cards/overview) +- [PayPal](https://developers.braintreepayments.com/guides/paypal/overview) +- [Pay with Venmo](https://developers.braintreepayments.com/guides/venmo/overview) +- [Apple Pay](https://developers.braintreepayments.com/guides/apple-pay/overview) +- [ThreeDSecure](https://developers.braintreepayments.com/guides/3d-secure/overview) +- [Visa Checkout](https://developers.braintreepayments.com/guides/visa-checkout/overview) + +## Installation + +We recommend using either [CocoaPods](https://github.com/CocoaPods/CocoaPods) or [Carthage](https://github.com/Carthage/Carthage) to integrate the Braintree SDK with your project. + +#### CocoaPods +``` +# Includes Cards and PayPal +pod 'Braintree' + +# Optionally include additional Pods +pod 'Braintree/DataCollector' +pod 'Braintree/Venmo' +``` + +#### Carthage +Add `github "braintree/braintree_ios"` to your `Cartfile`, and [add the frameworks to your project](https://github.com/Carthage/Carthage#adding-frameworks-to-an-application). + +## Documentation + +Start with [**'Hello, Client!'**](https://developers.braintreepayments.com/ios/start/hello-client) for instructions on basic setup and usage. + +Next, read the [**full documentation**](https://developers.braintreepayments.com/ios/sdk/client) for information about integration options, such as Drop-In UI, PayPal, and credit card tokenization. + +## Demo + +A demo app is included in the project. To run it, run `pod install` and then open `Braintree.xcworkspace` in Xcode. + +## Feedback + +The Braintree iOS SDK is in active development, we welcome your feedback! + +Here are a few ways to get in touch: + +* [GitHub Issues](https://github.com/braintree/braintree_ios/issues) - For generally applicable issues and feedback +* [Braintree Support](https://articles.braintreepayments.com/) / support@braintreepayments.com - for personal support at any phase of integration + +## Help + +* Read the headers +* [Read the Braintree docs](https://developers.braintreepayments.com/ios/sdk/client) +* [Check out the reference docs](https://braintree.github.io/braintree_ios/) +* Find a bug? [Open an issue](https://github.com/braintree/braintree_ios/issues) +* Want to contribute? [Check out contributing guidelines](CONTRIBUTING.md) and [submit a pull request](https://help.github.com/articles/creating-a-pull-request). + +## Releases + +Subscribe to our [Google Group](https://groups.google.com/forum/#!forum/braintree-sdk-announce) to +be notified when SDK releases go out. + +### License + +The Braintree iOS SDK is open source and available under the MIT license. See the [LICENSE](LICENSE) file for more info. diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Rakefile b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Rakefile new file mode 100644 index 0000000..5b3b03a --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Rakefile @@ -0,0 +1,303 @@ +require 'tempfile' +require 'fileutils' +require 'shellwords' +require 'bundler' +Bundler.require +HighLine.color_scheme = HighLine::SampleColorScheme.new + +task :default => %w[sanity_checks spec] + +desc "Run default set of tasks" +task :spec => %w[spec:all] + +desc "Run internal release process, pushing to internal GitHub Enterprise only" +task :release => %w[release:assumptions sanity_checks release:check_working_directory release:bump_version release:lint_podspec release:tag release:push_private] + +desc "Publish code and pod to public github.com" +task :publish => %w[publish:push publish:push_pod docs_internal docs_external] + +SEMVER = /\d+\.\d+\.\d+(-[0-9A-Za-z.-]+)?/ +PODSPEC = "Braintree.podspec" +BRAINTREE_VERSION_FILE = "BraintreeCore/Braintree-Version.h" +PAYPAL_ONE_TOUCH_VERSION_FILE = "BraintreePayPal/PayPalUtils/Public/PPOTVersion.h" +DEMO_PLIST = "Demo/Supporting Files/Braintree-Demo-Info.plist" +FRAMEWORKS_PLIST = "BraintreeCore/Info.plist" +PUBLIC_REMOTE_NAME = "public" + +class << self + def run cmd + say(HighLine.color("$ #{cmd}", :debug)) + File.popen(cmd) { |file| + if block_given? + result = '' + result << file.gets until file.eof? + yield result + else + puts file.gets until file.eof? + end + } + $? == 0 + end + + def run! cmd + run(cmd) or fail("Command failed with non-zero exit status #{$?}:\n$ #{cmd}") + end + + def current_version + File.read(PODSPEC)[SEMVER] + end + + def current_version_with_sha + %x{git describe}.strip + end + + def current_branch + %x{git rev-parse --abbrev-ref HEAD}.strip + end + + def xcodebuild(scheme, command, configuration, ios_version, options={}) + default_options = { + :build_settings => {} + } + ios_version_specifier = ",OS=#{ios_version}" if !ios_version.nil? + options = default_options.merge(options) + build_settings = options[:build_settings].map{|k,v| "#{k}='#{v}'"}.join(" ") + return "set -o pipefail && xcodebuild -workspace 'Braintree.xcworkspace' -sdk 'iphonesimulator' -configuration '#{configuration}' -scheme '#{scheme}' -destination 'name=iPhone 6,platform=iOS Simulator#{ios_version_specifier}' #{build_settings} #{command} | xcpretty -c -r junit" + end + +end + +namespace :spec do + def run_test_scheme! scheme, ios_version = nil + run! xcodebuild(scheme, 'test', 'Release', ios_version) + end + + desc 'Run unit tests' + task :unit, [:ios_version] do |t, args| + if args[:ios_version] + run_test_scheme! 'UnitTests', args[:ios_version] + else + run_test_scheme! 'UnitTests' + end + end + + desc 'Run UI tests' + task :ui do + run_test_scheme! 'UITests' + end + + namespace :api do + def with_https_server &block + begin + pid = Process.spawn('ruby ./IntegrationTests/Braintree-API-Integration-Specs/SSL/https_server.rb') + puts "Started server (#{pid})" + yield + puts "Killing server (#{pid})" + ensure + Process.kill("INT", pid) + end + end + + desc 'Run integration tests' + task :integration do + with_https_server do + run! xcodebuild('IntegrationTests', 'test', 'Release', nil, :build_settings => {'GCC_PREPROCESSOR_DEFINITIONS' => '$GCC_PREPROCESSOR_DEFINITIONS RUN_SSL_PINNING_SPECS=1'}) + end + end + end + + desc 'Run all spec schemes' + task :all => %w[spec:unit spec:api:integration spec:ui] +end + +namespace :demo do + desc 'Verify that the demo app builds successfully' + task :build do + run! xcodebuild('Demo', 'build', 'Release', nil) + end +end + +desc 'Run Carthage update' +namespace :carthage do + def generate_cartfile + File.write("./Cartfile", "git \"file://#{Dir.pwd}\" \"#{current_branch}\"") + end + + task :generate do + generate_cartfile + end + + task :clean do + run! 'rm -rf Carthage && rm Cartfile && rm Cartfile.resolved && rm -rf ~/Library/Developers/Xcode/DerivedData' + end + + task :test do + generate_cartfile + run! "carthage update" + run! "xcodebuild -project 'Demo/CarthageTest/CarthageTest.xcodeproj' -scheme 'CarthageTest' clean build" + end +end + +desc 'Run all sanity checks' +task :sanity_checks => %w[sanity_checks:pending_specs sanity_checks:build_demo sanity_checks:carthage_test] + +namespace :sanity_checks do + desc 'Check for pending tests' + task :pending_specs do + # ack returns 1 if no match is found, which is our success case + run! "which -s ack && ! ack 'fit\\(|fdescribe\\(' Specs" or fail "Please do not commit pending specs." + end + + desc 'Verify that all demo apps Build successfully' + task :build_demo => 'demo:build' + + desc 'Verify that Carthage builds successfully' + task :carthage_test => %w[carthage:test carthage:clean] +end + +namespace :release do + desc "Print out pre-release checklist" + task :assumptions do + say "Release Assumptions" + say "* [ ] You have pulled and reconciled origin (internal GitHub Enterprise) vs public (github.com)." + say "* [ ] You are on the branch and commit you want to release." + say "* [ ] You have already merged hotfixes and pulled changes." + say "* [ ] You have already reviewed the diff between the current release and the last tag, noting breaking changes in the semver and CHANGELOG." + say "* [ ] Tests (rake spec) are passing, manual verifications complete." + say "* [ ] Email is composed and ready to send to braintree-sdk-announce@googlegroups.com" + + abort(1) unless ask "Ready to release? " + end + + desc "Check that working directory is clean" + task :check_working_directory do + run! "echo 'Checking for uncommitted changes' && git diff --exit-code" + end + + desc "Bump version in Podspec" + task :bump_version do + say "Current version in Podspec: #{current_version}" + n = 10 + say "Previous #{n} versions in Git:" + run "git tag -l | tail -n #{n}" + version = ask("What version are you releasing?") { |q| q.validate = /\A#{SEMVER}\Z/ } + + podspec = File.read(PODSPEC) + podspec.gsub!(/(s\.version\s*=\s*)"#{SEMVER}"/, "\\1\"#{version}\"") + File.open(PODSPEC, "w") { |f| f.puts podspec } + + version_header = File.read(BRAINTREE_VERSION_FILE) + version_header.gsub!(SEMVER, version) + File.open(BRAINTREE_VERSION_FILE, "w") { |f| f.puts version_header } + + version_header = File.read(PAYPAL_ONE_TOUCH_VERSION_FILE) + version_header.gsub!(SEMVER, version) + File.open(PAYPAL_ONE_TOUCH_VERSION_FILE, "w") { |f| f.puts version_header } + + [DEMO_PLIST, FRAMEWORKS_PLIST].each do |plist| + run! "plutil -replace CFBundleVersion -string #{current_version} -- '#{plist}'" + run! "plutil -replace CFBundleShortVersionString -string #{current_version} -- '#{plist}'" + end + run "git commit -m 'Bump pod version to #{version}' -- #{PODSPEC} Podfile.lock '#{DEMO_PLIST}' '#{FRAMEWORKS_PLIST}' #{BRAINTREE_VERSION_FILE} #{PAYPAL_ONE_TOUCH_VERSION_FILE}" + end + + desc "Test." + task :test => 'spec:all' + + desc "Lint podspec." + task :lint_podspec do + run! "pod lib lint Braintree.podspec --allow-warnings" + end + + desc "Tag." + task :tag do + run! "git tag #{current_version} -a -m 'Release #{current_version}'" + end + + desc "Push tag to ghe." + task :push_private do + run! "git push origin HEAD #{current_version}" + end + +end + +namespace :publish do + + desc "Push code and tag to github.com" + task :push do + run! "git push #{PUBLIC_REMOTE_NAME} HEAD #{current_version}" + end + + desc "Pod push." + task :push_pod do + run! "pod trunk push --allow-warnings Braintree.podspec" + end + +end + +namespace :gen do + task :strings do + ["Drop-In", "UI"].each do |subspec| + run! "genstrings -o Braintree/#{subspec}/Localization/en.lproj Braintree/#{subspec}/**/*.m && " + + "iconv -f utf-16 -t utf-8 Braintree/#{subspec}/Localization/en.lproj/Localizable.strings > Braintree/#{subspec}/Localization/en.lproj/#{subspec}.strings && " + + "rm -f Braintree/#{subspec}/Localization/en.lproj/Localizable.strings" + end + end +end + +def jazzy_command + %W[jazzy + --objc + --author Braintree + --author_url http://braintreepayments.com + --github_url https://github.com/braintree/braintree_ios + --github-file-prefix https://github.com/braintree/braintree_ios/tree/#{current_version} + --sdk iphonesimulator + --module-version #{current_version} + --output docs_output + --xcodebuild-arguments --objc,Docs/Braintree-Umbrella-Header.h,--,-x,objective-c,-isysroot,$(xcrun --show-sdk-path),-I,$(pwd) + --min-acl internal + --theme fullwidth + --module Braintree + ].join(' ') +end + +desc "Generate documentation via jazzy and push to GHE" +task :docs_internal => %w[docs:generate docs:publish docs:internal docs:clean] + +desc "Generate documentation via jazzy and push to GH" +task :docs_external => %w[docs:generate docs:publish docs:external docs:clean] + +namespace :docs do + + desc "Generate docs with jazzy" + task :generate do + run! 'rm -rf docs_output' + run(jazzy_command) + puts "Generated HTML documentation at docs_output" + end + + task :publish do + run 'git branch -D gh-pages' + run! 'git add docs_output' + run! 'git commit -m "Publish docs to github pages"' + puts "Generating git subtree, this will take a moment..." + run! 'git subtree split --prefix docs_output -b gh-pages' + end + + task:internal do + run! 'git push -f origin gh-pages:gh-pages' + end + + task:external do + run! 'git push -f public gh-pages:gh-pages' + end + + task :clean do + run! 'git reset HEAD~' + run! 'git branch -D gh-pages' + puts "Published docs to gh-pages branch" + run! 'rm -rf docs_output' + end + +end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-API-Specs/BTLoggerSpec.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-API-Specs/BTLoggerSpec.m new file mode 100644 index 0000000..1059fec --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-API-Specs/BTLoggerSpec.m @@ -0,0 +1,78 @@ +#import "BTLogger_Internal.h" + +SpecBegin(BTLogger) + +describe(@"sharedLogger", ^{ + it(@"returns the singleton logger", ^{ + BTLogger *logger1 = [BTLogger sharedLogger]; + BTLogger *logger2 = [BTLogger sharedLogger]; + expect(logger1).to.beKindOf([BTLogger class]); + expect(logger1).to.equal(logger2); + }); +}); + +SpecEnd + +SpecBegin(BTLogger_Internal) + +describe(@"logger", ^{ + + __block BTLogger *logger; + + beforeEach(^{ + logger = [[BTLogger alloc] init]; + }); + + describe(@"log", ^{ + it(@"sends log message to NSLog", ^{ + [logger log:@"BTLogger probably works!"]; + // Can't mock NSLog + }); + + it(@"sends log message to logBlock if defined", ^{ + waitUntil(^(DoneCallback done) { + NSString *messageLogged = @"BTLogger logBlock works!"; + logger.logBlock = ^(BTLogLevel level, NSString *messageReceived) { + expect(level).to.equal(BTLogLevelInfo); + expect(messageReceived).to.equal(messageLogged); + done(); + }; + [logger log:messageLogged]; + }); + }); + }); + + describe(@"level", ^{ + it(@"defaults to 'info'", ^{ + expect(logger.level).to.equal(BTLogLevelInfo); + }); + + it(@"allows logging if logged at or below level", ^{ + + for (int level = BTLogLevelNone; level <= BTLogLevelDebug; level++) { + NSString *message = [NSString stringWithFormat:@"test %d", level]; + NSMutableArray *messagesLogged = [NSMutableArray array]; + __block BTLogLevel maxLevel = level; + waitUntil(^(DoneCallback done) { + logger.logBlock = ^(BTLogLevel actualLevel, NSString *messageReceived) { + expect(actualLevel).to.beLessThanOrEqualTo(maxLevel); + [messagesLogged addObject:messageReceived]; + }; + + logger.level = level; + [logger critical:message]; + [logger error:message]; + [logger warning:message]; + [logger info:message]; + [logger debug:message]; + done(); + }); + expect(messagesLogged.count).to.equal(level); + } + }); + + }); + +}); + +SpecEnd diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-API-Specs/BTThreeDSecureLookupSpec.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-API-Specs/BTThreeDSecureLookupSpec.m new file mode 100644 index 0000000..2df5811 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-API-Specs/BTThreeDSecureLookupSpec.m @@ -0,0 +1,28 @@ +#import "BTThreeDSecureLookupResult.h" + +// TODO: Reenable this spec when 3D Secure stuff is added back into the new BTThreeDSecureDriver + +SpecBegin(BTThreeDSecureLookupResult) + +describe(@"requiresUserAuthentication", ^{ + it(@"returns YES when the acs url is present", ^{ + BTThreeDSecureLookupResult *lookup = [[BTThreeDSecureLookupResult alloc] init]; + lookup.acsURL = [NSURL URLWithString:@"http://example.com"]; + lookup.termURL = [NSURL URLWithString:@"http://example.com"]; + lookup.MD = @"an-md"; + lookup.PAReq = @"a-PAReq"; + + expect(lookup.requiresUserAuthentication).to.beTruthy(); + }); + it(@"returns NO when the acs url is not present", ^{ + BTThreeDSecureLookupResult *lookup = [[BTThreeDSecureLookupResult alloc] init]; + lookup.acsURL = nil; + lookup.termURL = [NSURL URLWithString:@"http://example.com"]; + lookup.MD = @"an-md"; + lookup.PAReq = @"a-PAReq"; + + expect(lookup.requiresUserAuthentication).to.beFalsy(); + }); +}); + +SpecEnd diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-API-Specs/BTURLUtilsSpecs.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-API-Specs/BTURLUtilsSpecs.m new file mode 100644 index 0000000..31186ef --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-API-Specs/BTURLUtilsSpecs.m @@ -0,0 +1,65 @@ +#import "BTURLUtils.h" + +SpecBegin(BTURLUtils) + +describe(@"URLfromURL:withAppendedQueryDictionary:", ^{ + it(@"appends a dictionary to a url as a query string", ^{ + expect([BTURLUtils URLfromURL:[NSURL URLWithString:@"http://example.com:80/path/to/file"] withAppendedQueryDictionary:@{ @"key": @"value" }]).to.equal([NSURL URLWithString:@"http://example.com:80/path/to/file?key=value"]); + }); + + it(@"accepts a nil dictionary", ^{ + expect([BTURLUtils URLfromURL:[NSURL URLWithString:@"http://example.com"] withAppendedQueryDictionary:nil]).to.equal([NSURL URLWithString:@"http://example.com?"]); + }); + + it(@"precent escapes the query parameters", ^{ + expect([BTURLUtils URLfromURL:[NSURL URLWithString:@"http://example.com"] withAppendedQueryDictionary:@{ @"space ": @"sym&bol=" }]).to.equal([NSURL URLWithString:@"http://example.com?space%20=sym%26bol%3D"]); + }); + + it(@"passes a nil URL", ^{ + expect([BTURLUtils URLfromURL:nil withAppendedQueryDictionary:@{ @"space ": @"sym&bol=" }]).to.beNil(); + }); + + it(@"accepts relative URLs", ^{ + expect([BTURLUtils URLfromURL:[NSURL URLWithString:@"/relative/path"] withAppendedQueryDictionary:@{ @"key": @"value" }]).to.equal([NSURL URLWithString:@"/relative/path?key=value"]); + }); +}); + +describe(@"dictionaryForQueryString:", ^{ + it(@"returns an empty dictionary for a nil query string", ^{ + expect([BTURLUtils dictionaryForQueryString:nil]).to.equal(@{}); + }); + + it(@"returns an empty dictionary for an empty query string", ^{ + expect([BTURLUtils dictionaryForQueryString:@""]).to.equal(@{}); + }); + + it(@"returns a dictionary containing items from the query string", ^{ + expect([BTURLUtils dictionaryForQueryString:@"foo=bar&baz=quux"]).to.equal(@{ @"foo": @"bar", @"baz": @"quux" }); + }); + + it(@"URL decodes entities from query string keys and values", ^{ + expect([BTURLUtils dictionaryForQueryString:@"IHaveEquals%3D=IHaveComma%2C"]).to.equal(@{ @"IHaveEquals=": @"IHaveComma," }); + }); + + it(@"URL decodes entities from query string keys and values", ^{ + expect([BTURLUtils dictionaryForQueryString:@"key+with%20spaces=value"]).to.equal(@{ @"key with spaces": @"value" }); + }); + + it(@"returns a dictionary with [NSNull null] values for keys that don't have values", ^{ + expect([BTURLUtils dictionaryForQueryString:@"key"]).to.equal(@{ @"key": [NSNull null] }); + }); + + it(@"returns a dictionary with empty string values for key=", ^{ + expect([BTURLUtils dictionaryForQueryString:@"key="]).to.equal(@{ @"key": @"" }); + }); + + it(@"represents empty keys with the empty string", ^{ + expect([BTURLUtils dictionaryForQueryString:@"&=asdf&"]).to.equal(@{ @"": @"asdf" }); + }); + + it(@"keeps the right-most value for duplicate keys", ^{ + expect([BTURLUtils dictionaryForQueryString:@"key=value1&key=value2"]).to.equal(@{ @"key": @"value2" }); + }); +}); + +SpecEnd diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-API-Specs/BTVersionSpec.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-API-Specs/BTVersionSpec.m new file mode 100644 index 0000000..20700a8 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-API-Specs/BTVersionSpec.m @@ -0,0 +1,9 @@ +#import "Braintree-Version.h" + +SpecBegin(BTVersion) + +it(@"returns the current version", ^{ + expect(BRAINTREE_VERSION).to.match(@"\\d+\\.\\d+\\.\\d+"); +}); + +SpecEnd diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-Acceptance-Specs/BTThreeDSecureAcceptanceSpec.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-Acceptance-Specs/BTThreeDSecureAcceptanceSpec.m new file mode 100644 index 0000000..770b139 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-Acceptance-Specs/BTThreeDSecureAcceptanceSpec.m @@ -0,0 +1,199 @@ +#import "BTThreeDSecureDriver.h" +#import "BTClient+Testing.h" + +SpecBegin(BTThreeDSecure) + +describe(@"verifyCardWithNonce:amount:", ^{ + __block BTClient *client; + __block id delegate; + __block NSString *nonce; + + beforeEach(^{ + waitUntil(^(DoneCallback done) { + [BTClient testClientWithConfiguration:@{ BTClientTestConfigurationKeyMerchantIdentifier:@"integration_merchant_id", + BTClientTestConfigurationKeyPublicKey:@"integration_public_key", + BTClientTestConfigurationKeyCustomer:@YES, + BTClientTestConfigurationKeyClientTokenVersion: @2, + BTClientTestConfigurationKeyMerchantAccountIdentifier: @"three_d_secure_merchant_account", } + async:YES + completion:^(BTClient *aClient) { + client = aClient; + BTClientCardRequest *r = [[BTClientCardRequest alloc] init]; + r.number = @"4000000000000002"; + r.expirationMonth = @"12"; + r.expirationYear = @"2020"; + r.shouldValidate = NO; + [client saveCardWithRequest:r + success:^(BTCardPaymentMethod *card) { + nonce = card.nonce; + done(); + } failure:nil]; + }]; + }); + + delegate = [OCMockObject mockForProtocol:@protocol(BTPaymentMethodCreationDelegate)]; + }); + + describe(@"for a card that requires authentication", ^{ + it(@"returns the nonce on authentication completion", ^{ + BTThreeDSecureDriver *threeDSecure = [[BTThreeDSecureDriver alloc] initWithClient:client delegate:delegate]; + + id delegateRequestPresentationExpectation = [(OCMockObject *)delegate expect]; + __block UIViewController *threeDSecureViewController; + [delegateRequestPresentationExpectation andDo:^(NSInvocation *invocation) { + [invocation retainArguments]; + [invocation getArgument:&threeDSecureViewController atIndex:3]; + [system presentViewController:threeDSecureViewController +withinNavigationControllerWithNavigationBarClass:nil + toolbarClass:nil + configurationBlock:nil]; + }]; + [delegateRequestPresentationExpectation paymentMethodCreator:threeDSecure requestsPresentationOfViewController:[OCMArg isNotNil]]; + + [threeDSecure verifyCardWithNonce:nonce amount:[NSDecimalNumber decimalNumberWithString:@"1"]]; + + [(OCMockObject *)delegate verifyWithDelay:30]; + + [system runBlock:^KIFTestStepResult(NSError *__autoreleasing *error) { + KIFTestWaitCondition(threeDSecureViewController != nil, error, @"Did not present 3D Secure authentication flow"); + return KIFTestStepResultSuccess; + }]; + + [[(OCMockObject *)delegate expect] paymentMethodCreator:threeDSecure didCreatePaymentMethod:[OCMArg checkWithBlock:^BOOL(id obj) { + waitUntil(^(DoneCallback done) { + BTPaymentMethod *paymentMethod = obj; + [client fetchNonceThreeDSecureVerificationInfo:paymentMethod.nonce + success:^(NSDictionary *nonceInfo) { + expect(nonceInfo[@"reportStatus"]).to.equal(@"authenticate_successful"); + done(); + } failure:nil]; + }); + return YES; + }]]; + + [[(OCMockObject *)delegate expect] paymentMethodCreator:threeDSecure requestsDismissalOfViewController:[OCMArg isNotNil]]; + + [tester waitForViewWithAccessibilityLabel:@"Please submit your Verified by Visa password." traits:UIAccessibilityTraitStaticText]; + [tester tapUIWebviewXPathElement:@"//input[@name=\"external.field.password\"]"]; + [tester waitForTimeInterval:1.5]; + [tester enterTextIntoCurrentFirstResponder:@"1234"]; + [tester tapViewWithAccessibilityLabel:@"Submit"]; + + [(OCMockObject *)delegate verifyWithDelay:30]; + }); + }); + + describe(@"for a issuer that is not enrolled", ^{ + __block NSString *unenrolledNonce; + + beforeEach(^{ + waitUntil(^(DoneCallback done) { + BTClientCardRequest *r = [[BTClientCardRequest alloc] init]; + r.number = @"4000000000000051"; + r.expirationMonth = @"12"; + r.expirationYear = @"2020"; + r.shouldValidate = NO; + [client saveCardWithRequest:r + success:^(BTCardPaymentMethod *card) { + unenrolledNonce = card.nonce; + done(); + } failure:nil]; + }); + }); + + it(@"returns a nonce without user authentication", ^{ + BTThreeDSecureDriver *threeDSecure = [[BTThreeDSecureDriver alloc] initWithClient:client delegate:delegate]; + + [[(OCMockObject *)delegate expect] paymentMethodCreator:threeDSecure didCreatePaymentMethod:[OCMArg checkWithBlock:^BOOL(id obj) { + return [obj isKindOfClass:[BTCardPaymentMethod class]]; + }]]; + + [threeDSecure verifyCardWithNonce:unenrolledNonce + amount:[NSDecimalNumber decimalNumberWithString:@"1"]]; + + [(OCMockObject *)delegate verifyWithDelay:30]; + }); + }); + + describe(@"for an unsupported card type", ^{ + __block NSString *unsupportedNonce; + + beforeEach(^{ + + waitUntil(^(DoneCallback done) { + BTClientCardRequest *r = [[BTClientCardRequest alloc] init]; + r.number = @"6011111111111117"; + r.expirationMonth = @"12"; + r.expirationYear = @"2020"; + r.shouldValidate = NO; + [client saveCardWithRequest:r + success:^(BTCardPaymentMethod *card) { + unsupportedNonce = card.nonce; + done(); + } failure:nil]; + + }); + }); + + it(@"returns a card with a new nonce and appropriate threeDSecureInfo", ^{ + BTThreeDSecureDriver *threeDSecure = [[BTThreeDSecureDriver alloc] initWithClient:client delegate:delegate]; + + [[(OCMockObject *)delegate expect] paymentMethodCreator:threeDSecure + didCreatePaymentMethod:[OCMArg checkWithBlock:^BOOL(id obj) { + if (![obj isKindOfClass:[BTCardPaymentMethod class]]) { + return NO; + } + BTCardPaymentMethod *card = (BTCardPaymentMethod *)obj; + if ([card.nonce isEqualToString:unsupportedNonce] || !card.nonce || [card.nonce isEqualToString:@""]) { + return NO; + } + if (card.threeDSecureInfo.liabilityShiftPossible || card.threeDSecureInfo.liabilityShifted) { + return NO; + } + return YES; + }]]; + + [threeDSecure verifyCardWithNonce:unsupportedNonce + amount:[NSDecimalNumber decimalNumberWithString:@"1"]]; + + [(OCMockObject *)delegate verifyWithDelay:30]; + }); + }); + + describe(@"when the user taps cancel", ^{ + it(@"requests dismissal and notifies the delegate of cancelation", ^{ + BTThreeDSecureDriver *threeDSecure = [[BTThreeDSecureDriver alloc] initWithClient:client delegate:delegate]; + + id delegateRequestPresentationExpectation = [(OCMockObject *)delegate expect]; + __block UIViewController *threeDSecureViewController; + [delegateRequestPresentationExpectation andDo:^(NSInvocation *invocation) { + [invocation retainArguments]; + [invocation getArgument:&threeDSecureViewController atIndex:3]; + [system presentViewController:threeDSecureViewController + withinNavigationControllerWithNavigationBarClass:nil + toolbarClass:nil + configurationBlock:nil]; + }]; + + [delegateRequestPresentationExpectation paymentMethodCreator:threeDSecure requestsPresentationOfViewController:[OCMArg isNotNil]]; + + [threeDSecure verifyCardWithNonce:nonce amount:[NSDecimalNumber decimalNumberWithString:@"1"]]; + + [(OCMockObject *)delegate verifyWithDelay:10]; + + [system runBlock:^KIFTestStepResult(NSError *__autoreleasing *error) { + KIFTestWaitCondition(threeDSecureViewController != nil, error, @"Did not present 3D Secure authentication flow"); + return KIFTestStepResultSuccess; + }]; + + [[(OCMockObject *)delegate expect] paymentMethodCreator:threeDSecure requestsDismissalOfViewController:[OCMArg isNotNil]]; + [[(OCMockObject *)delegate expect] paymentMethodCreatorDidCancel:threeDSecure]; + + [tester tapViewWithAccessibilityLabel:@"Cancel"]; + + [(OCMockObject *)delegate verifyWithDelay:30]; + }); + }); +}); + +SpecEnd diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-Acceptance-Specs/BTThreeDSecureAuthenticationViewControllerAcceptanceSpec.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-Acceptance-Specs/BTThreeDSecureAuthenticationViewControllerAcceptanceSpec.m new file mode 100644 index 0000000..8348907 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-Acceptance-Specs/BTThreeDSecureAuthenticationViewControllerAcceptanceSpec.m @@ -0,0 +1,543 @@ +#import "BTThreeDSecureAuthenticationViewController.h" +#import "BTClient+Testing.h" +#import "BTClient_Internal.h" + +#import "KIFUITestActor+BTWebView.h" +#import "EXPMatchers+BTBeANonce.h" + +#define TIME_TO_WAIT_FOR_KEYBOARD 1.5 + +@interface BTThreeDSecureAuthenticationViewController_AcceptanceSpecHelper : NSObject + +@property (nonatomic, strong) BTClient *client; +@property (nonatomic, strong) BTThreeDSecureAuthenticationViewController *threeDSecureViewController; +@property (nonatomic, strong) BTThreeDSecureLookupResult *lookupResult; +@property (nonatomic, copy) NSString *originalNonce; + +@property (nonatomic, copy) void (^authenticateBlock)(BTThreeDSecureAuthenticationViewController *threeDSecureViewController, BTCardPaymentMethod *card, void (^completion)(BTThreeDSecureViewControllerCompletionStatus)); +@property (nonatomic, copy) void (^finishBlock)(BTThreeDSecureAuthenticationViewController *threeDSecureViewController); +@property (nonatomic, copy) void (^failureBlock)(BTThreeDSecureAuthenticationViewController *threeDSecureViewController, NSError *error); +@end + +@implementation BTThreeDSecureAuthenticationViewController_AcceptanceSpecHelper + ++ (instancetype)helper { + BTThreeDSecureAuthenticationViewController_AcceptanceSpecHelper *helper = [[self alloc] init]; + waitUntil(^(DoneCallback done) { + [BTClient testClientWithConfiguration:@{ BTClientTestConfigurationKeyMerchantIdentifier:@"integration_merchant_id", + BTClientTestConfigurationKeyPublicKey:@"integration_public_key", + BTClientTestConfigurationKeyCustomer:@YES, + BTClientTestConfigurationKeyClientTokenVersion: @2, + BTClientTestConfigurationKeyMerchantAccountIdentifier: @"three_d_secure_merchant_account", } + async:YES + completion:^(BTClient *client) { + helper.client = client; + done(); + }]; + }); + + return helper; +} + +- (void)lookupCard:(NSString *)number completion:(void (^)(BTThreeDSecureLookupResult *))completion { + BTClientCardRequest *request = [[BTClientCardRequest alloc] init]; + request.number = number; + request.expirationMonth = @"12"; + request.expirationYear = @"2020"; + request.shouldValidate = YES; + + [self.client saveCardWithRequest:request + success:^(BTPaymentMethod *card) { + NSString *originalNonce = card.nonce; + self.originalNonce = originalNonce; + [self.client lookupNonceForThreeDSecure:originalNonce + transactionAmount:[NSDecimalNumber decimalNumberWithString:@"1"] + success:^(BTThreeDSecureLookupResult *threeDSecureLookup) { + completion(threeDSecureLookup); + } failure:^(NSError *error) { + completion(nil); + }]; + } failure:^(__unused NSError *error) { + completion(nil); + }]; +} + +- (void)fetchThreeDSecureVerificationInfo:(NSString *)nonce completion:(void (^)(NSDictionary *response))completion { + [self.client fetchNonceThreeDSecureVerificationInfo:nonce + success:^(NSDictionary *threeDSecureVerificationInfo){ + completion(threeDSecureVerificationInfo); + } failure:^(__unused NSError *error){ + completion(nil); + }]; +} + +- (void)lookupNumber:(NSString *)number + andDo:(void (^)(BTThreeDSecureAuthenticationViewController *threeDSecureViewController))testBlock + didAuthenticate:(void (^)(BTThreeDSecureAuthenticationViewController *threeDSecureViewController, BTCardPaymentMethod *card, void (^completion)(BTThreeDSecureViewControllerCompletionStatus)))authenticateBlock + didFail:(void (^)(BTThreeDSecureAuthenticationViewController *threeDSecureViewController, NSError *error))failureBlock + didFinish:(void (^)(BTThreeDSecureAuthenticationViewController *threeDSecureViewController))finishBlock { + + waitUntil(^(DoneCallback done) { + [self lookupCard:number + completion:^(BTThreeDSecureLookupResult *threeDSecureLookup){ + self.lookupResult = threeDSecureLookup; + done(); + }]; + }); + + self.threeDSecureViewController = [[BTThreeDSecureAuthenticationViewController alloc] initWithLookupResult:self.lookupResult]; + + self.authenticateBlock = authenticateBlock; + self.finishBlock = finishBlock; + self.failureBlock = failureBlock; + + self.threeDSecureViewController.delegate = self; + + if (testBlock) { + testBlock(self.threeDSecureViewController); + } +} + +#pragma mark ThreeDSecureViewControllerDelegate + +- (void)threeDSecureViewController:(BTThreeDSecureAuthenticationViewController *)viewController + didAuthenticateCard:(BTCardPaymentMethod *)card + completion:(void (^)(BTThreeDSecureViewControllerCompletionStatus))completionBlock { + if (self.authenticateBlock) { + self.authenticateBlock(viewController, card, completionBlock); + } else { + [[NSException exceptionWithName:NSInternalInconsistencyException + reason:@"BTThreeDSecureViewController_AcceptanceSpecHelper received an unexpected call to threeDSecureViewController:didAuthenticateNonce:completion:" + userInfo:nil] raise]; + } +} + +- (void)threeDSecureViewController:(BTThreeDSecureAuthenticationViewController *)viewController didFailWithError:(NSError *)error { + if (self.failureBlock) { + self.failureBlock(viewController, error); + } else { + [[NSException exceptionWithName:NSInternalInconsistencyException + reason:@"BTThreeDSecureViewController_AcceptanceSpecHelper received an unexpected call to threeDSecureViewController:didFailWithError:" + userInfo:nil] raise]; + } +} + +- (void)threeDSecureViewControllerDidFinish:(BTThreeDSecureAuthenticationViewController *)viewController { + if (self.finishBlock) { + self.finishBlock(viewController); + } else { + [[NSException exceptionWithName:NSInternalInconsistencyException + reason:@"BTThreeDSecureViewController_AcceptanceSpecHelper received an unexpected call to threeDSecureViewControllerDidFinish:" + userInfo:nil] raise]; + } +} + +- (void)lookupHappyPathAndDo:(void (^)(BTThreeDSecureAuthenticationViewController *threeDSecureViewController))completion { + [self lookupNumber:@"4000000000000002" andDo:completion didAuthenticate:nil didFail:nil didFinish:nil]; +} + +@end + +SpecBegin(BTThreeDSecureAuthenticationViewController_Acceptance) + +describe(@"3D Secure View Controller", ^{ + __block BTThreeDSecureAuthenticationViewController_AcceptanceSpecHelper *helper; + beforeEach(^{ + helper = [BTThreeDSecureAuthenticationViewController_AcceptanceSpecHelper helper]; + }); + + describe(@"developer perspective - delegate messages", ^{ + it(@"fails to load a view controller when lookup fails", ^{ + BTThreeDSecureLookupResult *lookupResult = nil; + BTThreeDSecureAuthenticationViewController *threeDSecureViewController = [[BTThreeDSecureAuthenticationViewController alloc] initWithLookupResult:lookupResult]; + + expect(threeDSecureViewController).to.beNil(); + }); + + it(@"fails to load a view controller when lookup does not require a user flow", ^{ + BTThreeDSecureLookupResult *lookupResult = [[BTThreeDSecureLookupResult alloc] init]; + BTThreeDSecureAuthenticationViewController *threeDSecureViewController = [[BTThreeDSecureAuthenticationViewController alloc] initWithLookupResult:lookupResult]; + + expect(lookupResult.requiresUserAuthentication).to.beFalsy(); + expect(threeDSecureViewController).to.beNil(); + }); + + it(@"calls didAuthenticate with the upgraded nonce (consuming the original nonce)", ^{ + __block BOOL calledDidAuthenticate = NO; + [helper lookupNumber:@"4000000000000002" + andDo:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController) { + [system presentViewController:threeDSecureViewController withinNavigationControllerWithNavigationBarClass:nil toolbarClass:nil configurationBlock:nil]; + + [tester waitForViewWithAccessibilityLabel:@"Please submit your Verified by Visa password." traits:UIAccessibilityTraitStaticText]; + [tester tapUIWebviewXPathElement:@"//input[@name=\"external.field.password\"]"]; + [tester waitForTimeInterval:TIME_TO_WAIT_FOR_KEYBOARD]; + + [tester enterTextIntoCurrentFirstResponder:@"1234"]; + [tester tapViewWithAccessibilityLabel:@"Submit"]; + } didAuthenticate:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController, BTCardPaymentMethod *card, void (^completion)(BTThreeDSecureViewControllerCompletionStatus)) { + calledDidAuthenticate = YES; + expect(card.nonce).to.beANonce(); + } didFail:nil + didFinish:nil]; + + [system runBlock:^KIFTestStepResult(NSError *__autoreleasing *error) { + KIFTestWaitCondition(calledDidAuthenticate, error, @"Did not call didAuthenticate"); + return KIFTestStepResultSuccess; + }]; + }); + + it(@"calls didFinish after didAuthenticate calls its completion with success", ^{ + __block BOOL calledDidAuthenticate = NO; + __block BOOL calledDidFinish = NO; + [helper lookupNumber:@"4000000000000002" + andDo:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController) { + [system presentViewController:threeDSecureViewController withinNavigationControllerWithNavigationBarClass:nil toolbarClass:nil configurationBlock:nil]; + + [tester waitForViewWithAccessibilityLabel:@"Please submit your Verified by Visa password." traits:UIAccessibilityTraitStaticText]; + [tester tapUIWebviewXPathElement:@"//input[@name=\"external.field.password\"]"]; + [tester waitForTimeInterval:TIME_TO_WAIT_FOR_KEYBOARD]; + + [tester enterTextIntoCurrentFirstResponder:@"1234"]; + [tester tapViewWithAccessibilityLabel:@"Submit"]; + } didAuthenticate:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController, BTCardPaymentMethod *card, void (^completion)(BTThreeDSecureViewControllerCompletionStatus)) { + calledDidAuthenticate = YES; + expect(calledDidFinish).to.beFalsy(); + completion(BTThreeDSecureViewControllerCompletionStatusSuccess); + } didFail:nil + didFinish:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController) { + calledDidFinish = YES; + expect(calledDidAuthenticate).to.beTruthy(); + }]; + + [system runBlock:^KIFTestStepResult(NSError *__autoreleasing *error) { + KIFTestWaitCondition(calledDidAuthenticate, error, @"Did not call didAuthenticate"); + KIFTestWaitCondition(calledDidFinish, error, @"Did not call didFinish"); + return KIFTestStepResultSuccess; + }]; + }); + + it(@"calls didFail when authentication fails (leaving the original nonce transactable)", ^{ + __block BOOL calledDidFail = NO; + __block BOOL calledDidFinish = NO; + + [helper lookupNumber:@"4000000000000010" + andDo:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController) { + [system presentViewController:threeDSecureViewController withinNavigationControllerWithNavigationBarClass:nil toolbarClass:nil configurationBlock:nil]; + + [tester waitForViewWithAccessibilityLabel:@"Please submit your Verified by Visa password." traits:UIAccessibilityTraitStaticText]; + [tester tapUIWebviewXPathElement:@"//input[@name=\"external.field.password\"]"]; + [tester waitForTimeInterval:TIME_TO_WAIT_FOR_KEYBOARD]; + + [tester enterTextIntoCurrentFirstResponder:@"1234"]; + [tester tapViewWithAccessibilityLabel:@"Submit"]; + } didAuthenticate:nil + didFail:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController, NSError *error) { + expect(error.domain).to.equal(BTThreeDSecureErrorDomain); + expect(error.code).to.equal(BTThreeDSecureFailedAuthenticationErrorCode); + expect(error.localizedDescription).to.equal(@"Failed to authenticate, please try a different form of payment"); + expect(error.userInfo[BTThreeDSecureInfoKey]).to.equal(@{ @"liabilityShifted": @NO, @"liabilityShiftPossible": @YES, }); + calledDidFail = YES; + } + didFinish:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController) { + expect(calledDidFail).to.beTruthy(); + calledDidFinish = YES; + }]; + + [system runBlock:^KIFTestStepResult(NSError *__autoreleasing *error) { + KIFTestWaitCondition(calledDidFail, error, @"Did not call didFail"); + KIFTestWaitCondition(calledDidFinish, error, @"Did not call didFinish"); + return KIFTestStepResultSuccess; + }]; + }); + }); + + describe(@"user flows - 3DS Statuses (enrolled, authenticated, signature verified)", ^{ + context(@"cardholder enrolled, successful authentication, successful signature verification - Y,Y,Y", ^{ + it(@"successfully authenticates a user when they enter their password", ^{ + __block BOOL checkedNonce = NO; + [helper lookupNumber:@"4000000000000002" + andDo:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController) { + [system presentViewController:threeDSecureViewController withinNavigationControllerWithNavigationBarClass:nil toolbarClass:nil configurationBlock:nil]; + + [tester waitForViewWithAccessibilityLabel:@"Please submit your Verified by Visa password." traits:UIAccessibilityTraitStaticText]; + [tester tapUIWebviewXPathElement:@"//input[@name=\"external.field.password\"]"]; + [tester waitForTimeInterval:TIME_TO_WAIT_FOR_KEYBOARD]; + + [tester enterTextIntoCurrentFirstResponder:@"1234"]; + [tester tapViewWithAccessibilityLabel:@"Submit"]; + } didAuthenticate:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController, BTCardPaymentMethod *card, void (^completion)(BTThreeDSecureViewControllerCompletionStatus)) { + [helper fetchThreeDSecureVerificationInfo:card.nonce + completion:^(NSDictionary *response) { + expect(response[@"reportStatus"]).to.equal(@"authenticate_successful"); + checkedNonce = YES; + }]; + } didFail:nil + didFinish:nil]; + + [system runBlock:^KIFTestStepResult(NSError *__autoreleasing *error) { + KIFTestWaitCondition(checkedNonce, error, @"Did not check nonce"); + return KIFTestStepResultSuccess; + }]; + }); + }); + + context(@"issuer not enrolled - N", ^{ + it(@"bypasses the entire authentication experience", ^{ + [helper lookupNumber:@"4000000000000051" + andDo:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController) { + expect(threeDSecureViewController).to.beNil(); + } didAuthenticate:nil didFail:nil didFinish:nil]; + }); + }); + + context(@"simulated cardinal error on lookup - error", ^{ + it(@"bypasses the entire authentication experience", ^{ + [helper lookupNumber:@"4000000000000077" + andDo:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController) { + expect(threeDSecureViewController).to.beNil(); + } didAuthenticate:nil + didFail:nil + didFinish:nil]; + }); + }); + + context(@"User enters incorrect password - Y,N,Y", ^{ + it(@"it presents the failure to the user and fails to authenticate the nonce", ^{ + __block BOOL calledDidFail; + __block BOOL calledDidFinish; + + [helper lookupNumber:@"4000000000000028" + andDo:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController) { + + [system presentViewController:threeDSecureViewController withinNavigationControllerWithNavigationBarClass:nil toolbarClass:nil configurationBlock:nil]; + + + [tester waitForViewWithAccessibilityLabel:@"Please submit your Verified by Visa password." traits:UIAccessibilityTraitStaticText]; + [tester tapUIWebviewXPathElement:@"//input[@name=\"external.field.password\"]"]; + [tester enterTextIntoCurrentFirstResponder:@"bad"]; + [tester tapViewWithAccessibilityLabel:@"Submit"]; + [tester waitForViewWithAccessibilityLabel:@"Account Authentication Blocked"]; + [tester tapViewWithAccessibilityLabel:@"Continue"]; + } didAuthenticate:nil + didFail:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController, NSError *error) { + expect(error.domain).to.equal(BTThreeDSecureErrorDomain); + expect(error.code).to.equal(BTThreeDSecureFailedAuthenticationErrorCode); + expect(error.localizedDescription).to.equal(@"Failed to authenticate, please try a different form of payment"); + expect(error.userInfo[BTThreeDSecureInfoKey]).to.equal(@{ @"liabilityShifted": @NO, @"liabilityShiftPossible": @YES}); + calledDidFail = YES; + } didFinish:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController) { + calledDidFinish = YES; + }]; + + [system runBlock:^KIFTestStepResult(NSError *__autoreleasing *error) { + KIFTestWaitCondition(calledDidFail, error, @"Did not call didFail"); + KIFTestWaitCondition(calledDidFinish, error, @"Did not call didFinish"); + return KIFTestStepResultSuccess; + }]; + }); + }); + + context(@"User attempted to enter a password - Y,A,Y", ^{ + it(@"displays a loading indication to the user and successfully authenticates the nonce", ^{ + __block BOOL checkedNonce; + + [helper lookupNumber:@"4000000000000101" + andDo:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController) { + [system presentViewController:threeDSecureViewController withinNavigationControllerWithNavigationBarClass:nil toolbarClass:nil configurationBlock:nil]; + } didAuthenticate:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController, BTCardPaymentMethod *card, void (^completion)(BTThreeDSecureViewControllerCompletionStatus status)) { + [helper fetchThreeDSecureVerificationInfo:card.nonce + completion:^(NSDictionary *response) { + expect(response[@"reportStatus"]).to.equal(@"authenticate_attempt_successful"); + checkedNonce = YES; + }]; + } didFail:nil + didFinish:nil]; + + [system runBlock:^KIFTestStepResult(NSError *__autoreleasing *error) { + KIFTestWaitCondition(checkedNonce, error, @"Did not check nonce"); + return KIFTestStepResultSuccess; + }]; + }); + }); + + context(@"Signature verification fails - Y,Y,N", ^{ + it(@"accepts a password but resuts in an failed verification", ^{ + __block BOOL calledDidFail = NO; + __block BOOL calledDidFinish = NO; + + [helper lookupNumber:@"4000000000000010" + andDo:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController) { + [system presentViewController:threeDSecureViewController withinNavigationControllerWithNavigationBarClass:nil toolbarClass:nil configurationBlock:nil]; + + [tester waitForViewWithAccessibilityLabel:@"Please submit your Verified by Visa password." traits:UIAccessibilityTraitStaticText]; + [tester tapUIWebviewXPathElement:@"//input[@name=\"external.field.password\"]"]; + [tester waitForTimeInterval:TIME_TO_WAIT_FOR_KEYBOARD]; + + [tester enterTextIntoCurrentFirstResponder:@"1234"]; + [tester tapViewWithAccessibilityLabel:@"Submit"]; + } didAuthenticate:nil + didFail:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController, NSError *error) { + expect(error.domain).to.equal(BTThreeDSecureErrorDomain); + expect(error.code).to.equal(BTThreeDSecureFailedAuthenticationErrorCode); + expect(error.localizedDescription).to.equal(@"Failed to authenticate, please try a different form of payment"); + expect(error.userInfo[BTThreeDSecureInfoKey]).to.equal(@{ @"liabilityShifted": @NO, @"liabilityShiftPossible": @YES, }); + calledDidFail = YES; + } + didFinish:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController) { + calledDidFinish = YES; + }]; + + [system runBlock:^KIFTestStepResult(NSError *__autoreleasing *error) { + KIFTestWaitCondition(calledDidFail, error, @"Did not call didFail"); + KIFTestWaitCondition(calledDidFinish, error, @"Did not call didFinish"); + return KIFTestStepResultSuccess; + }]; + }); + }); + + context(@"issuer is down - Y,U", ^{ + it(@"returns a nonce without asking user for authentication", ^{ + __block BOOL calledDidFail = NO; + __block BOOL calledDidFinish = NO; + + [helper lookupNumber:@"4000000000000036" + andDo:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController) { + [system presentViewController:threeDSecureViewController withinNavigationControllerWithNavigationBarClass:nil toolbarClass:nil configurationBlock:nil]; + + [tester waitForViewWithAccessibilityLabel:@"System Error" traits:UIAccessibilityTraitStaticText]; + [tester tapViewWithAccessibilityLabel:@"Continue"]; + } didAuthenticate:nil + didFail:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController, NSError *error) { + calledDidFail = YES; + + expect(error.domain).to.equal(BTThreeDSecureErrorDomain); + expect(error.code).to.equal(BTThreeDSecureFailedAuthenticationErrorCode); + expect(error.userInfo[BTThreeDSecureInfoKey]).to.equal(@{ @"liabilityShifted": @NO, @"liabilityShiftPossible": @YES, }); + } didFinish:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController) { + expect(calledDidFail).to.beTruthy(); + calledDidFinish = YES; + }]; + + [system runBlock:^KIFTestStepResult(NSError *__autoreleasing *error) { + KIFTestWaitCondition(calledDidFail, error, @"Did not call didFail"); + KIFTestWaitCondition(calledDidFinish, error, @"Did not call didFinish"); + return KIFTestStepResultSuccess; + }]; + }); + }); + + context(@"Early termination due to cardinal error - Y, Error", ^{ + it(@"accepts a password but fails to authenticate the nonce", ^{ + __block BOOL calledDidFail = NO; + __block BOOL calledDidFinish = NO; + + [helper lookupNumber:@"4000000000000093" + andDo:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController) { + [system presentViewController:threeDSecureViewController withinNavigationControllerWithNavigationBarClass:nil toolbarClass:nil configurationBlock:nil]; + + [tester waitForViewWithAccessibilityLabel:@"Please submit your Verified by Visa password." traits:UIAccessibilityTraitStaticText]; + [tester tapUIWebviewXPathElement:@"//input[@name=\"external.field.password\"]"]; + [tester waitForTimeInterval:TIME_TO_WAIT_FOR_KEYBOARD]; + + [tester enterTextIntoCurrentFirstResponder:@"1234"]; + [tester tapViewWithAccessibilityLabel:@"Submit"]; + } didAuthenticate:nil + didFail:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController, NSError *error) { + calledDidFail = YES; + expect(error.domain).to.equal(BTThreeDSecureErrorDomain); + expect(error.code).to.equal(BTThreeDSecureFailedAuthenticationErrorCode); + expect(error.userInfo[BTThreeDSecureInfoKey]).to.equal(@{ @"liabilityShiftPossible": @YES, @"liabilityShifted": @NO, }); + } didFinish:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController) { + calledDidFinish = YES; + expect(calledDidFail).to.beTruthy(); + }]; + + [system runBlock:^KIFTestStepResult(NSError *__autoreleasing *error) { + KIFTestWaitCondition(calledDidFail, error, @"Did not call didFail"); + KIFTestWaitCondition(calledDidFinish, error, @"Did not call didFinish"); + return KIFTestStepResultSuccess; + }]; + }); + }); + + context(@"The ACS Frame fails to load", ^{ + it(@"accepts a password but fails to authenticate the nonce", ^{ + id stub = [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return [request.URL.host isEqualToString:@"acs.example.com"]; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { + return [OHHTTPStubsResponse responseWithError:[NSError errorWithDomain:NSURLErrorDomain code:123 userInfo:@{ NSLocalizedDescriptionKey: @"Something bad happened" }]]; + }]; + + BTThreeDSecureLookupResult *lookupResult = [[BTThreeDSecureLookupResult alloc] init]; + lookupResult.acsURL = [NSURL URLWithString:@"https://acs.example.com/"]; + lookupResult.PAReq = @"pareq"; + lookupResult.termURL = [NSURL URLWithString:@"https://example.com/term"]; + lookupResult.MD = @"md"; + + BTThreeDSecureAuthenticationViewController *threeDSecureViewController = [[BTThreeDSecureAuthenticationViewController alloc] initWithLookupResult:lookupResult]; + + [system presentViewController:threeDSecureViewController withinNavigationControllerWithNavigationBarClass:nil toolbarClass:nil configurationBlock:nil]; + + [tester waitForViewWithAccessibilityLabel:@"Something bad happened"]; + [tester tapViewWithAccessibilityLabel:@"OK"]; + [tester waitForAbsenceOfViewWithAccessibilityLabel:@"Something bad happened"]; + + [OHHTTPStubs removeStub:stub]; + }); + }); + }); + + describe(@"web view interaction details", ^{ + xit(@"displays a loading indicator during page loads", ^{ + [helper lookupHappyPathAndDo:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController) { + [system presentViewController:threeDSecureViewController withinNavigationControllerWithNavigationBarClass:nil toolbarClass:nil configurationBlock:nil]; + + [system waitForApplicationToSetNetworkActivityIndicatorVisible:YES]; + [system waitForApplicationToSetNetworkActivityIndicatorVisible:NO]; + [system waitForTimeInterval:1]; + [tester tapViewWithAccessibilityLabel:@"Submit"]; + [system waitForApplicationToSetNetworkActivityIndicatorVisible:YES]; + [system waitForTimeInterval:1]; + [tester waitForViewWithAccessibilityLabel:@"Incorrect, Please try again"]; + [system waitForApplicationToSetNetworkActivityIndicatorVisible:NO]; + }]; + }); + + it(@"closes the popup when the user taps Cancel in the nav bar", ^{ + [helper lookupHappyPathAndDo:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController) { + [system presentViewController:threeDSecureViewController withinNavigationControllerWithNavigationBarClass:nil toolbarClass:nil configurationBlock:nil]; + + [tester tapViewWithAccessibilityLabel:@"Help"]; + [tester waitForViewWithAccessibilityLabel:@"Social Security Number"]; + [tester tapViewWithAccessibilityLabel:@"Cancel"]; + + [tester waitForViewWithAccessibilityLabel:@"Please submit your Verified by Visa password." traits:UIAccessibilityTraitStaticText]; + }]; + }); + + it(@"closes the popup when the user taps a close link", ^{ + [helper lookupHappyPathAndDo:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController) { + [system presentViewController:threeDSecureViewController withinNavigationControllerWithNavigationBarClass:nil toolbarClass:nil configurationBlock:nil]; + + [tester tapViewWithAccessibilityLabel:@"Help"]; + [tester waitForViewWithAccessibilityLabel:@"Social Security Number"]; + [tester tapUIWebviewXPathElement:@"//a[text()=\"Social Security Number\"]"]; + [tester tapUIWebviewXPathElement:@"(//a[contains(text(), \"Return\")])[last()]"]; + + [tester waitForViewWithAccessibilityLabel:@"Please submit your Verified by Visa password." traits:UIAccessibilityTraitStaticText]; + }]; + }); + + it(@"uses the html title tag for the view controllers title", ^{ + [helper lookupHappyPathAndDo:^(BTThreeDSecureAuthenticationViewController *threeDSecureViewController) { + [system presentViewController:threeDSecureViewController withinNavigationControllerWithNavigationBarClass:nil toolbarClass:nil configurationBlock:nil]; + + [tester waitForViewWithAccessibilityLabel:@"Please submit your Verified by Visa password." traits:UIAccessibilityTraitStaticText]; + + expect(threeDSecureViewController.title).to.equal(@"Authentication"); + }]; + }); + }); +}); + +SpecEnd diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-Acceptance-Specs/KIFSystemTestActor+BTNetworkActivity.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-Acceptance-Specs/KIFSystemTestActor+BTNetworkActivity.h new file mode 100644 index 0000000..5fa7d22 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-Acceptance-Specs/KIFSystemTestActor+BTNetworkActivity.h @@ -0,0 +1,7 @@ +#import "KIFSystemTestActor.h" + +@interface KIFSystemTestActor (BTNetworkActivity) + +- (void)waitForApplicationToSetNetworkActivityIndicatorVisible:(BOOL)visible; + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-Acceptance-Specs/KIFSystemTestActor+BTNetworkActivity.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-Acceptance-Specs/KIFSystemTestActor+BTNetworkActivity.m new file mode 100644 index 0000000..7eab576 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-Acceptance-Specs/KIFSystemTestActor+BTNetworkActivity.m @@ -0,0 +1,12 @@ +#import "KIFSystemTestActor+BTNetworkActivity.h" + +@implementation KIFSystemTestActor (BTNetworkActivity) + +- (void)waitForApplicationToSetNetworkActivityIndicatorVisible:(BOOL)visible { + [system runBlock:^KIFTestStepResult(NSError *__autoreleasing *error) { + KIFTestWaitCondition([[UIApplication sharedApplication] isNetworkActivityIndicatorVisible] == visible, error, @"Network activity indicator visiblity was not %@", (visible ? @"YES" : @"NO")); + return KIFTestStepResultSuccess; + }]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-Acceptance-Specs/KIFUITestActor+BTWebView.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-Acceptance-Specs/KIFUITestActor+BTWebView.h new file mode 100644 index 0000000..08bd3d6 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-Acceptance-Specs/KIFUITestActor+BTWebView.h @@ -0,0 +1,8 @@ +#import "KIFUITestActor.h" + +@interface KIFUITestActor (BTWebView) + +- (void) waitForUIWebviewXPathElement:(NSString*)xpath; +- (void) tapUIWebviewXPathElement:(NSString*)xpath; + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-Acceptance-Specs/KIFUITestActor+BTWebView.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-Acceptance-Specs/KIFUITestActor+BTWebView.m new file mode 100644 index 0000000..c278394 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-Acceptance-Specs/KIFUITestActor+BTWebView.m @@ -0,0 +1,66 @@ +#import "KIFUITestActor+BTWebView.h" + +@implementation KIFUITestActor (BTWebView) + +- (UIWebView *)_getWebViewOnCurrentScreen:(NSArray *)views +{ + for (UIView *view in views) { + if ([NSStringFromClass([view class]) isEqual:@"UIWebView"]) { + return (UIWebView*) view; + } + UIWebView* found = [self _getWebViewOnCurrentScreen:view.subviews]; + if (found != nil) + return found; + } + return nil; +} + +- (UIWebView *)getWebViewOnCurrentScreen { + return [self _getWebViewOnCurrentScreen:[[UIApplication sharedApplication] windows]]; +} + + +// If the send in xpath doesn't find any element the return CGPoint will be -1,-1 +- (CGPoint)webViewElementCoordinates:(NSString *)xpath { + UIWebView *currentWebView = [self getWebViewOnCurrentScreen]; + if (currentWebView) { + [currentWebView stringByEvaluatingJavaScriptFromString:@"var script = document.createElement('script');" + "script.type = 'text/javascript';" + "script.text = \"function findPos(obj) {var curtop = 0; if (obj.offsetParent) { do { curtop += obj.offsetTop; } while (obj = obj.offsetParent); return [curtop]; }}; function getElementsByXPath(xpath, contextNode) { try { if(contextNode === undefined) { var xpathResult = document.evaluate(xpath, document, null, XPathResult.ANY_TYPE, null); } else { var xpathResult = contextNode.evaluate(xpath, contextNode, null, XPathResult.ANY_TYPE, null); } var array = []; var element; element = xpathResult.iterateNext(); while(element) { array[array.length] = element; element = xpathResult.iterateNext(); } if (array.length >= 0) { var element = array[0]; window.scroll(0,findPos(element)); var rect = element.getBoundingClientRect(); var elementLeft,elementTop; var scrollTop = document.documentElement.scrollTop?document.documentElement.scrollTop:document.body.scrollTop; var scrollLeft = document.documentElement.scrollLeft? document.documentElement.scrollLeft:document.body.scrollLeft; elementTop = rect.top+scrollTop; elementLeft = rect.left+scrollLeft; return elementLeft + ',' + elementTop + ',' + document.documentElement.scrollTop + ',' + document.body.scrollTop; } else { return ''; } } catch(err) { return 'xpath not found';} };\";" + "document.getElementsByTagName('head')[0].appendChild(script);"]; + NSString *message = [currentWebView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"%@%@%@", @"getElementsByXPath('", xpath, @"');"]]; + // This sleep is to allow scrolling to the element happening + [self waitForTimeInterval:0.1]; + if (![message isEqualToString:@""] && ![message isEqualToString:@"xpath not found"]) { + NSArray *list = [message componentsSeparatedByString:@","]; + CGPoint domCoordinates = CGPointMake([list[0] floatValue], [list[1] floatValue]); + CGPoint windowCoordinates = [currentWebView.scrollView convertPoint:domCoordinates + toView:[[UIApplication sharedApplication] keyWindow]]; + + return windowCoordinates; + } + } + return CGPointMake(-1, -1); +} + +- (void)waitForUIWebviewXPathElement:(NSString *)xpath { + + [self runBlock:^KIFTestStepResult(NSError **error) { + CGPoint point = [self webViewElementCoordinates:xpath]; + KIFTestWaitCondition(point.x != -1 && point.y != -1, error, @"Cannot find element with xpath \"%@\"", xpath); + return KIFTestStepResultSuccess; + } timeout:10.0]; + +} + +- (void)tapUIWebviewXPathElement:(NSString *)xpath { + [self runBlock:^KIFTestStepResult(NSError **error) { + CGPoint point = [self webViewElementCoordinates:xpath]; + KIFTestWaitCondition(point.x != -1 && point.y != -1, error, @"Cannot find element with xpath \"%@\"", xpath); + [self tapScreenAtPoint:point]; + return KIFTestStepResultSuccess; + } timeout:10.0]; + +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-PayPal-Integration-Specs/BTPayPalDriverSpec.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-PayPal-Integration-Specs/BTPayPalDriverSpec.m new file mode 100644 index 0000000..a7035b2 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-PayPal-Integration-Specs/BTPayPalDriverSpec.m @@ -0,0 +1,917 @@ +#import "BTPayPalDriver.h" + +#import "Braintree.h" +#import "BTClient_Internal.h" +#import "PayPalOneTouchCore.h" +#import "PayPalOneTouchRequest.h" +#import "BTAppSwitchErrors.h" +#import "BTPayPalDriver_Compatibility.h" + +@interface BTPayPalDriverSpecHelper : NSObject +@end + +@implementation BTPayPalDriverSpecHelper + ++ (void)setupSpec:(void (^)(NSString *returnURLScheme, id mockClient, id mockApplication))setupBlock { + id configuration = [OCMockObject mockForClass:[BTConfiguration class]]; + [[[configuration stub] andReturnValue:@YES] payPalEnabled]; + [[[configuration stub] andReturn:[NSURL URLWithString:@"https://example.com/privacy"]] payPalPrivacyPolicyURL]; + [[[configuration stub] andReturn:[NSURL URLWithString:@"https://example.com/tos"]] payPalMerchantUserAgreementURL]; + [[[configuration stub] andReturn:@"offline"] payPalEnvironment]; + [[[configuration stub] andReturn:@"client-id"] payPalClientId]; + [[[configuration stub] andReturnValue:@NO] payPalUseBillingAgreement]; + + id clientToken = [OCMockObject mockForClass:[BTClientToken class]]; + [[[clientToken stub] andReturn:@"client-token"] originalValue]; + + id client = [OCMockObject mockForClass:[BTClient class]]; + [[[client stub] andReturn:client] copyWithMetadata:OCMOCK_ANY]; + [[[client stub] andReturn:clientToken] clientToken]; + [[[client stub] andReturn:configuration] configuration]; + + NSString *returnURLScheme = @"com.braintreepayments.Braintree-Demo.payments"; + + id bundle = [OCMockObject partialMockForObject:[NSBundle mainBundle]]; + [[[bundle stub] andReturn:@[@{ @"CFBundleURLSchemes": @[returnURLScheme] }]] objectForInfoDictionaryKey:@"CFBundleURLTypes"]; + + id application = [OCMockObject partialMockForObject:[UIApplication sharedApplication]]; + [[[application stub] andReturnValue:@YES] canOpenURL:HC_hasProperty(@"scheme", returnURLScheme)]; + + setupBlock(returnURLScheme, client, application); +} + +@end + +SpecBegin(BTPayPalDriver) + +describe(@"PayPal One Touch Core", ^{ + describe(@"future payments", ^{ + describe(@"performing app switches", ^{ + it(@"performs an app switch to PayPal when the PayPal app is installed", ^{ + [BTPayPalDriverSpecHelper setupSpec:^(NSString *returnURLScheme, id mockClient, id mockApplication){ + [[mockClient stub] postAnalyticsEvent:OCMOCK_ANY]; + + XCTestExpectation *appSwitchExpectation = [self expectationWithDescription:@"Perform App Switch"]; + [[[mockApplication stub] andReturnValue:@YES] canOpenURL:HC_hasProperty(@"scheme", HC_startsWith(@"com.paypal"))]; + [[[[mockApplication expect] andReturnValue:@YES] andDo:^(__unused NSInvocation *invocation) { + [appSwitchExpectation fulfill]; + }] openURL:HC_hasProperty(@"scheme", HC_startsWith(@"com.paypal"))]; + + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithClient:mockClient returnURLScheme:returnURLScheme]; + + [payPalDriver startAuthorizationWithCompletion:nil]; + [self waitForExpectationsWithTimeout:10 handler:nil]; + + [mockApplication verify]; + }]; + }); + + it(@"performs an app switch to Safari when the PayPal app is not installed", ^{ + [BTPayPalDriverSpecHelper setupSpec:^(NSString *returnURLScheme, id mockClient, id mockApplication){ + [[mockClient stub] postAnalyticsEvent:OCMOCK_ANY]; + XCTestExpectation *appSwitchExpectation = [self expectationWithDescription:@"Perform App Switch"]; + + [[[mockApplication stub] andReturnValue:@NO] canOpenURL:HC_hasProperty(@"scheme", HC_startsWith(@"com.paypal"))]; + + [[[mockApplication stub] andReturnValue:@YES] canOpenURL:HC_hasProperty(@"scheme", @"https")]; + [[[[mockApplication expect] andReturnValue:@YES] andDo:^(NSInvocation *invocation) { + [appSwitchExpectation fulfill]; + }] openURL:HC_hasProperty(@"scheme", @"https")]; + + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithClient:mockClient returnURLScheme:returnURLScheme]; + + [payPalDriver startAuthorizationWithCompletion:nil]; + [self waitForExpectationsWithTimeout:10 handler:nil]; + + [mockApplication verify]; + }]; + }); + + it(@"fails to initialize if the returnURLScheme is not valid", ^{ + [BTPayPalDriverSpecHelper setupSpec:^(NSString *returnURLScheme, id mockClient, id mockApplication){ + [[mockClient stub] postAnalyticsEvent:OCMOCK_ANY]; + + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithClient:mockClient returnURLScheme:@"invalid-return-url-scheme"]; + + expect(payPalDriver).to.beNil(); + }]; + }); + }); + + describe(@"handling app switch returns", ^{ + it(@"receives a payment method on app switch return success", ^{ + [BTPayPalDriverSpecHelper setupSpec:^(NSString *returnURLScheme, id mockClient, id mockApplication){ + [[mockClient stub] postAnalyticsEvent:OCMOCK_ANY]; + + BTPaymentMethod *fakePaymentMethod = [OCMockObject mockForClass:[BTPaymentMethod class]]; + NSURL *fakeReturnURL = [OCMockObject mockForClass:[NSURL class]]; + + [[[mockClient expect] andDo:^(NSInvocation *invocation) { + void (^successBlock)(BTPaymentMethod *paymentMethod); + [invocation getArgument:&successBlock atIndex:4]; + successBlock(fakePaymentMethod); + }] savePaypalAccount:OCMOCK_ANY clientMetadataID:OCMOCK_ANY success:OCMOCK_ANY failure:OCMOCK_ANY]; + + [[[mockApplication stub] andReturnValue:@YES] canOpenURL:OCMOCK_ANY]; + [[[mockApplication stub] andReturnValue:@YES] openURL:OCMOCK_ANY]; + + id mockOTC = [OCMockObject mockForClass:[PayPalOneTouchCore class]]; + [[[[mockOTC expect] classMethod] andDo:^(NSInvocation *invocation) { + void (^stubOTCCompletionBlock)(PayPalOneTouchCoreResult *result); + [invocation getArgument:&stubOTCCompletionBlock atIndex:3]; + id result = [OCMockObject mockForClass:[PayPalOneTouchCoreResult class]]; + [(PayPalOneTouchCoreResult *)[[result stub] andReturnValue:OCMOCK_VALUE(PayPalOneTouchResultTypeSuccess)] type]; + [(PayPalOneTouchCoreResult *)[result stub] target]; + [(PayPalOneTouchCoreResult *)[result stub] response]; + stubOTCCompletionBlock(result); + }] parseResponseURL:fakeReturnURL completionBlock:[OCMArg isNotNil]]; + + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithClient:mockClient returnURLScheme:returnURLScheme]; + + XCTestExpectation *completionExpectation = [self expectationWithDescription:@"Received call to completion block"]; + [payPalDriver startAuthorizationWithCompletion:^void(BTPayPalPaymentMethod *paymentMethod, NSError *error) { + expect(paymentMethod).to.equal(fakePaymentMethod); + expect(error).to.beNil(); + [completionExpectation fulfill]; + }]; + + [BTPayPalDriver handleAppSwitchReturnURL:fakeReturnURL]; + [self waitForExpectationsWithTimeout:10 handler:nil]; + + [mockClient verify]; + [mockOTC verify]; + }]; + }); + + it(@"receives the error passed through directly on failure", ^{ + [BTPayPalDriverSpecHelper setupSpec:^(NSString *returnURLScheme, id mockClient, id mockApplication){ + [[mockClient stub] postAnalyticsEvent:OCMOCK_ANY]; + + NSError *fakeError = [OCMockObject mockForClass:[NSError class]]; + NSURL *fakeReturnURL = [OCMockObject mockForClass:[NSURL class]]; + + [[[mockApplication stub] andReturnValue:@YES] canOpenURL:OCMOCK_ANY]; + [[[mockApplication stub] andReturnValue:@YES] openURL:OCMOCK_ANY]; + + id mockOTC = [OCMockObject mockForClass:[PayPalOneTouchCore class]]; + [[[[mockOTC expect] classMethod] andDo:^(NSInvocation *invocation) { + void (^stubOTCCompletionBlock)(PayPalOneTouchCoreResult *result); + [invocation getArgument:&stubOTCCompletionBlock atIndex:3]; + id result = [OCMockObject mockForClass:[PayPalOneTouchCoreResult class]]; + [(PayPalOneTouchCoreResult *)[[result stub] andReturnValue:OCMOCK_VALUE(PayPalOneTouchResultTypeError)] type]; + [(PayPalOneTouchCoreResult *)[result stub] target]; + [(PayPalOneTouchCoreResult *)[[result stub] andReturn:fakeError] error]; + stubOTCCompletionBlock(result); + }] parseResponseURL:fakeReturnURL completionBlock:[OCMArg isNotNil]]; + + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithClient:mockClient returnURLScheme:returnURLScheme]; + + XCTestExpectation *completionExpectation = [self expectationWithDescription:@"Received call to completion block"]; + [payPalDriver startAuthorizationWithCompletion:^void(BTPayPalPaymentMethod *paymentMethod, NSError *error) { + expect(paymentMethod).to.beNil(); + expect(error).to.equal(fakeError); + [completionExpectation fulfill]; + }]; + + [BTPayPalDriver handleAppSwitchReturnURL:fakeReturnURL]; + [self waitForExpectationsWithTimeout:10 handler:nil]; + + [mockClient verify]; + [mockOTC verify]; + }]; + }); + + it(@"receives neither a payment method nor an error on cancelation", ^{ + [BTPayPalDriverSpecHelper setupSpec:^(NSString *returnURLScheme, id mockClient, id mockApplication){ + [[mockClient stub] postAnalyticsEvent:OCMOCK_ANY]; + + NSURL *fakeReturnURL = [OCMockObject mockForClass:[NSURL class]]; + + [[[mockApplication stub] andReturnValue:@YES] canOpenURL:OCMOCK_ANY]; + [[[mockApplication stub] andReturnValue:@YES] openURL:OCMOCK_ANY]; + + id mockOTC = [OCMockObject mockForClass:[PayPalOneTouchCore class]]; + [[[[mockOTC expect] classMethod] andDo:^(NSInvocation *invocation) { + void (^stubOTCCompletionBlock)(PayPalOneTouchCoreResult *result); + [invocation getArgument:&stubOTCCompletionBlock atIndex:3]; + id result = [OCMockObject mockForClass:[PayPalOneTouchCoreResult class]]; + [(PayPalOneTouchCoreResult *)[[result stub] andReturnValue:OCMOCK_VALUE(PayPalOneTouchResultTypeCancel)] type]; + [(PayPalOneTouchCoreResult *)[result stub] target]; + [(PayPalOneTouchCoreResult *)[result stub] error]; + stubOTCCompletionBlock(result); + }] parseResponseURL:fakeReturnURL completionBlock:[OCMArg isNotNil]]; + + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithClient:mockClient returnURLScheme:returnURLScheme]; + + XCTestExpectation *completionExpectation = [self expectationWithDescription:@"Received call to completion block"]; + [payPalDriver startAuthorizationWithCompletion:^void(BTPayPalPaymentMethod *paymentMethod, NSError *error) { + expect(paymentMethod).to.beNil(); + expect(error).to.beNil(); + [completionExpectation fulfill]; + }]; + + [BTPayPalDriver handleAppSwitchReturnURL:fakeReturnURL]; + [self waitForExpectationsWithTimeout:10 handler:nil]; + + [mockClient verify]; + [mockOTC verify]; + }]; + }); + }); + + describe(@"scopes", ^{ + it(@"includes email and future payments", ^{ + [BTPayPalDriverSpecHelper setupSpec:^(NSString *returnURLScheme, id mockClient, id mockApplication){ + [[mockClient stub] postAnalyticsEvent:OCMOCK_ANY]; + + XCTestExpectation *appSwitchExpectation = [self expectationWithDescription:@"opened URL"]; + [[[[mockApplication expect] andReturnValue:@YES] andDo:^(NSInvocation *invocation) { + [appSwitchExpectation fulfill]; + }] openURL:HC_hasProperty(@"scheme", @"https")]; + + id otcStub = [OCMockObject mockForClass:[PayPalOneTouchAuthorizationRequest class]]; + [[[[otcStub expect] classMethod] andForwardToRealObject] requestWithScopeValues:HC_containsInAnyOrder(@"email", @"https://uri.paypal.com/services/payments/futurepayments", nil) + privacyURL:OCMOCK_ANY + agreementURL:OCMOCK_ANY + clientID:OCMOCK_ANY + environment:OCMOCK_ANY + callbackURLScheme:OCMOCK_ANY]; + + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithClient:mockClient returnURLScheme:returnURLScheme]; + [payPalDriver startAuthorizationWithCompletion:nil]; + + [self waitForExpectationsWithTimeout:10 handler:nil]; + + [otcStub verify]; + }]; + }); + }); + + describe(@"analytics", ^{ + it(@"posts an analytics event for a successful app switch to the PayPal app", ^{ + [BTPayPalDriverSpecHelper setupSpec:^(NSString *returnURLScheme, id mockClient, id mockApplication){ + XCTestExpectation *appSwitchExpectation = [self expectationWithDescription:@"Perform App Switch"]; + [[[mockApplication stub] andReturnValue:@YES] canOpenURL:HC_hasProperty(@"scheme", HC_startsWith(@"com.paypal"))]; + [[[[mockApplication expect] andReturnValue:@YES] andDo:^(__unused NSInvocation *invocation) { + [appSwitchExpectation fulfill]; + }] openURL:HC_hasProperty(@"scheme", HC_startsWith(@"com.paypal"))]; + + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithClient:mockClient returnURLScheme:returnURLScheme]; + + [[mockClient expect] postAnalyticsEvent:@"ios.paypal-future-payments.appswitch.initiate.started"]; + + [payPalDriver startAuthorizationWithCompletion:nil]; + [self waitForExpectationsWithTimeout:10 handler:nil]; + + [mockClient verify]; + }]; + }); + + it(@"posts an analytics event for a successful app switch to the Browser", ^{ + [BTPayPalDriverSpecHelper setupSpec:^(NSString *returnURLScheme, id mockClient, id mockApplication){ + XCTestExpectation *appSwitchExpectation = [self expectationWithDescription:@"Perform App Switch"]; + [[[mockApplication stub] andReturnValue:@NO] canOpenURL:HC_hasProperty(@"scheme", HC_startsWith(@"com.paypal"))]; + [[[mockApplication stub] andReturnValue:@YES] canOpenURL:HC_hasProperty(@"scheme", @"https")]; + [[[[mockApplication expect] andReturnValue:@YES] andDo:^(__unused NSInvocation *invocation) { + [appSwitchExpectation fulfill]; + }] openURL:HC_hasProperty(@"scheme", @"https")]; + + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithClient:mockClient returnURLScheme:returnURLScheme]; + + [[mockClient expect] postAnalyticsEvent:@"ios.paypal-future-payments.webswitch.initiate.started"]; + + [payPalDriver startAuthorizationWithCompletion:nil]; + [self waitForExpectationsWithTimeout:10 handler:nil]; + + [mockClient verify]; + }]; + }); + + it(@"posts an analytics event for a failed app switch", ^{ + [BTPayPalDriverSpecHelper setupSpec:^(NSString *returnURLScheme, id mockClient, id mockApplication){ + XCTestExpectation *appSwitchExpectation = [self expectationWithDescription:@"Perform App Switch"]; + [[[mockApplication stub] andReturnValue:@NO] canOpenURL:HC_hasProperty(@"scheme", HC_startsWith(@"com.paypal"))]; + [[[mockApplication stub] andReturnValue:@YES] canOpenURL:HC_hasProperty(@"scheme", @"https")]; + [[[[mockApplication expect] andReturnValue:@YES] andDo:^(__unused NSInvocation *invocation) { + [appSwitchExpectation fulfill]; + }] openURL:HC_hasProperty(@"scheme", @"https")]; + + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithClient:mockClient returnURLScheme:returnURLScheme]; + + [[mockClient expect] postAnalyticsEvent:@"ios.paypal-future-payments.webswitch.initiate.started"]; + + [payPalDriver startAuthorizationWithCompletion:nil]; + [self waitForExpectationsWithTimeout:10 handler:nil]; + + [mockClient verify]; + }]; + }); + + it(@"posts analytics events when preflight checks fail", ^{ + [BTPayPalDriverSpecHelper setupSpec:^(NSString *returnURLScheme, id mockClient, id mockApplication){ + [[mockClient expect] postAnalyticsEvent:@"ios.paypal-otc.preflight.invalid-return-url-scheme"]; + + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithClient:mockClient returnURLScheme:@"invalid-return-url-scheme"]; + expect(payPalDriver).to.beNil(); + + [mockClient verify]; + }]; + }); + + it(@"post an analytics event to indicate handling the one touch core response ", ^{ + [BTPayPalDriverSpecHelper setupSpec:^(NSString *returnURLScheme, id mockClient, id mockApplication){ + NSURL *fakeReturnURL = [OCMockObject mockForClass:[NSURL class]]; + + [[[mockApplication stub] andReturnValue:@YES] canOpenURL:OCMOCK_ANY]; + [[[mockApplication stub] andReturnValue:@YES] openURL:OCMOCK_ANY]; + + id mockOTC = [OCMockObject mockForClass:[PayPalOneTouchCore class]]; + [[[[mockOTC stub] classMethod] andDo:^(NSInvocation *invocation) { + void (^stubOTCCompletionBlock)(PayPalOneTouchCoreResult *result); + [invocation getArgument:&stubOTCCompletionBlock atIndex:3]; + id result = [OCMockObject mockForClass:[PayPalOneTouchCoreResult class]]; + [(PayPalOneTouchCoreResult *)[[result stub] andReturnValue:OCMOCK_VALUE(PayPalOneTouchResultTypeCancel)] type]; + [(PayPalOneTouchCoreResult *)[result stub] target]; + [(PayPalOneTouchCoreResult *)[result stub] error]; + stubOTCCompletionBlock(result); + }] parseResponseURL:fakeReturnURL completionBlock:[OCMArg isNotNil]]; + + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithClient:mockClient returnURLScheme:returnURLScheme]; + + [[mockClient expect] postAnalyticsEvent:@"ios.paypal-future-payments.unknown.canceled"]; + [[mockClient stub] postAnalyticsEvent:OCMOCK_ANY]; + + XCTestExpectation *completionExpectation = [self expectationWithDescription:@"Received call to completion block"]; + [payPalDriver startAuthorizationWithCompletion:^void(BTPayPalPaymentMethod *paymentMethod, NSError *error) { + [completionExpectation fulfill]; + }]; + + [BTPayPalDriver handleAppSwitchReturnURL:fakeReturnURL]; + [self waitForExpectationsWithTimeout:10 handler:nil]; + + [mockClient verify]; + }]; + }); + + it(@"posts an anlaytics event to indicate tokenization success", ^{ + [BTPayPalDriverSpecHelper setupSpec:^(NSString *returnURLScheme, id mockClient, id mockApplication){ + NSURL *fakeReturnURL = [OCMockObject mockForClass:[NSURL class]]; + + [[[mockClient stub] andDo:^(NSInvocation *invocation) { + void (^successBlock)(BTPaymentMethod *paymentMethod); + [invocation getArgument:&successBlock atIndex:4]; + successBlock(nil); + }] savePaypalAccount:OCMOCK_ANY clientMetadataID:OCMOCK_ANY success:OCMOCK_ANY failure:OCMOCK_ANY]; + + [[[mockApplication stub] andReturnValue:@YES] canOpenURL:OCMOCK_ANY]; + [[[mockApplication stub] andReturnValue:@YES] openURL:OCMOCK_ANY]; + + id mockOTC = [OCMockObject mockForClass:[PayPalOneTouchCore class]]; + [[[[mockOTC stub] classMethod] andDo:^(NSInvocation *invocation) { + void (^stubOTCCompletionBlock)(PayPalOneTouchCoreResult *result); + [invocation getArgument:&stubOTCCompletionBlock atIndex:3]; + id result = [OCMockObject mockForClass:[PayPalOneTouchCoreResult class]]; + [(PayPalOneTouchCoreResult *)[[result stub] andReturnValue:OCMOCK_VALUE(PayPalOneTouchResultTypeSuccess)] type]; + [(PayPalOneTouchCoreResult *)[result stub] target]; + [(PayPalOneTouchCoreResult *)[result stub] response]; + stubOTCCompletionBlock(result); + }] parseResponseURL:fakeReturnURL completionBlock:[OCMArg isNotNil]]; + + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithClient:mockClient returnURLScheme:returnURLScheme]; + + [[mockClient expect] postAnalyticsEvent:@"ios.paypal-future-payments.tokenize.succeeded"]; + [[mockClient stub] postAnalyticsEvent:OCMOCK_ANY]; + + XCTestExpectation *completionExpectation = [self expectationWithDescription:@"Received call to completion block"]; + [payPalDriver startAuthorizationWithCompletion:^void(BTPayPalPaymentMethod *paymentMethod, NSError *error) { + [completionExpectation fulfill]; + }]; + + [BTPayPalDriver handleAppSwitchReturnURL:fakeReturnURL]; + [self waitForExpectationsWithTimeout:10 handler:nil]; + + [mockClient verify]; + }]; + }); + + it(@"posts an anlaytics event to indicate tokenization failure", ^{ + [BTPayPalDriverSpecHelper setupSpec:^(NSString *returnURLScheme, id mockClient, id mockApplication){ + NSURL *fakeReturnURL = [OCMockObject mockForClass:[NSURL class]]; + + [[[mockClient stub] andDo:^(NSInvocation *invocation) { + void (^failureBlock)(BTPaymentMethod *paymentMethod); + [invocation getArgument:&failureBlock atIndex:5]; + failureBlock(nil); + }] savePaypalAccount:OCMOCK_ANY clientMetadataID:OCMOCK_ANY success:OCMOCK_ANY failure:OCMOCK_ANY]; + + [[[mockApplication stub] andReturnValue:@YES] canOpenURL:OCMOCK_ANY]; + [[[mockApplication stub] andReturnValue:@YES] openURL:OCMOCK_ANY]; + + id mockOTC = [OCMockObject mockForClass:[PayPalOneTouchCore class]]; + [[[[mockOTC stub] classMethod] andDo:^(NSInvocation *invocation) { + void (^stubOTCCompletionBlock)(PayPalOneTouchCoreResult *result); + [invocation getArgument:&stubOTCCompletionBlock atIndex:3]; + id result = [OCMockObject mockForClass:[PayPalOneTouchCoreResult class]]; + [(PayPalOneTouchCoreResult *)[[result stub] andReturnValue:OCMOCK_VALUE(PayPalOneTouchResultTypeSuccess)] type]; + [(PayPalOneTouchCoreResult *)[result stub] target]; + [(PayPalOneTouchCoreResult *)[result stub] response]; + stubOTCCompletionBlock(result); + }] parseResponseURL:fakeReturnURL completionBlock:[OCMArg isNotNil]]; + + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithClient:mockClient returnURLScheme:returnURLScheme]; + + [[mockClient expect] postAnalyticsEvent:@"ios.paypal-future-payments.tokenize.failed"]; + [[mockClient stub] postAnalyticsEvent:OCMOCK_ANY]; + + XCTestExpectation *completionExpectation = [self expectationWithDescription:@"Received call to completion block"]; + [payPalDriver startAuthorizationWithCompletion:^void(BTPayPalPaymentMethod *paymentMethod, NSError *error) { + [completionExpectation fulfill]; + }]; + + [BTPayPalDriver handleAppSwitchReturnURL:fakeReturnURL]; + [self waitForExpectationsWithTimeout:10 handler:nil]; + + [mockClient verify]; + }]; + }); + }); + + describe(@"delegate notifications", ^{ + }); + + describe(@"isAvailable", ^{ + + + it(@"returns YES when PayPal is enabled in configuration and One Touch Core is ready", ^{ + + id configuration = [OCMockObject mockForClass:[BTConfiguration class]]; + [[[configuration stub] andReturnValue:@YES] payPalEnabled]; + [[[configuration stub] andReturn:[NSURL URLWithString:@"https://example.com/privacy"]] payPalPrivacyPolicyURL]; + [[[configuration stub] andReturn:[NSURL URLWithString:@"https://example.com/tos"]] payPalMerchantUserAgreementURL]; + [[[configuration stub] andReturn:@"offline"] payPalEnvironment]; + [[[configuration stub] andReturn:@"client-id"] payPalClientId]; + + id clientToken = [OCMockObject mockForClass:[BTClientToken class]]; + [[[clientToken stub] andReturn:@"client-token"] originalValue]; + + id client = [OCMockObject mockForClass:[BTClient class]]; + [[[client stub] andReturn:client] copyWithMetadata:OCMOCK_ANY]; + [[[client stub] andReturn:clientToken] clientToken]; + [[[client stub] andReturn:configuration] configuration]; + + NSString *returnURLScheme = @"com.braintreepayments.Braintree-Demo.bt-payments"; + + id bundle = [OCMockObject partialMockForObject:[NSBundle mainBundle]]; + [[[bundle stub] andReturn:@[@{ @"CFBundleURLSchemes": @[returnURLScheme] }]] objectForInfoDictionaryKey:@"CFBundleURLTypes"]; + + id application = [OCMockObject partialMockForObject:[UIApplication sharedApplication]]; + [[[application stub] andReturnValue:@YES] canOpenURL:HC_hasProperty(@"scheme", returnURLScheme)]; + + NSError *error; + BOOL isAvailable = [BTPayPalDriver verifyAppSwitchConfigurationForClient:client returnURLScheme:returnURLScheme error:&error]; + expect(isAvailable).to.beTruthy(); + expect(error).to.beNil(); + + + }); + + it(@"returns NO when PayPal is not enabled in configuration", ^{ + + id configuration = [OCMockObject mockForClass:[BTConfiguration class]]; + [[[configuration stub] andReturnValue:@NO] payPalEnabled]; + + [[[configuration stub] andReturn:@"offline"] payPalEnvironment]; + [[[configuration stub] andReturn:@"client-id"] payPalClientId]; + + id clientToken = [OCMockObject mockForClass:[BTClientToken class]]; + [[[clientToken stub] andReturn:@"client-token"] originalValue]; + + id client = [OCMockObject mockForClass:[BTClient class]]; + [[[client stub] andReturn:client] copyWithMetadata:OCMOCK_ANY]; + [[[client stub] andReturn:clientToken] clientToken]; + [[[client stub] andReturn:configuration] configuration]; + + NSString *returnURLScheme = @"com.braintreepayments.Braintree-Demo.bt-payments"; + + id bundle = [OCMockObject partialMockForObject:[NSBundle mainBundle]]; + [[[bundle stub] andReturn:@[@{ @"CFBundleURLSchemes": @[returnURLScheme] }]] objectForInfoDictionaryKey:@"CFBundleURLTypes"]; + + id application = [OCMockObject partialMockForObject:[UIApplication sharedApplication]]; + [[[application stub] andReturnValue:@YES] canOpenURL:HC_hasProperty(@"scheme", returnURLScheme)]; + + [[client expect] postAnalyticsEvent:@"ios.paypal-otc.preflight.disabled"]; + + NSError *error; + BOOL isAvailable = [BTPayPalDriver verifyAppSwitchConfigurationForClient:client returnURLScheme:returnURLScheme error:&error]; + expect(isAvailable).to.beFalsy(); + expect(error).notTo.beNil(); + + }); + + it(@"returns NO when the URL scheme has not been setup", ^{ + + id configuration = [OCMockObject mockForClass:[BTConfiguration class]]; + [[[configuration stub] andReturnValue:@YES] payPalEnabled]; + + [[[configuration stub] andReturn:@"offline"] payPalEnvironment]; + [[[configuration stub] andReturn:@"client-id"] payPalClientId]; + + id clientToken = [OCMockObject mockForClass:[BTClientToken class]]; + [[[clientToken stub] andReturn:@"client-token"] originalValue]; + + id client = [OCMockObject mockForClass:[BTClient class]]; + [[[client stub] andReturn:client] copyWithMetadata:OCMOCK_ANY]; + [[[client stub] andReturn:clientToken] clientToken]; + [[[client stub] andReturn:configuration] configuration]; + + NSString *returnURLScheme = @"com.braintreepayments.Braintree-Demo.bt-payments"; + + id application = [OCMockObject partialMockForObject:[UIApplication sharedApplication]]; + [[[application stub] andReturnValue:@YES] canOpenURL:HC_hasProperty(@"scheme", returnURLScheme)]; + + [[client expect] postAnalyticsEvent:@"ios.paypal-otc.preflight.invalid-return-url-scheme"]; + + NSError *error; + BOOL isAvailable = [BTPayPalDriver verifyAppSwitchConfigurationForClient:client returnURLScheme:returnURLScheme error:&error]; + expect(isAvailable).to.beFalsy(); + expect(error).notTo.beNil(); + + }); + + it(@"returns NO when the return URL scheme has not been registered with UIApplication", ^{ + + id configuration = [OCMockObject mockForClass:[BTConfiguration class]]; + [[[configuration stub] andReturnValue:@YES] payPalEnabled]; + + [[[configuration stub] andReturn:@"offline"] payPalEnvironment]; + [[[configuration stub] andReturn:@"client-id"] payPalClientId]; + + id clientToken = [OCMockObject mockForClass:[BTClientToken class]]; + [[[clientToken stub] andReturn:@"client-token"] originalValue]; + + id client = [OCMockObject mockForClass:[BTClient class]]; + [[[client stub] andReturn:client] copyWithMetadata:OCMOCK_ANY]; + [[[client stub] andReturn:clientToken] clientToken]; + [[[client stub] andReturn:configuration] configuration]; + + NSString *returnURLScheme = @"com.braintreepayments.Braintree-Demo.bt-payments"; + + id bundle = [OCMockObject partialMockForObject:[NSBundle mainBundle]]; + [[[bundle stub] andReturn:@[@{ @"CFBundleURLSchemes": @[returnURLScheme] }]] objectForInfoDictionaryKey:@"CFBundleURLTypes"]; + + [[client expect] postAnalyticsEvent:@"ios.paypal-otc.preflight.invalid-return-url-scheme"]; + + NSError *error; + BOOL isAvailable = [BTPayPalDriver verifyAppSwitchConfigurationForClient:client returnURLScheme:returnURLScheme error:&error]; + expect(isAvailable).to.beFalsy(); + expect(error).notTo.beNil(); + + }); + }); + + }); + + describe(@"classifying app switch returns", ^{ + + afterEach(^{ + // Reset state of BTPayPalDriver after each test (execute BTPayPalHandleURLContinuation if set) + [BTPayPalDriver handleAppSwitchReturnURL:[NSURL URLWithString:@""]]; + }); + + it(@"accepts return URLs from the browser", ^{ + + [BTPayPalDriverSpecHelper setupSpec:^(NSString *returnURLScheme, id mockClient, id mockApplication){ + [[mockClient stub] postAnalyticsEvent:OCMOCK_ANY]; + + // Both -canOpenURL: and -openURL: are checked by OTC. + // Pretend that no wallet is installed. + [[[mockApplication stub] andReturnValue:@NO] canOpenURL:HC_hasProperty(@"scheme", @"com.paypal.ppclient.touch.v1")]; + [[[mockApplication stub] andReturnValue:@NO] openURL:HC_hasProperty(@"scheme", @"com.paypal.ppclient.touch.v1")]; + [[[mockApplication stub] andReturnValue:@NO] canOpenURL:HC_hasProperty(@"scheme", @"com.paypal.ppclient.touch.v2")]; + [[[mockApplication stub] andReturnValue:@NO] openURL:HC_hasProperty(@"scheme", @"com.paypal.ppclient.touch.v2")]; + + + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithClient:mockClient returnURLScheme:returnURLScheme]; + + [payPalDriver startAuthorizationWithCompletion:nil]; + + NSURL *returnURL = [NSURL URLWithString:@"com.braintreepayments.braintree-demo.payments://onetouch/v1/success?payloadEnc=e0yvzQHOOoXyoLjKZvHBI0Rbyad6usxhOz22CjG3V1lOsguMRsuQpEqPxlIlK86VPmTuagb1jJcnDUK9QsWJE8ffe4i9Ms4ggd6r5EoymVM%2BAYgjyjaYtPPOxIgMepNGnvnYt9EKJs2Bd0wbZj0ekxSA6BzRZDPEpZ%2FjhssxJVscjbPvOwCoTnjEhuNxiOamAGSRd6fo7ln%2BishDwRCLz81qlV8cgfXNzlHrRw1P7CbTQ8XhNGn35CHD64ysuHAW97ZjAzPCRdikWbgiw2S%2BDvSePhRRnTR10e2NPDYBeVzGQFzvf6WRklrqcLeFwRcAqoa0ZneOPgMbk5nvylGY716caCCPtJKnoJAflZZK6%2F7iXcA%2F3p9qrQIrszmthu%2FbnA%2FP7dZsWRarUiT%2FZhZg32MsmV3B3fPjQOMbhB7dRv5uomhCjhNhPzXH7nFA54mKOlvAdTm1QOk5P%2Fh3AaHz0qwIKgXAhxIfwxqHgIYxtba53sdwa7OXfx14FRlcfPngrR02IAHeaulkH6vJ24ZAsoUUdNkvRfDmM1O2%2B4424%2FMINTUJJsR0%2FwrYrwzp0gC6fKoAzT%2FgFhL6QVLoUss%3D&payload=eyJ2ZXJzaW9uIjozLCJtc2dfR1VJRCI6IkMwQTkwODQ1LTJBRUQtNEZCRC04NzIwLTQzNUU2MkRGNjhFNCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiZW52aXJvbm1lbnQiOiJsaXZlIiwiZXJyb3IiOm51bGx9&x-source=com.braintree.browserswitch"]; + NSString *source = @"com.apple.mobilesafari"; + + BOOL canHandle = [BTPayPalDriver canHandleAppSwitchReturnURL:returnURL sourceApplication:source]; + expect(canHandle).to.beTruthy(); + + [mockApplication verify]; + }]; + + }); + + it(@"accepts return URLs from the app", ^{ + + [BTPayPalDriverSpecHelper setupSpec:^(NSString *returnURLScheme, id mockClient, id mockApplication){ + [[mockClient stub] postAnalyticsEvent:OCMOCK_ANY]; + + // Both -canOpenURL: and -openURL: are checked by OTC + [[[mockApplication stub] andReturnValue:@YES] canOpenURL:HC_hasProperty(@"scheme", @"com.paypal.ppclient.touch.v2")]; + [[[mockApplication stub] andReturnValue:@YES] openURL:HC_hasProperty(@"scheme", @"com.paypal.ppclient.touch.v2")]; + + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithClient:mockClient returnURLScheme:returnURLScheme]; + + [payPalDriver startAuthorizationWithCompletion:nil]; + + NSURL *returnURL = [NSURL URLWithString:@"com.braintreepayments.Braintree-Demo.payments://onetouch/v1/success?payload=eyJ2ZXJzaW9uIjoyLCJhY2NvdW50X2NvdW50cnkiOiJVUyIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiZW52aXJvbm1lbnQiOiJtb2NrIiwiZXhwaXJlc19pbiI6LTEsImRpc3BsYXlfbmFtZSI6Im1vY2tEaXNwbGF5TmFtZSIsInNjb3BlIjoiaHR0cHM6XC9cL3VyaS5wYXlwYWwuY29tXC9zZXJ2aWNlc1wvcGF5bWVudHNcL2Z1dHVyZXBheW1lbnRzIiwiZW1haWwiOiJtb2NrZW1haWxhZGRyZXNzQG1vY2suY29tIiwiYXV0aG9yaXphdGlvbl9jb2RlIjoibW9ja1RoaXJkUGFydHlBdXRob3JpemF0aW9uQ29kZSJ9&x-source=com.paypal.ppclient.touch.v1-or-v2"]; + NSString *source = @"com.paypal.ppclient.touch.v1"; + + BOOL canHandle = [BTPayPalDriver canHandleAppSwitchReturnURL:returnURL sourceApplication:source]; + expect(canHandle).to.beTruthy(); + + source = @"com.paypal.ppclient.touch.v2"; + + canHandle = [BTPayPalDriver canHandleAppSwitchReturnURL:returnURL sourceApplication:source]; + expect(canHandle).to.beTruthy(); + + [mockApplication verify]; + }]; + + }); + + it(@"rejects return URLs that did not come from browser or app", ^{ + + [BTPayPalDriverSpecHelper setupSpec:^(NSString *returnURLScheme, id mockClient, id mockApplication){ + [[mockClient stub] postAnalyticsEvent:OCMOCK_ANY]; + + // Both -canOpenURL: and -openURL: are checked by OTC + [[[mockApplication stub] andReturnValue:@YES] canOpenURL:HC_hasProperty(@"scheme", @"com.paypal.ppclient.touch.v2")]; + [[[mockApplication stub] andReturnValue:@YES] openURL:HC_hasProperty(@"scheme", @"com.paypal.ppclient.touch.v2")]; + + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithClient:mockClient returnURLScheme:returnURLScheme]; + + [payPalDriver startAuthorizationWithCompletion:nil]; + + NSURL *returnURL = [NSURL URLWithString:@"com.braintreepayments.Braintree-Demo.payments://onetouch/v1/success?payload=eyJ2ZXJzaW9uIjoyLCJhY2NvdW50X2NvdW50cnkiOiJVUyIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiZW52aXJvbm1lbnQiOiJtb2NrIiwiZXhwaXJlc19pbiI6LTEsImRpc3BsYXlfbmFtZSI6Im1vY2tEaXNwbGF5TmFtZSIsInNjb3BlIjoiaHR0cHM6XC9cL3VyaS5wYXlwYWwuY29tXC9zZXJ2aWNlc1wvcGF5bWVudHNcL2Z1dHVyZXBheW1lbnRzIiwiZW1haWwiOiJtb2NrZW1haWxhZGRyZXNzQG1vY2suY29tIiwiYXV0aG9yaXphdGlvbl9jb2RlIjoibW9ja1RoaXJkUGFydHlBdXRob3JpemF0aW9uQ29kZSJ9&x-source=com.paypal.ppclient.touch.v1-or-v2"]; + NSString *source = @"com.something.else"; + + BOOL canHandle = [BTPayPalDriver canHandleAppSwitchReturnURL:returnURL sourceApplication:source]; + expect(canHandle).to.beFalsy(); + + [mockApplication verify]; + }]; + + }); + + it(@"rejects other malformed URLs", ^{ + + [BTPayPalDriverSpecHelper setupSpec:^(NSString *returnURLScheme, id mockClient, id mockApplication){ + [[mockClient stub] postAnalyticsEvent:OCMOCK_ANY]; + + // Both -canOpenURL: and -openURL: are checked by OTC + [[[mockApplication stub] andReturnValue:@YES] canOpenURL:HC_hasProperty(@"scheme", @"com.paypal.ppclient.touch.v2")]; + [[[mockApplication stub] andReturnValue:@YES] openURL:HC_hasProperty(@"scheme", @"com.paypal.ppclient.touch.v2")]; + + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithClient:mockClient returnURLScheme:returnURLScheme]; + + [payPalDriver startAuthorizationWithCompletion:nil]; + + // This malformed returnURL is just missing payload + NSURL *returnURL = [NSURL URLWithString:@"com.braintreepayments.Braintree-Demo.payments://onetouch/v1/success?x-source=com.paypal.ppclient.touch.v1-or-v2"]; + + NSString *source = @"com.paypal.ppclient.touch.v2"; + + BOOL canHandle = [BTPayPalDriver canHandleAppSwitchReturnURL:returnURL sourceApplication:source]; + expect(canHandle).to.beFalsy(); + + + [mockApplication verify]; + }]; + + }); + + it(@"rejects returns when there is no app switch in progress", ^{ + + [BTPayPalDriverSpecHelper setupSpec:^(NSString *returnURLScheme, id mockClient, id mockApplication){ + [[mockClient stub] postAnalyticsEvent:OCMOCK_ANY]; + + // Both -canOpenURL: and -openURL: are checked by OTC + [[[mockApplication stub] andReturnValue:@YES] canOpenURL:HC_hasProperty(@"scheme", @"com.paypal.ppclient.touch.v2")]; + [[[mockApplication stub] andReturnValue:@YES] openURL:HC_hasProperty(@"scheme", @"com.paypal.ppclient.touch.v2")]; + + NSURL *returnURL = [NSURL URLWithString:@"com.braintreepayments.Braintree-Demo.payments://onetouch/v1/success?payload=eyJ2ZXJzaW9uIjoyLCJhY2NvdW50X2NvdW50cnkiOiJVUyIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiZW52aXJvbm1lbnQiOiJtb2NrIiwiZXhwaXJlc19pbiI6LTEsImRpc3BsYXlfbmFtZSI6Im1vY2tEaXNwbGF5TmFtZSIsInNjb3BlIjoiaHR0cHM6XC9cL3VyaS5wYXlwYWwuY29tXC9zZXJ2aWNlc1wvcGF5bWVudHNcL2Z1dHVyZXBheW1lbnRzIiwiZW1haWwiOiJtb2NrZW1haWxhZGRyZXNzQG1vY2suY29tIiwiYXV0aG9yaXphdGlvbl9jb2RlIjoibW9ja1RoaXJkUGFydHlBdXRob3JpemF0aW9uQ29kZSJ9&x-source=com.paypal.ppclient.touch.v1-or-v2"]; + + NSString *source = @"com.paypal.ppclient.touch.v2"; + + BOOL canHandle = [BTPayPalDriver canHandleAppSwitchReturnURL:returnURL sourceApplication:source]; + expect(canHandle).to.beFalsy(); + + + [mockApplication verify]; + }]; + + }); + + it(@"ignores the case of the URL Scheme to account for Safari's habit of downcasing URL schemes", ^{ + [BTPayPalDriverSpecHelper setupSpec:^(NSString *returnURLScheme, id mockClient, id mockApplication){ + [[mockClient stub] postAnalyticsEvent:OCMOCK_ANY]; + + // Both -canOpenURL: and -openURL: are checked by OTC + [[[mockApplication stub] andReturnValue:@YES] canOpenURL:HC_hasProperty(@"scheme", @"com.paypal.ppclient.touch.v2")]; + [[[mockApplication stub] andReturnValue:@YES] openURL:HC_hasProperty(@"scheme", @"com.paypal.ppclient.touch.v2")]; + + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithClient:mockClient returnURLScheme:returnURLScheme]; + + [payPalDriver startAuthorizationWithCompletion:nil]; + + NSURL *returnURL = [NSURL URLWithString:@"com.braintreepayments.braintree-demo.PaYmEnTs://onetouch/v1/success?payload=eyJ2ZXJzaW9uIjoyLCJhY2NvdW50X2NvdW50cnkiOiJVUyIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiZW52aXJvbm1lbnQiOiJtb2NrIiwiZXhwaXJlc19pbiI6LTEsImRpc3BsYXlfbmFtZSI6Im1vY2tEaXNwbGF5TmFtZSIsInNjb3BlIjoiaHR0cHM6XC9cL3VyaS5wYXlwYWwuY29tXC9zZXJ2aWNlc1wvcGF5bWVudHNcL2Z1dHVyZXBheW1lbnRzIiwiZW1haWwiOiJtb2NrZW1haWxhZGRyZXNzQG1vY2suY29tIiwiYXV0aG9yaXphdGlvbl9jb2RlIjoibW9ja1RoaXJkUGFydHlBdXRob3JpemF0aW9uQ29kZSJ9&x-source=com.paypal.ppclient.touch.v1-or-v2"]; + NSString *source = @"com.paypal.ppclient.touch.v2"; + + BOOL canHandle = [BTPayPalDriver canHandleAppSwitchReturnURL:returnURL sourceApplication:source]; + expect(canHandle).to.beTruthy(); + + [mockApplication verify]; + }]; + }); + }); + + describe(@"handling app switch returns", ^{ + + afterEach(^{ + // Reset state of BTPayPalDriver after each test (execute BTPayPalHandleURLContinuation if set) + [BTPayPalDriver handleAppSwitchReturnURL:[NSURL URLWithString:@""]]; + }); + + it(@"ignores an irrelevant or malformed URL", ^{ + + [BTPayPalDriverSpecHelper setupSpec:^(NSString *returnURLScheme, id mockClient, id mockApplication){ + [[mockClient stub] postAnalyticsEvent:OCMOCK_ANY]; + + // Both -canOpenURL: and -openURL: are checked by OTC + [[[mockApplication stub] andReturnValue:@YES] canOpenURL:HC_hasProperty(@"scheme", @"com.paypal.ppclient.touch.v2")]; + [[[mockApplication stub] andReturnValue:@YES] openURL:HC_hasProperty(@"scheme", @"com.paypal.ppclient.touch.v2")]; + + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithClient:mockClient returnURLScheme:returnURLScheme]; + + [payPalDriver startAuthorizationWithCompletion:nil]; + + NSURL *returnURL = [NSURL URLWithString:@"com.braintreepayments.braintree-demo.PaYmEnTs://----malformed----"]; + + [[mockClient reject] savePaypalAccount:OCMOCK_ANY clientMetadataID:OCMOCK_ANY success:OCMOCK_ANY failure:OCMOCK_ANY]; + + [BTPayPalDriver handleAppSwitchReturnURL:returnURL]; + + [mockClient verify]; + }]; + + }); + + it(@"accepts a success app switch return", ^{ + [BTPayPalDriverSpecHelper setupSpec:^(NSString *returnURLScheme, id mockClient, id mockApplication){ + [[mockClient stub] postAnalyticsEvent:OCMOCK_ANY]; + + // Both -canOpenURL: and -openURL: are checked by OTC + [[[mockApplication stub] andReturnValue:@YES] canOpenURL:HC_hasProperty(@"scheme", @"com.paypal.ppclient.touch.v2")]; + [[[mockApplication stub] andReturnValue:@YES] openURL:HC_hasProperty(@"scheme", @"com.paypal.ppclient.touch.v2")]; + + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithClient:mockClient returnURLScheme:returnURLScheme]; + + [payPalDriver startAuthorizationWithCompletion:nil]; + + NSURL *returnURL = [NSURL URLWithString:@"com.braintreepayments.braintree-demo.payments://onetouch/v1/success?payload=eyJ2ZXJzaW9uIjoyLCJhY2NvdW50X2NvdW50cnkiOiJVUyIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiZW52aXJvbm1lbnQiOiJtb2NrIiwiZXhwaXJlc19pbiI6LTEsImRpc3BsYXlfbmFtZSI6Im1vY2tEaXNwbGF5TmFtZSIsInNjb3BlIjoiaHR0cHM6XC9cL3VyaS5wYXlwYWwuY29tXC9zZXJ2aWNlc1wvcGF5bWVudHNcL2Z1dHVyZXBheW1lbnRzIiwiZW1haWwiOiJtb2NrZW1haWxhZGRyZXNzQG1vY2suY29tIiwiYXV0aG9yaXphdGlvbl9jb2RlIjoibW9ja1RoaXJkUGFydHlBdXRob3JpemF0aW9uQ29kZSJ9&x-source=com.paypal.ppclient.touch.v1-or-v2"]; + + [[mockClient expect] savePaypalAccount:OCMOCK_ANY clientMetadataID:OCMOCK_ANY success:OCMOCK_ANY failure:OCMOCK_ANY]; + + [BTPayPalDriver handleAppSwitchReturnURL:returnURL]; + + [mockClient verify]; + }]; + }); + + it(@"accepts a failure app switch return", ^{ + + [BTPayPalDriverSpecHelper setupSpec:^(NSString *returnURLScheme, id mockClient, id mockApplication){ + [[mockClient stub] postAnalyticsEvent:OCMOCK_ANY]; + + // Both -canOpenURL: and -openURL: are checked by OTC + [[[mockApplication stub] andReturnValue:@YES] canOpenURL:HC_hasProperty(@"scheme", @"com.paypal.ppclient.touch.v2")]; + [[[mockApplication stub] andReturnValue:@YES] openURL:HC_hasProperty(@"scheme", @"com.paypal.ppclient.touch.v2")]; + + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithClient:mockClient returnURLScheme:returnURLScheme]; + + [payPalDriver startAuthorizationWithCompletion:nil]; + + NSURL *returnURL = [NSURL URLWithString:@"com.braintreepayments.braintree-demo.PaYmEnTs://onetouch/v1/failure?error=some+message"]; + + XCTestExpectation *parseOtcExpectation = [self expectationWithDescription:@"Parse otc response"]; + + [PayPalOneTouchCore parseResponseURL:returnURL + completionBlock:^(PayPalOneTouchCoreResult *result) { + expect(result.type).to.equal(PayPalOneTouchResultTypeError); + [parseOtcExpectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:10 handler:nil]; + + [mockClient verify]; + }]; + + + + }); + + it(@"accepts a cancelation app switch return", ^{ + [BTPayPalDriverSpecHelper setupSpec:^(NSString *returnURLScheme, id mockClient, id mockApplication){ + [[mockClient stub] postAnalyticsEvent:OCMOCK_ANY]; + + // Both -canOpenURL: and -openURL: are checked by OTC + [[[mockApplication stub] andReturnValue:@YES] canOpenURL:HC_hasProperty(@"scheme", @"com.paypal.ppclient.touch.v2")]; + [[[mockApplication stub] andReturnValue:@YES] openURL:HC_hasProperty(@"scheme", @"com.paypal.ppclient.touch.v2")]; + + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithClient:mockClient returnURLScheme:returnURLScheme]; + + [payPalDriver startAuthorizationWithCompletion:nil]; + + NSURL *returnURL = [NSURL URLWithString:@"com.braintreepayments.braintree-demo.payments://onetouch/v1/cancel?payload=eyJ2ZXJzaW9uIjozLCJtc2dfR1VJRCI6IjQ1QUZEQkE3LUJEQTYtNDNEMi04MUY2LUY4REM1QjZEOTkzQSIsImVudmlyb25tZW50IjoibW9jayJ9&x-source=com.paypal.ppclient.touch.v2"]; + + XCTestExpectation *parseOtcExpectation = [self expectationWithDescription:@"Parse otc response"]; + + [PayPalOneTouchCore parseResponseURL:returnURL + completionBlock:^(PayPalOneTouchCoreResult *result) { + expect(result.type).to.equal(PayPalOneTouchResultTypeCancel); + [parseOtcExpectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:10 handler:nil]; + + [mockClient verify]; + }]; + }); + + it(@"tokenizes a success response, returning the payment method nonce to the developer", ^{ + + [BTPayPalDriverSpecHelper setupSpec:^(NSString *returnURLScheme, id mockClient, id mockApplication) { + + id ppOtcMock = [OCMockObject mockForClass:[PayPalOneTouchCore class]]; + [[[ppOtcMock stub] andReturnValue:@YES] canParseURL:OCMOCK_ANY sourceApplication:OCMOCK_ANY]; + + [[mockClient stub] postAnalyticsEvent:OCMOCK_ANY]; + + // Both -canOpenURL: and -openURL: are checked by OTC + [[[mockApplication stub] andReturnValue:@YES] canOpenURL:HC_hasProperty(@"scheme", @"com.paypal.ppclient.touch.v2")]; + [[[mockApplication stub] andReturnValue:@YES] openURL:HC_hasProperty(@"scheme", @"com.paypal.ppclient.touch.v2")]; + + BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithClient:mockClient returnURLScheme:returnURLScheme]; + + XCTestExpectation *completionExpectation = [self expectationWithDescription:@"authorization completion callback"]; + [payPalDriver startAuthorizationWithCompletion:^(BTPayPalPaymentMethod *payPalPaymentMethod, NSError *error) { + NSLog(@"startAuthorizationWithCompletion %@ %@", payPalPaymentMethod, error); + [completionExpectation fulfill]; + }]; + + NSURL *returnURL = [NSURL URLWithString:@"com.braintreepayments.braintree-demo.payments://onetouch/v1/success?payloadEnc=IiRZ%2FKEnD6RQ8UeUmOFO8Ofh1RqQcWFycpO6pB9Yzl7fLb5szdaHanap7gwpmKsq4MJ2KGRJ0MzZBPvmoL%2BxkSH7%2FC%2F4WqeeVeGYvCpAvsPpkg%2BY8PID54FqVDpP1EXKS3Vx%2F6XmqbDplNLUUNzXZ4P%2FNcaXiEZXoHv6odjm7rxP3Ric%2Fsal9oiCDGDeFOAwTkiklA%2BA5nsASGopzrMHeIVBtcA01yae%2BDrgwPhHWNy6hffL2yVPVREtpVRBLrXK0jzn9IGUKMbBSMg%2F8BZ14ijhU%2F4cFlqi51NARQEFXMJcSba%2FscQTV1%2Fzj7D6B9W4pUYk9WY7eygmwMs%2BTYkTYnKRJjHTPWzMScdesYjj161c6DdWBFFtCVcanwvdk5rp1YCaElOmYV5WZSGKkSORCNMNKVKe8AkXMVO%2BPc41&payload=eyJ2ZXJzaW9uIjozLCJtc2dfR1VJRCI6IkNCNkY1Q0IwLUY4NEYtNEZEMC1BNzQ1LTdCMDE0MDQ0OUQyRSIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiZW52aXJvbm1lbnQiOiJtb2NrIiwiZXJyb3IiOm51bGx9&x-source=com.braintree.browserswitch"]; + + // We must call +[Braintree handleOpenURL:sourceApplication:] (not [BTPayPalDriver handleAppSwitchReturnURL:returnURL]) + // in order to test that the returnURL is passed through to BTPayPalDriver. + // This was a real bug that shipped in 4.0.0-pre2 and was fixed in 625ae947ee92561934dfb1a3a2bf387d8890b91f. + // Also, sourceApplication is verified by OTC. + [Braintree handleOpenURL:returnURL sourceApplication:@"com.apple.mobilesafari"]; + + // Note: -savePaypalAccount:clientMetadataID:success:failure: isn't actually called here. + + [self waitForExpectationsWithTimeout:5 handler:nil]; + + [mockClient verify]; + + [ppOtcMock stopMocking]; + }]; + }); + + it(@"returns tokenization failures to the developer", ^{ //Todo + }); + + it(@"returns a failure to the developer", ^{ //Todo + }); + + it(@"returns a cancelation to the developer", ^{ //Todo + }); + + it(@"rejects returns when there is no app switch in progress", ^{ + [BTPayPalDriverSpecHelper setupSpec:^(NSString *returnURLScheme, id mockClient, id mockApplication){ + [[mockClient stub] postAnalyticsEvent:OCMOCK_ANY]; + + // Both -canOpenURL: and -openURL: are checked by OTC + [[[mockApplication stub] andReturnValue:@YES] canOpenURL:HC_hasProperty(@"scheme", @"com.paypal.ppclient.touch.v2")]; + [[[mockApplication stub] andReturnValue:@YES] openURL:HC_hasProperty(@"scheme", @"com.paypal.ppclient.touch.v2")]; + + __unused BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithClient:mockClient returnURLScheme:returnURLScheme]; + + NSURL *returnURL = [NSURL URLWithString:@"com.braintreepayments.braintree-demo.payments://onetouch/v1/success?payload=eyJ2ZXJzaW9uIjoyLCJhY2NvdW50X2NvdW50cnkiOiJVUyIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiZW52aXJvbm1lbnQiOiJtb2NrIiwiZXhwaXJlc19pbiI6LTEsImRpc3BsYXlfbmFtZSI6Im1vY2tEaXNwbGF5TmFtZSIsInNjb3BlIjoiaHR0cHM6XC9cL3VyaS5wYXlwYWwuY29tXC9zZXJ2aWNlc1wvcGF5bWVudHNcL2Z1dHVyZXBheW1lbnRzIiwiZW1haWwiOiJtb2NrZW1haWxhZGRyZXNzQG1vY2suY29tIiwiYXV0aG9yaXphdGlvbl9jb2RlIjoibW9ja1RoaXJkUGFydHlBdXRob3JpemF0aW9uQ29kZSJ9&x-source=com.paypal.ppclient.touch.v1-or-v2"]; + + [[mockClient reject] savePaypalAccount:OCMOCK_ANY clientMetadataID:OCMOCK_ANY success:OCMOCK_ANY failure:OCMOCK_ANY]; + + [BTPayPalDriver handleAppSwitchReturnURL:returnURL]; + + [mockClient verify]; + }]; + }); + }); +}); + +SpecEnd diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-PayPal-Specs/BTClient+BTPayPalSpec.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-PayPal-Specs/BTClient+BTPayPalSpec.m new file mode 100644 index 0000000..ada230c --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-PayPal-Specs/BTClient+BTPayPalSpec.m @@ -0,0 +1,155 @@ +#import "BTClientToken.h" +#import "BTClient+BTPayPal.h" +#import "PayPalMobile.h" +#import "BTErrors+BTPayPal.h" +#import "BTTestClientTokenFactory.h" +#import "BTConfiguration.h" +#import "BTClient+Offline.h" + +#import "BTClient_Internal.h" +#import "BTClientSpecHelper.h" + +SharedExamplesBegin(BTClient_BTPayPalSpec) + +sharedExamplesFor(@"a BTClient", ^(NSDictionary *data) { + + __block BOOL asyncClient = [data[@"asyncClient"] boolValue]; + __block NSMutableDictionary *mutableClaims; + + beforeEach(^{ + + NSDictionary *paypalClaims = @{ + BTConfigurationKeyPayPalMerchantName: @"PayPal Merchant", + BTConfigurationKeyPayPalMerchantPrivacyPolicyUrl: @"http://merchant.example.com/privacy", + BTConfigurationKeyPayPalMerchantUserAgreementUrl: @"http://merchant.example.com/tos", + BTConfigurationKeyPayPalClientId: @"PayPal-Test-Merchant-ClientId", + BTConfigurationKeyPayPalDirectBaseUrl: @"http://api.paypal.example.com" + }; + + NSDictionary *baseClaims = @{ + BTConfigurationKeyClientApiURL: @"http://gateway.example.com/client_api", + BTConfigurationKeyPayPalEnabled: @YES, + BTConfigurationKeyPayPal: [paypalClaims mutableCopy] }; + + + mutableClaims = [baseClaims mutableCopy]; + }); + + describe(@"btPayPal_preparePayPalMobileWithError", ^{ + + describe(@"in Live PayPal environment", ^{ + describe(@"btPayPal_payPalEnvironment", ^{ + it(@"returns PayPal mSDK notion of Live", ^{ + mutableClaims[@"paypal"][@"environment"] = BTConfigurationPayPalEnvironmentLive; + BTClient * client = [BTClientSpecHelper clientForTestCase:self withOverrides:mutableClaims async:asyncClient]; + expect([client btPayPal_environment]).to.equal(PayPalEnvironmentProduction); + }); + }); + }); + + describe(@"with custom PayPal environment", ^{ + it(@"does not return an error with the valid set of claims", ^{ + mutableClaims[@"paypal"][@"environment"] = BTConfigurationPayPalEnvironmentCustom; + BTClient * client = [BTClientSpecHelper clientForTestCase:self withOverrides:mutableClaims async:asyncClient]; + NSError *error; + BOOL success = [client btPayPal_preparePayPalMobileWithError:&error]; + expect(error).to.beNil(); + expect(success).to.beTruthy(); + }); + + it(@"returns an error if the client ID is present but the Base URL is missing", ^{ + mutableClaims[@"paypal"][@"directBaseUrl"] = [NSNull null]; + mutableClaims[@"paypal"][@"environment"] = BTConfigurationPayPalEnvironmentCustom; + BTClient * client = [BTClientSpecHelper clientForTestCase:self withOverrides:mutableClaims async:asyncClient]; + NSError *error; + BOOL success = [client btPayPal_preparePayPalMobileWithError:&error]; + expect(error.code).to.equal(BTMerchantIntegrationErrorPayPalConfiguration); + expect(error.userInfo).notTo.beNil(); + expect(success).to.beFalsy(); + }); + + it(@"returns an error if the PayPal Base URL is present but the client ID is missing", ^{ + mutableClaims[@"paypal"][@"clientId"] = [NSNull null]; + mutableClaims[@"paypal"][@"environment"] = BTConfigurationPayPalEnvironmentCustom; + BTClient * client = [BTClientSpecHelper clientForTestCase:self withOverrides:mutableClaims async:asyncClient]; + NSError *error; + [client btPayPal_preparePayPalMobileWithError:&error]; + expect(error.code).to.equal(BTMerchantIntegrationErrorPayPalConfiguration); + expect(error.userInfo).notTo.beNil(); + }); + + describe(@"btPayPal_payPalEnvironment", ^{ + it(@"returns a pretty custom environment name", ^{ + mutableClaims[@"paypal"][@"environment"] = BTConfigurationPayPalEnvironmentCustom; + BTClient * client = [BTClientSpecHelper clientForTestCase:self withOverrides:mutableClaims async:asyncClient]; + expect([client btPayPal_environment]).to.equal(BTClientPayPalMobileEnvironmentName); + }); + }); + }); + + describe(@"when the environment is not production", ^{ + describe(@"if the merchant privacy policy URL, merchant agreement URL, merchant name, and client ID are missing", ^{ + it(@"does not return an error", ^{ + mutableClaims[@"paypal"][BTConfigurationKeyPayPalMerchantPrivacyPolicyUrl] = [NSNull null]; + mutableClaims[@"paypal"][BTConfigurationKeyPayPalMerchantUserAgreementUrl] = [NSNull null]; + mutableClaims[@"paypal"][BTConfigurationKeyPayPalMerchantName] = [NSNull null]; + mutableClaims[@"paypal"][@"environment"] = BTConfigurationPayPalEnvironmentCustom; + BTClient * client = [BTClientSpecHelper clientForTestCase:self withOverrides:mutableClaims async:asyncClient]; + NSError *error; + [client btPayPal_preparePayPalMobileWithError:&error]; + expect(error).to.beNil(); + }); + }); + + }); + }); + + describe(@"scopes", ^{ + it(@"includes email and future payments", ^{ + mutableClaims[@"paypal"][@"environment"] = BTConfigurationPayPalEnvironmentLive; + BTClient * client = [BTClientSpecHelper clientForTestCase:self withOverrides:mutableClaims async:asyncClient]; + NSSet *scopes = [client btPayPal_scopes]; + expect(scopes).to.contain(@"email"); + expect(scopes).to.contain(@"https://uri.paypal.com/services/payments/futurepayments"); + }); + + it(@"does not contain address scope by default", ^{ + mutableClaims[@"paypal"][@"environment"] = BTConfigurationPayPalEnvironmentLive; + BTClient * client = [BTClientSpecHelper clientForTestCase:self withOverrides:mutableClaims async:asyncClient]; + NSSet *scopes = [client btPayPal_scopes]; + expect(scopes).toNot.contain(@"address"); + }); + + it(@"includes additional scopes and default scopes (email and future payments)", ^{ + mutableClaims[@"paypal"][@"environment"] = BTConfigurationPayPalEnvironmentLive; + BTClient * client = [BTClientSpecHelper clientForTestCase:self withOverrides:mutableClaims async:asyncClient]; + client.additionalPayPalScopes = [NSSet setWithObjects:@"address", nil]; + NSSet *scopes = [client btPayPal_scopes]; + expect(scopes).to.contain(@"address"); + expect(scopes).to.contain(@"email"); + expect(scopes).to.contain(@"https://uri.paypal.com/services/payments/futurepayments"); + }); + + }); + +}); + +SharedExamplesEnd + +SpecBegin(DeprecatedBTClient) + +describe(@"shared initialization behavior", ^{ + NSDictionary* data = @{@"asyncClient": @NO}; + itShouldBehaveLike(@"a BTClient", data); +}); + +SpecEnd + +SpecBegin(AsyncBTClient) + +describe(@"shared initialization behavior", ^{ + NSDictionary* data = @{@"asyncClient": @YES}; + itShouldBehaveLike(@"a BTClient", data); +}); + +SpecEnd diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-Specs/BTDropInErrorStateSpec.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-Specs/BTDropInErrorStateSpec.m new file mode 100644 index 0000000..ada25e4 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-Specs/BTDropInErrorStateSpec.m @@ -0,0 +1,109 @@ +#import "BTDropInErrorState.h" +#import "BTErrors.h" +#import "BTUICardFormView.h" + +SpecBegin(BTDropInErrorState) + +describe(@"errorTitle", ^{ + it(@"returns an error title based on the NSError's top level error message", ^{ + NSDictionary *validationErrors = @{@"error": @{ + @"message": @"Credit Card is Invalid" }, + @"fieldErrors": @[ + @{ + @"field": @"creditCard", + @"fieldErrors": @[ + @{ + @"field": @"cvv", + @"message": @"CVV is required" } + ] + }]}; + + NSDictionary *userInfo = @{BTCustomerInputBraintreeValidationErrorsKey: validationErrors}; + NSError *error = [[NSError alloc] initWithDomain:BTBraintreeAPIErrorDomain + code:BTCustomerInputErrorInvalid + userInfo:userInfo]; + BTDropInErrorState *state = [[BTDropInErrorState alloc] initWithError:error]; + expect(state.errorTitle).to.equal(@"Credit Card is Invalid"); + }); + + it(@"returns an error title based on the NSError's top level error message, even when there are no field errors associated", ^{ + NSDictionary *validationErrors = @{ @"error": @{ @"message": @"Everything is Invalid" } }; + + + + + NSDictionary *userInfo = @{BTCustomerInputBraintreeValidationErrorsKey: validationErrors}; + NSError *error = [[NSError alloc] initWithDomain:BTBraintreeAPIErrorDomain + code:BTCustomerInputErrorInvalid + userInfo:userInfo]; + BTDropInErrorState *state = [[BTDropInErrorState alloc] initWithError:error]; + expect(state.errorTitle).to.equal(@"Everything is Invalid"); + }); +}); + +describe(@"highlighted fields", ^{ + it(@"returns a set of fields with validation errors associated", ^{ + NSDictionary *validationErrors = @{@"error": @{ + @"message": @"Credit Card is Invalid" }, + @"fieldErrors": @[ + @{ + @"field": @"creditCard", + @"fieldErrors": @[ + @{ @"field": @"cvv", + @"message": @"CVV is required" }, + @{ @"field": @"billingAddress", + @"fieldErrors": @[@{ @"field": @"postalCode", + @"message": @"Postal Code is required" }], + }, + @{ @"field": @"number", + @"message": @"Number is required" }, + @{ @"field": @"expirationDate", + @"message": @"Expiration date is required" }, + ] + }]}; + + NSDictionary *userInfo = @{BTCustomerInputBraintreeValidationErrorsKey: validationErrors}; + NSError *error = [[NSError alloc] initWithDomain:BTBraintreeAPIErrorDomain + code:BTCustomerInputErrorInvalid + userInfo:userInfo]; + BTDropInErrorState *state = [[BTDropInErrorState alloc] initWithError:error]; + expect(state.highlightedFields).to.haveCountOf(4); + expect(state.highlightedFields).to.contain(BTUICardFormFieldNumber);\ + expect(state.highlightedFields).to.contain(BTUICardFormFieldExpiration); + expect(state.highlightedFields).to.contain(BTUICardFormFieldCvv); + expect(state.highlightedFields).to.contain(BTUICardFormFieldPostalCode); + }); + + it(@"returns the empty set when no fields needs to be highlighted", ^{ + NSDictionary *validationErrors = @{@"error": @{ + @"message": @"Credit Card is Invalid" }, + @"fieldErrors": @[ + @{ + @"field": @"creditCard", + @"fieldErrors": @[ + @{ @"field": @"paymentMethodNonce", + @"message": @"Payment method nonces cannot be used to update an existing card." }, + ] + }]}; + NSDictionary *userInfo = @{BTCustomerInputBraintreeValidationErrorsKey: validationErrors}; + NSError *error = [[NSError alloc] initWithDomain:BTBraintreeAPIErrorDomain + code:BTCustomerInputErrorInvalid + userInfo:userInfo]; + BTDropInErrorState *state = [[BTDropInErrorState alloc] initWithError:error]; + expect(state.highlightedFields).to.haveCountOf(0); + }); + + it(@"ignores unknown fields", ^{ + NSDictionary *validationErrors = @{@"error": @{ @"message": @"Everything is invalid" } }; + + NSDictionary *userInfo = @{BTCustomerInputBraintreeValidationErrorsKey: validationErrors}; + NSError *error = [[NSError alloc] initWithDomain:BTBraintreeAPIErrorDomain + code:BTCustomerInputErrorInvalid + userInfo:userInfo]; + BTDropInErrorState *state = [[BTDropInErrorState alloc] initWithError:error]; + expect(state.highlightedFields).to.haveCountOf(0); + }); + +}); + +SpecEnd diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-UI-Specs/BTUICardFormViewSpec.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-UI-Specs/BTUICardFormViewSpec.m new file mode 100644 index 0000000..7c3d44e --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-UI-Specs/BTUICardFormViewSpec.m @@ -0,0 +1,208 @@ +#import +#import "BTUICardType.h" +#import "BTUIFormField.h" +#import +#import +#import + +@interface BTUICardFormViewSpecCardEntryViewController : UIViewController +@property (nonatomic, strong) BTUICardFormView *cardFormView; +@end + +@implementation BTUICardFormViewSpecCardEntryViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + self.cardFormView = [[BTUICardFormView alloc] initWithFrame:self.view.frame]; + + [self.view addSubview:self.cardFormView]; + + [self.cardFormView autoPinEdgeToSuperviewMargin:ALEdgeLeading]; + [self.cardFormView autoPinEdgeToSuperviewMargin:ALEdgeTrailing]; + [self.cardFormView autoPinToTopLayoutGuideOfViewController:self withInset:10]; +} + +@end + +SpecBegin(BTUICardFormView) + +describe(@"Card Form", ^{ + describe(@"accepting and validating credit card details", ^{ + it(@"accepts a number, an expiry, a cvv and a postal code", ^{ + BTUICardFormViewSpecCardEntryViewController *viewController = [[BTUICardFormViewSpecCardEntryViewController alloc] init]; + + [system presentViewController:viewController]; + + [[tester usingTimeout:1] enterText:@"4111111111111111" intoViewWithAccessibilityLabel:@"Card Number"]; + [[tester usingTimeout:1] tapViewWithAccessibilityLabel:@"MM/YY"]; + [[tester usingTimeout:1] enterTextIntoCurrentFirstResponder:@"122018"]; + [[tester usingTimeout:1] enterText:@"100" intoViewWithAccessibilityLabel:@"CVV"]; + [[tester usingTimeout:1] enterText:@"60606" intoViewWithAccessibilityLabel:@"Postal Code"]; + + expect(viewController.cardFormView.valid).to.beTruthy(); + }); + }); + + describe(@"auto advancing", ^{ + it(@"auto advances from field to field", ^{ + [system presentViewController:[[BTUICardFormViewSpecCardEntryViewController alloc] init]]; + [[tester usingTimeout:1] tapViewWithAccessibilityLabel:@"Card Number"]; + [[tester usingTimeout:1] enterTextIntoCurrentFirstResponder:@"4111111111111111"]; + [[tester usingTimeout:1] waitForFirstResponderWithAccessibilityLabel:@"MM/YY"]; + }); + }); + + describe(@"retreat on backspace", ^{ + it(@"retreats on backspace and deletes one digit", ^{ + [system presentViewController:[[BTUICardFormViewSpecCardEntryViewController alloc] init]]; + [[tester usingTimeout:1] tapViewWithAccessibilityLabel:@"Card Number"]; + [[tester usingTimeout:1] enterTextIntoCurrentFirstResponder:@"4111111111111111"]; + [[tester usingTimeout:1] enterTextIntoCurrentFirstResponder:@"\b"]; + [[tester usingTimeout:1] waitForFirstResponderWithAccessibilityLabel:@"Card Number"]; + [[tester usingTimeout:1] waitForViewWithAccessibilityLabel:@"Card Number" value:@"411111111111111" traits:0]; + }); + }); + + describe(@"setting the form programmatically", ^{ + __block BTUICardFormView *cardFormView; + + beforeEach(^{ + cardFormView = [[BTUICardFormView alloc] init]; + }); + + describe(@"card number field", ^{ + it(@"sets the field text", ^{ + cardFormView.number = @"411111"; + [system presentView:cardFormView]; + [[tester usingTimeout:1] waitForViewWithAccessibilityLabel:@"Card Number" value:@"411111" traits:0]; + }); + + describe(@"number of digits", ^{ + context(@"unknown card type", ^{ + it(@"allows max digits", ^{ + NSString *cardNumber = [@"" stringByPaddingToLength:[BTUICardType maxNumberLength] withString:@"0" startingAtIndex:0]; + cardFormView.number = cardNumber; + [system presentView:cardFormView]; + [[[tester usingTimeout:1] usingTimeout:1] waitForViewWithAccessibilityLabel:@"Card Number" value:cardNumber traits:0]; + }); + + it(@"doesn't set field if max digits exceeded", ^{ + cardFormView.number = @"1234"; + cardFormView.number = [@"" stringByPaddingToLength:[BTUICardType maxNumberLength]+1 withString:@"0" startingAtIndex:0];; + [system presentView:cardFormView]; + [[tester usingTimeout:1] waitForViewWithAccessibilityLabel:@"Card Number" value:@"1234" traits:0]; + }); + }); + + context(@"known card type", ^{ + it(@"allows max digits", ^{ + cardFormView.number = @"4111111111111111"; + [system presentView:cardFormView]; + [[tester usingTimeout:1] waitForViewWithAccessibilityLabel:@"Card Number" value:@"4111111111111111" traits:0]; + }); + + it(@"doesn't set field if max digits exceeded", ^{ + cardFormView.number = @"41111111111111111"; + cardFormView.number = @"1234"; + [system presentView:cardFormView]; + [[tester usingTimeout:1] waitForViewWithAccessibilityLabel:@"Card Number" value:@"1234" traits:0]; + }); + }); + }); + + it(@"doesn't allow invalid characters", ^{ + cardFormView.number = @"1234"; + cardFormView.number = @"4111 1111-1111"; + [system presentView:cardFormView]; + [[tester usingTimeout:1] waitForViewWithAccessibilityLabel:@"Card Number" value:@"411111111111" traits:0]; + }); + }); + + describe(@"expiry field", ^{ + it(@"accepts a date and displays as valid", ^{ + NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; + dateComponents.month = 1; + dateComponents.year = 2016; + dateComponents.calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; + + NSDate *date = [dateComponents date]; + [cardFormView setExpirationDate:date]; + [system presentView:cardFormView]; + [[tester usingTimeout:1] waitForViewWithAccessibilityLabel:@"01/2016"]; + + UIAccessibilityElement *element = [[[UIApplication sharedApplication] keyWindow] accessibilityElementWithLabel:@"01/2016"]; + BTUIFormField *expiryField = (BTUIFormField *)([UIAccessibilityElement viewContainingAccessibilityElement:element].superview.superview); + expect(expiryField.displayAsValid).to.beTruthy(); + }); + + it(@"accepts a well-formed invalid date and displays as invalid", ^{ + NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; + dateComponents.month = 2; + dateComponents.year = 2000; + dateComponents.calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; + + NSDate *date = [dateComponents date]; + [cardFormView setExpirationDate:date]; + [system presentView:cardFormView]; + [[tester usingTimeout:1] waitForViewWithAccessibilityLabel:@"02/2000"]; + + UIAccessibilityElement *element = [[[UIApplication sharedApplication] keyWindow] accessibilityElementWithLabel:@"02/2000"]; + BTUIFormField *expiryField = (BTUIFormField *)([UIAccessibilityElement viewContainingAccessibilityElement:element].superview.superview); + expect(expiryField.displayAsValid).to.beFalsy(); + }); + + it(@"can be set when visible", ^{ + NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; + dateComponents.month = 1; + dateComponents.year = 2016; + dateComponents.calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; + NSDate *date = [dateComponents date]; + + [system presentView:cardFormView]; + [cardFormView setExpirationDate:date]; + [[tester usingTimeout:1] waitForViewWithAccessibilityLabel:@"01/2016"]; + }); + }); + + describe(@"CVV field", ^{ + it(@"accepts a CVV number", ^{ + cardFormView.cvv = @"123"; + [system presentView:cardFormView]; + [[tester usingTimeout:1] waitForViewWithAccessibilityLabel:@"123"]; + }); + + it(@"doesn't set field if max digits exceeded", ^{ + cardFormView.cvv = @"543"; + cardFormView.cvv = @"12345"; + [system presentView:cardFormView]; + [[tester usingTimeout:1] waitForViewWithAccessibilityLabel:@"543"]; + }); + }); + + describe(@"Postal code field", ^{ + it(@"accepts a zipcode number", ^{ + cardFormView.postalCode = @"12345"; + [system presentView:cardFormView]; + [[tester usingTimeout:1] waitForViewWithAccessibilityLabel:@"12345"]; + }); + + it(@"accepts a postal code string", ^{ + cardFormView.postalCode = @"WC2E 9RZ"; + [system presentView:cardFormView]; + [[tester usingTimeout:1] waitForViewWithAccessibilityLabel:@"WC2E 9RZ"]; + }); + + it(@"won't accept an alphanumeric string if alphanumericPostalCode is NO", ^{ + cardFormView.postalCode = @"123"; + cardFormView.alphaNumericPostalCode = NO; + cardFormView.postalCode = @"WC2E 9RZ"; + + [system presentView:cardFormView]; + + [[tester usingTimeout:1] waitForViewWithAccessibilityLabel:@"123"]; + }); + }); + }); +}); + +SpecEnd diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-UI-Specs/BTUITextFieldSpec.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-UI-Specs/BTUITextFieldSpec.m new file mode 100644 index 0000000..dde5756 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Braintree-UI-Specs/BTUITextFieldSpec.m @@ -0,0 +1,131 @@ +#import "BTUITextField.h" +#import + +/// A custom mock outside of OCMock for spying on the BTUITextField text value at various +/// points in the editDelegate lifecycle +@interface BTUITextFieldSpecMockEditDelegate : NSObject +@property (copy, nonatomic) NSString *textAtTimeOfWillInsertText; +@property (copy, nonatomic) NSString *textAtTimeOfDidInsertText; +@property (copy, nonatomic) NSString *textAtTimeOfWillDeleteBackward; +@property (copy, nonatomic) NSString *textAtTimeOfDidDeleteBackward; +@end + +@implementation BTUITextFieldSpecMockEditDelegate + +- (void)textField:(BTUITextField *)textField willInsertText:(NSString *)text { + self.textAtTimeOfWillInsertText = textField.text; +} +- (void)textField:(BTUITextField *)textField didInsertText:(NSString *)text { + self.textAtTimeOfDidInsertText = textField.text; +} +- (void)textFieldWillDeleteBackward:(BTUITextField *)textField { + self.textAtTimeOfWillDeleteBackward = textField.text; +} +- (void)textFieldDidDeleteBackward:(BTUITextField *)textField originalText:(NSString *)originalText { + self.textAtTimeOfDidDeleteBackward = textField.text; +} + +@end + +SpecBegin(BTUITextField) + +describe(@"text field behavior", ^{ + it(@"can accept user input", ^{ + BTUITextField *textField = [[BTUITextField alloc] init]; + textField.backgroundColor = [UIColor whiteColor]; + textField.accessibilityLabel = @"Some Field"; + [system presentView:textField]; + // The text field's initial frame is based on the intrinsic size. We want the view to be + // big enough to see. + [textField autoSetDimension:ALDimensionWidth toSize:300]; + [textField autoSetDimension:ALDimensionHeight toSize:44]; + [tester tapViewWithAccessibilityLabel:@"Some Field"]; + [tester enterTextIntoCurrentFirstResponder:@"Hello, World!"]; + + expect(textField.text).to.equal(@"Hello, World!"); + }); +}); + +describe(@"editDelegate", ^{ + __block BTUITextField *textField; + __block BTUITextFieldSpecMockEditDelegate *editDelegate; + + beforeEach(^{ + editDelegate = OCMPartialMock([[BTUITextFieldSpecMockEditDelegate alloc] init]); + textField = [[BTUITextField alloc] init]; + textField.editDelegate = editDelegate; + textField.backgroundColor = [UIColor whiteColor]; + textField.text = @"Some text"; + textField.accessibilityLabel = @"Some Field"; + [system presentView:textField]; + [tester tapViewWithAccessibilityLabel:@"Some Field"]; + [tester waitForTimeInterval:2]; + }); + + describe(@"delegate method protocol", ^{ + it(@"textField:willInsertText: and textField:didInsertText: are called when user enters text", ^{ + [(OCMockObject *)editDelegate setExpectationOrderMatters:YES]; + OCMExpect([editDelegate textField:textField willInsertText:@"a"]).andForwardToRealObject(); + OCMExpect([editDelegate textField:textField didInsertText:@"a"]).andForwardToRealObject(); + + [tester enterTextIntoCurrentFirstResponder:@"a"]; + + OCMVerify(editDelegate); + // Note: the behavior of `insertText:` in iOS 9 is buggy. We have implemented + // a workaround that makes the card expiry field functional, but the workaround + // causes willInsertText to be called *after* the text has already been inserted. + if ([UIDevice currentDevice].systemVersion.intValue < 9) { + expect(editDelegate.textAtTimeOfWillInsertText).to.equal(@"Some text"); + } else { + expect(editDelegate.textAtTimeOfWillInsertText).to.equal(@"Some texta"); + } + expect(editDelegate.textAtTimeOfDidInsertText).to.equal(@"Some texta"); + }); + + it(@"textField:willDeleteBackward: and textField:didDeleteBackward:originalText: are called when user backspaces", ^{ + [(OCMockObject *)editDelegate setExpectationOrderMatters:YES]; + OCMExpect([editDelegate textFieldWillDeleteBackward:textField]).andForwardToRealObject(); + OCMExpect([editDelegate textFieldDidDeleteBackward:textField originalText:@"Some text"]).andForwardToRealObject(); + + [tester enterTextIntoCurrentFirstResponder:@"\b"]; + + OCMVerify(editDelegate); + expect(editDelegate.textAtTimeOfWillDeleteBackward).to.equal(@"Some text"); + expect(editDelegate.textAtTimeOfDidDeleteBackward).to.equal(@"Some tex"); + }); + + it(@"textField:willDeleteBackward: and textField:didDeleteBackward:originalText: are called when user backspaces beyond the first character", ^{ + textField.text = @"AB"; + + [(OCMockObject *)editDelegate setExpectationOrderMatters:YES]; + OCMExpect([editDelegate textFieldWillDeleteBackward:textField]).andForwardToRealObject(); + OCMExpect([editDelegate textFieldDidDeleteBackward:textField originalText:@"AB"]).andForwardToRealObject(); + + // Delete "B" + [tester enterTextIntoCurrentFirstResponder:@"\b"]; + + OCMVerify(editDelegate); + expect(editDelegate.textAtTimeOfWillDeleteBackward).to.equal(@"AB"); + + // Reduce likelihood of failure: expected: A, got: nil/null + [tester waitForTimeInterval:0.1]; + + expect(editDelegate.textAtTimeOfDidDeleteBackward).to.equal(@"A"); + + // Delete "A" + [tester enterTextIntoCurrentFirstResponder:@"\b"]; + + OCMExpect([editDelegate textFieldWillDeleteBackward:textField]).andForwardToRealObject(); + OCMExpect([editDelegate textFieldDidDeleteBackward:textField originalText:@""]).andForwardToRealObject(); + + // Backspace, nothing to delete + [tester enterTextIntoCurrentFirstResponder:@"\b"]; + + OCMVerify(editDelegate); + expect(editDelegate.textAtTimeOfWillDeleteBackward).to.equal(@""); + expect(editDelegate.textAtTimeOfDidDeleteBackward).to.equal(@""); + }); + }); +}); + +SpecEnd diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Shared Spec Utilities/KIFSystemTestActor+BTViewPresentation.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Shared Spec Utilities/KIFSystemTestActor+BTViewPresentation.h new file mode 100644 index 0000000..817a8a4 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Shared Spec Utilities/KIFSystemTestActor+BTViewPresentation.h @@ -0,0 +1,17 @@ +#import "KIFSystemTestActor.h" + +/// Provides convenience methods for presenting view controllers and views for KIF tests +@interface KIFSystemTestActor (BTViewPresentation) + +/// Present a view controller in the app +/// +/// @param viewController The view controller to show. Cannot be `nil`. +- (void)presentViewController:(UIViewController *)viewController; + +/// Present a view by adding it as a subview of a new view controller, then presenting the view controller +/// in the app. +/// +/// @param view The view to display. +- (void)presentView:(UIView *)view; + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Shared Spec Utilities/KIFSystemTestActor+BTViewPresentation.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Shared Spec Utilities/KIFSystemTestActor+BTViewPresentation.m new file mode 100644 index 0000000..7c6869c --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/Specs/Shared Spec Utilities/KIFSystemTestActor+BTViewPresentation.m @@ -0,0 +1,38 @@ +#import "KIFSystemTestActor+BTViewPresentation.h" +#import + +@implementation KIFSystemTestActor (BTViewPresentation) + +- (void)presentViewController:(UIViewController *)viewController { + [self runBlock:^KIFTestStepResult(NSError **error) { + UIViewController *viewControllerToPresent = viewController; + KIFTestCondition(viewControllerToPresent != nil, error, @"Expected a view controller, but got nil"); + + UINavigationController *navigationController; + if ([viewControllerToPresent isKindOfClass:[UINavigationController class]]) { + navigationController = (UINavigationController *)viewControllerToPresent; + } else { + navigationController = [[UINavigationController alloc] initWithRootViewController:viewController]; + } + [UIApplication sharedApplication].keyWindow.rootViewController = navigationController; + + return KIFTestStepResultSuccess; + }]; +} + +- (void)presentView:(UIView *)view { + [self runBlock:^KIFTestStepResult(NSError *__autoreleasing *error) { + KIFTestCondition(view != nil, error, @"Expected a view, but got nil"); + + UIViewController *viewController = [[UIViewController alloc] init]; + [viewController.view addSubview:view]; + [view autoCenterInSuperview]; + [view autoMatchDimension:ALDimensionHeight toDimension:ALDimensionHeight ofView:viewController.view withOffset:0 relation:NSLayoutRelationLessThanOrEqual]; + [view autoMatchDimension:ALDimensionWidth toDimension:ALDimensionWidth ofView:viewController.view withOffset:0 relation:NSLayoutRelationLessThanOrEqual]; + [self presentViewController:viewController]; + + return KIFTestStepResultSuccess; + }]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UITests/BraintreeDropInLegacy_UITests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UITests/BraintreeDropInLegacy_UITests.swift new file mode 100644 index 0000000..857176f --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UITests/BraintreeDropInLegacy_UITests.swift @@ -0,0 +1,188 @@ +/* + IMPORTANT + Hardware keyboard should be disabled on simulator for tests to run reliably. + */ + +import XCTest + +class BraintreeDropInLegacy_TokenizationKey_CardForm_UITests: XCTestCase { + + var app: XCUIApplication! + + override func setUp() { + super.setUp() + continueAfterFailure = false + app = XCUIApplication() + app.launchArguments.append("-EnvironmentSandbox") + app.launchArguments.append("-TokenizationKey") + app.launchArguments.append("-Integration:BraintreeDemoDropInLegacyViewController") + app.launch() + sleep(1) + self.waitForElementToBeHittable(app.buttons["Buy Now"]) + app.buttons["Buy Now"].tap() + + } + + func testDropInLegacy_cardInput_receivesNonce() { + + let elementsQuery = app.scrollViews.otherElements + let cardNumberTextField = elementsQuery.textFields["Card Number"] + let expiryTextField = elementsQuery.textFields["MM/YY"] + + self.waitForElementToBeHittable(cardNumberTextField) + + cardNumberTextField.forceTapElement() + cardNumberTextField.typeText("4111111111111111") + expiryTextField.typeText("1119") + + let postalCodeField = elementsQuery.textFields["Postal Code"] + self.waitForElementToBeHittable(postalCodeField) + postalCodeField.forceTapElement() + postalCodeField.typeText("12345") + + let securityCodeField = elementsQuery.textFields["CVV"] + self.waitForElementToBeHittable(securityCodeField) + securityCodeField.forceTapElement() + securityCodeField.typeText("123") + + elementsQuery.buttons["$19 - Subscribe Now"].forceTapElement() + + self.waitForElementToAppear(app.buttons["Got a nonce. Tap to make a transaction."]) + + XCTAssertTrue(app.buttons["Got a nonce. Tap to make a transaction."].exists); + } + + func testDropInLegacy_cardInput_showsInvalidState_withInvalidCardNumber() { + + let elementsQuery = app.scrollViews.otherElements + let cardNumberTextField = elementsQuery.textFields["Card Number"] + + self.waitForElementToBeHittable(cardNumberTextField) + + cardNumberTextField.forceTapElement() + cardNumberTextField.typeText("4141414141414141") + + self.waitForElementToAppear(elementsQuery.textFields["Invalid: Card Number"]) + } + + func testDropInLegacy_cardInput_showsInvalidState_withInvalidExpirationDate() { + + let elementsQuery = app.scrollViews.otherElements + let expiryTextField = elementsQuery.textFields["MM/YY"] + self.waitForElementToBeHittable(expiryTextField) + + expiryTextField.forceTapElement() + expiryTextField.typeText("1111") + + self.waitForElementToAppear(elementsQuery.textFields["Invalid: MM/YY"]) + } + + func testDropInLegacy_cardInput_hidesInvalidCardNumberState_withDeletion() { + + let elementsQuery = app.scrollViews.otherElements + let cardNumberTextField = elementsQuery.textFields["Card Number"] + self.waitForElementToBeHittable(cardNumberTextField) + + cardNumberTextField.forceTapElement() + cardNumberTextField.typeText("4141414141414141") + + self.waitForElementToAppear(elementsQuery.textFields["Invalid: Card Number"]) + + cardNumberTextField.typeText("\u{8}") + + XCTAssertFalse(elementsQuery.textFields["Invalid: Card Number"].exists); + } + + func testDropInLegacy_cardInput_hidesInvalidExpirationState_withDeletion() { + + let elementsQuery = app.scrollViews.otherElements + let expirationField = elementsQuery.textFields["MM/YY"] + self.waitForElementToBeHittable(expirationField) + + expirationField.forceTapElement() + expirationField.typeText("1111") + + self.waitForElementToAppear(elementsQuery.textFields["Invalid: MM/YY"]) + + expirationField.typeText("\u{8}") + + XCTAssertFalse(elementsQuery.textFields["Invalid: MM/YY"].exists); + } +} + +class BraintreeDropInLegacy_ClientToken_CardForm_UITests: XCTestCase { + + // var app: XCUIApplication! + // + // override func setUp() { + // super.setUp() + // continueAfterFailure = false + // app = XCUIApplication() + // app.launchArguments.append("-EnvironmentSandbox") + // app.launchArguments.append("-ClientToken") + // app.launchArguments.append("-Integration:BraintreeDemoDropInLegacyViewController") + // app.launch() + // self.waitForElementToAppear(app.buttons["Buy Now"]) + // app.buttons["Buy Now"].forceTapElement() + // } + // + // // This test card number is now valid + // // Is this related to Union Pay? + // func pendDropInLegacy_cardInput_displaysErrorForFailedValidation() { + // + // let elementsQuery = app.scrollViews.otherElements + // let cardNumberTextField = elementsQuery.textFields["Card Number"] + // let expirationField = elementsQuery.textFields["MM/YY"] + // + // cardNumberTextField.forceTapElement() + // cardNumberTextField.typeText("5105105105105100") + // expirationField.typeText("1119") + // + // elementsQuery.buttons["$19 - Subscribe Now"].forceTapElement() + // + // self.waitForElementToAppear(app.alerts.staticTexts["Credit card verification failed"]) + // + // XCTAssertTrue(app.alerts.staticTexts["Credit card verification failed"].exists); + // } +} + + +class BraintreeDropInLegacy_PayPal_UITests: XCTestCase { + + var app: XCUIApplication! + + override func setUp() { + super.setUp() + continueAfterFailure = false + app = XCUIApplication() + app.launchArguments.append("-EnvironmentSandbox") + app.launchArguments.append("-TokenizationKey") + app.launchArguments.append("-Integration:BraintreeDemoDropInLegacyViewController") + app.launch() + sleep(1) + self.waitForElementToBeHittable(app.buttons["Buy Now"]) + app.buttons["Buy Now"].forceTapElement() + } + + func testDropInLegacy_paypal_receivesNonce() { + if #available(iOS 11.0, *) { + // SFSafariAuthenticationSession flow cannot be fully automated, so returning early + return + } + + let elementsQuery = app.collectionViews["Payment Options"].cells + let paypalButton = elementsQuery.element(boundBy: 0) + paypalButton.forceTapElement() + sleep(3) + + let webviewElementsQuery = app.webViews.element.otherElements + + self.waitForElementToBeHittable(webviewElementsQuery.links["Proceed with Sandbox Purchase"]) + + webviewElementsQuery.links["Proceed with Sandbox Purchase"].forceTapElement() + + self.waitForElementToAppear(app.buttons["Got a nonce. Tap to make a transaction."]) + + XCTAssertTrue(app.buttons["Got a nonce. Tap to make a transaction."].exists); + } +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UITests/BraintreePayPal_UITests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UITests/BraintreePayPal_UITests.swift new file mode 100644 index 0000000..7ed532c --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UITests/BraintreePayPal_UITests.swift @@ -0,0 +1,195 @@ +/* + IMPORTRANT + Hardware keyboard should be disabled on simulator for tests to run reliably. + */ + +import XCTest + +class BraintreePayPal_FuturePayment_UITests: XCTestCase { + var app: XCUIApplication! + + override func setUp() { + super.setUp() + continueAfterFailure = false + app = XCUIApplication() + app.launchArguments.append("-EnvironmentSandbox") + app.launchArguments.append("-TokenizationKey") + app.launchArguments.append("-Integration:BraintreeDemoPayPalForceFuturePaymentViewController") + app.launch() + sleep(1) + self.waitForElementToBeHittable(app.buttons["PayPal (future payment button)"]) + app.buttons["PayPal (future payment button)"].tap() + sleep(2) + } + + func testPayPal_futurePayment_receivesNonce() { + if #available(iOS 11.0, *) { + // SFSafariAuthenticationSession flow cannot be fully automated, so returning early + return + } + + let webviewElementsQuery = app.webViews.element.otherElements + let emailTextField = webviewElementsQuery.textFields["Email"] + + self.waitForElementToAppear(emailTextField) + emailTextField.forceTapElement() + emailTextField.typeText("test@paypal.com") + + let passwordTextField = webviewElementsQuery.secureTextFields["Password"] + passwordTextField.forceTapElement() + passwordTextField.typeText("1234") + + webviewElementsQuery.buttons["Log In"].forceTapElement() + + self.waitForElementToAppear(webviewElementsQuery.buttons["Agree"]) + + webviewElementsQuery.buttons["Agree"].forceTapElement() + + self.waitForElementToAppear(app.buttons["Got a nonce. Tap to make a transaction."]) + + XCTAssertTrue(app.buttons["Got a nonce. Tap to make a transaction."].exists); + } + + func testPayPal_futurePayment_cancelsSuccessfully() { + if #available(iOS 11.0, *) { + // SFSafariAuthenticationSession flow cannot be fully automated, so returning early + return + } + + let webviewElementsQuery = app.webViews.element.otherElements + let emailTextField = webviewElementsQuery.textFields["Email"] + + self.waitForElementToAppear(emailTextField) + + // Close button has no accessibility helper + // Purposely don't use the webviewElementsQuery variable + // Reevaluate the elements query after the page load to get the close button + app.webViews.buttons.element(boundBy: 0).forceTapElement() + + self.waitForElementToAppear(app.buttons["PayPal (future payment button)"]) + + XCTAssertTrue(app.buttons["Canceled 🔰"].exists); + } +} + +class BraintreePayPal_SinglePayment_UITests: XCTestCase { + var app: XCUIApplication! + + override func setUp() { + super.setUp() + continueAfterFailure = false + app = XCUIApplication() + app.launchArguments.append("-EnvironmentSandbox") + app.launchArguments.append("-TokenizationKey") + app.launchArguments.append("-Integration:BraintreeDemoPayPalOneTimePaymentViewController") + app.launch() + sleep(1) + self.waitForElementToBeHittable(app.buttons["PayPal one-time payment"]) + app.buttons["PayPal one-time payment"].tap() + sleep(2) + } + + func testPayPal_singlePayment_receivesNonce() { + if #available(iOS 11.0, *) { + // SFSafariAuthenticationSession flow cannot be fully automated, so returning early + return + } + + let webviewElementsQuery = app.webViews.element.otherElements + + self.waitForElementToAppear(webviewElementsQuery.links["Proceed with Sandbox Purchase"]) + + webviewElementsQuery.links["Proceed with Sandbox Purchase"].forceTapElement() + + self.waitForElementToAppear(app.buttons["Got a nonce. Tap to make a transaction."]) + + XCTAssertTrue(app.buttons["Got a nonce. Tap to make a transaction."].exists); + } + + func testPayPal_singlePayment_cancelsSuccessfully() { + if #available(iOS 11.0, *) { + // SFSafariAuthenticationSession flow cannot be fully automated, so returning early + return + } + + let webviewElementsQuery = app.webViews.element.otherElements + + self.waitForElementToAppear(webviewElementsQuery.links["Cancel Sandbox Purchase"]) + + webviewElementsQuery.links["Cancel Sandbox Purchase"].forceTapElement() + + self.waitForElementToAppear(app.buttons["PayPal one-time payment"]) + + XCTAssertTrue(app.buttons["Cancelled"].exists); + } +} + +class BraintreePayPal_BillingAgreement_UITests: XCTestCase { + var app: XCUIApplication! + + override func setUp() { + super.setUp() + continueAfterFailure = false + app = XCUIApplication() + app.launchArguments.append("-EnvironmentSandbox") + app.launchArguments.append("-TokenizationKey") + app.launchArguments.append("-Integration:BraintreeDemoPayPalBillingAgreementViewController") + app.launch() + sleep(1) + self.waitForElementToBeHittable(app.buttons["Billing Agreement with PayPal"]) + app.buttons["Billing Agreement with PayPal"].tap() + sleep(2) + } + + func testPayPal_billingAgreement_receivesNonce() { + if #available(iOS 11.0, *) { + // SFSafariAuthenticationSession flow cannot be fully automated, so returning early + return + } + + let webviewElementsQuery = app.webViews.element.otherElements + + self.waitForElementToAppear(webviewElementsQuery.links["Proceed with Sandbox Purchase"]) + + webviewElementsQuery.links["Proceed with Sandbox Purchase"].forceTapElement() + + self.waitForElementToAppear(app.buttons["Got a nonce. Tap to make a transaction."]) + + XCTAssertTrue(app.textViews["DismissalOfViewController Called"].exists); + XCTAssertTrue(app.buttons["Got a nonce. Tap to make a transaction."].exists); + } + + func testPayPal_billingAgreement_cancelsSuccessfully() { + if #available(iOS 11.0, *) { + // SFSafariAuthenticationSession flow cannot be fully automated, so returning early + return + } + + let webviewElementsQuery = app.webViews.element.otherElements + + self.waitForElementToAppear(webviewElementsQuery.links["Cancel Sandbox Purchase"]) + + webviewElementsQuery.links["Cancel Sandbox Purchase"].forceTapElement() + + self.waitForElementToAppear(app.buttons["Billing Agreement with PayPal"]) + + XCTAssertTrue(app.textViews["DismissalOfViewController Called"].exists); + XCTAssertTrue(app.buttons["Cancelled"].exists); + } + + func testPayPal_billingAgreement_cancelsSuccessfully_whenTappingSFSafariViewControllerDoneButton() { + if #available(iOS 11.0, *) { + // SFSafariAuthenticationSession flow cannot be fully automated, so returning early + return + } + + self.waitForElementToAppear(app.buttons["Done"]) + + app.buttons["Done"].forceTapElement() + + self.waitForElementToAppear(app.buttons["Billing Agreement with PayPal"]) + + XCTAssertTrue(app.textViews["DismissalOfViewController Called"].exists); + XCTAssertTrue(app.buttons["Cancelled"].exists); + } +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UITests/BraintreeThreeDSecure_UITests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UITests/BraintreeThreeDSecure_UITests.swift new file mode 100644 index 0000000..75a13a6 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UITests/BraintreeThreeDSecure_UITests.swift @@ -0,0 +1,501 @@ +/* + IMPORTRANT + Hardware keyboard should be disabled on simulator for tests to run reliably. + */ + +import XCTest + +class BraintreeThreeDSecurePaymentFlow_UITests: XCTestCase { + var app: XCUIApplication! + + override func setUp() { + super.setUp() + continueAfterFailure = false + app = XCUIApplication() + app.launchArguments.append("-EnvironmentSandbox") + app.launchArguments.append("-ClientToken") + app.launchArguments.append("-Integration:BraintreeDemoThreeDSecurePaymentFlowViewController") + self.app.launch() + sleep(1) + self.waitForElementToBeHittable(app.textFields["Card Number"]) + sleep(2) + } + + func getPasswordFieldQuery() -> XCUIElementQuery { + return app.webViews.element.otherElements.children(matching: .other).children(matching: .secureTextField) + } + + func getSubmitButton() -> XCUIElement { + return app.webViews.element.otherElements.children(matching: .other).children(matching: .other).buttons["Submit"] + } + + func testThreeDSecurePaymentFlow_completesAuthentication_receivesNonce() { + self.waitForElementToAppear(app.textFields["Card Number"]) + let cardNumberTextField = app.textFields["Card Number"] + cardNumberTextField.tap() + cardNumberTextField.typeText("4000000000000002") + app.textFields["MM/YY"].typeText("012020") + app.buttons["Tokenize and Verify New Card"].tap() + + self.waitForElementToAppear(getPasswordFieldQuery().element) + let passwordTextField = getPasswordFieldQuery().element + + passwordTextField.forceTapElement() + sleep(2) + passwordTextField.typeText("1234") + + getSubmitButton().tap() + + self.waitForElementToAppear(app.buttons["Liability shift possible and liability shifted"]) + } + + func testThreeDSecurePaymentFlow_failsAuthentication() { + self.waitForElementToAppear(app.textFields["Card Number"]) + let cardNumberTextField = app.textFields["Card Number"] + cardNumberTextField.tap() + cardNumberTextField.typeText("4000000000000010") + app.textFields["MM/YY"].typeText("012020") + app.buttons["Tokenize and Verify New Card"].tap() + + self.waitForElementToAppear(getPasswordFieldQuery().element) + let passwordTextField = getPasswordFieldQuery().element + + passwordTextField.forceTapElement() + sleep(1) + passwordTextField.typeText("1234") + + getSubmitButton().tap() + + self.waitForElementToAppear(app.buttons["Failed to authenticate, please try a different form of payment."]) + } + + func testThreeDSecurePaymentFlow_bypassesAuthentication_notEnrolled() { + self.waitForElementToAppear(app.textFields["Card Number"]) + let cardNumberTextField = app.textFields["Card Number"] + cardNumberTextField.tap() + cardNumberTextField.typeText("4000000000000051") + app.textFields["MM/YY"].typeText("012020") + app.buttons["Tokenize and Verify New Card"].tap() + sleep(2) + + self.waitForElementToAppear(app.buttons["3D Secure authentication was attempted but liability shift is not possible"]) + } + + func testThreeDSecurePaymentFlow_bypassesAuthentication_lookupFailed() { + self.waitForElementToAppear(app.textFields["Card Number"]) + let cardNumberTextField = app.textFields["Card Number"] + cardNumberTextField.tap() + cardNumberTextField.typeText("4000000000000077") + app.textFields["MM/YY"].typeText("012020") + app.buttons["Tokenize and Verify New Card"].tap() + sleep(2) + + self.waitForElementToAppear(app.buttons["3D Secure authentication was attempted but liability shift is not possible"]) + } + + func testThreeDSecurePaymentFlow_incorrectPassword_callsBackWithError_exactlyOnce() { + let app = XCUIApplication() + self.waitForElementToAppear(app.textFields["Card Number"]) + let cardNumberTextField = app.textFields["Card Number"] + cardNumberTextField.tap() + cardNumberTextField.typeText("4000000000000028") + app.textFields["MM/YY"].typeText("012020") + app.buttons["Tokenize and Verify New Card"].tap() + + self.waitForElementToAppear(getPasswordFieldQuery().element) + let passwordTextField = getPasswordFieldQuery().element + + passwordTextField.forceTapElement() + sleep(1) + passwordTextField.typeText("1234") + + getSubmitButton().tap() + + self.waitForElementToAppear(app.buttons["Failed to authenticate, please try a different form of payment."]) + + sleep(2) + + self.waitForElementToAppear(app.staticTexts["Callback Count: 1"]) + } + + func testThreeDSecurePaymentFlow_passiveAuthentication_notPromptedForAuthentication() { + let app = XCUIApplication() + self.waitForElementToAppear(app.textFields["Card Number"]) + let cardNumberTextField = app.textFields["Card Number"] + cardNumberTextField.tap() + cardNumberTextField.typeText("4000000000000101") + app.textFields["MM/YY"].typeText("012020") + app.buttons["Tokenize and Verify New Card"].tap() + sleep(2) + + self.waitForElementToAppear(app.buttons["Liability shift possible and liability shifted"]) + } + + func testThreeDSecurePaymentFlow_returnsNonce_whenIssuerDown() { + let app = XCUIApplication() + self.waitForElementToAppear(app.textFields["Card Number"]) + let cardNumberTextField = app.textFields["Card Number"] + cardNumberTextField.tap() + cardNumberTextField.typeText("4000000000000036") + app.textFields["MM/YY"].typeText("012020") + app.buttons["Tokenize and Verify New Card"].tap() + + self.waitForElementToAppear(getPasswordFieldQuery().element) + let passwordTextField = getPasswordFieldQuery().element + + passwordTextField.tap() + sleep(1) + passwordTextField.typeText("1234") + + getSubmitButton().tap() + + self.waitForElementToAppear(app.buttons["An unexpected error occurred"]) + } + + func testThreeDSecurePaymentFlow_acceptsPassword_failsToAuthenticateNonce_dueToCardinalError() { + self.waitForElementToAppear(app.textFields["Card Number"]) + let cardNumberTextField = app.textFields["Card Number"] + cardNumberTextField.tap() + cardNumberTextField.typeText("4000000000000093") + app.textFields["MM/YY"].typeText("012020") + app.buttons["Tokenize and Verify New Card"].tap() + + self.waitForElementToAppear(getPasswordFieldQuery().element) + let passwordTextField = getPasswordFieldQuery().element + + passwordTextField.forceTapElement() + sleep(2) + passwordTextField.typeText("1234") + + getSubmitButton().tap() + + self.waitForElementToAppear(app.buttons["An unexpected error occurred"]) + } + + func testThreeDSecurePaymentFlow_returnsToApp_whenCancelTapped() { + self.waitForElementToAppear(app.textFields["Card Number"]) + let cardNumberTextField = app.textFields["Card Number"] + cardNumberTextField.tap() + cardNumberTextField.typeText("4000000000000002") + app.textFields["MM/YY"].typeText("012020") + app.buttons["Tokenize and Verify New Card"].tap() + + self.waitForElementToAppear(app.buttons["Done"]) + + app.buttons["Done"].forceTapElement() + + self.waitForElementToAppear(app.buttons["Cancelled🎲"]) + + XCTAssertTrue(app.buttons["Cancelled🎲"].exists); + } + + func testThreeDSecurePaymentFlow_bypassedAuthentication() { + self.waitForElementToAppear(app.textFields["Card Number"]) + let cardNumberTextField = app.textFields["Card Number"] + cardNumberTextField.tap() + cardNumberTextField.typeText("4000990000000004") + app.textFields["MM/YY"].typeText("012020") + app.buttons["Tokenize and Verify New Card"].tap() + sleep(2) + + self.waitForElementToAppear(app.buttons["3D Secure authentication was attempted but liability shift is not possible"]) + } + + func testThreeDSecurePaymentFlow_lookupError() { + self.waitForElementToAppear(app.textFields["Card Number"]) + let cardNumberTextField = app.textFields["Card Number"] + cardNumberTextField.tap() + cardNumberTextField.typeText("4000000000000085") + app.textFields["MM/YY"].typeText("012020") + app.buttons["Tokenize and Verify New Card"].tap() + sleep(2) + + self.waitForElementToAppear(app.buttons["3D Secure authentication was attempted but liability shift is not possible"]) + } + + func testThreeDSecurePaymentFlow_unavailable() { + self.waitForElementToAppear(app.textFields["Card Number"]) + let cardNumberTextField = app.textFields["Card Number"] + cardNumberTextField.tap() + cardNumberTextField.typeText("4000000000000069") + app.textFields["MM/YY"].typeText("012020") + app.buttons["Tokenize and Verify New Card"].tap() + sleep(2) + + self.waitForElementToAppear(app.buttons["3D Secure authentication was attempted but liability shift is not possible"]) + } + + func testThreeDSecurePaymentFlow_timeout() { + self.waitForElementToAppear(app.textFields["Card Number"]) + let cardNumberTextField = app.textFields["Card Number"] + cardNumberTextField.tap() + cardNumberTextField.typeText("4000000000000044") + app.textFields["MM/YY"].typeText("012020") + app.buttons["Tokenize and Verify New Card"].tap() + sleep(5) + + self.waitForElementToAppear(app.buttons["3D Secure authentication was attempted but liability shift is not possible"]) + } +} + + +class BraintreeThreeDSecure_UITests: XCTestCase { + var app: XCUIApplication! + + override func setUp() { + super.setUp() + continueAfterFailure = false + app = XCUIApplication() + app.launchArguments.append("-EnvironmentSandbox") + app.launchArguments.append("-ClientToken") + app.launchArguments.append("-Integration:BraintreeDemoThreeDSecureViewController") + self.app.launch() + sleep(1) + self.waitForElementToBeHittable(app.textFields["Card Number"]) + sleep(2) + } + + func getPasswordFieldQuery() -> XCUIElementQuery { + return app.webViews.element.otherElements.children(matching: .other).children(matching: .secureTextField) + } + + func getSubmitButton() -> XCUIElement { + return app.webViews.element.otherElements.children(matching: .other).children(matching: .other).buttons["Submit"] + } + + func testThreeDSecure_completesAuthentication_receivesNonce() { + self.waitForElementToAppear(app.textFields["Card Number"]) + let cardNumberTextField = app.textFields["Card Number"] + cardNumberTextField.tap() + cardNumberTextField.typeText("4000000000000002") + app.textFields["MM/YY"].typeText("012020") + app.buttons["Tokenize and Verify New Card"].tap() + + self.waitForElementToAppear(getPasswordFieldQuery().element) + let passwordTextField = getPasswordFieldQuery().element + + passwordTextField.tap() + sleep(1) + passwordTextField.typeText("1234") + + getSubmitButton().tap() + + self.waitForElementToAppear(app.buttons["Liability shift possible and liability shifted"]) + + XCTAssertTrue(app.buttons["Liability shift possible and liability shifted"].exists); + } + + func testThreeDSecure_failsAuthentication() { + self.waitForElementToAppear(app.textFields["Card Number"]) + let cardNumberTextField = app.textFields["Card Number"] + cardNumberTextField.tap() + cardNumberTextField.typeText("4000000000000010") + app.textFields["MM/YY"].typeText("012020") + app.buttons["Tokenize and Verify New Card"].tap() + + self.waitForElementToAppear(getPasswordFieldQuery().element) + let passwordTextField = getPasswordFieldQuery().element + + passwordTextField.tap() + sleep(1) + passwordTextField.typeText("1234") + + getSubmitButton().tap() + + self.waitForElementToAppear(app.buttons["Failed to authenticate, please try a different form of payment."]) + + XCTAssertTrue(app.buttons["Failed to authenticate, please try a different form of payment."].exists); + } + + func testThreeDSecure_bypassesAuthentication_notEnrolled() { + self.waitForElementToAppear(app.textFields["Card Number"]) + let cardNumberTextField = app.textFields["Card Number"] + cardNumberTextField.tap() + cardNumberTextField.typeText("4000000000000051") + app.textFields["MM/YY"].typeText("012020") + app.buttons["Tokenize and Verify New Card"].tap() + sleep(2) + + self.waitForElementToAppear(app.buttons["3D Secure authentication was attempted but liability shift is not possible"]) + + XCTAssertTrue(app.buttons["3D Secure authentication was attempted but liability shift is not possible"].exists); + } + + func testThreeDSecure_bypassesAuthentication_lookupFailed() { + self.waitForElementToAppear(app.textFields["Card Number"]) + let cardNumberTextField = app.textFields["Card Number"] + cardNumberTextField.tap() + cardNumberTextField.typeText("4000000000000077") + app.textFields["MM/YY"].typeText("012020") + app.buttons["Tokenize and Verify New Card"].tap() + sleep(2) + + self.waitForElementToAppear(app.buttons["3D Secure authentication was attempted but liability shift is not possible"]) + + XCTAssertTrue(app.buttons["3D Secure authentication was attempted but liability shift is not possible"].exists); + } + + func testThreeDSecure_incorrectPassword_callsBackWithError_exactlyOnce() { + let app = XCUIApplication() + self.waitForElementToAppear(app.textFields["Card Number"]) + let cardNumberTextField = app.textFields["Card Number"] + cardNumberTextField.tap() + cardNumberTextField.typeText("4000000000000028") + app.textFields["MM/YY"].typeText("012020") + app.buttons["Tokenize and Verify New Card"].tap() + + self.waitForElementToAppear(getPasswordFieldQuery().element) + let passwordTextField = getPasswordFieldQuery().element + + passwordTextField.tap() + sleep(1) + passwordTextField.typeText("1234") + + getSubmitButton().tap() + + self.waitForElementToAppear(app.buttons["Failed to authenticate, please try a different form of payment."]) + + XCTAssertTrue(app.buttons["Failed to authenticate, please try a different form of payment."].exists); + + sleep(2) + + self.waitForElementToAppear(app.staticTexts["Callback Count: 1"]) + + XCTAssertTrue(app.staticTexts["Callback Count: 1"].exists); + } + + func testThreeDSecure_passiveAuthentication_notPromptedForAuthentication() { + let app = XCUIApplication() + self.waitForElementToAppear(app.textFields["Card Number"]) + let cardNumberTextField = app.textFields["Card Number"] + cardNumberTextField.tap() + cardNumberTextField.typeText("4000000000000101") + app.textFields["MM/YY"].typeText("012020") + app.buttons["Tokenize and Verify New Card"].tap() + sleep(2) + + self.waitForElementToAppear(app.buttons["Liability shift possible and liability shifted"]) + + XCTAssertTrue(app.buttons["Liability shift possible and liability shifted"].exists); + } + + func testThreeDSecure_returnsNonce_whenIssuerDown() { + let app = XCUIApplication() + self.waitForElementToAppear(app.textFields["Card Number"]) + let cardNumberTextField = app.textFields["Card Number"] + cardNumberTextField.tap() + cardNumberTextField.typeText("4000000000000036") + app.textFields["MM/YY"].typeText("012020") + app.buttons["Tokenize and Verify New Card"].tap() + + self.waitForElementToAppear(getPasswordFieldQuery().element) + let passwordTextField = getPasswordFieldQuery().element + + passwordTextField.tap() + sleep(1) + passwordTextField.typeText("1234") + + getSubmitButton().tap() + + self.waitForElementToAppear(app.buttons["An unexpected error occurred"]) + + XCTAssertTrue(app.buttons["An unexpected error occurred"].exists); + } + + func testThreeDSecure_acceptsPassword_failsToAuthenticateNonce_dueToCardinalError() { + self.waitForElementToAppear(app.textFields["Card Number"]) + let cardNumberTextField = app.textFields["Card Number"] + cardNumberTextField.tap() + cardNumberTextField.typeText("4000000000000093") + app.textFields["MM/YY"].typeText("012020") + app.buttons["Tokenize and Verify New Card"].tap() + + self.waitForElementToAppear(getPasswordFieldQuery().element) + let passwordTextField = getPasswordFieldQuery().element + + passwordTextField.tap() + sleep(1) + passwordTextField.typeText("1234") + + getSubmitButton().tap() + + self.waitForElementToAppear(app.buttons["An unexpected error occurred"]) + + XCTAssertTrue(app.buttons["An unexpected error occurred"].exists); + } + + func testThreeDSecure_returnsToApp_whenCancelTapped() { + self.waitForElementToAppear(app.textFields["Card Number"]) + let cardNumberTextField = app.textFields["Card Number"] + cardNumberTextField.tap() + cardNumberTextField.typeText("4000000000000002") + app.textFields["MM/YY"].typeText("012020") + app.buttons["Tokenize and Verify New Card"].tap() + sleep(2) + + self.waitForElementToBeHittable(app.buttons["Cancel"]) + + app.buttons["Cancel"].forceTapElement() + + self.waitForElementToAppear(app.buttons["Cancelled🎲"]) + + XCTAssertTrue(app.buttons["Cancelled🎲"].exists); + } + + func testThreeDSecure_bypassedAuthentication() { + self.waitForElementToAppear(app.textFields["Card Number"]) + let cardNumberTextField = app.textFields["Card Number"] + cardNumberTextField.tap() + cardNumberTextField.typeText("4000990000000004") + app.textFields["MM/YY"].typeText("012020") + app.buttons["Tokenize and Verify New Card"].tap() + sleep(2) + + self.waitForElementToAppear(app.buttons["3D Secure authentication was attempted but liability shift is not possible"]) + + XCTAssertTrue(app.buttons["3D Secure authentication was attempted but liability shift is not possible"].exists); + } + + func testThreeDSecure_lookupError() { + self.waitForElementToAppear(app.textFields["Card Number"]) + let cardNumberTextField = app.textFields["Card Number"] + cardNumberTextField.tap() + cardNumberTextField.typeText("4000000000000085") + app.textFields["MM/YY"].typeText("012020") + app.buttons["Tokenize and Verify New Card"].tap() + sleep(2) + + self.waitForElementToAppear(app.buttons["3D Secure authentication was attempted but liability shift is not possible"]) + + XCTAssertTrue(app.buttons["3D Secure authentication was attempted but liability shift is not possible"].exists); + } + + func testThreeDSecure_unavailable() { + self.waitForElementToAppear(app.textFields["Card Number"]) + let cardNumberTextField = app.textFields["Card Number"] + cardNumberTextField.tap() + cardNumberTextField.typeText("4000000000000069") + app.textFields["MM/YY"].typeText("012020") + app.buttons["Tokenize and Verify New Card"].tap() + sleep(2) + + self.waitForElementToAppear(app.buttons["3D Secure authentication was attempted but liability shift is not possible"]) + + XCTAssertTrue(app.buttons["3D Secure authentication was attempted but liability shift is not possible"].exists); + } + + func testThreeDSecure_timeout() { + self.waitForElementToAppear(app.textFields["Card Number"]) + let cardNumberTextField = app.textFields["Card Number"] + cardNumberTextField.tap() + cardNumberTextField.typeText("4000000000000044") + app.textFields["MM/YY"].typeText("012020") + app.buttons["Tokenize and Verify New Card"].tap() + sleep(5) + + self.waitForElementToAppear(app.buttons["3D Secure authentication was attempted but liability shift is not possible"]) + + XCTAssertTrue(app.buttons["3D Secure authentication was attempted but liability shift is not possible"].exists); + } + +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UITests/Helpers/BTUITest.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UITests/Helpers/BTUITest.swift new file mode 100644 index 0000000..437b1f3 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UITests/Helpers/BTUITest.swift @@ -0,0 +1,42 @@ +import XCTest + +extension XCTestCase { + func waitForElementToAppear(_ element: XCUIElement, timeout: TimeInterval = 10, file: String = #file, line: UInt = #line) { + let existsPredicate = NSPredicate(format: "exists == true") + + expectation(for: existsPredicate, + evaluatedWith: element, handler: nil) + + waitForExpectations(timeout: timeout) { (error) -> Void in + if (error != nil) { + let message = "Failed to find \(element) after \(timeout) seconds." + self.recordFailure(withDescription: message, inFile: file, atLine: Int(line), expected: true) + } + } + } + + func waitForElementToBeHittable(_ element: XCUIElement, timeout: TimeInterval = 10, file: String = #file, line: UInt = #line) { + let existsPredicate = NSPredicate(format: "exists == true && hittable == true") + + expectation(for: existsPredicate, + evaluatedWith: element, handler: nil) + + waitForExpectations(timeout: timeout) { (error) -> Void in + if (error != nil) { + let message = "Failed to find \(element) after \(timeout) seconds." + self.recordFailure(withDescription: message, inFile: file, atLine: Int(line), expected: true) + } + } + } +} + +extension XCUIElement { + func forceTapElement() { + if self.isHittable { + self.tap() + } else { + let coordinate: XCUICoordinate = self.coordinate(withNormalizedOffset: CGVector(dx: 0.0, dy: 0.0)) + coordinate.tap() + } + } +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UITests/Info.plist b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UITests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UITests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTAPIClient_SwiftTests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTAPIClient_SwiftTests.swift new file mode 100644 index 0000000..632ec62 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTAPIClient_SwiftTests.swift @@ -0,0 +1,251 @@ +import XCTest + +class BTAPIClient_SwiftTests: XCTestCase { + + // MARK: - Initialization + + func testAPIClientInitialization_withValidTokenizationKey_returnsClientWithTokenizationKey() { + let apiClient = BTAPIClient(authorization: "development_testing_integration_merchant_id")! + XCTAssertEqual(apiClient.tokenizationKey, "development_testing_integration_merchant_id") + } + + func testAPIClientInitialization_withInvalidTokenizationKey_returnsNil() { + XCTAssertNil(BTAPIClient(authorization: "invalid")) + } + + func testAPIClientInitialization_withEmptyTokenizationKey_returnsNil() { + XCTAssertNil(BTAPIClient(authorization: "")) + } + + func testAPIClientInitialization_withValidClientToken_returnsClientWithClientToken() { + let clientToken = BTTestClientTokenFactory.token(withVersion: 2) + let apiClient = BTAPIClient(authorization: clientToken!) + XCTAssertEqual(apiClient?.clientToken?.originalValue, clientToken) + } + + func testAPIClientInitialization_withVersionThreeClientToken_returnsClientWithClientToken() { + let clientToken = BTTestClientTokenFactory.token(withVersion: 3) + let apiClient = BTAPIClient(authorization: clientToken!) + XCTAssertEqual(apiClient?.clientToken?.originalValue, clientToken) + } + + func testAPIClientInitialization_withValidClientToken_performanceMeetsExpectations() { + let clientToken = BTTestClientTokenFactory.token(withVersion: 2) + self.measure() { + _ = BTAPIClient(authorization: clientToken!) + } + } + + // MARK: - Copy + + func testCopyWithSource_whenUsingClientToken_usesSameClientToken() { + let clientToken = BTTestClientTokenFactory.token(withVersion: 2) + let apiClient = BTAPIClient(authorization: clientToken!) + + let copiedApiClient = apiClient?.copy(with: .unknown, integration: .unknown) + + XCTAssertEqual(copiedApiClient?.clientToken?.originalValue, clientToken) + } + + func testCopyWithSource_whenUsingTokenizationKey_usesSameTokenizationKey() { + let apiClient = BTAPIClient(authorization: "development_testing_integration_merchant_id") + let copiedApiClient = apiClient?.copy(with: .unknown, integration: .unknown) + XCTAssertEqual(copiedApiClient?.tokenizationKey, "development_testing_integration_merchant_id") + } + + func testCopyWithSource_setsMetadataSourceAndIntegration() { + let apiClient = BTAPIClient(authorization: "development_testing_integration_merchant_id") + let copiedApiClient = apiClient?.copy(with: .payPalBrowser, integration: .dropIn) + XCTAssertEqual(copiedApiClient?.metadata.source, .payPalBrowser) + XCTAssertEqual(copiedApiClient?.metadata.integration, .dropIn) + } + + func testCopyWithSource_copiesHTTP() { + let apiClient = BTAPIClient(authorization: "development_testing_integration_merchant_id") + let copiedApiClient = apiClient?.copy(with: .payPalBrowser, integration: .dropIn) + XCTAssertTrue(copiedApiClient !== apiClient) + } + + // MARK: - fetchOrReturnRemoteConfiguration + + func testFetchOrReturnRemoteConfiguration_performsGETWithCorrectPayload() { + let apiClient = BTAPIClient(authorization: "development_testing_integration_merchant_id", sendAnalyticsEvent: false)! + let mockHTTP = BTFakeHTTP()! + mockHTTP.stubRequest("GET", toEndpoint: "/v1/configuration", respondWith: [], statusCode: 200) + apiClient.configurationHTTP = mockHTTP + + let expectation = self.expectation(description: "Callback invoked") + apiClient.fetchOrReturnRemoteConfiguration() { _,_ in + XCTAssertEqual(mockHTTP.lastRequestEndpoint, "v1/configuration") + XCTAssertEqual(mockHTTP.lastRequestParameters?["configVersion"] as? String, "3") + expectation.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + } + + // MARK: - fetchPaymentMethods + + func testFetchPaymentMethods_performsGETWithCorrectParameter() { + let apiClient = BTAPIClient(authorization: BTValidTestClientToken, sendAnalyticsEvent: false)! + let mockHTTP = BTFakeHTTP()! + mockHTTP.stubRequest("GET", toEndpoint: "/client_api/v1/payment_methods", respondWith: [], statusCode: 200) + apiClient.http = mockHTTP + + var expectation = self.expectation(description: "Callback invoked") + apiClient.fetchPaymentMethodNonces() { _,_ in + XCTAssertEqual(mockHTTP.lastRequestEndpoint, "v1/payment_methods") + XCTAssertEqual(mockHTTP.lastRequestParameters!["default_first"] as? String, "false") + XCTAssertEqual(mockHTTP.lastRequestParameters!["session_id"] as? String, apiClient.metadata.sessionId) + expectation.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + + expectation = self.expectation(description: "Callback invoked") + apiClient.fetchPaymentMethodNonces(true) { _,_ in + XCTAssertEqual(mockHTTP.lastRequestEndpoint, "v1/payment_methods") + XCTAssertEqual(mockHTTP.lastRequestParameters!["default_first"] as? String, "true") + expectation.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + + expectation = self.expectation(description: "Callback invoked") + apiClient.fetchPaymentMethodNonces(false) { _,_ in + XCTAssertEqual(mockHTTP.lastRequestEndpoint, "v1/payment_methods") + XCTAssertEqual(mockHTTP.lastRequestParameters!["default_first"] as? String, "false") + expectation.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + } + + func testFetchPaymentMethods_returnsPaymentMethodNonces() { + let apiClient = BTAPIClient(authorization: BTValidTestClientToken, sendAnalyticsEvent: false)! + let stubHTTP = BTFakeHTTP()! + let stubbedResponse = [ + "paymentMethods": [ + [ + "default" : true, + "description": "ending in 05", + "details": [ + "cardType": "American Express", + "lastTwo": "05" + ], + "nonce": "fake-nonce", + "type": "CreditCard" + ], + [ + "default" : false, + "description": "jane.doe@example.com", + "details": [], + "nonce": "fake-nonce", + "type": "PayPalAccount" + ] + ] ] + stubHTTP.stubRequest("GET", toEndpoint: "/client_api/v1/payment_methods", respondWith: stubbedResponse, statusCode: 200) + apiClient.http = stubHTTP + + let expectation = self.expectation(description: "Callback invoked") + apiClient.fetchPaymentMethodNonces() { (paymentMethodNonces, error) in + guard let paymentMethodNonces = paymentMethodNonces else { + XCTFail() + return + } + + XCTAssertNil(error) + XCTAssertEqual(paymentMethodNonces.count, 2) + + guard let cardNonce = paymentMethodNonces[0] as? BTCardNonce else { + XCTFail() + return + } + guard let paypalNonce = paymentMethodNonces[1] as? BTPayPalAccountNonce else { + XCTFail() + return + } + + XCTAssertEqual(cardNonce.nonce, "fake-nonce") + XCTAssertEqual(cardNonce.localizedDescription, "ending in 05") + XCTAssertEqual(cardNonce.lastTwo, "05") + XCTAssertTrue(cardNonce.cardNetwork == BTCardNetwork.AMEX) + XCTAssertTrue(cardNonce.isDefault) + + XCTAssertEqual(paypalNonce.nonce, "fake-nonce") + XCTAssertEqual(paypalNonce.localizedDescription, "jane.doe@example.com") + XCTAssertFalse(paypalNonce.isDefault) + + expectation.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + } + + func testFetchPaymentMethods_withTokenizationKey_returnsError() { + let apiClient = BTAPIClient(authorization: "development_tokenization_key", sendAnalyticsEvent: false)! + + let expectation = self.expectation(description: "Error returned") + apiClient.fetchPaymentMethodNonces() { (paymentMethodNonces, error) -> Void in + XCTAssertNil(paymentMethodNonces); + guard let error = error as NSError? else {return} + XCTAssertEqual(error._domain, BTAPIClientErrorDomain); + XCTAssertEqual(error._code, BTAPIClientErrorType.notAuthorized.rawValue); + expectation.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + } + + // MARK: - V3 Client Token + + func testFetchPaymentMethods_performsGETWithCorrectParameter_withVersionThreeClientToken() { + let clientToken = BTTestClientTokenFactory.token(withVersion: 3) + let apiClient = BTAPIClient(authorization: clientToken!, sendAnalyticsEvent: false)! + let mockHTTP = BTFakeHTTP()! + mockHTTP.stubRequest("GET", toEndpoint: "/client_api/v1/payment_methods", respondWith: [], statusCode: 200) + apiClient.http = mockHTTP + let mockConfigurationHTTP = BTFakeHTTP()! + mockConfigurationHTTP.stubRequest("GET", toEndpoint: "/client_api/v1/configuration", respondWith: [], statusCode: 200) + apiClient.configurationHTTP = mockConfigurationHTTP + + XCTAssertEqual((apiClient.clientToken!.json["version"] as! BTJSON).asIntegerOrZero(), 3) + + var expectation = self.expectation(description: "Callback invoked") + apiClient.fetchPaymentMethodNonces() { _,_ in + XCTAssertEqual(mockHTTP.lastRequestEndpoint, "v1/payment_methods") + XCTAssertEqual(mockHTTP.lastRequestParameters!["default_first"] as? String, "false") + XCTAssertEqual(mockHTTP.lastRequestParameters!["session_id"] as? String, apiClient.metadata.sessionId) + expectation.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + + expectation = self.expectation(description: "Callback invoked") + apiClient.fetchPaymentMethodNonces(true) { _,_ in + XCTAssertEqual(mockHTTP.lastRequestEndpoint, "v1/payment_methods") + XCTAssertEqual(mockHTTP.lastRequestParameters!["default_first"] as? String, "true") + expectation.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + + expectation = self.expectation(description: "Callback invoked") + apiClient.fetchPaymentMethodNonces(false) { _,_ in + XCTAssertEqual(mockHTTP.lastRequestEndpoint, "v1/payment_methods") + XCTAssertEqual(mockHTTP.lastRequestParameters!["default_first"] as? String, "false") + expectation.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + } + + // MARK: - Analytics + + func testAnalyticsService_byDefault_isASingleton() { + let firstAPIClient = BTAPIClient(authorization: "development_testing_integration_merchant_id")! + let secondAPIClient = BTAPIClient(authorization: "development_testing_integration_merchant_id")! + XCTAssertTrue(firstAPIClient.analyticsService === secondAPIClient.analyticsService) + } + +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTAPIClient_Tests.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTAPIClient_Tests.m new file mode 100644 index 0000000..bc24903 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTAPIClient_Tests.m @@ -0,0 +1,463 @@ +#import +#import +#import +#import +#import +#import "BTAnalyticsService.h" +#import "BTAPIClient_Internal.h" +#import "BTFakeHTTP.h" +#import "BTHTTP.h" +#import "BTHTTPTestProtocol.h" +#import "BTSpecHelper.h" + +@interface StubBTClientMetadata : BTClientMetadata +@property (nonatomic, assign) BTClientMetadataIntegrationType integration; +@property (nonatomic, assign) BTClientMetadataSourceType source; +@property (nonatomic, copy) NSString *sessionId; +@end + +@implementation StubBTClientMetadata +@synthesize integration = _integration; +@synthesize source = _source; +@synthesize sessionId = _sessionId; +@end + +@interface BTFakeAnalyticsService : BTAnalyticsService +@property (nonatomic, copy) NSString *lastEvent; +@property (nonatomic, assign) BOOL didLastFlush; +@end + +@implementation BTFakeAnalyticsService + +- (void)sendAnalyticsEvent:(NSString *)eventKind { + self.lastEvent = eventKind; + self.didLastFlush = NO; +} + +- (void)sendAnalyticsEvent:(NSString *)eventKind completion:(__unused void (^)(NSError *))completionBlock { + self.lastEvent = eventKind; + self.didLastFlush = YES; +} + +@end + +@interface BTAPIClient_Tests : XCTestCase +@end + +@implementation BTAPIClient_Tests + +#pragma mark - Initialization + +- (void)testInitialization_withValidTokenizationKey_setsTokenizationKey { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:@"development_tokenization_key" sendAnalyticsEvent:NO]; + XCTAssertEqualObjects(apiClient.tokenizationKey, @"development_tokenization_key"); +} + +- (void)testInitialization_withInvalidTokenizationKey_returnsNil { + XCTAssertNil([[BTAPIClient alloc] initWithAuthorization:@"not_a_valid_tokenization_key" sendAnalyticsEvent:NO]); +} + +- (void)testInitialization_withValidClientToken_setsClientToken { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:BTValidTestClientToken sendAnalyticsEvent:NO]; + XCTAssertEqualObjects(apiClient.clientToken.originalValue, BTValidTestClientToken); +} + +- (void)testInitialization_withInvalidClientToken_returnsNil { + XCTAssertNil([[BTAPIClient alloc] initWithAuthorization:@"invalidclienttoken" sendAnalyticsEvent:NO]); +} + +#pragma mark - Environment Base URL + +- (void)testBaseURL_isDeterminedByTokenizationKey { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:@"development_tokenization_key" sendAnalyticsEvent:NO]; + XCTAssertEqualObjects(apiClient.configurationHTTP.baseURL.absoluteString, @"http://localhost:3000/merchants/key/client_api"); + + apiClient = [[BTAPIClient alloc] initWithAuthorization:@"sandbox_tokenization_key" sendAnalyticsEvent:NO]; + XCTAssertEqualObjects(apiClient.configurationHTTP.baseURL.absoluteString, @"https://api.sandbox.braintreegateway.com/merchants/key/client_api"); + + apiClient = [[BTAPIClient alloc] initWithAuthorization:@"production_tokenization_key" sendAnalyticsEvent:NO]; + XCTAssertEqualObjects(apiClient.configurationHTTP.baseURL.absoluteString, @"https://api.braintreegateway.com:443/merchants/key/client_api"); +} + +#pragma mark - Configuration + +- (void)testAPIClient_canGetRemoteConfiguration { + XCTestExpectation *expectation = [self expectationWithDescription:@"Fetch configuration"]; + + BTAPIClient *apiClient = [self clientThatReturnsConfiguration:@{ @"test": @YES }]; + BTFakeHTTP *mockConfigurationHTTP = (BTFakeHTTP *)apiClient.configurationHTTP; + mockConfigurationHTTP.GETRequestCount = 0; + [apiClient fetchOrReturnRemoteConfiguration:^(BTConfiguration *configuration, NSError *error) { + XCTAssertNotNil(configuration); + XCTAssertNil(error); + + XCTAssertGreaterThanOrEqual(mockConfigurationHTTP.GETRequestCount, (NSUInteger)1); + XCTAssertTrue([configuration.json[@"test"] isTrue]); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testConfiguration_whenServerRespondsWithNon200StatusCode_returnsAPIClientError { + XCTestExpectation *expectation = [self expectationWithDescription:@"Fetch configuration"]; + + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:@"development_tokenization_key" sendAnalyticsEvent:NO]; + + BTFakeHTTP *fake = [BTFakeHTTP fakeHTTP]; + [fake stubRequest:@"GET" toEndpoint:@"/client_api/v1/configuration" respondWith:@{ @"error_message": @"Something bad happened" } statusCode:503]; + apiClient.configurationHTTP = fake; + + [apiClient fetchOrReturnRemoteConfiguration:^(BTConfiguration *configuration, NSError *error) { + // Note: GETRequestCount will be 1 or 2 depending on whether the analytics event for the API client initialization + // has failed yet + XCTAssertNil(configuration); + XCTAssertEqualObjects(error.domain, BTAPIClientErrorDomain); + XCTAssertEqual(error.code, BTAPIClientErrorTypeConfigurationUnavailable); + XCTAssertEqualObjects(error.localizedFailureReason, @"Unable to fetch remote configuration from Braintree API at this time."); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testConfiguration_whenNetworkHasError_returnsNetworkErrorInCallback { + XCTestExpectation *expectation = [self expectationWithDescription:@"Fetch configuration"]; + + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:@"development_tokenization_key" sendAnalyticsEvent:NO]; + + BTFakeHTTP *fake = [BTFakeHTTP fakeHTTP]; + NSError *anError = [NSError errorWithDomain:NSURLErrorDomain + code:NSURLErrorCannotConnectToHost + userInfo:nil]; + [fake stubRequest:@"GET" toEndpoint:@"/client_api/v1/configuration" respondWithError:anError]; + apiClient.configurationHTTP = fake; + + [apiClient fetchOrReturnRemoteConfiguration:^(BTConfiguration *configuration, NSError *error) { + // BTAPIClient fetches the config when initialized so there can potentially be 2 requests here + XCTAssertLessThanOrEqual(fake.GETRequestCount, (NSUInteger)2); + XCTAssertNil(configuration); + XCTAssertEqual(error, anError); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testConfigurationHTTP_byDefault_usesAnInMemoryCache { + // We don't want configuration to cache configuration responses past the lifetime of the app + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:@"development_tokenization_key" sendAnalyticsEvent:NO]; + NSURLCache *cache = apiClient.configurationHTTP.session.configuration.URLCache; + + XCTAssertTrue(cache.diskCapacity == 0); + XCTAssertTrue(cache.memoryCapacity > 0); +} + +#pragma mark - Dispatch Queue + +- (void)testCallbacks_useMainDispatchQueue { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:@"development_tokenization_key" sendAnalyticsEvent:NO]; + BTFakeHTTP *fake = [[BTFakeHTTP alloc] initWithBaseURL:apiClient.http.baseURL authorizationFingerprint:@""]; + // Override apiClient.http so that requests don't fail + apiClient.configurationHTTP = fake; + apiClient.http = fake; + [fake stubRequest:@"GET" toEndpoint:@"/client_api/v1/configuration" respondWith: @{ } statusCode:200]; + + XCTestExpectation *expectation1 = [self expectationWithDescription:@"Fetch configuration"]; + [apiClient fetchOrReturnRemoteConfiguration:^(__unused BTConfiguration *configuration, __unused NSError *error) { + XCTAssert([NSThread isMainThread]); + [expectation1 fulfill]; + }]; + XCTestExpectation *expectation2 = [self expectationWithDescription:@"GET request"]; + [apiClient GET:@"" parameters:@{} completion:^(__unused BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(response); + XCTAssertNil(error); + + XCTAssert([NSThread isMainThread]); + [expectation2 fulfill]; + }]; + XCTestExpectation *expectation3 = [self expectationWithDescription:@"POST request"]; + [apiClient POST:@"" parameters:@{} completion:^(__unused BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(response); + XCTAssertNil(error); + + XCTAssert([NSThread isMainThread]); + [expectation3 fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +#pragma mark - Payment option categories + +- (void)testIsPayPalEnabled_whenEnabled_returnsTrue { + BTAPIClient *apiClient = [self clientThatReturnsConfiguration:@{ @"paypalEnabled": @(YES) }]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Fetch configuration"]; + [apiClient fetchOrReturnRemoteConfiguration:^(BTConfiguration *configuration, NSError *error) { + XCTAssertNil(error); + + XCTAssertTrue(configuration.isPayPalEnabled); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testIsPayPalEnabled_whenDisabled_returnsFalse { + BTAPIClient *apiClient = [self clientThatReturnsConfiguration:@{ @"paypalEnabled": @(NO) }]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Fetch configuration"]; + [apiClient fetchOrReturnRemoteConfiguration:^(BTConfiguration *configuration, NSError *error) { + XCTAssertNil(error); + + XCTAssertFalse(configuration.isPayPalEnabled); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testIsApplePayEnabled_whenEnabled_returnsTrue { + BTAPIClient *apiClient = [self clientThatReturnsConfiguration:@{ @"applePay": @{ @"status": @"production" } }]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Fetch configuration"]; + [apiClient fetchOrReturnRemoteConfiguration:^(BTConfiguration *configuration, NSError *error) { + XCTAssertNil(error); + + XCTAssertTrue(configuration.isApplePayEnabled); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testIsApplePayEnabled_whenDisabled_returnsFalse { + BTAPIClient *apiClient = [self clientThatReturnsConfiguration:@{ @"applePay": @{ @"status": @"off" } }]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Fetch configuration"]; + [apiClient fetchOrReturnRemoteConfiguration:^(BTConfiguration *configuration, NSError *error) { + XCTAssertNil(error); + + XCTAssertFalse(configuration.isApplePayEnabled); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testIsUnionPayEnabled_whenGatewayReturnsFalse_isFalse { + BTAPIClient *apiClient = [self clientThatReturnsConfiguration:@{ @"unionPayEnabled": @(NO) }]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Fetch configuration"]; + [apiClient fetchOrReturnRemoteConfiguration:^(BTConfiguration *configuration, NSError *error) { + XCTAssertNil(error); + + XCTAssertFalse(configuration.isUnionPayEnabled); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)testIsUnionPayEnabled_whenGatewayReturnsTrue_isTrue { + BTAPIClient *apiClient = [self clientThatReturnsConfiguration:@{ @"unionPay": @{@"enabled": @(YES) } }]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Fetch configuration"]; + [apiClient fetchOrReturnRemoteConfiguration:^(BTConfiguration *configuration, NSError *error) { + XCTAssertNil(error); + + XCTAssertTrue(configuration.isUnionPayEnabled); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +#pragma mark - Analytics tests + +- (void)testAnalyticsService_isCreatedDuringInitialization { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:@"development_tokenization_key" sendAnalyticsEvent:NO]; + XCTAssertTrue([apiClient.analyticsService isKindOfClass:[BTAnalyticsService class]]); +} + +- (void)testSendAnalyticsEvent_whenCalled_callsAnalyticsService_doesFlush { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:@"development_tokenization_key" sendAnalyticsEvent:NO]; + BTFakeAnalyticsService *mockAnalyticsService = [[BTFakeAnalyticsService alloc] init]; + apiClient.analyticsService = mockAnalyticsService; + + [apiClient sendAnalyticsEvent:@"blahblah"]; + + XCTAssertEqualObjects(mockAnalyticsService.lastEvent, @"blahblah"); + XCTAssertTrue(mockAnalyticsService.didLastFlush); +} + +- (void)testQueueAnalyticsEvent_whenCalled_callsAnalyticsService_doesNotFlush { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:@"development_tokenization_key" sendAnalyticsEvent:NO]; + BTFakeAnalyticsService *mockAnalyticsService = [[BTFakeAnalyticsService alloc] init]; + apiClient.analyticsService = mockAnalyticsService; + + [apiClient queueAnalyticsEvent:@"blahblahqueue"]; + + XCTAssertEqualObjects(mockAnalyticsService.lastEvent, @"blahblahqueue"); + XCTAssertFalse(mockAnalyticsService.didLastFlush); +} + +#pragma mark - Client SDK Metadata + +- (void)testPOST_whenUsingGateway_includesMetadata { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:@"development_tokenization_key" sendAnalyticsEvent:NO]; + apiClient = [apiClient copyWithSource:BTClientMetadataSourcePayPalApp integration:BTClientMetadataIntegrationDropIn]; + BTFakeHTTP *mockHTTP = [BTFakeHTTP fakeHTTP]; + apiClient.http = mockHTTP; + BTFakeHTTP *stubConfigurationHTTP = [BTFakeHTTP fakeHTTP]; + apiClient.configurationHTTP = stubConfigurationHTTP; + [stubConfigurationHTTP stubRequest:@"GET" toEndpoint:@"/client_api/v1/configuration" respondWith: @{} statusCode:200]; + + BTClientMetadata *metadata = apiClient.metadata; + + XCTestExpectation *expectation = [self expectationWithDescription:@"POST callback"]; + [apiClient POST:@"/" parameters:@{} httpType:BTAPIClientHTTPTypeGateway completion:^(__unused BTJSON *body, __unused NSHTTPURLResponse *response, __unused NSError *error) { + XCTAssertEqualObjects(mockHTTP.lastRequestParameters[@"_meta"][@"integration"], metadata.integrationString); + XCTAssertEqualObjects(mockHTTP.lastRequestParameters[@"_meta"][@"source"], metadata.sourceString); + XCTAssertEqualObjects(mockHTTP.lastRequestParameters[@"_meta"][@"sessionId"], metadata.sessionId); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testPOST_whenUsingBraintreeAPI_doesNotIncludeMetadata { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:@"development_tokenization_key" sendAnalyticsEvent:NO]; + apiClient = [apiClient copyWithSource:BTClientMetadataSourcePayPalApp integration:BTClientMetadataIntegrationDropIn]; + BTFakeAPIHTTP *mockAPIHTTP = [BTFakeAPIHTTP fakeHTTP]; + apiClient.braintreeAPI = mockAPIHTTP; + BTFakeHTTP *stubConfigurationHTTP = [BTFakeHTTP fakeHTTP]; + apiClient.configurationHTTP = stubConfigurationHTTP; + [stubConfigurationHTTP stubRequest:@"GET" toEndpoint:@"/client_api/v1/configuration" respondWith: @{} statusCode:200]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"POST callback"]; + [apiClient POST:@"/" parameters:@{} httpType:BTAPIClientHTTPTypeBraintreeAPI completion:^(__unused BTJSON *body, __unused NSHTTPURLResponse *response, __unused NSError *error) { + XCTAssertEqualObjects(mockAPIHTTP.lastRequestParameters, @{}); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testPOST_whenUsingGraphQLAPI_includesMetadata { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:@"development_tokenization_key" sendAnalyticsEvent:NO]; + apiClient = [apiClient copyWithSource:BTClientMetadataSourcePayPalApp integration:BTClientMetadataIntegrationDropIn]; + BTFakeGraphQLHTTP *mockGraphQLHTTP = [BTFakeGraphQLHTTP fakeHTTP]; + apiClient.graphQL = mockGraphQLHTTP; + BTFakeHTTP *stubConfigurationHTTP = [BTFakeHTTP fakeHTTP]; + apiClient.configurationHTTP = stubConfigurationHTTP; + [stubConfigurationHTTP stubRequest:@"GET" + toEndpoint:@"/client_api/v1/configuration" + respondWith:@{ + @"graphQL": @{ + @"url": @"graphql://graphql", + @"features": @[@"tokenize_credit_cards"] } + } + statusCode:200]; + + BTClientMetadata *metadata = apiClient.metadata; + + XCTestExpectation *expectation = [self expectationWithDescription:@"POST callback"]; + [apiClient POST:@"/" parameters:@{} httpType:BTAPIClientHTTPTypeGraphQLAPI completion:^(__unused BTJSON *body, __unused NSHTTPURLResponse *response, __unused NSError *error) { + XCTAssertEqualObjects(mockGraphQLHTTP.lastRequestParameters[@"clientSdkMetadata"], metadata.parameters); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +#pragma mark - Timeouts + +- (void)testGETCallback_returnFetchConfigErrors { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:@"development_tokenization_key" sendAnalyticsEvent:NO]; + BTFakeHTTP *fakeConfigurationHTTP = [[BTFakeHTTP alloc] initWithBaseURL:apiClient.http.baseURL authorizationFingerprint:@""]; + BTFakeHTTP *fakeHTTP = [[BTFakeHTTP alloc] initWithBaseURL:apiClient.http.baseURL authorizationFingerprint:@""]; + // Override apiClient.http so that requests don't fail + apiClient.configurationHTTP = fakeConfigurationHTTP; + apiClient.http = fakeHTTP; + + NSError *anError = [NSError errorWithDomain:NSURLErrorDomain + code:NSURLErrorCannotConnectToHost + userInfo:nil]; + [fakeConfigurationHTTP stubRequest:@"GET" toEndpoint:@"/client_api/v1/configuration" respondWithError:anError]; + + XCTestExpectation *expectation1 = [self expectationWithDescription:@"GET request"]; + + [apiClient GET:@"/example" parameters:@{} completion:^(__unused BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNil(response); + XCTAssertNotNil(error); + XCTAssertEqualObjects(anError, error); + + [expectation1 fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testPOSTCallback_returnFetchConfigErrors { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:@"development_tokenization_key" sendAnalyticsEvent:NO]; + BTFakeHTTP *fakeConfigurationHTTP = [[BTFakeHTTP alloc] initWithBaseURL:apiClient.http.baseURL authorizationFingerprint:@""]; + BTFakeHTTP *fakeHTTP = [[BTFakeHTTP alloc] initWithBaseURL:apiClient.http.baseURL authorizationFingerprint:@""]; + // Override apiClient.http so that requests don't fail + apiClient.configurationHTTP = fakeConfigurationHTTP; + apiClient.http = fakeHTTP; + + NSError *anError = [NSError errorWithDomain:NSURLErrorDomain + code:NSURLErrorCannotConnectToHost + userInfo:nil]; + [fakeConfigurationHTTP stubRequest:@"GET" toEndpoint:@"/client_api/v1/configuration" respondWithError:anError]; + + XCTestExpectation *expectation1 = [self expectationWithDescription:@"GET request"]; + + [apiClient POST:@"/example" parameters:@{} completion:^(__unused BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNil(response); + XCTAssertNotNil(error); + XCTAssertEqualObjects(anError, error); + + [expectation1 fulfill]; + }]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testGraphQLURLForEnvironment_returnsSandboxURL { + NSURL *sandboxURL = [BTAPIClient graphQLURLForEnvironment:@"sandbox"]; + XCTAssertEqualObjects(sandboxURL.absoluteString, @"https://payments.sandbox.braintree-api.com/graphql"); +} + +- (void)testGraphQLURLForEnvironment_returnsDevelopmentURL { + NSURL *developmentURL = [BTAPIClient graphQLURLForEnvironment:@"development"]; + XCTAssertEqualObjects(developmentURL.absoluteString, @"http://localhost:8080/graphql"); +} + +- (void)testGraphQLURLForEnvironment_returnsProductionURL { + NSURL *productionURL = [BTAPIClient graphQLURLForEnvironment:@"production"]; + XCTAssertEqualObjects(productionURL.absoluteString, @"https://payments.braintree-api.com/graphql"); +} + +- (void)testGraphQLURLForEnvironment_returnsProductionURL_asDefault { + NSURL *defaultURL = [BTAPIClient graphQLURLForEnvironment:@"unknown"]; + XCTAssertEqualObjects(defaultURL.absoluteString, @"https://payments.braintree-api.com/graphql"); +} + +#pragma mark - Helpers + +- (BTAPIClient *)clientThatReturnsConfiguration:(NSDictionary *)configurationDictionary { + BTAPIClient *apiClient = [[BTAPIClient alloc] initWithAuthorization:@"development_tokenization_key" sendAnalyticsEvent:NO]; + BTFakeHTTP *fake = [BTFakeHTTP fakeHTTP]; + fake.cannedConfiguration = [[BTJSON alloc] initWithValue:configurationDictionary]; + fake.cannedStatusCode = 200; + [fake stubRequest:@"GET" toEndpoint:@"/client_api/v1/configuration" respondWith: configurationDictionary statusCode:200]; + + apiClient.configurationHTTP = fake; + + return apiClient; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTAmericanExpressClient_Tests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTAmericanExpressClient_Tests.swift new file mode 100644 index 0000000..8fefd8f --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTAmericanExpressClient_Tests.swift @@ -0,0 +1,51 @@ +import XCTest + +class BTAmericanExpressClient_Tests: XCTestCase { + + var mockAPIClient : MockAPIClient = MockAPIClient(authorization: "development_client_key")! + var amexClient : BTAmericanExpressClient? = nil + + override func setUp() { + super.setUp() + mockAPIClient = MockAPIClient(authorization: "development_tokenization_key")! + amexClient = BTAmericanExpressClient(apiClient: mockAPIClient) + } + + func testGetRewardsBalance_returnsSendsAnalyticsEventOnSuccess() { + let responseBody = [ + "conversionRate": "0.0070", + "currencyAmount": "316795.03", + "currencyIsoCode": "USD", + "requestId": "715f4712-8690-49ed-8cc5-d7fb1c2d", + "rewardsAmount": "45256433", + "rewardsUnit": "Points", + ] as [String : Any] + mockAPIClient.cannedResponseBody = BTJSON(value: responseBody) + + let expectation = self.expectation(description: "Amex rewards balance response") + amexClient!.getRewardsBalance(forNonce: "fake-nonce", currencyIsoCode: "USD", completion: { (rewardsBalance, error) in + XCTAssertNil(error) + XCTAssertNotNil(rewardsBalance) + expectation.fulfill() + }) + waitForExpectations(timeout: 2, handler: nil) + + XCTAssertEqual(mockAPIClient.postedAnalyticsEvents[mockAPIClient.postedAnalyticsEvents.count - 2], "ios.amex.rewards-balance.start") + XCTAssertEqual(mockAPIClient.postedAnalyticsEvents.last!, "ios.amex.rewards-balance.success") + } + + func testGetRewardsBalance_returnsSendsAnalyticsEventOnError() { + mockAPIClient.cannedResponseError = NSError(domain: "foo", code: 100, userInfo: nil) + + let expectation = self.expectation(description: "Amex rewards balance response") + amexClient!.getRewardsBalance(forNonce: "fake-nonce", currencyIsoCode: "USD", completion: { (rewardsBalance, error) in + XCTAssertEqual(error! as NSError, self.mockAPIClient.cannedResponseError!) + XCTAssertNil(rewardsBalance) + expectation.fulfill() + }) + waitForExpectations(timeout: 2, handler: nil) + + XCTAssertEqual(mockAPIClient.postedAnalyticsEvents[mockAPIClient.postedAnalyticsEvents.count - 2], "ios.amex.rewards-balance.start") + XCTAssertEqual(mockAPIClient.postedAnalyticsEvents.last!, "ios.amex.rewards-balance.error") + } +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTAmericanExpressRewardsBalance_Tests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTAmericanExpressRewardsBalance_Tests.swift new file mode 100644 index 0000000..d19e971 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTAmericanExpressRewardsBalance_Tests.swift @@ -0,0 +1,33 @@ +import XCTest + +class BTAmericanExpressRewardsBalance_Tests: XCTestCase { + + func testInitWithJson_parsesSuccessJsonCorrectly() { + let jsonString = "{ \"conversionRate\": \"0.0070\", \"currencyAmount\": \"316795.03\", \"currencyIsoCode\": \"USD\", \"requestId\": \"715f4712-8690-49ed-8cc5-d7fb1c2d\", \"rewardsUnit\": \"Points\", \"rewardsAmount\": \"45256433\"}".data(using: String.Encoding.utf8)! + let json = BTJSON(data: jsonString) + let rewardsBalance = BTAmericanExpressRewardsBalance(json: json) + XCTAssertEqual(rewardsBalance.conversionRate, "0.0070") + XCTAssertEqual(rewardsBalance.currencyAmount, "316795.03") + XCTAssertEqual(rewardsBalance.currencyIsoCode, "USD") + XCTAssertEqual(rewardsBalance.requestId, "715f4712-8690-49ed-8cc5-d7fb1c2d") + XCTAssertEqual(rewardsBalance.rewardsAmount, "45256433") + XCTAssertEqual(rewardsBalance.rewardsUnit, "Points") + XCTAssertNil(rewardsBalance.errorCode) + XCTAssertNil(rewardsBalance.errorMessage) + + } + + func testInitWithJson_parsesErrorJsonCorrectly() { + let jsonString = "{ \"error\": { \"code\": \"abv6178\", \"message\": \"Rewards balance error message\"}}".data(using: String.Encoding.utf8)! + let json = BTJSON(data: jsonString) + let rewardsBalance = BTAmericanExpressRewardsBalance(json: json) + XCTAssertEqual(rewardsBalance.errorCode, "abv6178") + XCTAssertEqual(rewardsBalance.errorMessage, "Rewards balance error message") + XCTAssertNil(rewardsBalance.conversionRate) + XCTAssertNil(rewardsBalance.currencyAmount) + XCTAssertNil(rewardsBalance.currencyIsoCode) + XCTAssertNil(rewardsBalance.requestId) + XCTAssertNil(rewardsBalance.rewardsAmount) + XCTAssertNil(rewardsBalance.rewardsUnit) + } +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTAnalyticsMetadataSpec.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTAnalyticsMetadataSpec.m new file mode 100644 index 0000000..5f81cdb --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTAnalyticsMetadataSpec.m @@ -0,0 +1,152 @@ +#import "BTAnalyticsMetadata.h" + +#import +#import "BTSpecDependencies.h" + +SpecBegin(BTAnalyticsMetadata) + +describe(@"metadata", ^{ + it(@"returns a dictionary of analytics metadata", ^{ + expect([BTAnalyticsMetadata metadata]).to.beKindOf([NSDictionary class]); + expect([[BTAnalyticsMetadata metadata] allKeys]).to.contain(@"platform"); + }); + + describe(@"platform", ^{ + it(@"returns \"iOS\"", ^{ + expect([BTAnalyticsMetadata metadata][@"platform"]).to.equal(@"iOS"); + }); + }); + + describe(@"platformVersion", ^{ + it(@"returns the iOS version, e.g. 7.0", ^{ + expect([BTAnalyticsMetadata metadata][@"platformVersion"]).to.match(@"^\\d+\\.\\d+(\\.\\d+)?$"); + }); + }); + + describe(@"sdkVersion", ^{ + it(@"returns Braintree sdk version", ^{ + expect([BTAnalyticsMetadata metadata][@"sdkVersion"]).to.match(@"^\\d+\\.\\d+\\.\\d+(-[0-9a-zA-Z-]+)?$"); + }); + }); + describe(@"merchantAppId", ^{ + it(@"returns app bundle identifier", ^{ + OCMockObject *mock = [OCMockObject partialMockForObject:[NSBundle mainBundle]]; + [[[mock stub] andReturn:@{ (__bridge NSString *)kCFBundleIdentifierKey: @"com.braintree.Braintree-Demo" }] infoDictionary]; + + expect([BTAnalyticsMetadata metadata][@"merchantAppId"]).to.equal(@"com.braintree.Braintree-Demo"); + + [mock stopMocking]; + }); + }); + describe(@"merchantAppName", ^{ + it(@"returns the merchant's app version", ^{ + OCMockObject *mock = [OCMockObject partialMockForObject:[NSBundle mainBundle]]; + [[[mock stub] andReturn:@{ (__bridge NSString *)kCFBundleNameKey:@"Braintree Demo" }] infoDictionary]; + + expect([BTAnalyticsMetadata metadata][@"merchantAppName"]).to.equal(@"Braintree Demo"); + + [mock stopMocking]; + }); + }); + describe(@"merchantAppVersion", ^{ + it(@"returns the merchant's app version", ^{ + OCMockObject *mock = [OCMockObject partialMockForObject:[NSBundle mainBundle]]; + [[[mock stub] andReturn:@{ (__bridge NSString *)kCFBundleVersionKey:@"2.3.4" }] infoDictionary]; + + expect([BTAnalyticsMetadata metadata][@"merchantAppVersion"]).to.match(@"2.3.4"); + + [mock stopMocking]; + }); + }); + describe(@"deviceRooted", ^{ + it(@"returns true iff the device has been jailbroken", ^{ + expect([[BTAnalyticsMetadata metadata][@"deviceRooted"] boolValue]).to.beFalsy(); + }); + }); + describe(@"deviceManufacturer", ^{ + it(@"returns \"Apple\"", ^{ + expect([BTAnalyticsMetadata metadata][@"deviceManufacturer"]).to.equal(@"Apple"); + }); + }); + describe(@"deviceModel", ^{ + it(@"returns the device model", ^{ + expect([BTAnalyticsMetadata metadata][@"deviceModel"]).to.match(@"iPhone\\d,\\d|i386|x86_64"); + }); + }); + + describe(@"deviceAppGeneratedPersistentUuid", ^{ + it(@"returns a UUID", ^{ + NSString *deviceAppGeneratedPersistentUuid = [BTAnalyticsMetadata metadata][@"deviceAppGeneratedPersistentUuid"]; + if (deviceAppGeneratedPersistentUuid) { + expect(deviceAppGeneratedPersistentUuid).to.match(@"^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$"); + } + }); + + it(@"returns a consistent value", ^{ + expect([BTAnalyticsMetadata metadata][@"deviceAppGeneratedPersistentUuid"]).to.equal([BTAnalyticsMetadata metadata][@"deviceAppGeneratedPersistentUuid"]); + }); + }); + + it(@"deviceNetworkType", ^{ + it(@"returns whether we're on cellular or wifi", ^{ + expect([BTAnalyticsMetadata metadata][@"deviceNetworkType"]).to.equal(@"wifi"); + }); + }); + describe(@"deviceLocationLatitude", ^{ + it(@"returns the devices location if already available", ^{ + expect([BTAnalyticsMetadata metadata][@"deviceLocationLatitude"]).to.beNil(); + }); + }); + describe(@"deviceLocationLongitude", ^{ + it(@"returns the device location if already available", ^{ + expect([BTAnalyticsMetadata metadata][@"deviceLocationLongitude"]).to.beNil(); + }); + }); + describe(@"iosIdentifierForVendor", ^{ + it(@"returns the identifierForVendor", ^{ + NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:@"00000000-0000-0000-0000-000000000000"]; + OCMockObject *mock = [OCMockObject partialMockForObject:[UIDevice currentDevice]]; + [[[mock stub] andReturn:uuid] identifierForVendor]; + + expect([BTAnalyticsMetadata metadata][@"iosIdentifierForVendor"]).to.equal(uuid.UUIDString); + + [mock stopMocking]; + }); + }); + describe(@"iosIsCocoaPods", ^{ + it(@"is present", ^{ + expect([BTAnalyticsMetadata metadata][@"iosIsCocoapods"]).to.beKindOf([NSNumber class]); + }); + }); + describe(@"isSimulator", ^{ + it(@"returns true for ios simulators", ^{ + expect([BTAnalyticsMetadata metadata][@"isSimulator"]).to.beTruthy(); + }); + }); + describe(@"deviceScreenOrientation", ^{ + it(@"returns the screen orientation, e.g. Portrait or FaceUp", ^{ + id mockDevice = OCMPartialMock([UIDevice currentDevice]); + OCMStub([mockDevice orientation]).andReturn(UIDeviceOrientationFaceUp); + expect([BTAnalyticsMetadata metadata][@"deviceScreenOrientation"]).to.equal(@"FaceUp"); + [mockDevice stopMocking]; + }); + it(@"returns AppExtension when running in an App Extension", ^{ + id stubMainBundle = OCMPartialMock([NSBundle mainBundle]); + OCMStub([stubMainBundle infoDictionary]).andReturn(@{@"NSExtension": @{}}); + expect([BTAnalyticsMetadata metadata][@"deviceScreenOrientation"]).to.equal(@"AppExtension"); + [stubMainBundle stopMocking]; + }); + }); + describe(@"userInterfaceOrientation", ^{ + it(@"returns the user interface orientation, e.g. Portrait or Landscape", ^{ +#ifdef __IPHONE_8_0 + expect([BTAnalyticsMetadata metadata][@"userInterfaceOrientation"]).to.beNil(); +#else + expect([BTAnalyticsMetadata metadata][@"userInterfaceOrientation"]).to.equal(@"Unknown"); +#endif + + }); + }); +}); + +SpecEnd diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTAnalyticsService_Tests.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTAnalyticsService_Tests.m new file mode 100644 index 0000000..1753fe7 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTAnalyticsService_Tests.m @@ -0,0 +1,284 @@ + #import "UnitTests-Swift.h" +#import "BTAnalyticsService.h" +#import "BTKeychain.h" +#import "Braintree-Version.h" +#import "BTFakeHTTP.h" +#import +#import +#import + +@interface BTAnalyticsService_Tests : XCTestCase + +@end + +@implementation BTAnalyticsService_Tests + +#pragma mark - Analytics tests + +- (void)testSendAnalyticsEvent_whenRemoteConfigurationHasNoAnalyticsURL_returnsError { + MockAPIClient *stubAPIClient = [self stubbedAPIClientWithAnalyticsURL:nil]; + BTAnalyticsService *analyticsService = [[BTAnalyticsService alloc] initWithAPIClient:stubAPIClient]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Sends analytics event"]; + [analyticsService sendAnalyticsEvent:@"any.analytics.event" completion:^(NSError *error) { + XCTAssertEqual(error.domain, BTAnalyticsServiceErrorDomain); + XCTAssertEqual(error.code, (NSInteger)BTAnalyticsServiceErrorTypeMissingAnalyticsURL); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testSendAnalyticsEvent_whenRemoteConfigurationHasAnalyticsURL_setsUpAnalyticsHTTPToUseBaseURL { + MockAPIClient *stubAPIClient = [self stubbedAPIClientWithAnalyticsURL:@"test://do-not-send.url"]; + BTAnalyticsService *analyticsService = [[BTAnalyticsService alloc] initWithAPIClient:stubAPIClient]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Sends analytics event"]; + [analyticsService sendAnalyticsEvent:@"any.analytics.event" completion:^(NSError *error) { + XCTAssertEqualObjects(analyticsService.http.baseURL.absoluteString, @"test://do-not-send.url"); + XCTAssertNil(error); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testSendAnalyticsEvent_whenNumberOfQueuedEventsMeetsThreshold_sendsAnalyticsEvent { + MockAPIClient *stubAPIClient = [self stubbedAPIClientWithAnalyticsURL:@"test://do-not-send.url"]; + BTFakeHTTP *mockAnalyticsHTTP = [BTFakeHTTP fakeHTTP]; + BTAnalyticsService *analyticsService = [[BTAnalyticsService alloc] initWithAPIClient:stubAPIClient]; + analyticsService.flushThreshold = 1; + analyticsService.http = mockAnalyticsHTTP; + + [analyticsService sendAnalyticsEvent:@"an.analytics.event"]; + // Pause briefly to allow analytics service to dispatch async blocks + [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + + XCTAssertEqualObjects(mockAnalyticsHTTP.lastRequestEndpoint, @"/"); + XCTAssertEqualObjects(mockAnalyticsHTTP.lastRequestParameters[@"analytics"][0][@"kind"], @"an.analytics.event"); + [self validateMetaParameters:mockAnalyticsHTTP.lastRequestParameters[@"_meta"]]; +} + +- (void)testSendAnalyticsEvent_whenFlushThresholdIsGreaterThanNumberOfBatchedEvents_doesNotSendAnalyticsEvent { + MockAPIClient *stubAPIClient = [self stubbedAPIClientWithAnalyticsURL:@"test://do-not-send.url"]; + BTFakeHTTP *mockAnalyticsHTTP = [BTFakeHTTP fakeHTTP]; + BTAnalyticsService *analyticsService = [[BTAnalyticsService alloc] initWithAPIClient:stubAPIClient]; + analyticsService.flushThreshold = 2; + analyticsService.http = mockAnalyticsHTTP; + + [analyticsService sendAnalyticsEvent:@"an.analytics.event"]; + [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + + XCTAssertTrue(mockAnalyticsHTTP.POSTRequestCount == 0); +} + +- (void)testSendAnalyticsEventCompletion_whenCalled_sendsAllEvents { + MockAPIClient *stubAPIClient = [self stubbedAPIClientWithAnalyticsURL:@"test://do-not-send.url"]; + BTFakeHTTP *mockAnalyticsHTTP = [BTFakeHTTP fakeHTTP]; + BTAnalyticsService *analyticsService = [[BTAnalyticsService alloc] initWithAPIClient:stubAPIClient]; + analyticsService.flushThreshold = 5; + analyticsService.http = mockAnalyticsHTTP; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Sends batched request"]; + [analyticsService sendAnalyticsEvent:@"an.analytics.event"]; + [analyticsService sendAnalyticsEvent:@"another.analytics.event" completion:^(NSError *error) { + XCTAssertNil(error); + XCTAssertTrue(mockAnalyticsHTTP.POSTRequestCount == 1); + XCTAssertEqualObjects(mockAnalyticsHTTP.lastRequestEndpoint, @"/"); + XCTAssertEqualObjects(mockAnalyticsHTTP.lastRequestParameters[@"analytics"][0][@"kind"], @"an.analytics.event"); + XCTAssertEqualObjects(mockAnalyticsHTTP.lastRequestParameters[@"analytics"][1][@"kind"], @"another.analytics.event"); + [self validateMetaParameters:mockAnalyticsHTTP.lastRequestParameters[@"_meta"]]; + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testFlush_whenCalled_sendsAllQueuedEvents { + MockAPIClient *stubAPIClient = [self stubbedAPIClientWithAnalyticsURL:@"test://do-not-send.url"]; + BTFakeHTTP *mockAnalyticsHTTP = [BTFakeHTTP fakeHTTP]; + BTAnalyticsService *analyticsService = [[BTAnalyticsService alloc] initWithAPIClient:stubAPIClient]; + analyticsService.flushThreshold = 5; + analyticsService.http = mockAnalyticsHTTP; + + [analyticsService sendAnalyticsEvent:@"an.analytics.event"]; + [analyticsService sendAnalyticsEvent:@"another.analytics.event"]; + // Pause briefly to allow analytics service to dispatch async blocks + [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Sends batched request"]; + [analyticsService flush:^(NSError *error) { + XCTAssertNil(error); + XCTAssertTrue(mockAnalyticsHTTP.POSTRequestCount == 1); + XCTAssertEqualObjects(mockAnalyticsHTTP.lastRequestEndpoint, @"/"); + XCTAssertEqualObjects(mockAnalyticsHTTP.lastRequestParameters[@"analytics"][0][@"kind"], @"an.analytics.event"); + XCTAssertEqualObjects(mockAnalyticsHTTP.lastRequestParameters[@"analytics"][1][@"kind"], @"another.analytics.event"); + [self validateMetaParameters:mockAnalyticsHTTP.lastRequestParameters[@"_meta"]]; + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testFlush_whenThereAreNoQueuedEvents_doesNotPOST { + MockAPIClient *stubAPIClient = [self stubbedAPIClientWithAnalyticsURL:@"test://do-not-send.url"]; + BTFakeHTTP *mockAnalyticsHTTP = [BTFakeHTTP fakeHTTP]; + BTAnalyticsService *analyticsService = [[BTAnalyticsService alloc] initWithAPIClient:stubAPIClient]; + analyticsService.flushThreshold = 5; + analyticsService.http = mockAnalyticsHTTP; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Sends batched request"]; + [analyticsService flush:^(NSError *error) { + XCTAssertNil(error); + XCTAssertTrue(mockAnalyticsHTTP.POSTRequestCount == 0); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testAnalyticsService_whenAPIClientConfigurationFails_returnsError { + MockAPIClient *stubAPIClient = [self stubbedAPIClientWithAnalyticsURL:@"test://do-not-send.url"]; + NSError *stubbedError = [NSError errorWithDomain:@"SomeError" code:1 userInfo:nil]; + stubAPIClient.cannedConfigurationResponseError = stubbedError; + BTFakeHTTP *mockAnalyticsHTTP = [BTFakeHTTP fakeHTTP]; + BTAnalyticsService *analyticsService = [[BTAnalyticsService alloc] initWithAPIClient:stubAPIClient]; + analyticsService.http = mockAnalyticsHTTP; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Callback invoked with error"]; + [analyticsService sendAnalyticsEvent:@"an.analytics.event" completion:^(NSError *error) { + XCTAssertEqualObjects(error, stubbedError); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; + + expectation = [self expectationWithDescription:@"Callback invoked with error"]; + [analyticsService flush:^(NSError *error) { + XCTAssertEqualObjects(error, stubbedError); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testAnalyticsService_afterConfigurationError_maintainsQueuedEventsUntilConfigurationIsSuccessful { + MockAPIClient *stubAPIClient = [self stubbedAPIClientWithAnalyticsURL:@"test://do-not-send.url"]; + NSError *stubbedError = [NSError errorWithDomain:@"SomeError" code:1 userInfo:nil]; + stubAPIClient.cannedConfigurationResponseError = stubbedError; + BTFakeHTTP *mockAnalyticsHTTP = [BTFakeHTTP fakeHTTP]; + BTAnalyticsService *analyticsService = [[BTAnalyticsService alloc] initWithAPIClient:stubAPIClient]; + analyticsService.http = mockAnalyticsHTTP; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Callback invoked with error"]; + [analyticsService sendAnalyticsEvent:@"an.analytics.event.1" completion:^(NSError *error) { + XCTAssertEqualObjects(error, stubbedError); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; + + stubAPIClient.cannedConfigurationResponseError = nil; + + expectation = [self expectationWithDescription:@"Callback invoked with error"]; + [analyticsService sendAnalyticsEvent:@"an.analytics.event.2" completion:^(NSError *error) { + XCTAssertNil(error); + XCTAssertTrue(mockAnalyticsHTTP.POSTRequestCount == 1); + XCTAssertEqualObjects(mockAnalyticsHTTP.lastRequestEndpoint, @"/"); + XCTAssertEqualObjects(mockAnalyticsHTTP.lastRequestParameters[@"analytics"][0][@"kind"], @"an.analytics.event.1"); + XCTAssertEqualObjects(mockAnalyticsHTTP.lastRequestParameters[@"analytics"][1][@"kind"], @"an.analytics.event.2"); + [self validateMetaParameters:mockAnalyticsHTTP.lastRequestParameters[@"_meta"]]; + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testAnalyticsService_whenAppIsBackgrounded_sendsQueuedAnalyticsEvents { + MockAPIClient *stubAPIClient = [self stubbedAPIClientWithAnalyticsURL:@"test://do-not-send.url"]; + BTFakeHTTP *mockAnalyticsHTTP = [BTFakeHTTP fakeHTTP]; + BTAnalyticsService *analyticsService = [[BTAnalyticsService alloc] initWithAPIClient:stubAPIClient]; + analyticsService.flushThreshold = 5; + analyticsService.http = mockAnalyticsHTTP; + + [analyticsService sendAnalyticsEvent:@"an.analytics.event"]; + [analyticsService sendAnalyticsEvent:@"another.analytics.event"]; + // Pause briefly to allow analytics service to dispatch async blocks + [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + [[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationWillResignActiveNotification object:nil]; + + [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + + XCTAssertTrue(mockAnalyticsHTTP.POSTRequestCount == 1); + XCTAssertEqualObjects(mockAnalyticsHTTP.lastRequestEndpoint, @"/"); + XCTAssertEqualObjects(mockAnalyticsHTTP.lastRequestParameters[@"analytics"][0][@"kind"], @"an.analytics.event"); + XCTAssertEqualObjects(mockAnalyticsHTTP.lastRequestParameters[@"analytics"][1][@"kind"], @"another.analytics.event"); + [self validateMetaParameters:mockAnalyticsHTTP.lastRequestParameters[@"_meta"]]; +} + +#pragma mark - Helpers + +- (MockAPIClient *)stubbedAPIClientWithAnalyticsURL:(NSString *)analyticsURL { + MockAPIClient *stubAPIClient = [[MockAPIClient alloc] initWithAuthorization:@"development_tokenization_key" sendAnalyticsEvent:NO]; + if (analyticsURL) { + stubAPIClient.cannedConfigurationResponseBody = [[BTJSON alloc] initWithValue:@{ @"analytics" : @{ @"url" : analyticsURL } }]; + } else { + stubAPIClient.cannedConfigurationResponseBody = [[BTJSON alloc] initWithValue:@{}]; + } + return stubAPIClient; +} + +- (void)validateMetaParameters:(NSDictionary *)metaParameters { + NSString *unitTestDeploymentTargetVersion = [@(__IPHONE_OS_VERSION_MIN_REQUIRED) stringValue]; + NSString *unitTestBaseSDKVersion = [@(__IPHONE_OS_VERSION_MAX_ALLOWED) stringValue]; + + XCTAssertEqualObjects(metaParameters[@"deviceManufacturer"], @"Apple"); + XCTAssertEqualObjects(metaParameters[@"deviceModel"], [self deviceModel]); + XCTAssertEqualObjects(metaParameters[@"deviceAppGeneratedPersistentUuid"], [self deviceAppGeneratedPersistentUuid]); + XCTAssertEqualObjects(metaParameters[@"deviceScreenOrientation"], @"Portrait"); + XCTAssertEqualObjects(metaParameters[@"integration"], @"custom"); + XCTAssertEqualObjects(metaParameters[@"iosBaseSDK"], unitTestBaseSDKVersion); + XCTAssertEqualObjects(metaParameters[@"iosDeploymentTarget"], unitTestDeploymentTargetVersion); + XCTAssertEqualObjects(metaParameters[@"iosDeviceName"], [[UIDevice currentDevice] name]); + XCTAssertTrue((BOOL)metaParameters[@"isSimulator"] == TARGET_IPHONE_SIMULATOR); + XCTAssertEqualObjects(metaParameters[@"merchantAppId"], @"com.braintreepayments.Demo"); + XCTAssertEqualObjects(metaParameters[@"merchantAppName"], @"Braintree iOS SDK Demo"); + XCTAssertEqualObjects(metaParameters[@"sdkVersion"], BRAINTREE_VERSION); + XCTAssertEqualObjects(metaParameters[@"platform"], @"iOS"); + XCTAssertEqualObjects(metaParameters[@"platformVersion"], [[UIDevice currentDevice] systemVersion]); + XCTAssertNotNil(metaParameters[@"sessionId"]); + XCTAssertEqualObjects(metaParameters[@"source"], @"unknown"); + XCTAssertTrue([metaParameters[@"venmoInstalled"] isKindOfClass:[NSNumber class]]); +} + +// Ripped from BTAnalyticsMetadata +- (NSString *)deviceModel { + struct utsname systemInfo; + + uname(&systemInfo); + + NSString* code = [NSString stringWithCString:systemInfo.machine + encoding:NSUTF8StringEncoding]; + return code; +} + +// Ripped from BTAnalyticsMetadata +- (NSString *)deviceAppGeneratedPersistentUuid { + @try { + static NSString *deviceAppGeneratedPersistentUuidKeychainKey = @"deviceAppGeneratedPersistentUuid"; + NSString *savedIdentifier = [BTKeychain stringForKey:deviceAppGeneratedPersistentUuidKeychainKey]; + if (savedIdentifier.length == 0) { + savedIdentifier = [[NSUUID UUID] UUIDString]; + BOOL setDidSucceed = [BTKeychain setString:savedIdentifier + forKey:deviceAppGeneratedPersistentUuidKeychainKey]; + if (!setDidSucceed) { + return nil; + } + } + return savedIdentifier; + } @catch (NSException *exception) { + return nil; + } +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTAppSwitch_Tests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTAppSwitch_Tests.swift new file mode 100644 index 0000000..15d0e54 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTAppSwitch_Tests.swift @@ -0,0 +1,86 @@ +import XCTest + +class BTAppSwitch_Tests: XCTestCase { + + var appSwitch = BTAppSwitch.sharedInstance() + + override func setUp() { + super.setUp() + appSwitch = BTAppSwitch.sharedInstance() + } + + override func tearDown() { + MockAppSwitchHandler.cannedCanHandle = false + MockAppSwitchHandler.lastCanHandleURL = nil + MockAppSwitchHandler.lastCanHandleSourceApplication = nil + MockAppSwitchHandler.lastHandleAppSwitchReturnURL = nil + super.tearDown() + } + + func testHandleOpenURL_whenHandlerIsRegistered_invokesCanHandleAppSwitchReturnURL() { + appSwitch.register(MockAppSwitchHandler.self) + let expectedURL = URL(string: "fake://url")! + let expectedSourceApplication = "fakeSourceApplication" + + BTAppSwitch.handleOpen(expectedURL, sourceApplication: expectedSourceApplication) + + XCTAssertEqual(MockAppSwitchHandler.lastCanHandleURL!, expectedURL) + XCTAssertEqual(MockAppSwitchHandler.lastCanHandleSourceApplication!, expectedSourceApplication) + } + + func testHandleOpenURL_whenHandlerCanHandleOpenURL_invokesHandleAppSwitchReturnURL() { + appSwitch.register(MockAppSwitchHandler.self) + MockAppSwitchHandler.cannedCanHandle = true + let expectedURL = URL(string: "fake://url")! + + let handled = BTAppSwitch.handleOpen(expectedURL, sourceApplication: "not important") + + XCTAssert(handled) + XCTAssertEqual(MockAppSwitchHandler.lastHandleAppSwitchReturnURL!, expectedURL) + } + + func testHandleOpenURL_whenHandlerCantHandleOpenURL_doesNotInvokeHandleAppSwitchReturnURL() { + appSwitch.register(MockAppSwitchHandler.self) + MockAppSwitchHandler.cannedCanHandle = false + + BTAppSwitch.handleOpen(URL(string: "fake://url")!, sourceApplication: "not important") + + XCTAssertNil(MockAppSwitchHandler.lastHandleAppSwitchReturnURL) + } + + func testHandleOpenURL_whenHandlerCantHandleOpenURL_returnsFalse() { + appSwitch.register(MockAppSwitchHandler.self) + MockAppSwitchHandler.cannedCanHandle = false + + XCTAssertFalse(BTAppSwitch.handleOpen(URL(string: "fake://url")!, sourceApplication: "not important")) + } + + func testHandleOpenURL_acceptsOptionalSourceApplication() { + // This doesn't assert any behavior about nil source application. It only checks that the code will compile! + let sourceApplication : String? = nil + BTAppSwitch.handleOpen(URL(string: "fake://url")!, sourceApplication: sourceApplication) + } + + func testHandleOpenURL_withNoAppSwitching() { + let handled = BTAppSwitch.handleOpen(URL(string: "scheme://")!, sourceApplication: "com.yourcompany.hi") + XCTAssertFalse(handled) + } + +} + +class MockAppSwitchHandler: BTAppSwitchHandler { + static var cannedCanHandle = false + static var lastCanHandleURL : URL? = nil + static var lastCanHandleSourceApplication : String? = nil + static var lastHandleAppSwitchReturnURL : URL? = nil + + @objc static func canHandleAppSwitchReturn(_ url: URL, sourceApplication: String) -> Bool { + lastCanHandleURL = url + lastCanHandleSourceApplication = sourceApplication + return cannedCanHandle + } + + @objc static func handleAppSwitchReturn(_ url: URL) { + lastHandleAppSwitchReturnURL = url + } +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTApplePay_Tests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTApplePay_Tests.swift new file mode 100644 index 0000000..64b5ecf --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTApplePay_Tests.swift @@ -0,0 +1,351 @@ +import PassKit +import XCTest + +@available(iOS 8.0, *) + +class BTApplePay_Tests: XCTestCase { + + var mockClient : MockAPIClient = MockAPIClient(authorization: "development_tokenization_key")! + + override func setUp() { + super.setUp() + mockClient = MockAPIClient(authorization: "development_tokenization_key")! + } + + // MARK: - Payment Request + + func testPaymentRequest_whenConfiguredOff_callsBackWithError() { + mockClient.cannedConfigurationResponseBody = BTJSON(value: [ + "applePay" : [ + "status" : "off" + ] + ]) + let applePayClient = BTApplePayClient(apiClient: mockClient) + + let expectation = self.expectation(description: "Callback invoked") + applePayClient.paymentRequest { (paymentRequest, error) in + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTApplePayErrorDomain) + XCTAssertEqual(error.code, BTApplePayErrorType.unsupported.rawValue) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testPaymentRequest_whenConfigurationIsMissingApplePayStatus_callsBackWithError() { + mockClient.cannedConfigurationResponseBody = BTJSON(value: [:]) + let applePayClient = BTApplePayClient(apiClient: mockClient) + + let expectation = self.expectation(description: "Callback invoked") + applePayClient.paymentRequest { (paymentRequest, error) in + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTApplePayErrorDomain) + XCTAssertEqual(error.code, BTApplePayErrorType.unsupported.rawValue) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testPaymentRequest_whenAPIClientIsNil_callsBackWithError() { + let applePayClient = BTApplePayClient(apiClient: mockClient) + applePayClient.apiClient = nil + + let expectation = self.expectation(description: "Callback invoked") + applePayClient.paymentRequest { (paymentRequest, error) in + XCTAssertNil(paymentRequest) + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTApplePayErrorDomain) + XCTAssertEqual(error.code, BTApplePayErrorType.integration.rawValue) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testPaymentRequest_returnsPaymentRequestUsingConfiguration() { + mockClient.cannedConfigurationResponseBody = BTJSON(value: [ + "applePay" : [ + "status" : "production", + "countryCode": "BT", + "currencyCode": "BTB", + "merchantIdentifier": "merchant.com.braintree-unit-tests", + "supportedNetworks": ["visa", "mastercard", "amex"] + ] ]) + let applePayClient = BTApplePayClient(apiClient: mockClient) + + let expectation = self.expectation(description: "Callback invoked") + applePayClient.paymentRequest { (paymentRequest, error) in + guard let paymentRequest = paymentRequest else { + XCTFail() + return + } + + XCTAssertNil(error) + XCTAssertEqual(paymentRequest.countryCode, "BT") + XCTAssertEqual(paymentRequest.currencyCode, "BTB") + XCTAssertEqual(paymentRequest.merchantIdentifier, "merchant.com.braintree-unit-tests") + XCTAssertEqual(paymentRequest.supportedNetworks, [PKPaymentNetwork.visa, PKPaymentNetwork.masterCard, PKPaymentNetwork.amex]) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testPaymentRequest_whenConfigurationIsMissingValues_returnsPaymentRequestWithValuesUndefined() { + mockClient.cannedConfigurationResponseBody = BTJSON(value: [ + "applePay" : [ + "status" : "production" + ] ]) + let applePayClient = BTApplePayClient(apiClient: mockClient) + + let expectation = self.expectation(description: "Callback invoked") + applePayClient.paymentRequest { (paymentRequest, error) in + guard let paymentRequest = paymentRequest else { + XCTFail() + return + } + + XCTAssertNil(error) + XCTAssertEqual(paymentRequest.countryCode, "") + XCTAssertEqual(paymentRequest.currencyCode, "") + XCTAssertEqual(paymentRequest.merchantIdentifier, "") + XCTAssertEqual(paymentRequest.supportedNetworks, []) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + + // MARK: - Tokenization + + func testTokenization_whenConfiguredOff_callsBackWithError() { + mockClient.cannedConfigurationResponseBody = BTJSON(value: [ + "applePay" : [ + "status" : "off" + ] + ]) + let expectation = self.expectation(description: "Unsuccessful tokenization") + + let client = BTApplePayClient(apiClient: mockClient) + let payment = MockPKPayment() + client.tokenizeApplePay(payment) { (tokenizedPayment, error) -> Void in + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTApplePayErrorDomain) + XCTAssertEqual(error.code, BTApplePayErrorType.unsupported.rawValue) + expectation.fulfill() + } + waitForExpectations(timeout: 2, handler: nil) + } + + func testTokenization_whenConfigurationIsMissingApplePayStatus_callsBackWithError() { + mockClient.cannedConfigurationResponseBody = BTJSON(value: [:]) + let expectation = self.expectation(description: "Unsuccessful tokenization") + + let client = BTApplePayClient(apiClient: mockClient) + let payment = MockPKPayment() + client.tokenizeApplePay(payment) { (tokenizedPayment, error) -> Void in + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTApplePayErrorDomain) + XCTAssertEqual(error.code, BTApplePayErrorType.unsupported.rawValue) + expectation.fulfill() + } + waitForExpectations(timeout: 2, handler: nil) + } + + func testTokenization_whenAPIClientIsNil_callsBackWithError() { + let client = BTApplePayClient(apiClient: mockClient) + client.apiClient = nil + + let expectation = self.expectation(description: "Callback invoked") + client.tokenizeApplePay(MockPKPayment()) { (tokenizedPayment, error) -> Void in + XCTAssertNil(tokenizedPayment) + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTApplePayErrorDomain) + XCTAssertEqual(error.code, BTApplePayErrorType.integration.rawValue) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testTokenization_whenConfigurationFetchErrorOccurs_callsBackWithError() { + mockClient.cannedConfigurationResponseError = NSError(domain: "MyError", code: 1, userInfo: nil) + let client = BTApplePayClient(apiClient: mockClient) + let payment = MockPKPayment() + let expectation = self.expectation(description: "tokenization error") + + client.tokenizeApplePay(payment) { (tokenizedPayment, error) -> Void in + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, "MyError") + XCTAssertEqual(error.code, 1) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testTokenization_whenTokenizationErrorOccurs_callsBackWithError() { + mockClient.cannedConfigurationResponseBody = BTJSON(value: [ + "applePay" : [ + "status" : "production" + ] + ]) + mockClient.cannedHTTPURLResponse = HTTPURLResponse(url: URL(string: "any")!, statusCode: 503, httpVersion: nil, headerFields: nil) + mockClient.cannedResponseError = NSError(domain: "foo", code: 100, userInfo: nil) + let client = BTApplePayClient(apiClient: mockClient) + let payment = MockPKPayment() + let expectation = self.expectation(description: "tokenization failure") + + client.tokenizeApplePay(payment) { (tokenizedPayment, error) -> Void in + XCTAssertEqual(error! as NSError, self.mockClient.cannedResponseError!) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testTokenization_whenTokenizationFailureOccurs_callsBackWithError() { + mockClient.cannedConfigurationResponseBody = BTJSON(value: [ + "applePay" : [ + "status" : "production" + ] + ]) + mockClient.cannedResponseError = NSError(domain: "MyError", code: 1, userInfo: nil) + let client = BTApplePayClient(apiClient: mockClient) + let payment = MockPKPayment() + let expectation = self.expectation(description: "tokenization failure") + + client.tokenizeApplePay(payment) { (tokenizedPayment, error) -> Void in + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, "MyError") + XCTAssertEqual(error.code, 1) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testTokenization_whenSuccessfulTokenizationInProduction_callsBackWithTokenizedPayment() { + mockClient.cannedConfigurationResponseBody = BTJSON(value: [ + "applePay" : [ + "status" : "production" + ] + ]) + mockClient.cannedResponseBody = BTJSON(value: [ + "applePayCards": [ + [ + "nonce" : "an-apple-pay-nonce", + "description": "a description", + "default": true, + "binData": [ + "prepaid": "Yes", + "healthcare": "Yes", + "debit": "No", + "durbinRegulated": "No", + "commercial": "Yes", + "payroll": "No", + "issuingBank": "US", + "countryOfIssuance": "Something", + "productId": "123" + ] + ] + ] + ]) + let expectation = self.expectation(description: "successful tokenization") + + let client = BTApplePayClient(apiClient: mockClient) + let payment = MockPKPayment() + client.tokenizeApplePay(payment) { (tokenizedPayment, error) -> Void in + XCTAssertNil(error) + XCTAssertEqual(tokenizedPayment!.localizedDescription, "a description") + XCTAssertEqual(tokenizedPayment!.nonce, "an-apple-pay-nonce") + XCTAssertTrue(tokenizedPayment!.isDefault) + XCTAssertEqual(tokenizedPayment!.binData.prepaid, "Yes") + XCTAssertEqual(tokenizedPayment!.binData.healthcare, "Yes") + XCTAssertEqual(tokenizedPayment!.binData.debit, "No") + XCTAssertEqual(tokenizedPayment!.binData.durbinRegulated, "No") + XCTAssertEqual(tokenizedPayment!.binData.commercial, "Yes") + XCTAssertEqual(tokenizedPayment!.binData.payroll, "No") + XCTAssertEqual(tokenizedPayment!.binData.issuingBank, "US") + XCTAssertEqual(tokenizedPayment!.binData.countryOfIssuance, "Something") + XCTAssertEqual(tokenizedPayment!.binData.productId, "123") + expectation.fulfill() + } + + XCTAssertEqual(mockClient.lastPOSTPath, "v1/payment_methods/apple_payment_tokens") + + waitForExpectations(timeout: 2, handler: nil) + } + + // MARK: - Metadata + + func testMetaParameter_whenTokenizationIsSuccessful_isPOSTedToServer() { + let mockAPIClient = MockAPIClient(authorization: "development_tokenization_key")! + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "applePay" : [ + "status" : "production" + ] + ]) + let applePayClient = BTApplePayClient(apiClient: mockAPIClient) + let payment = MockPKPayment() + + let expectation = self.expectation(description: "Tokenized card") + applePayClient.tokenizeApplePay(payment) { _,_ -> Void in + expectation.fulfill() + } + + waitForExpectations(timeout: 5, handler: nil) + + XCTAssertEqual(mockAPIClient.lastPOSTPath, "v1/payment_methods/apple_payment_tokens") + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + let metaParameters = lastPostParameters["_meta"] as! NSDictionary + XCTAssertEqual(metaParameters["source"] as? String, "unknown") + XCTAssertEqual(metaParameters["integration"] as? String, "custom") + XCTAssertEqual(metaParameters["sessionId"] as? String, mockAPIClient.metadata.sessionId) + } + + class MockPKPaymentToken : PKPaymentToken { + override var paymentData : Data { + get { + return Data() + } + } + override var transactionIdentifier : String { + get { + return "transaction-id" + } + } + override var paymentInstrumentName : String { + get { + return "payment-instrument-name" + } + } + override var paymentNetwork : String { + get { + return "payment-network" + } + } + } + + class MockPKPayment : PKPayment { + var overrideToken = MockPKPaymentToken() + override var token : PKPaymentToken { + get { + return overrideToken + } + } + } + +} + + + + + + diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTBinData_Tests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTBinData_Tests.swift new file mode 100644 index 0000000..1781686 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTBinData_Tests.swift @@ -0,0 +1,74 @@ +import XCTest + +class BTBinData_Tests: XCTestCase { + + func testBinData_withCompleteJSON() { + let json = BTJSON(value: [ + "description": "Visa ending in 11", + "details": [ + "cardType": "Visa", + "lastTwo": "11", + ], + "binData": [ + "prepaid": "Yes", + "healthcare": "Yes", + "debit": "No", + "durbinRegulated": "No", + "commercial": "Yes", + "payroll": "No", + "issuingBank": "US", + "countryOfIssuance": "Something", + "productId": "123" + ], + "nonce": "fake-nonce", + ]) + let binData = BTBinData(json: json["binData"] as! BTJSON) + + XCTAssertEqual(binData.prepaid, "Yes") + XCTAssertEqual(binData.healthcare, "Yes") + XCTAssertEqual(binData.debit, "No") + XCTAssertEqual(binData.durbinRegulated, "No") + XCTAssertEqual(binData.commercial, "Yes") + XCTAssertEqual(binData.payroll, "No") + XCTAssertEqual(binData.issuingBank, "US") + XCTAssertEqual(binData.countryOfIssuance, "Something") + XCTAssertEqual(binData.productId, "123") + } + + func testBinData_withEmptyJSON() { + let json = BTJSON(value: [ + "some": "value" + ]) + let binData = BTBinData(json: json["binData"] as! BTJSON) + + XCTAssertEqual(binData.prepaid, "Unknown") + XCTAssertEqual(binData.healthcare, "Unknown") + XCTAssertEqual(binData.debit, "Unknown") + XCTAssertEqual(binData.durbinRegulated, "Unknown") + XCTAssertEqual(binData.commercial, "Unknown") + XCTAssertEqual(binData.payroll, "Unknown") + XCTAssertEqual(binData.issuingBank, "") + XCTAssertEqual(binData.countryOfIssuance, "") + XCTAssertEqual(binData.productId, "") + } + + func testBinData_withPartialJSON() { + let binData = BTBinData(json: BTJSON(value: [ + "prepaid": "Yes", + "healthcare": "Yes", + "countryOfIssuance": "Something", + "productId": "123" + ])) + + XCTAssertEqual(binData.prepaid, "Yes") + XCTAssertEqual(binData.healthcare, "Yes") + XCTAssertEqual(binData.debit, "Unknown") + XCTAssertEqual(binData.durbinRegulated, "Unknown") + XCTAssertEqual(binData.commercial, "Unknown") + XCTAssertEqual(binData.payroll, "Unknown") + XCTAssertEqual(binData.issuingBank, "") + XCTAssertEqual(binData.countryOfIssuance, "Something") + XCTAssertEqual(binData.productId, "123") + } + +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTCardClient_Tests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTCardClient_Tests.swift new file mode 100644 index 0000000..339f409 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTCardClient_Tests.swift @@ -0,0 +1,866 @@ +import XCTest + +class BTCardClient_Tests: XCTestCase { + + // MARK: - ClientAPI + + func testTokenization_postsCardDataToClientAPI() { + let expectation = self.expectation(description: "Tokenize Card") + let fakeHTTP = FakeHTTP.fakeHTTP() + let apiClient = BTAPIClient(authorization: "development_tokenization_key")! + apiClient.http = fakeHTTP + let mockConfigurationHTTP = BTFakeHTTP()! + mockConfigurationHTTP.stubRequest("GET", toEndpoint: "/client_api/v1/configuration", respondWith: [], statusCode: 200) + apiClient.configurationHTTP = mockConfigurationHTTP + + let cardClient = BTCardClient(apiClient: apiClient) + + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: "1234") + card.cardholderName = "Brian Tree" + + cardClient.tokenizeCard(card) { (tokenizedCard, error) -> Void in + XCTAssertEqual(fakeHTTP.lastRequest!.endpoint, "v1/payment_methods/credit_cards") + XCTAssertEqual(fakeHTTP.lastRequest!.method, "POST") + + if let cardParameters = fakeHTTP.lastRequest!.parameters["credit_card"] as? [String:AnyObject] { + XCTAssertEqual(cardParameters["number"] as? String, "4111111111111111") + XCTAssertEqual(cardParameters["expiration_date"] as? String, "12/2038") + XCTAssertEqual(cardParameters["cvv"] as? String, "1234") + XCTAssertEqual(cardParameters["cardholder_name"] as? String, "Brian Tree") + } else { + XCTFail() + } + expectation.fulfill() + } + + self.waitForExpectations(timeout: 10, handler: nil) + } + + func testTokenization_whenAPIClientSucceeds_returnsTokenizedCard() { + let expectation = self.expectation(description: "Tokenize Card") + let apiClient = BTAPIClient(authorization: "development_tokenization_key")! + apiClient.http = FakeHTTP.fakeHTTP() + let mockConfigurationHTTP = BTFakeHTTP()! + mockConfigurationHTTP.stubRequest("GET", toEndpoint: "/client_api/v1/configuration", respondWith: [], statusCode: 200) + apiClient.configurationHTTP = mockConfigurationHTTP + + let cardClient = BTCardClient(apiClient: apiClient) + + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: nil) + + cardClient.tokenizeCard(card) { (tokenizedCard, error) -> Void in + guard let tokenizedCard = tokenizedCard else { + XCTFail("Received an error: \(String(describing: error))") + return + } + + XCTAssertEqual(tokenizedCard.nonce, FakeHTTP.fakeNonce) + XCTAssertEqual(tokenizedCard.localizedDescription, "Visa ending in 11") + XCTAssertEqual(tokenizedCard.lastTwo!, "11") + XCTAssertEqual(tokenizedCard.cardNetwork, BTCardNetwork.visa) + expectation.fulfill() + } + + self.waitForExpectations(timeout: 10, handler: nil) + } + + func testTokenization_whenAPIClientFails_returnsError() { + let expectation = self.expectation(description: "Tokenize Card") + let apiClient = BTAPIClient(authorization: "development_tokenization_key")! + apiClient.http = ErrorHTTP.fakeHTTP() + let mockConfigurationHTTP = BTFakeHTTP()! + mockConfigurationHTTP.stubRequest("GET", toEndpoint: "/client_api/v1/configuration", respondWith: [], statusCode: 200) + apiClient.configurationHTTP = mockConfigurationHTTP + + let cardClient = BTCardClient(apiClient: apiClient) + + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: nil) + + cardClient.tokenizeCard(card) { (tokenizedCard, error) -> Void in + XCTAssertNil(tokenizedCard) + XCTAssertEqual(error! as NSError, ErrorHTTP.error) + expectation.fulfill() + } + + self.waitForExpectations(timeout: 10, handler: nil) + } + + func testTokenization_whenTokenizationEndpointReturns422_callCompletionWithValidationError() { + let stubAPIClient = MockAPIClient(authorization: BTValidTestClientToken)! + let stubJSONResponse = BTJSON(value: [ + "error" : [ + "message" : "Credit card is invalid" + ], + "fieldErrors" : [ + [ + "field" : "creditCard", + "fieldErrors" : [ + [ + "field" : "number", + "message" : "Credit card number must be 12-19 digits", + "code" : "81716" + ] + ] + ] + ] + ]) + let stubError = NSError(domain: BTHTTPErrorDomain, code: BTHTTPErrorCode.clientError.rawValue, userInfo: [ + BTHTTPURLResponseKey: HTTPURLResponse(url: URL(string: "http://fake")!, statusCode: 422, httpVersion: nil, headerFields: nil)!, + BTHTTPJSONResponseBodyKey: stubJSONResponse + ]) + stubAPIClient.cannedResponseError = stubError + let cardClient = BTCardClient(apiClient: stubAPIClient) + let request = BTCardRequest() + request.card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: "123") + + let expectation = self.expectation(description: "Callback invoked with error") + cardClient.tokenizeCard(request, options: nil) { (cardNonce, error) -> Void in + XCTAssertNil(cardNonce) + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTCardClientErrorDomain) + XCTAssertEqual(error.code, BTCardClientErrorType.customerInputInvalid.rawValue) + if let json = (error.userInfo as NSDictionary)[BTCustomerInputBraintreeValidationErrorsKey] as? NSDictionary { + XCTAssertEqual(json, (stubJSONResponse as BTJSON).asDictionary()! as NSDictionary) + } else { + XCTFail("Expected JSON response in userInfo[BTCustomInputBraintreeValidationErrorsKey]") + } + XCTAssertEqual(error.localizedDescription, "Credit card is invalid") + XCTAssertEqual((error as NSError).localizedFailureReason, "Credit card number must be 12-19 digits") + + + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testTokenization_whenTokenizationEndpointReturnsAnyNon422Error_callCompletionWithError() { + let stubAPIClient = MockAPIClient(authorization: BTValidTestClientToken)! + stubAPIClient.cannedResponseError = NSError(domain: BTHTTPErrorDomain, code: BTHTTPErrorCode.clientError.rawValue, userInfo: nil) + let cardClient = BTCardClient(apiClient: stubAPIClient) + let request = BTCardRequest() + request.card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: "123") + request.smsCode = "12345" + request.enrollmentID = "fake-enrollment-id" + + let expectation = self.expectation(description: "Callback invoked with error") + cardClient.tokenizeCard(request, options: nil) { (cardNonce, error) -> Void in + XCTAssertNil(cardNonce) + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTHTTPErrorDomain) + XCTAssertEqual(error.code, BTHTTPErrorCode.clientError.rawValue) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testMetaParameter_whenTokenizationIsSuccessful_isPOSTedToServer() { + let mockAPIClient = MockAPIClient(authorization: "development_tokenization_key")! + let cardClient = BTCardClient(apiClient: mockAPIClient) + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: nil) + + let expectation = self.expectation(description: "Tokenized card") + cardClient.tokenizeCard(card) { _,_ -> Void in + expectation.fulfill() + } + + waitForExpectations(timeout: 5, handler: nil) + + XCTAssertEqual(mockAPIClient.lastPOSTPath, "v1/payment_methods/credit_cards") + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + let metaParameters = lastPostParameters["_meta"] as! NSDictionary + XCTAssertEqual(metaParameters["source"] as? String, "unknown") + XCTAssertEqual(metaParameters["integration"] as? String, "custom") + XCTAssertEqual(metaParameters["sessionId"] as? String, mockAPIClient.metadata.sessionId) + } + + func testAnalyticsEvent_whenTokenizationSucceeds_isSent() { + let mockAPIClient = MockAPIClient(authorization: "development_tokenization_key")! + let cardClient = BTCardClient(apiClient: mockAPIClient) + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: nil) + + let expectation = self.expectation(description: "Tokenized card") + cardClient.tokenizeCard(card) { _, _ -> Void in + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + + XCTAssertTrue(mockAPIClient.postedAnalyticsEvents.contains("ios.custom.card.succeeded")) + } + + func testCollectsDeviceData_whenEnabled_withCorrectParams_usingNonceAsClientMetadataId_withoutCustomer() { + let mockAPIClient = MockAPIClient(authorization: "development_tokenization_key")! + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "creditCards": [ + "collectDeviceData": true + ], + "merchantId": "fake-merchant" + ]) + + mockAPIClient.cannedResponseBody = BTJSON(value: [ + "creditCards": [ + [ + "nonce": "cmid-nonce", + "description": "Visa ending in 11", + "details": [ + "lastTwo" : "11", + "cardType": "visa"] ] ] + ]) + + FakePPDataCollector.resetState() + BTCardClient.setPayPalDataCollectorClass(FakePPDataCollector.self) + let cardClient = BTCardClient(apiClient: mockAPIClient) + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: nil) + + let expectation = self.expectation(description: "Tokenized card") + cardClient.tokenizeCard(card) { _, _ -> Void in + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + + XCTAssertTrue(FakePPDataCollector.didGetClientMetadataID) + XCTAssertTrue(FakePPDataCollector.lastBeaconState) + XCTAssertEqual("cmid-nonce", FakePPDataCollector.lastClientMetadataId) + guard let data:[String : String] = (FakePPDataCollector.lastData as! [String : String]?) else { return XCTFail() } + XCTAssertEqual("fake-merchant", data["mid"]) + XCTAssertEqual("bt_card", data["rda_tenant"]) + XCTAssertNil(data["cid"]) + } + + func testCollectsDeviceData_whenEnabled_withCorrectParams_withCustomer() { + let clientTokenString = BTTestClientTokenFactory.token(withVersion: 2, overrides: [ + BTClientTokenKeyConfigURL: "https://api.example.com/client_api/v1/configuration", + BTClientTokenKeyAuthorizationFingerprint: "an_authorization_fingerprint|created_at=2014-02-12T18:02:30+0000&customer_id=fake-customer-123&public_key=integration_public_key" + ]) + + let mockAPIClient = MockAPIClient(authorization: clientTokenString!)! + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "creditCards": [ + "collectDeviceData": true + ], + "merchantId": "fake-merchant" + ]) + + mockAPIClient.cannedResponseBody = BTJSON(value: [ + "creditCards": [ + [ + "nonce": "cmid-nonce", + "description": "Visa ending in 11", + "details": [ + "lastTwo" : "11", + "cardType": "visa"] ] ] + ]) + + FakePPDataCollector.resetState() + BTCardClient.setPayPalDataCollectorClass(FakePPDataCollector.self) + let cardClient = BTCardClient(apiClient: mockAPIClient) + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: nil) + + let expectation = self.expectation(description: "Tokenized card") + cardClient.tokenizeCard(card) { _, _ -> Void in + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + + XCTAssertTrue(FakePPDataCollector.didGetClientMetadataID) + XCTAssertTrue(FakePPDataCollector.lastBeaconState) + XCTAssertEqual("cmid-nonce", FakePPDataCollector.lastClientMetadataId) + guard let data:[String : String] = (FakePPDataCollector.lastData as! [String : String]?) else { return XCTFail() } + XCTAssertEqual("fake-merchant", data["mid"]) + XCTAssertEqual("bt_card", data["rda_tenant"]) + XCTAssertEqual("fake-customer-123", data["cid"]) + } + + func testDoesNotCollectsDeviceData_whenDisabled() { + let mockAPIClient = MockAPIClient(authorization: "development_tokenization_key")! + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "creditCards": [ + "collectDeviceData": false + ], + "merchantId": "fake-merchant" + ]) + + mockAPIClient.cannedResponseBody = BTJSON(value: [ + "creditCards": [ + [ + "nonce": "cmid-nonce", + "description": "Visa ending in 11", + "details": [ + "lastTwo" : "11", + "cardType": "visa"] ] ] + ]) + + FakePPDataCollector.resetState() + BTCardClient.setPayPalDataCollectorClass(FakePPDataCollector.self) + let cardClient = BTCardClient(apiClient: mockAPIClient) + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: nil) + + let expectation = self.expectation(description: "Tokenized card") + cardClient.tokenizeCard(card) { _, _ -> Void in + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + + XCTAssertFalse(FakePPDataCollector.didGetClientMetadataID) + } + + func testAnalyticsEvent_whenTokenizationFails_isSent() { + let mockAPIClient = MockAPIClient(authorization: "development_tokenization_key")! + let stubJSONResponse = BTJSON(value: [ + "error" : [ + "message" : "Credit card is invalid" + ], + "fieldErrors" : [ + [ + "field" : "creditCard", + "fieldErrors" : [ + [ + "field" : "number", + "message" : "Credit card number must be 12-19 digits", + "code" : "81716" + ] + ] + ] + ] + ]) + let stubError = NSError(domain: BTHTTPErrorDomain, code: BTHTTPErrorCode.clientError.rawValue, userInfo: [ + BTHTTPURLResponseKey: HTTPURLResponse(url: URL(string: "http://fake")!, statusCode: 422, httpVersion: nil, headerFields: nil)!, + BTHTTPJSONResponseBodyKey: stubJSONResponse + ]) + mockAPIClient.cannedResponseError = stubError + let cardClient = BTCardClient(apiClient: mockAPIClient) + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: nil) + + let expectation = self.expectation(description: "Tokenized card") + cardClient.tokenizeCard(card) { _, _ -> Void in + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + + XCTAssertTrue(mockAPIClient.postedAnalyticsEvents.contains("ios.custom.card.failed")) + } + + + // MARK: - GraphQL API + + func testTokenization_whenGraphQLIsEnabled_postsCardDataToGraphQLAPI() { + let mockApiClient = MockAPIClient(authorization: "development_tokenization_key")! + mockApiClient.cannedConfigurationResponseBody = BTJSON(value: [ + "graphQL": [ + "url": "graphql://graphql", + "features": ["tokenize_credit_cards"] + ] + ]) + + let cardClient = BTCardClient(apiClient: mockApiClient) + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: "1234") + card.cardholderName = "Brian Tree" + + let expectation = self.expectation(description: "Tokenize Card") + + cardClient.tokenizeCard(card) { (tokenizedCard, error) -> Void in + XCTAssertTrue(mockApiClient.lastPOSTAPIClientHTTPType! == BTAPIClientHTTPType.graphQLAPI) + guard var lastPostParameters = mockApiClient.lastPOSTParameters else { + XCTFail() + return + } + lastPostParameters.removeValue(forKey: "clientSdkMetadata") + XCTAssertEqual(lastPostParameters as NSObject, card.graphQLParameters() as NSObject) + expectation.fulfill() + } + + waitForExpectations(timeout: 10, handler: nil) + } + + func testCollectsDeviceData_whenEnabledWithGraphQL_withCorrectParams_usingNonceAsClientMetadataId_withoutCustomer() { + let mockAPIClient = MockAPIClient(authorization: "development_tokenization_key")! + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "creditCards": [ + "collectDeviceData": true + ], + "merchantId": "fake-merchant", + "graphQL": [ + "url": "graphql://graphql", + "features": ["tokenize_credit_cards"] + ] + ]) + + mockAPIClient.cannedResponseBody = BTJSON(value: [ + "data": [ + "tokenizeCreditCard" : [ + "token" : "abc-nonce", + "creditCard" : [ + "brand" : "Visa", + "last4" : "1111", + "binData": [ + "prepaid": "Yes", + "healthcare": "Yes", + "debit": "No", + "durbinRegulated": "No", + "commercial": "Yes", + "payroll": "No", + "issuingBank": "US", + "countryOfIssuance": "Something", + "productId": "123" + ] + ] + ] + ], + "extensions": [ + ] + ]) + + FakePPDataCollector.resetState() + BTCardClient.setPayPalDataCollectorClass(FakePPDataCollector.self) + let cardClient = BTCardClient(apiClient: mockAPIClient) + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: "1234") + card.cardholderName = "Brian Tree" + + let expectation = self.expectation(description: "Tokenized card") + cardClient.tokenizeCard(card) { _, _ -> Void in + XCTAssertTrue(mockAPIClient.lastPOSTAPIClientHTTPType! == BTAPIClientHTTPType.graphQLAPI) + guard var lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + lastPostParameters.removeValue(forKey: "clientSdkMetadata") + XCTAssertEqual(lastPostParameters as NSObject, card.graphQLParameters() as NSObject) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + + XCTAssertTrue(FakePPDataCollector.didGetClientMetadataID) + XCTAssertTrue(FakePPDataCollector.lastBeaconState) + XCTAssertEqual("abc-nonce", FakePPDataCollector.lastClientMetadataId) + guard let data:[String : String] = (FakePPDataCollector.lastData as! [String : String]?) else { return XCTFail() } + XCTAssertEqual("fake-merchant", data["mid"]) + XCTAssertEqual("bt_card", data["rda_tenant"]) + XCTAssertNil(data["cid"]) + } + + func testCollectsDeviceData_whenEnabledWithGraphQL_withCustomer() { + let clientTokenString = BTTestClientTokenFactory.token(withVersion: 2, overrides: [ + BTClientTokenKeyConfigURL: "https://api.example.com/client_api/v1/configuration", + BTClientTokenKeyAuthorizationFingerprint: "an_authorization_fingerprint|created_at=2014-02-12T18:02:30+0000&customer_id=fake-customer-123&public_key=integration_public_key" + ]) + + let mockAPIClient = MockAPIClient(authorization: clientTokenString!)! + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "creditCards": [ + "collectDeviceData": true + ], + "merchantId": "fake-merchant", + "graphQL": [ + "url": "graphql://graphql", + "features": ["tokenize_credit_cards"] + ] + ]) + + mockAPIClient.cannedResponseBody = BTJSON(value: [ + "data": [ + "tokenizeCreditCard" : [ + "token" : "abc-nonce", + "creditCard" : [ + "brand" : "Visa", + "last4" : "1111", + "binData": [ + "prepaid": "Yes", + "healthcare": "Yes", + "debit": "No", + "durbinRegulated": "No", + "commercial": "Yes", + "payroll": "No", + "issuingBank": "US", + "countryOfIssuance": "Something", + "productId": "123" + ] + ] + ] + ], + "extensions": [ + ] + ]) + + FakePPDataCollector.resetState() + BTCardClient.setPayPalDataCollectorClass(FakePPDataCollector.self) + let cardClient = BTCardClient(apiClient: mockAPIClient) + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: "1234") + card.cardholderName = "Brian Tree" + + let expectation = self.expectation(description: "Tokenized card") + cardClient.tokenizeCard(card) { _, _ -> Void in + XCTAssertTrue(mockAPIClient.lastPOSTAPIClientHTTPType! == BTAPIClientHTTPType.graphQLAPI) + guard var lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + lastPostParameters.removeValue(forKey: "clientSdkMetadata") + XCTAssertEqual(lastPostParameters as NSObject, card.graphQLParameters() as NSObject) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + + XCTAssertTrue(FakePPDataCollector.didGetClientMetadataID) + XCTAssertTrue(FakePPDataCollector.lastBeaconState) + XCTAssertEqual("abc-nonce", FakePPDataCollector.lastClientMetadataId) + guard let data:[String : String] = (FakePPDataCollector.lastData as! [String : String]?) else { return XCTFail() } + XCTAssertEqual("fake-merchant", data["mid"]) + XCTAssertEqual("bt_card", data["rda_tenant"]) + XCTAssertEqual("fake-customer-123", data["cid"]) + } + + func testDoesNotCollectsDeviceData_whenDisabledWithGraphQL() { + let mockAPIClient = MockAPIClient(authorization: "development_tokenization_key")! + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "creditCards": [ + "collectDeviceData": false + ], + "merchantId": "fake-merchant", + "graphQL": [ + "url": "graphql://graphql", + "features": ["tokenize_credit_cards"] + ] + ]) + + mockAPIClient.cannedResponseBody = BTJSON(value: [ + "data": [ + "tokenizeCreditCard" : [ + "token" : "abc-nonce", + "creditCard" : [ + "brand" : "Visa", + "last4" : "1111", + "binData": [ + "prepaid": "Yes", + "healthcare": "Yes", + "debit": "No", + "durbinRegulated": "No", + "commercial": "Yes", + "payroll": "No", + "issuingBank": "US", + "countryOfIssuance": "Something", + "productId": "123" + ] + ] + ] + ], + "extensions": [ + ] + ]) + + FakePPDataCollector.resetState() + BTCardClient.setPayPalDataCollectorClass(FakePPDataCollector.self) + let cardClient = BTCardClient(apiClient: mockAPIClient) + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: "1234") + card.cardholderName = "Brian Tree" + + let expectation = self.expectation(description: "Tokenized card") + cardClient.tokenizeCard(card) { _, _ -> Void in + XCTAssertTrue(mockAPIClient.lastPOSTAPIClientHTTPType! == BTAPIClientHTTPType.graphQLAPI) + guard var lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + lastPostParameters.removeValue(forKey: "clientSdkMetadata") + XCTAssertEqual(lastPostParameters as NSObject, card.graphQLParameters() as NSObject) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + + XCTAssertFalse(FakePPDataCollector.didGetClientMetadataID) + } + + func testTokenization_whenGraphQLIsDisabled_postsCardDataToGatewayAPI() { + let mockApiClient = MockAPIClient(authorization: "development_tokenization_key")! + mockApiClient.cannedConfigurationResponseBody = BTJSON(value: [ + ]) + + let cardClient = BTCardClient(apiClient: mockApiClient) + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: "1234") + card.cardholderName = "Brian Tree" + + let expectation = self.expectation(description: "Tokenize Card") + + cardClient.tokenizeCard(card) { (tokenizedCard, error) -> Void in + XCTAssertTrue(mockApiClient.lastPOSTAPIClientHTTPType! == BTAPIClientHTTPType.gateway) + expectation.fulfill() + } + + waitForExpectations(timeout: 10, handler: nil) + } + + func testTokenization_whenGraphQLFeatureIsNotEnabled_postsCardDataToGatewayAPI() { + let mockApiClient = MockAPIClient(authorization: "development_tokenization_key")! + mockApiClient.cannedConfigurationResponseBody = BTJSON(value: [ + "graphQL": [ + "url": "graphql://graphql", + "features": ["do_not_tokenize_credit_cards"] + ] + ]) + + let cardClient = BTCardClient(apiClient: mockApiClient) + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: "1234") + card.cardholderName = "Brian Tree" + + let expectation = self.expectation(description: "Tokenize Card") + + cardClient.tokenizeCard(card) { (tokenizedCard, error) -> Void in + XCTAssertTrue(mockApiClient.lastPOSTAPIClientHTTPType! == BTAPIClientHTTPType.gateway) + + expectation.fulfill() + } + + waitForExpectations(timeout: 10, handler: nil) + } + + func testTokenization_whenCardIsUnionPayAndGraphQLEnabledForCards_usesGatewayAPI() { + let mockApiClient = MockAPIClient(authorization: "development_tokenization_key")! + mockApiClient.cannedConfigurationResponseBody = BTJSON(value: [ + "graphQL": [ + "url": "graphql://graphql", + "features": ["tokenize_credit_cards"] + ] + ]) + + let cardClient = BTCardClient(apiClient: mockApiClient) + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: "1234") + card.cardholderName = "Brian Tree" + let cardRequest = BTCardRequest(card: card) + cardRequest.enrollmentID = "enrollment-id" + cardRequest.mobileCountryCode = "1" + cardRequest.mobilePhoneNumber = "867-5309" + cardRequest.smsCode = "1234" + + let expectation = self.expectation(description: "Tokenize Card") + + cardClient.tokenizeCard(cardRequest) { (tokenizedCard, error) -> Void in + XCTAssertTrue(mockApiClient.lastPOSTAPIClientHTTPType! == BTAPIClientHTTPType.gateway) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testTokenization_whenGraphQLIsEnabledAndTokenizationIsSuccessful_returnsACardNonce() { + let mockApiClient = MockAPIClient(authorization: "development_tokenization_key")! + mockApiClient.cannedConfigurationResponseBody = BTJSON(value: [ + "graphQL": [ + "url": "graphql://graphql", + "features": ["tokenize_credit_cards"] + ] + ]) + mockApiClient.cannedResponseBody = BTJSON(value: [ + "data": [ + "tokenizeCreditCard" : [ + "token" : "a-nonce", + "creditCard" : [ + "brand" : "Visa", + "last4" : "1111", + "binData": [ + "prepaid": "Yes", + "healthcare": "Yes", + "debit": "No", + "durbinRegulated": "No", + "commercial": "Yes", + "payroll": "No", + "issuingBank": "US", + "countryOfIssuance": "Something", + "productId": "123" + ] + ] + ] + ], + "extensions": [ + ] + ]) + + let cardClient = BTCardClient(apiClient: mockApiClient) + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: "1234") + + let expectation = self.expectation(description: "Tokenize Card") + + cardClient.tokenizeCard(card) { (tokenizedCard, error) -> Void in + guard let tokenizedCard = tokenizedCard else { + XCTFail() + return + } + + XCTAssertEqual(tokenizedCard.nonce, "a-nonce") + XCTAssertEqual(tokenizedCard.localizedDescription, "ending in 11") + XCTAssertEqual(tokenizedCard.type, "Visa") + XCTAssertEqual(tokenizedCard.lastTwo!, "11") + XCTAssertEqual(tokenizedCard.cardNetwork, BTCardNetwork.visa) + XCTAssertEqual(tokenizedCard.binData.prepaid, "Yes") + XCTAssertEqual(tokenizedCard.binData.healthcare, "Yes") + XCTAssertEqual(tokenizedCard.binData.debit, "No") + XCTAssertEqual(tokenizedCard.binData.durbinRegulated, "No") + XCTAssertEqual(tokenizedCard.binData.commercial, "Yes") + XCTAssertEqual(tokenizedCard.binData.payroll, "No") + XCTAssertEqual(tokenizedCard.binData.issuingBank, "US") + XCTAssertEqual(tokenizedCard.binData.countryOfIssuance, "Something") + XCTAssertEqual(tokenizedCard.binData.productId, "123") + + expectation.fulfill() + } + + waitForExpectations(timeout: 10, handler: nil) + } + + func testAnalyticsEvent_whenTokenizationSucceedsWithGraphQL_isSent() { + let mockApiClient = MockAPIClient(authorization: "development_tokenization_key")! + mockApiClient.cannedConfigurationResponseBody = BTJSON(value: [ + "graphQL": [ + "url": "graphql://graphql", + "features": ["tokenize_credit_cards"] + ] + ]) + mockApiClient.cannedResponseBody = BTJSON(value: [ + "data": [ + "tokenizeCreditCard" : [ + "token" : "a-nonce", + "creditCard" : [ + "brand" : "Visa", + "last4" : "1111", + "binData": [ + "prepaid": "Yes", + "healthcare": "Yes", + "debit": "No", + "durbinRegulated": "No", + "commercial": "Yes", + "payroll": "No", + "issuingBank": "US", + "countryOfIssuance": "Something", + "productId": "123" + ] + ] + ] + ], + "extensions": [] + ]) + + let cardClient = BTCardClient(apiClient: mockApiClient) + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: "1234") + + let expectation = self.expectation(description: "Tokenize Card") + + cardClient.tokenizeCard(card) { _, _ -> Void in + expectation.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + + XCTAssertTrue(mockApiClient.postedAnalyticsEvents.contains("ios.card.graphql.tokenization.success")) + } + + func testAnalyticsEvent_whenTokenizationFailsWithGraphQL_isSent() { + let mockAPIClient = MockAPIClient(authorization: "development_tokenization_key")! + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "graphQL": [ + "url": "graphql://graphql", + "features": ["tokenize_credit_cards"] + ] + ]) + let stubJSONResponse = BTJSON(value: [ + "error" : [ + "message" : "Credit card is invalid" + ], + "fieldErrors" : [ + [ + "field" : "creditCard", + "fieldErrors" : [ + [ + "field" : "number", + "message" : "Credit card number must be 12-19 digits", + "code" : "81716" + ] + ] + ] + ] + ]) + let stubError = NSError(domain: BTHTTPErrorDomain, code: BTHTTPErrorCode.clientError.rawValue, userInfo: [ + BTHTTPURLResponseKey: HTTPURLResponse(url: URL(string: "http://fake")!, statusCode: 422, httpVersion: nil, headerFields: nil)!, + BTHTTPJSONResponseBodyKey: stubJSONResponse + ]) + mockAPIClient.cannedResponseError = stubError + let cardClient = BTCardClient(apiClient: mockAPIClient) + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: nil) + + let expectation = self.expectation(description: "Tokenized card") + cardClient.tokenizeCard(card) { _, _ -> Void in + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + + XCTAssertTrue(mockAPIClient.postedAnalyticsEvents.contains("ios.card.graphql.tokenization.failure")) + } +} + +// MARK: - Helpers + +class FakeHTTP : BTHTTP { + struct Request { + let endpoint : String + let method : String + let parameters : [AnyHashable: Any] + } + + static let fakeNonce = "fake-nonce" + var lastRequest : Request? + + class func fakeHTTP() -> FakeHTTP { + return FakeHTTP(baseURL: URL(string: "fake://fake")!, authorizationFingerprint: "") + } + + override func post(_ path: String, parameters: [AnyHashable : Any]?, completion completionBlock: ((BTJSON?, HTTPURLResponse?, Error?) -> Void)? = nil) { + self.lastRequest = Request(endpoint: path, method: "POST", parameters: parameters!) + + let response = HTTPURLResponse(url: URL(string: path)!, statusCode: 202, httpVersion: nil, headerFields: nil)! + + guard let completionBlock = completionBlock else { + return + } + completionBlock(BTJSON(value: [ + "creditCards": [ + [ + "nonce": FakeHTTP.fakeNonce, + "description": "Visa ending in 11", + "details": [ + "lastTwo" : "11", + "cardType": "visa"] ] ] ]), response, nil) + } +} + +class ErrorHTTP : BTHTTP { + static let error = NSError(domain: "TestErrorDomain", code: 1, userInfo: nil) + + class func fakeHTTP() -> ErrorHTTP { + let fakeURL = URL(string: "fake://fake") + return ErrorHTTP(baseURL: fakeURL!, authorizationFingerprint: "") + } + + override func get(_ path: String, parameters: [String : String]?, completion completionBlock: ((BTJSON?, HTTPURLResponse?, Error?) -> Void)? = nil) { + guard let completionBlock = completionBlock else { + return + } + completionBlock(nil, nil, ErrorHTTP.error) + } + + override func post(_ path: String, parameters: [AnyHashable : Any]?, completion completionBlock: ((BTJSON?, HTTPURLResponse?, Error?) -> Void)? = nil) { + guard let completionBlock = completionBlock else { + return + } + completionBlock(nil, nil, ErrorHTTP.error) + } +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTCardClient_UnionPayTests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTCardClient_UnionPayTests.swift new file mode 100644 index 0000000..02b04c8 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTCardClient_UnionPayTests.swift @@ -0,0 +1,578 @@ +import XCTest +import BraintreeUnionPay + +class BTCardClient_UnionPayTests: XCTestCase { + + var apiClient: BTAPIClient! + + override func setUp() { + super.setUp() + apiClient = clientWithUnionPayEnabled(true) + } + + // MARK: - Fetch capabilities + + func testFetchCapabilities_whenConfigurationFetchFails_returnsError() { + let stubConfigurationHTTP = BTFakeHTTP()! + stubConfigurationHTTP.cannedError = NSError(domain: "FakeDomain", code: 2, userInfo: nil) + apiClient.configurationHTTP = stubConfigurationHTTP + let cardClient = BTCardClient(apiClient: apiClient) + let cardNumber = "411111111111111" + + let expectation = self.expectation(description: "Callback invoked") + cardClient.fetchCapabilities(cardNumber) { (cardNonce, error) -> Void in + guard let error = error else { + XCTFail() + return + } + + XCTAssertNil(cardNonce) + XCTAssertEqual(error as NSError, stubConfigurationHTTP.cannedError! as NSError) + expectation.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + } + + func testFetchCapabilities_whenCallToCapabilitiesEndpointReturnsError_sendsAnalyticsEvent() { + let mockAPIClient = MockAPIClient(authorization: BTValidTestClientToken)! + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: ["unionPay": ["enabled": true]]) + mockAPIClient.cannedResponseError = NSError(domain: "FakeError", code: 0, userInfo: nil) + let cardClient = BTCardClient(apiClient: mockAPIClient) + let cardNumber = "411111111111111" + + let expectation = self.expectation(description: "Callback invoked") + cardClient.fetchCapabilities(cardNumber) { (_, _) -> Void in + XCTAssertEqual(mockAPIClient.postedAnalyticsEvents.last!, "ios.custom.unionpay.capabilities-failed") + expectation.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + } + + func testFetchCapabilities_whenUnionPayIsNotEnabledForMerchant_returnsError() { + apiClient = clientWithUnionPayEnabled(false) + let cardClient = BTCardClient(apiClient: apiClient) + let cardNumber = "411111111111111" + + let expectation = self.expectation(description: "Callback invoked") + cardClient.fetchCapabilities(cardNumber) { (cardNonce, error) -> Void in + XCTAssertNil(cardNonce) + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTCardClientErrorDomain) + XCTAssertEqual(error.code, BTCardClientErrorType.paymentOptionNotEnabled.rawValue) + XCTAssertEqual(error.localizedDescription, "UnionPay is not enabled for this merchant") + expectation.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + } + + func testFetchCapabilities_whenUnionPayIsEnabledForMerchant_sendsGETRequestToCapabilitiesEndpointWithExpectedPayload() { + let mockHTTP = BTFakeHTTP()! + apiClient.http = mockHTTP + let cardClient = BTCardClient(apiClient: apiClient) + let cardNumber = "411111111111111" + + let expectation = self.expectation(description: "Callback invoked") + cardClient.fetchCapabilities(cardNumber) { (_, _) -> Void in + expectation.fulfill() + } + waitForExpectations(timeout: 1, handler: nil) + + XCTAssertEqual(mockHTTP.lastRequestMethod, "GET") + XCTAssertEqual(mockHTTP.lastRequestEndpoint, "v1/payment_methods/credit_cards/capabilities") + guard let lastRequestParameters = mockHTTP.lastRequestParameters else { + XCTFail() + return + } + guard let cardNumberInPayload = lastRequestParameters["credit_card[number]"] as? String else { + XCTFail() + return + } + XCTAssertEqual(cardNumberInPayload, cardNumber) + } + + func testFetchCapabilities_whenSuccessful_parsesCardCapabilitiesFromJSONResponse() { + let stubHTTP = BTFakeHTTP()! + stubHTTP.stubRequest("GET", toEndpoint: "v1/payment_methods/credit_cards/capabilities", respondWith: [ + "isUnionPay": true, + "isDebit": false, + "unionPay": [ + "supportsTwoStepAuthAndCapture": true, + "isSupported": true + ] + ], statusCode: 201) + apiClient.http = stubHTTP + let cardClient = BTCardClient(apiClient: apiClient) + let cardNumber = "411111111111111" + + let expectation = self.expectation(description: "Callback invoked") + cardClient.fetchCapabilities(cardNumber) { (cardCapabilities, error) -> Void in + guard let cardCapabilities = cardCapabilities else { + XCTFail("Expected union pay capabilities") + return + } + + XCTAssertNil(error) + XCTAssertEqual(true, cardCapabilities.isUnionPay) + XCTAssertEqual(false, cardCapabilities.isDebit) + XCTAssertEqual(true, cardCapabilities.supportsTwoStepAuthAndCapture) + XCTAssertEqual(true, cardCapabilities.isSupported) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testFetchCapabilities_whenSuccessful_sendsAnalyticsEvent() { + let mockAPIClient = MockAPIClient(authorization: BTValidTestClientToken)! + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: ["unionPay": ["enabled": true]]) + mockAPIClient.cannedResponseBody = BTJSON(value:[ + "isUnionPay": true, + "isDebit": false, + "unionPay": [ + "supportsTwoStepAuthAndCapture": true, + "isSupported": true + ] + ]) + let cardClient = BTCardClient(apiClient: mockAPIClient) + let cardNumber = "411111111111111" + + let expectation = self.expectation(description: "Callback invoked") + cardClient.fetchCapabilities(cardNumber) { (cardCapabilities, error) -> Void in + XCTAssertEqual(mockAPIClient.postedAnalyticsEvents.last!, "ios.custom.unionpay.capabilities-received") + expectation.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + } + + func testFetchCapabilities_whenFailure_returnsError() { + let stubHTTP = BTFakeHTTP()! + let stubbedError = NSError(domain: "FakeError", code: 1, userInfo: nil) + stubHTTP.stubRequest("GET", toEndpoint: "v1/credit_cards/capabilities", respondWithError: stubbedError) + apiClient.http = stubHTTP + let cardClient = BTCardClient(apiClient: apiClient) + let cardNumber = "411111111111111" + + let expectation = self.expectation(description: "Callback invoked") + cardClient.fetchCapabilities(cardNumber) { (cardCapabilities, error) -> Void in + XCTAssertNil(cardCapabilities) + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, stubbedError.domain) + XCTAssertEqual(error.code, stubbedError.code) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + // MARK: - Enrollment + + func testEnroll_whenConfigurationFetchFails_returnsError() { + let stubConfigurationHTTP = BTFakeHTTP()! + stubConfigurationHTTP.cannedError = NSError(domain: "FakeDomain", code: 2, userInfo: nil) + apiClient.configurationHTTP = stubConfigurationHTTP + let cardClient = BTCardClient(apiClient: apiClient) + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: "123") + let request = BTCardRequest(card: card) + request.mobileCountryCode = "123" + request.mobilePhoneNumber = "321" + + let expectation = self.expectation(description: "Callback invoked") + cardClient.enrollCard(request) { (enrollmentID, smsCodeRequired, error) -> Void in + guard let error = error else { + XCTFail() + return + } + + XCTAssertNil(enrollmentID) + XCTAssertEqual(error as NSError, stubConfigurationHTTP.cannedError! as NSError) + expectation.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + } + + func testEnrollment_whenUnionPayIsNotEnabledForMerchant_returnsError() { + apiClient = clientWithUnionPayEnabled(false) + let cardClient = BTCardClient(apiClient: apiClient) + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: "123") + let request = BTCardRequest(card: card) + request.mobileCountryCode = "123" + request.mobilePhoneNumber = "321" + + let expectation = self.expectation(description: "Callback invoked") + cardClient.enrollCard(request) { (enrollmentID, smsCodeRequired, error) -> Void in + XCTAssertNil(enrollmentID) + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTCardClientErrorDomain) + XCTAssertEqual(error.code, BTCardClientErrorType.paymentOptionNotEnabled.rawValue) + XCTAssertEqual(error.localizedDescription, "UnionPay is not enabled for this merchant") + expectation.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + } + + func testEnrollment_whenUnionPayIsEnabledForMerchant_sendsPOSTRequestToEnrollmentEndpointWithExpectedPayload() { + let mockHTTP = BTFakeHTTP()! + apiClient.http = mockHTTP + let cardClient = BTCardClient(apiClient: apiClient) + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: "123") + let request = BTCardRequest(card: card) + request.mobileCountryCode = "123" + request.mobilePhoneNumber = "321" + + let expectation = self.expectation(description: "Callback invoked") + cardClient.enrollCard(request) { _,_,_ -> Void in + expectation.fulfill() + } + waitForExpectations(timeout: 1, handler: nil) + + XCTAssertEqual(mockHTTP.lastRequestMethod, "POST") + XCTAssertEqual(mockHTTP.lastRequestEndpoint, "v1/union_pay_enrollments") + guard let parameters = mockHTTP.lastRequestParameters as? [String:AnyObject] else { + XCTFail() + return + } + guard let enrollment = parameters["union_pay_enrollment"] as? [String:AnyObject] else { + XCTFail() + return + } + + XCTAssertEqual(enrollment["number"] as? String, card.number!) + XCTAssertEqual(enrollment["expiration_month"] as? String, card.expirationMonth!) + XCTAssertEqual(enrollment["expiration_year"] as? String, card.expirationYear!) + XCTAssertEqual(enrollment["mobile_country_code"] as? String, request.mobileCountryCode!) + XCTAssertEqual(enrollment["mobile_number"] as? String, request.mobilePhoneNumber!) + } + + func testEnrollmentPayload_doesNotContainCVV() { + let mockHTTP = BTFakeHTTP()! + apiClient.http = mockHTTP + let cardClient = BTCardClient(apiClient: apiClient) + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: "123") + let request = BTCardRequest(card: card) + request.mobileCountryCode = "123" + request.mobilePhoneNumber = "321" + + let expectation = self.expectation(description: "Callback invoked") + cardClient.enrollCard(request) { _,_,_ -> Void in + expectation.fulfill() + } + waitForExpectations(timeout: 1, handler: nil) + + guard let parameters = mockHTTP.lastRequestParameters as? [String:AnyObject] else { + XCTFail() + return + } + guard let enrollment = parameters["union_pay_enrollment"] as? [String:AnyObject] else { + XCTFail() + return + } + + XCTAssertNil(enrollment["cvv"] as? String) + } + + func testEnrollCard_whenSuccessful_returnsEnrollmentIDAndSmsCodeRequiredFromJSONResponse() { + let stubHTTP = BTFakeHTTP()! + stubHTTP.stubRequest("POST", toEndpoint: "v1/union_pay_enrollments", respondWith: [ + "unionPayEnrollmentId": "fake-enrollment-id", + "smsCodeRequired": true + ], statusCode: 201) + apiClient.http = stubHTTP + let cardClient = BTCardClient(apiClient: apiClient) + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: nil) + let request = BTCardRequest(card: card) + + let expectation = self.expectation(description: "Callback invoked") + cardClient.enrollCard(request) { (enrollmentID, smsCodeRequired, error) -> Void in + guard let enrollmentID = enrollmentID else { + XCTFail("Expected UnionPay enrollment") + return + } + XCTAssertNil(error) + XCTAssertEqual(enrollmentID, "fake-enrollment-id") + XCTAssertTrue(smsCodeRequired) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testEnrollCard_when422Failure_returnsValidationError() { + let stubHTTP = BTFakeHTTP()! + let stubbed422HTTPResponse = HTTPURLResponse(url: URL(string: "someendpoint")!, statusCode: 422, httpVersion: nil, headerFields: nil)! + let stubbed422ResponseBody = BTJSON(value: ["some": "thing"]) + let stubbedError = NSError(domain: BTHTTPErrorDomain, code: BTHTTPErrorCode.clientError.rawValue, userInfo: [ + BTHTTPURLResponseKey: stubbed422HTTPResponse, + BTHTTPJSONResponseBodyKey: stubbed422ResponseBody]) + stubHTTP.stubRequest("POST", toEndpoint: "v1/union_pay_enrollments", respondWithError:stubbedError) + apiClient.http = stubHTTP + let cardClient = BTCardClient(apiClient: apiClient) + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: nil) + let request = BTCardRequest(card: card) + + let expectation = self.expectation(description: "Callback invoked") + cardClient.enrollCard(request) { (enrollmentID, smsCodeRequired, error) -> Void in + XCTAssertNil(enrollmentID) + XCTAssertFalse(smsCodeRequired) + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTCardClientErrorDomain) + XCTAssertEqual(error.code, BTCardClientErrorType.customerInputInvalid.rawValue) + + guard let inputErrors = (error._userInfo as! NSDictionary)[BTCustomerInputBraintreeValidationErrorsKey] as? NSDictionary else { + XCTFail("Expected error userInfo to contain validation errors") + return + } + XCTAssertEqual(inputErrors["some"] as! String, "thing") + + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testEnrollCard_onError_invokesCallbackOnMainThread() { + let stubHTTP = BTFakeHTTP()! + stubHTTP.stubRequest("POST", toEndpoint: "v1/union_pay_enrollments", respondWithError: NSError(domain: "CannedError", code: 0, userInfo: nil)) + apiClient.http = stubHTTP + let cardClient = BTCardClient(apiClient: apiClient) + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: nil) + let request = BTCardRequest(card: card) + + let expectation = self.expectation(description: "Callback invoked") + cardClient.enrollCard(request) { _,_,_ -> Void in + XCTAssertTrue(Thread.isMainThread) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testEnrollCard_whenEnrollmentEndpointReturnsError_sendsAnalyticsEvent() { + let mockAPIClient = MockAPIClient(authorization: BTValidTestClientToken)! + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: ["unionPay": ["enabled": true]]) + mockAPIClient.cannedResponseError = NSError(domain: "FakeError", code: 0, userInfo: nil) + let cardClient = BTCardClient(apiClient: mockAPIClient) + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: nil) + let request = BTCardRequest(card: card) + + let expectation = self.expectation(description: "Callback invoked") + cardClient.enrollCard(request) { _,_,_ -> Void in + XCTAssertEqual(mockAPIClient.postedAnalyticsEvents.last!, "ios.custom.unionpay.enrollment-failed") + expectation.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + } + + func testEnrollCard_onSuccess_invokesCallbackOnMainThread() { + let stubHTTP = BTFakeHTTP()! + stubHTTP.stubRequest("POST", toEndpoint: "v1/union_pay_enrollments", respondWith: [ + "unionPayEnrollmentId": "fake-enrollment-id" + ], statusCode: 201) + apiClient.http = stubHTTP + let cardClient = BTCardClient(apiClient: apiClient) + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: nil) + let request = BTCardRequest(card: card) + + let expectation = self.expectation(description: "Callback invoked") + cardClient.enrollCard(request) { _,_,_ -> Void in + XCTAssertTrue(Thread.isMainThread) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testEnrollCard_onSuccess_sendsAnalyticsEvent() { + let mockAPIClient = MockAPIClient(authorization: BTValidTestClientToken)! + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: ["unionPay": ["enabled": true]]) + mockAPIClient.cannedResponseBody = BTJSON(value: [ + "unionPayEnrollmentId": "fake-enrollment-id", + "smsCodeRequired": true + ]) + let cardClient = BTCardClient(apiClient: mockAPIClient) + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: nil) + let request = BTCardRequest(card: card) + + let expectation = self.expectation(description: "Callback invoked") + cardClient.enrollCard(request) { _,_,_ -> Void in + XCTAssertEqual(mockAPIClient.postedAnalyticsEvents.last!, "ios.custom.unionpay.enrollment-succeeded") + expectation.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + } + + func testEnrollCard_whenOtherFailure_returnsError() { + let stubHTTP = BTFakeHTTP()! + let stubbedError = NSError(domain: "FakeError", code: 1, userInfo: nil) + stubHTTP.stubRequest("POST", toEndpoint: "v1/union_pay_enrollments", respondWithError:stubbedError) + apiClient.http = stubHTTP + let cardClient = BTCardClient(apiClient: apiClient) + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: nil) + let request = BTCardRequest(card: card) + + let expectation = self.expectation(description: "Callback invoked") + cardClient.enrollCard(request) { (enrollmentID, smsCodeRequired, error) -> Void in + XCTAssertNil(enrollmentID) + XCTAssertFalse(smsCodeRequired) + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, "FakeError") + XCTAssertEqual(error.code, 1) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + // MARK: - Tokenization + + func testTokenization_POSTsToTokenizationEndpoint() { + let mockHTTP = BTFakeHTTP()! + apiClient.http = mockHTTP + let cardClient = BTCardClient(apiClient: apiClient) + let request = BTCardRequest() + request.card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: "123") + request.smsCode = "12345" + // This is an internal-only property, but we want to verify that it gets sent when hitting the tokenization endpoint + request.enrollmentID = "enrollment-id" + + let expectation = self.expectation(description: "Callback invoked") + cardClient.tokenizeCard(request, options: nil) { (_, _) -> Void in + expectation.fulfill() + } + waitForExpectations(timeout: 1, handler: nil) + + XCTAssertEqual(mockHTTP.lastRequestMethod, "POST") + XCTAssertEqual(mockHTTP.lastRequestEndpoint, "v1/payment_methods/credit_cards") + if let parameters = mockHTTP.lastRequestParameters as? [String: AnyObject] { + guard let cardParameters = parameters["credit_card"] as? [String: AnyObject] else { + XCTFail("Card should be in parameters") + return + } + XCTAssertEqual(cardParameters["number"] as? String, "4111111111111111") + XCTAssertEqual(cardParameters["expiration_date"] as? String, "12/2038") + XCTAssertEqual(cardParameters["cvv"] as? String, "123") + + guard let tokenizationOptionsParameters = cardParameters["options"] as? [String: AnyObject] else { + XCTFail("Tokenization options should be present") + return + } + + guard let unionPayEnrollmentParameters = tokenizationOptionsParameters["union_pay_enrollment"] as? [String: AnyObject] else { + XCTFail("UnionPay enrollment should be present") + return + } + + XCTAssertEqual(unionPayEnrollmentParameters["sms_code"] as? String, "12345") + XCTAssertEqual(unionPayEnrollmentParameters["id"] as? String, "enrollment-id") + } else { + XCTFail() + } + } + + func testTokenization_withEnrollmentIDAndNoSMSCode_sendsUnionPayEnrollment() { + let mockHTTP = BTFakeHTTP()! + apiClient.http = mockHTTP + let cardClient = BTCardClient(apiClient: apiClient) + let request = BTCardRequest() + request.card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: "123") + // This is an internal-only property, but we want to verify that it gets sent when hitting the tokenization endpoint + request.enrollmentID = "enrollment-id" + + let expectation = self.expectation(description: "Callback invoked") + cardClient.tokenizeCard(request, options: nil) { (_, _) -> Void in + expectation.fulfill() + } + waitForExpectations(timeout: 1, handler: nil) + + XCTAssertEqual(mockHTTP.lastRequestMethod, "POST") + XCTAssertEqual(mockHTTP.lastRequestEndpoint, "v1/payment_methods/credit_cards") + if let parameters = mockHTTP.lastRequestParameters as? [String: AnyObject] { + guard let cardParameters = parameters["credit_card"] as? [String: AnyObject] else { + XCTFail("Card should be in parameters") + return + } + XCTAssertEqual(cardParameters["number"] as? String, "4111111111111111") + XCTAssertEqual(cardParameters["expiration_date"] as? String, "12/2038") + XCTAssertEqual(cardParameters["cvv"] as? String, "123") + + guard let tokenizationOptionsParameters = cardParameters["options"] as? [String: AnyObject] else { + XCTFail("Tokenization options should be present") + return + } + + guard let unionPayEnrollmentParameters = tokenizationOptionsParameters["union_pay_enrollment"] as? [String: AnyObject] else { + XCTFail("UnionPay enrollment should be present") + return + } + + XCTAssertNil(unionPayEnrollmentParameters["sms_code"]) + XCTAssertEqual(unionPayEnrollmentParameters["id"] as? String, "enrollment-id") + } else { + XCTFail() + } + } + + func testTokenization_whenTokenizingUnionPayEnrolledCardSucceeds_sendsAnalyticsEvent() { + let mockAPIClient = MockAPIClient(authorization: BTValidTestClientToken)! + mockAPIClient.cannedResponseBody = BTJSON(value: [ + "creditCards": [ + [ + "nonce": "fake-nonce", + "description": "UnionPay ending in 11", + "details": [ + "lastTwo" : "11", + "cardType": "unionpay"] ] ] ] ) + let cardClient = BTCardClient(apiClient: mockAPIClient) + let request = BTCardRequest() + request.card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: "123") + request.smsCode = "12345" + request.enrollmentID = "enrollment-id" + + let expectation = self.expectation(description: "Callback invoked") + cardClient.tokenizeCard(request, options: nil) { (_, _) -> Void in + XCTAssertEqual(mockAPIClient.postedAnalyticsEvents.last!, "ios.custom.unionpay.nonce-received") + expectation.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + } + + func testTokenization_whenTokenizingUnionPayEnrolledCardFails_sendsAnalyticsEvent() { + let mockAPIClient = MockAPIClient(authorization: BTValidTestClientToken)! + mockAPIClient.cannedResponseError = NSError(domain: "FakeError", code: 0, userInfo: nil) + let cardClient = BTCardClient(apiClient: mockAPIClient) + let request = BTCardRequest() + request.card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: "123") + request.smsCode = "12345" + request.enrollmentID = "enrollment-id" + + let expectation = self.expectation(description: "Callback invoked") + cardClient.tokenizeCard(request, options: nil) { (_, _) -> Void in + XCTAssertEqual(mockAPIClient.postedAnalyticsEvents.last!, "ios.custom.unionpay.nonce-failed") + expectation.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + } + + // MARK: - Helpers + + func clientWithUnionPayEnabled(_ unionPayEnabled: Bool) -> BTAPIClient { + let apiClient = BTAPIClient(authorization: BTValidTestClientToken, sendAnalyticsEvent: false)! + let stubbedConfigurationHTTP = BTFakeHTTP()! + stubbedConfigurationHTTP.cannedConfiguration = BTJSON(value: ["unionPay": [ + "enabled": unionPayEnabled + ] ]) + stubbedConfigurationHTTP.cannedStatusCode = 200 + apiClient.configurationHTTP = stubbedConfigurationHTTP + return apiClient + } + +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTCardNonce_Tests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTCardNonce_Tests.swift new file mode 100644 index 0000000..be93760 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTCardNonce_Tests.swift @@ -0,0 +1,326 @@ +import XCTest + +class BTCardNonce_Tests: XCTestCase { + + override func setUp() { + super.setUp() + } + + func testCardNonceWithJSON_createsCardWithExpectedValues() { + let cardNonce = BTCardNonce(json: BTJSON(value: [ + "description": "Visa ending in 11", + "details": [ + "cardType": "Visa", + "lastTwo": "11", + ], + "binData": [ + "prepaid": "Yes", + "healthcare": "Yes", + "debit": "No", + "durbinRegulated": "No", + "commercial": "Yes", + "payroll": "No", + "issuingBank": "US", + "countryOfIssuance": "Something", + "productId": "123" + ], + "nonce": "fake-nonce", + "threeDSecureInfo": [ + "liabilityShifted": true, + "liabilityShiftPossible": true + ] + ])) + + XCTAssertNotNil(cardNonce.threeDSecureInfo) + XCTAssertTrue(cardNonce.threeDSecureInfo.liabilityShiftPossible) + XCTAssertTrue(cardNonce.threeDSecureInfo.liabilityShifted) + XCTAssertTrue(cardNonce.threeDSecureInfo.wasVerified) + XCTAssertEqual(cardNonce.localizedDescription, "Visa ending in 11") + XCTAssertEqual(cardNonce.cardNetwork, BTCardNetwork.visa) + XCTAssertEqual(cardNonce.lastTwo, "11") + XCTAssertEqual(cardNonce.nonce, "fake-nonce") + XCTAssertEqual(cardNonce.type, "Visa") + XCTAssertEqual(cardNonce.binData.prepaid, "Yes") + XCTAssertEqual(cardNonce.binData.healthcare, "Yes") + XCTAssertEqual(cardNonce.binData.debit, "No") + XCTAssertEqual(cardNonce.binData.durbinRegulated, "No") + XCTAssertEqual(cardNonce.binData.commercial, "Yes") + XCTAssertEqual(cardNonce.binData.payroll, "No") + XCTAssertEqual(cardNonce.binData.issuingBank, "US") + XCTAssertEqual(cardNonce.binData.countryOfIssuance, "Something") + XCTAssertEqual(cardNonce.binData.productId, "123") + } + + func testCardWithJSON_createsCard_withoutThreeDSecureInfo() { + let cardNonce = BTCardNonce(json: BTJSON(value: [ + "description": "Visa ending in 11", + "details": [ + "cardType": "Visa", + "lastTwo": "11", + ], + "binData": [ + "prepaid": "Yes", + "healthcare": "Yes", + "debit": "No", + "durbinRegulated": "No", + "commercial": "Yes", + "payroll": "No", + "issuingBank": "US", + "countryOfIssuance": "Something", + "productId": "123" + ], + "nonce": "fake-nonce", + ])) + + XCTAssertNotNil(cardNonce.threeDSecureInfo) + XCTAssertFalse(cardNonce.threeDSecureInfo.liabilityShiftPossible) + XCTAssertFalse(cardNonce.threeDSecureInfo.liabilityShifted) + XCTAssertFalse(cardNonce.threeDSecureInfo.wasVerified) + XCTAssertEqual(cardNonce.localizedDescription, "Visa ending in 11") + XCTAssertEqual(cardNonce.cardNetwork, BTCardNetwork.visa) + XCTAssertEqual(cardNonce.lastTwo, "11") + XCTAssertEqual(cardNonce.nonce, "fake-nonce") + XCTAssertEqual(cardNonce.type, "Visa") + XCTAssertEqual(cardNonce.binData.prepaid, "Yes") + XCTAssertEqual(cardNonce.binData.healthcare, "Yes") + XCTAssertEqual(cardNonce.binData.debit, "No") + XCTAssertEqual(cardNonce.binData.durbinRegulated, "No") + XCTAssertEqual(cardNonce.binData.commercial, "Yes") + XCTAssertEqual(cardNonce.binData.payroll, "No") + XCTAssertEqual(cardNonce.binData.issuingBank, "US") + XCTAssertEqual(cardNonce.binData.countryOfIssuance, "Something") + XCTAssertEqual(cardNonce.binData.productId, "123") + } + + func testCardNonceWithJSON_ignoresCaseWhenParsingCardType() { + let cardNonce = BTCardNonce(json: BTJSON(value: [ + "description": "Visa ending in 11", + "details": [ + "cardType": "vIsA", + "lastTwo": "11", + ], + "nonce": "fake-nonce", + ])) + + XCTAssertEqual(cardNonce.localizedDescription, "Visa ending in 11") + XCTAssertEqual(cardNonce.cardNetwork, BTCardNetwork.visa) + XCTAssertEqual(cardNonce.lastTwo, "11") + XCTAssertEqual(cardNonce.nonce, "fake-nonce") + XCTAssertEqual(cardNonce.type, "Visa") + } + + func testCardNonceWithJSON_parsesAllCardTypesCorrectly() { + let cardNetworks = [ + BTCardNetwork.unknown, + BTCardNetwork.AMEX, + BTCardNetwork.dinersClub, + BTCardNetwork.discover, + BTCardNetwork.maestro, + BTCardNetwork.masterCard, + BTCardNetwork.JCB, + BTCardNetwork.laser, + BTCardNetwork.solo, + BTCardNetwork.switch, + BTCardNetwork.unionPay, + BTCardNetwork.hiper, + BTCardNetwork.hipercard, + BTCardNetwork.ukMaestro, + BTCardNetwork.visa, + ] + let cardTypeJSONValues = [ + "some unrecognized type", + "american express", + "diners club", + "discover", + "maestro", + "mastercard", + "jcb", + "laser", + "solo", + "switch", + "unionpay", + "hiper", + "hipercard", + "uk maestro", + "visa", + ] + let cardTypes = [ + "Unknown", + "AMEX", + "DinersClub", + "Discover", + "Maestro", + "MasterCard", + "JCB", + "Laser", + "Solo", + "Switch", + "UnionPay", + "Hiper", + "Hipercard", + "UKMaestro", + "Visa", + ] + for i in 0.. +#import "BTCard_Internal.h" + +// See also BTCard_Tests +@interface BTCard_Internal_Tests : XCTestCase + +@end + +@implementation BTCard_Internal_Tests + +- (void)testParameters_standardProperties { + BTCard *card = [[BTCard alloc] initWithNumber:@"4111111111111111" + expirationMonth:@"12" + expirationYear:@"2038" + cvv:@"123"]; + BTJSON *parameters = [[BTJSON alloc] initWithValue:card.parameters]; + XCTAssertEqualObjects([parameters[@"number"] asString], @"4111111111111111"); + XCTAssertEqualObjects([parameters[@"expiration_date"] asString], @"12/2038"); + XCTAssertEqualObjects([parameters[@"cvv"] asString], @"123"); + XCTAssertTrue([parameters[@"options"][@"validate"] isFalse]); +} + +- (void)testParameters_whenShouldValidateIsTrue_encodesParametersCorrectly { + BTCard *card = [[BTCard alloc] init]; + card.shouldValidate = YES; + BTJSON *parameters = [[BTJSON alloc] initWithValue:card.parameters]; + XCTAssertTrue([parameters[@"options"][@"validate"] isTrue]); +} + +- (void)testParameters_whenShouldValidateIsTrueInParameters_encodesParametersCorrectly { + BTCard *card = [[BTCard alloc] initWithParameters:@{@"options": @{@"validate": @YES}}]; + BTJSON *parameters = [[BTJSON alloc] initWithValue:card.parameters]; + XCTAssertTrue([parameters[@"options"][@"validate"] isTrue]); +} + +- (void)testParameters_encodesAllParametersIncludingAdditionalParameters { + BTCard *card = + [[BTCard alloc] initWithParameters:@{}]; + + card.number = @"4111111111111111"; + card.expirationMonth = @"12"; + card.expirationYear = @"2038"; + card.postalCode = @"40404"; + card.company = @"Company"; + card.streetAddress = @"724 Evergreen Terrace"; + card.extendedAddress = @"Unit 1"; + card.locality = @"some locality"; + card.region = @"some region"; + card.countryName = @"some country name"; + card.countryCodeAlpha2 = @"US"; + card.countryCodeAlpha3 = @"USA"; + card.countryCodeNumeric = @"840"; + + BTJSON *parameters = [[BTJSON alloc] initWithValue:card.parameters]; + XCTAssertEqualObjects([parameters[@"number"] asString], @"4111111111111111"); + XCTAssertEqualObjects([parameters[@"expiration_date"] asString], @"12/2038"); + XCTAssertEqualObjects([parameters[@"billing_address"][@"postal_code"] asString], @"40404"); + XCTAssertEqualObjects([parameters[@"billing_address"][@"company"] asString], @"Company"); + XCTAssertEqualObjects([parameters[@"billing_address"][@"street_address"] asString], @"724 Evergreen Terrace"); + XCTAssertEqualObjects([parameters[@"billing_address"][@"extended_address"] asString], @"Unit 1"); + XCTAssertEqualObjects([parameters[@"billing_address"][@"locality"] asString], @"some locality"); + XCTAssertEqualObjects([parameters[@"billing_address"][@"region"] asString], @"some region"); + XCTAssertEqualObjects([parameters[@"billing_address"][@"country_name"] asString], @"some country name"); + XCTAssertEqualObjects([parameters[@"billing_address"][@"country_code_alpha2"] asString], @"US"); + XCTAssertEqualObjects([parameters[@"billing_address"][@"country_code_alpha3"] asString], @"USA"); + XCTAssertEqualObjects([parameters[@"billing_address"][@"country_code_numeric"] asString], @"840"); +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTCard_Tests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTCard_Tests.swift new file mode 100644 index 0000000..8c3e866 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTCard_Tests.swift @@ -0,0 +1,293 @@ +import XCTest + +// See also BTCard_Internal_Tests +class BTCard_Tests: XCTestCase { + + func testInitialization_savesStandardProperties() { + let card = BTCard(number: "4111111111111111", expirationMonth:"12", expirationYear:"2038", cvv: "123") + + XCTAssertEqual(card.number!, "4111111111111111") + XCTAssertEqual(card.expirationMonth!, "12") + XCTAssertEqual(card.expirationYear!, "2038") + XCTAssertNil(card.postalCode) + XCTAssertEqual(card.cvv!, "123") + } + + func testInitialization_acceptsNilCvv() { + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2038", cvv: nil) + XCTAssertNil(card.cvv) + } + + func testInitialization_withoutParameters() { + let card = BTCard() + + card.number = "4111111111111111" + card.expirationMonth = "12" + card.expirationYear = "2038" + card.cvv = "123" + + XCTAssertEqual(card.number!, "4111111111111111") + XCTAssertEqual(card.expirationMonth!, "12") + XCTAssertEqual(card.expirationYear!, "2038") + XCTAssertNil(card.postalCode) + XCTAssertEqual(card.cvv!, "123") + } + + func testInitWithParameters_withAllValuesPresent_setsAllProperties() { + let card = BTCard(parameters: [ + "number": "4111111111111111", + "expiration_date": "12/20", + "cvv": "123", + "billing_address": [ + "first_name": "Joe", + "last_name": "Smith", + "company": "Company", + "street_address": "123 Townsend St", + "extended_address": "Unit 1", + "locality": "San Francisco", + "region": "CA", + "country_name": "United States of America", + "country_code_alpha2": "US", + "country_code_alpha3": "USA", + "country_code_numeric": "840", + "postal_code": "94107" + ], + "options": ["validate": true], + "cardholder_name": "Brian Tree" + ]) + + XCTAssertEqual(card.number, "4111111111111111") + XCTAssertEqual(card.expirationMonth, "12") + XCTAssertEqual(card.expirationYear, "20") + XCTAssertEqual(card.postalCode, "94107") + XCTAssertEqual(card.cvv, "123") + XCTAssertTrue(card.shouldValidate) + XCTAssertEqual(card.cardholderName, "Brian Tree") + XCTAssertEqual(card.firstName, "Joe") + XCTAssertEqual(card.lastName, "Smith") + XCTAssertEqual(card.company, "Company") + XCTAssertEqual(card.streetAddress, "123 Townsend St") + XCTAssertEqual(card.extendedAddress, "Unit 1") + XCTAssertEqual(card.locality, "San Francisco") + XCTAssertEqual(card.region, "CA") + XCTAssertEqual(card.countryName, "United States of America") + XCTAssertEqual(card.countryCodeAlpha2, "US") + XCTAssertEqual(card.countryCodeAlpha3, "USA") + XCTAssertEqual(card.countryCodeNumeric, "840") + XCTAssertEqual(card.postalCode, "94107") + } + + func testInitWithParameters_withEmptyParameters_setsPropertiesToExpectedValues() { + let card = BTCard(parameters: [:]) + + XCTAssertNil(card.number) + XCTAssertNil(card.expirationMonth) + XCTAssertNil(card.expirationYear) + XCTAssertNil(card.postalCode) + XCTAssertNil(card.cvv) + XCTAssertNil(card.cardholderName) + XCTAssertFalse(card.shouldValidate) + XCTAssertNil(card.streetAddress) + XCTAssertNil(card.locality) + XCTAssertNil(card.region) + XCTAssertNil(card.countryName) + XCTAssertNil(card.countryCodeAlpha2) + XCTAssertNil(card.countryCodeAlpha3) + XCTAssertNil(card.countryCodeNumeric) + } + + func testInitWithParameters_withCVVAndPostalCode_setsPropertiesToExpectedValues() { + let card = BTCard(parameters: [ + "cvv": "123", + "billing_address": ["postal_code": "94949"], + ]) + + XCTAssertNil(card.number) + XCTAssertNil(card.expirationMonth) + XCTAssertNil(card.expirationYear) + XCTAssertEqual(card.postalCode, "94949") + XCTAssertEqual(card.cvv, "123") + XCTAssertFalse(card.shouldValidate) + } + + func testParameters_whenInitializedWithInitWithParameters_returnsExpectedValues() { + let card = BTCard(parameters: [ + "number": "4111111111111111", + "expiration_date": "12/20", + "cvv": "123", + "billing_address": [ + "first_name": "Joe", + "last_name": "Smith", + "company": "Company", + "street_address": "123 Townsend St", + "extended_address": "Unit 1", + "locality": "San Francisco", + "region": "CA", + "country_name": "United States of America", + "country_code_alpha2": "US", + "postal_code": "94107" + ], + "options": ["validate": false], + "cardholder_name": "Brian Tree" + ]) + + XCTAssertEqual(card.parameters() as NSObject, [ + "number": "4111111111111111", + "expiration_date": "12/20", + "cvv": "123", + "billing_address": [ + "first_name": "Joe", + "last_name": "Smith", + "company": "Company", + "street_address": "123 Townsend St", + "extended_address": "Unit 1", + "locality": "San Francisco", + "region": "CA", + "country_name": "United States of America", + "country_code_alpha2": "US", + "postal_code": "94107" + ], + "options": ["validate": false], + "cardholder_name": "Brian Tree" + ] as NSObject) + } + + func testParameters_whenInitializedWithCustomParameters_returnsExpectedValues() { + let card = BTCard(parameters: [ + "cvv": "123", + "billing_address": ["postal_code": "94949"], + "options": ["foo": "bar"], + ]) + + XCTAssertEqual(card.parameters() as NSObject, [ + "cvv": "123", + "billing_address": ["postal_code": "94949"], + "options": [ + "foo": "bar", + "validate": false, + ], + ] as NSObject) + } + + func testParameters_whenShouldValidateIsSetToNewValue_returnsExpectedValues() { + let card = BTCard(parameters: ["options": ["validate": false]]) + card.shouldValidate = true + XCTAssertEqual(card.parameters() as NSObject, [ + "options": [ "validate": true ], + ] as NSObject) + } + + func testGraphQLParameters_whenInitializedWithInitWithParameters_returnsExpectedValues() { + let card = BTCard(parameters: [ + "number": "4111111111111111", + "expiration_date": "12/20", + "cvv": "123", + "billing_address": [ + "first_name": "Joe", + "last_name": "Smith", + "company": "Company", + "street_address": "123 Townsend St", + "extended_address": "Unit 1", + "locality": "San Francisco", + "region": "CA", + "country_name": "United States of America", + "country_code_alpha2": "US", + "country_code_alpha3": "USA", + "postal_code": "94107" + ], + "options": ["validate": false], + "cardholder_name": "Brian Tree" + ]) + + XCTAssertEqual(card.graphQLParameters() as NSObject, [ + "operationName": "TokenizeCreditCard", + "query": BTCardGraphQLTokenizationMutation, + "variables": [ + "input": [ + "creditCard": [ + "cardholderName": "Brian Tree", + "number": "4111111111111111", + "expirationMonth": "12", + "expirationYear": "20", + "cvv": "123", + "billingAddress": [ + "firstName": "Joe", + "lastName": "Smith", + "company": "Company", + "streetAddress": "123 Townsend St", + "extendedAddress": "Unit 1", + "locality": "San Francisco", + "region": "CA", + "countryName": "United States of America", + "countryCodeAlpha2": "US", + "countryCode": "USA", + "postalCode": "94107" + ], + ], + "options": ["validate": false] + ] + ] + ] as NSObject) + } + + func testGraphQLParameters_whenDoingCVVOnly_returnsExpectedValue() { + let card = BTCard(parameters: ["cvv": "123"]) + + XCTAssertEqual(card.graphQLParameters() as NSObject, [ + "operationName": "TokenizeCreditCard", + "query": BTCardGraphQLTokenizationMutation, + "variables": [ + "input": [ + "creditCard": [ + "cvv": "123" + ], + "options": ["validate": false] + ] + ] + ] as NSObject) + } + + func testGraphQLParameters_whenInitializedWithCustomParameters_doesNotAddCustomParameters() { + let card = BTCard(parameters: [ + "cvv": "123", + "billing_address": ["postal_code": "94949"], + "options": ["foo": "bar"], + ]) + + XCTAssertEqual(card.graphQLParameters() as NSObject, [ + "operationName": "TokenizeCreditCard", + "query": BTCardGraphQLTokenizationMutation, + "variables": [ + "input": [ + "creditCard": [ + "cvv": "123", + "billingAddress": ["postalCode": "94949"], + ], + "options": [ + "validate": false, + ] + ] + ] + ] as NSObject) + } + + func testGraphQLParameters_whenShouldValidateIsSetToNewValue_returnsExpectedValues() { + let card = BTCard(parameters: [ + "cvv": "123", + "options": ["validate": false] + ]) + card.shouldValidate = true + XCTAssertEqual(card.graphQLParameters() as NSObject, [ + "operationName": "TokenizeCreditCard", + "query": BTCardGraphQLTokenizationMutation, + "variables": [ + "input": [ + "creditCard": [ + "cvv": "123", + ], + "options": [ "validate": true ], + ] + ] + ] as NSObject) + } +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTCheckoutRequest_Tests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTCheckoutRequest_Tests.swift new file mode 100644 index 0000000..fa951e6 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTCheckoutRequest_Tests.swift @@ -0,0 +1,70 @@ +import XCTest + +class BTPaymentRequest_Tests: XCTestCase { + + func testPaymentRequest_initializesAndCopiesCorrectly() { + let paymentRequest = BTPaymentRequest() + XCTAssertNil(paymentRequest.summaryTitle) + XCTAssertNil(paymentRequest.summaryDescription) + XCTAssertEqual("", paymentRequest.displayAmount) + XCTAssertEqual("Pay", paymentRequest.callToActionText) + XCTAssertFalse(paymentRequest.shouldHideCallToAction) + XCTAssertNil(paymentRequest.amount) + XCTAssertNil(paymentRequest.currencyCode) + XCTAssertFalse(paymentRequest.noShipping) + XCTAssertFalse(paymentRequest.presentViewControllersFromTop) + XCTAssertNil(paymentRequest.shippingAddress) + XCTAssertFalse(paymentRequest.showDefaultPaymentMethodNonceFirst) + + let paymentRequestCopy = paymentRequest.copy() as! BTPaymentRequest + XCTAssertNil(paymentRequestCopy.summaryTitle) + XCTAssertNil(paymentRequestCopy.summaryDescription) + XCTAssertEqual("", paymentRequestCopy.displayAmount) + XCTAssertEqual("Pay", paymentRequestCopy.callToActionText) + XCTAssertFalse(paymentRequestCopy.shouldHideCallToAction) + XCTAssertNil(paymentRequestCopy.amount) + XCTAssertNil(paymentRequestCopy.currencyCode) + XCTAssertFalse(paymentRequestCopy.noShipping) + XCTAssertFalse(paymentRequestCopy.presentViewControllersFromTop) + XCTAssertNil(paymentRequestCopy.shippingAddress) + XCTAssertFalse(paymentRequest.showDefaultPaymentMethodNonceFirst) + } + + func testPaymentRequest_valuesAreSetAndCopiedCorrectly() { + let paymentRequest = BTPaymentRequest() + paymentRequest.summaryTitle = "My Summary Title" + paymentRequest.summaryDescription = "My Summary Description" + paymentRequest.displayAmount = "$123.45" + paymentRequest.callToActionText = "My Call To Action" + paymentRequest.shouldHideCallToAction = true + paymentRequest.amount = "123.45" + paymentRequest.currencyCode = "USD" + paymentRequest.noShipping = true + paymentRequest.presentViewControllersFromTop = true + let shippingAddress = BTPostalAddress() + paymentRequest.shippingAddress = shippingAddress + + XCTAssertEqual("My Summary Title", paymentRequest.summaryTitle) + XCTAssertEqual("My Summary Description", paymentRequest.summaryDescription) + XCTAssertEqual("$123.45", paymentRequest.displayAmount) + XCTAssertEqual("My Call To Action", paymentRequest.callToActionText) + XCTAssertTrue(paymentRequest.shouldHideCallToAction) + XCTAssertEqual("123.45", paymentRequest.amount) + XCTAssertEqual("USD", paymentRequest.currencyCode) + XCTAssertTrue(paymentRequest.noShipping) + XCTAssertTrue(paymentRequest.presentViewControllersFromTop) + XCTAssertEqual(shippingAddress, paymentRequest.shippingAddress) + + let paymentRequestCopy = paymentRequest.copy() as! BTPaymentRequest + XCTAssertEqual("My Summary Title", paymentRequestCopy.summaryTitle) + XCTAssertEqual("My Summary Description", paymentRequestCopy.summaryDescription) + XCTAssertEqual("$123.45", paymentRequestCopy.displayAmount) + XCTAssertEqual("My Call To Action", paymentRequestCopy.callToActionText) + XCTAssertTrue(paymentRequestCopy.shouldHideCallToAction) + XCTAssertEqual("123.45", paymentRequestCopy.amount) + XCTAssertEqual("USD", paymentRequestCopy.currencyCode) + XCTAssertTrue(paymentRequestCopy.noShipping) + XCTAssertTrue(paymentRequestCopy.presentViewControllersFromTop) + XCTAssertEqual(shippingAddress, paymentRequestCopy.shippingAddress) + } +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTClientMetadataSpec.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTClientMetadataSpec.m new file mode 100644 index 0000000..ddaacd5 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTClientMetadataSpec.m @@ -0,0 +1,205 @@ +#import "BTClientMetadata.h" +#import "BTSpecDependencies.h" + +SpecBegin(BTClientMetadata) + +describe(@"string values", ^{ + + BTMutableClientMetadata *m = [[BTMutableClientMetadata alloc] init]; + + it(@"source returns expected strings", ^{ + NSDictionary *sources = @{ + @(BTClientMetadataSourceUnknown) : @"unknown", + @(BTClientMetadataSourceForm) : @"form", + @(BTClientMetadataSourcePayPalApp) : @"paypal-app", + @(BTClientMetadataSourcePayPalBrowser) : @"paypal-browser", + @(BTClientMetadataSourceVenmoApp) : @"venmo-app", + }; + + for (NSNumber *sourceNumber in sources) { + m.source = (BTClientMetadataSourceType)sourceNumber.integerValue; + XCTAssertEqualObjects(m.sourceString, sources[sourceNumber]); + } + }); + + it(@"integration returns expected strings", ^{ + m.integration = BTClientMetadataIntegrationDropIn; + expect(m.integrationString).to.equal(@"dropin"); + + m.integration = BTClientMetadataIntegrationDropIn2; + expect(m.integrationString).to.equal(@"dropin2"); + + m.integration = BTClientMetadataIntegrationCustom; + expect(m.integrationString).to.equal(@"custom"); + + m.integration = BTClientMetadataIntegrationUnknown; + expect(m.integrationString).to.equal(@"unknown"); + }); + + it(@"sessionId returns a 32 character UUID string", ^{ + expect(m.sessionId.length).to.equal(32); + }); + + it(@"sessionId should be different than a different instance's sessionId", ^{ + BTMutableClientMetadata *m2 = [BTMutableClientMetadata new]; + expect(m.sessionId).notTo.equal(m2.sessionId); + }); + +}); + +sharedExamplesFor(@"a copied metadata instance", ^(NSDictionary *data) { + __block BTClientMetadata *original, *copied; + + beforeEach(^{ + original = data[@"original"]; + copied = data[@"copy"]; + }); + + it(@"has the same values", ^{ + expect(copied.integration).to.equal(original.integration); + expect(copied.source).to.equal(original.source); + expect(copied.sessionId).to.equal(original.sessionId); + }); +}); + + +describe(@"mutableMetadata", ^{ + + __block BTMutableClientMetadata *mutableMetadata; + + beforeEach(^{ + mutableMetadata = [[BTMutableClientMetadata alloc] init]; + }); + + describe(@"init", ^{ + it(@"has expected default values", ^{ + expect(mutableMetadata.integration).to.equal(BTClientMetadataIntegrationCustom); + expect(mutableMetadata.source).to.equal(BTClientMetadataSourceUnknown); + }); + }); + + context(@"with non-default values", ^{ + beforeEach(^{ + mutableMetadata.integration = BTClientMetadataIntegrationDropIn; + mutableMetadata.source = BTClientMetadataSourcePayPalApp; + }); + + describe(@"copy", ^{ + __block BTClientMetadata *copied; + beforeEach(^{ + copied = [mutableMetadata copy]; + }); + + itBehavesLike(@"a copied metadata instance", ^{ + return @{@"original" : mutableMetadata, + @"copy" : copied}; + }); + + it(@"returns a different, immutable instance", ^{ + expect(mutableMetadata).toNot.beIdenticalTo(copied); + expect([copied isKindOfClass:[BTClientMetadata class]]).to.beTruthy(); + expect([copied isKindOfClass:[BTMutableClientMetadata class]]).to.beFalsy(); + }); + }); + + describe(@"mutableCopy", ^{ + __block BTMutableClientMetadata *copied; + beforeEach(^{ + copied = [mutableMetadata mutableCopy]; + }); + + itBehavesLike(@"a copied metadata instance", ^{ + return @{@"original" : mutableMetadata, + @"copy" : copied}; + }); + + it(@"returns a different, immutable instance", ^{ + expect(mutableMetadata).toNot.beIdenticalTo(copied); + expect([copied isKindOfClass:[BTClientMetadata class]]).to.beTruthy(); + expect([copied isKindOfClass:[BTMutableClientMetadata class]]).to.beTruthy(); + }); + }); + }); +}); + +describe(@"metadata", ^{ + + __block BTClientMetadata *metadata; + + beforeEach(^{ + metadata = [[BTClientMetadata alloc] init]; + }); + + describe(@"init", ^{ + it(@"has expected default values", ^{ + expect(metadata.integration).to.equal(BTClientMetadataIntegrationCustom); + expect(metadata.source).to.equal(BTClientMetadataSourceUnknown); + }); + }); + + context(@"with non-default values", ^{ + beforeEach(^{ + metadata = ({ + BTMutableClientMetadata *mutableMetadata = [[BTMutableClientMetadata alloc] init]; + mutableMetadata.integration = BTClientMetadataIntegrationDropIn; + mutableMetadata.source = BTClientMetadataSourcePayPalApp; + [mutableMetadata copy]; + }); + }); + + describe(@"copy", ^{ + __block BTClientMetadata *copied; + beforeEach(^{ + copied = [metadata copy]; + }); + + itBehavesLike(@"a copied metadata instance", ^{ + return @{@"original" : metadata, + @"copy" : copied}; + }); + + it(@"returns a different, immutable instance", ^{ + expect(metadata).toNot.beIdenticalTo(copied); + expect([copied isKindOfClass:[BTClientMetadata class]]).to.beTruthy(); + expect([copied isKindOfClass:[BTMutableClientMetadata class]]).to.beFalsy(); + }); + }); + + describe(@"mutableCopy", ^{ + __block BTMutableClientMetadata *copied; + beforeEach(^{ + copied = [metadata mutableCopy]; + }); + + itBehavesLike(@"a copied metadata instance", ^{ + return @{@"original" : metadata, + @"copy" : copied}; + }); + + it(@"returns a different, immutable instance", ^{ + expect(copied).toNot.beIdenticalTo(metadata); + expect([copied isKindOfClass:[BTClientMetadata class]]).to.beTruthy(); + expect([copied isKindOfClass:[BTMutableClientMetadata class]]).to.beTruthy(); + }); + }); + }); +}); + +SpecEnd + +@interface BTClientMetadata_Tests : XCTestCase +@end + +@implementation BTClientMetadata_Tests + +- (void)testParameters_ReturnsTheMetadataMetaParametersForPosting { + BTClientMetadata *metadata = [[BTClientMetadata alloc] init]; + NSDictionary *parameters = metadata.parameters; + expect(parameters).to.equal( + @{@"integration": metadata.integrationString, + @"source": metadata.sourceString, + @"sessionId": metadata.sessionId, + }); +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTClientTokenSpec.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTClientTokenSpec.m new file mode 100644 index 0000000..428b298 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTClientTokenSpec.m @@ -0,0 +1,149 @@ +#import "BTClientToken.h" +#import "BTTestClientTokenFactory.h" +#import +#import + +@interface BTClientToken_Tests : XCTestCase +@end + +@implementation BTClientToken_Tests + +- (void)testInitialization_whenVersionIsUnsupported_returnsError { + NSError *error; + BTClientToken *clientToken = [[BTClientToken alloc] initWithClientToken:[BTTestClientTokenFactory tokenWithVersion:2 overrides:@{ @"version": @0 }] error:&error]; + XCTAssertNil(clientToken); + XCTAssertEqualObjects(error.domain, BTClientTokenErrorDomain); + XCTAssertEqual(error.code, BTClientTokenErrorUnsupportedVersion); +} + +- (void)testInitialization_withV1RawJSONClientTokens_isSuccessful { + BTClientToken *clientToken = [[BTClientToken alloc] initWithClientToken:[BTTestClientTokenFactory tokenWithVersion:1 overrides:@{ BTClientTokenKeyConfigURL: @"https://api.example.com:443/merchants/a_merchant_id/client_api/v1/configuration"}] error:NULL]; + XCTAssertEqualObjects(clientToken.authorizationFingerprint, @"an_authorization_fingerprint"); + XCTAssertEqualObjects(clientToken.configURL, [NSURL URLWithString:@"https://api.example.com:443/merchants/a_merchant_id/client_api/v1/configuration"]); +} + +- (void)testInitialization_withV2Base64EncodedClientTokens_isSuccessful { + BTClientToken *clientToken = [[BTClientToken alloc] initWithClientToken:[BTTestClientTokenFactory tokenWithVersion:2 overrides:@{ BTClientTokenKeyConfigURL: @"https://api.example.com:443/merchants/a_merchant_id/client_api/v1/configuration" }] error:NULL]; + XCTAssertEqualObjects(clientToken.authorizationFingerprint, @"an_authorization_fingerprint"); + XCTAssertEqualObjects(clientToken.configURL, [NSURL URLWithString:@"https://api.example.com:443/merchants/a_merchant_id/client_api/v1/configuration"]); +} + +- (void)testInitialization_withInvalidJSON_returnsError { + NSError *error; + BTClientToken *clientToken = [[BTClientToken alloc] initWithClientToken:@"definitely_not_a_client_token" error:&error]; + + XCTAssertNil(clientToken); + XCTAssertEqualObjects(error.domain, BTClientTokenErrorDomain); + XCTAssertEqual(error.code, BTClientTokenErrorInvalid); + XCTAssertEqualObjects([error.userInfo[NSUnderlyingErrorKey] domain], NSCocoaErrorDomain); +} + +#pragma mark - Edge cases + +- (void)testInitialization_whenConfigURLIsBlank_returnsError { + NSString *clientTokenRawJSON = [BTTestClientTokenFactory tokenWithVersion:2 overrides:@{ BTClientTokenKeyConfigURL: @"" }]; + NSError *error; + BTClientToken *clientToken = [[BTClientToken alloc] initWithClientToken:clientTokenRawJSON error:&error]; + + XCTAssertNil(clientToken); + XCTAssertEqualObjects(error.domain, BTClientTokenErrorDomain); + XCTAssertEqual(error.code, BTClientTokenErrorInvalid); + expect([error localizedDescription]).to.contain(@"config url"); +} + +- (void)testInitialization_whenAuthorizationFingerprintIsOmitted_returnsError { + NSString *clientTokenRawJSON = [BTTestClientTokenFactory tokenWithVersion:2 overrides:@{ BTClientTokenKeyAuthorizationFingerprint: NSNull.null }]; + NSError *error; + + BTClientToken *clientToken = [[BTClientToken alloc] initWithClientToken:clientTokenRawJSON error:&error]; + + XCTAssertNil(clientToken); + XCTAssertEqualObjects(error.domain, BTClientTokenErrorDomain); + XCTAssertEqual(error.code, BTClientTokenErrorInvalid); + expect([error localizedDescription]).to.contain(@"Invalid client token."); + expect([error localizedFailureReason]).to.contain(@"Authorization fingerprint"); +} + +- (void)testInitialization_whenAuthorizationFingerprintIsBlank_returnsError { + NSString *clientTokenRawJSON = [BTTestClientTokenFactory tokenWithVersion:2 overrides:@{ BTClientTokenKeyAuthorizationFingerprint: @"" }]; + NSError *error; + + BTClientToken *clientToken = [[BTClientToken alloc] initWithClientToken:clientTokenRawJSON error:&error]; + + XCTAssertNil(clientToken); + XCTAssertEqualObjects(error.domain, BTClientTokenErrorDomain); + XCTAssertEqual(error.code, BTClientTokenErrorInvalid); + expect([error localizedDescription]).to.contain(@"Invalid client token."); + expect([error localizedFailureReason]).to.contain(@"Authorization fingerprint"); +} + +#pragma mark - NSCoding + +- (void)testNSCoding_afterEncodingAndDecodingClientToken_preservesClientTokenDataIntegrity { + NSString *clientTokenEncodedJSON = [BTTestClientTokenFactory tokenWithVersion:2 overrides:@{ + BTClientTokenKeyConfigURL: @"https://api.example.com/client_api/v1/configuration", + BTClientTokenKeyAuthorizationFingerprint: @"an_authorization_fingerprint|created_at=2014-02-12T18:02:30+0000&customer_id=1234567&public_key=integration_public_key" }]; + BTClientToken *clientToken = [[BTClientToken alloc] initWithClientToken:clientTokenEncodedJSON error:NULL]; + + NSMutableData *data = [NSMutableData data]; + NSKeyedArchiver *coder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; + [clientToken encodeWithCoder:coder]; + [coder finishEncoding]; + + NSKeyedUnarchiver *decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; + BTClientToken *returnedClientToken = [[BTClientToken alloc] initWithCoder:decoder]; + [decoder finishDecoding]; + + expect(returnedClientToken.configURL).to.equal([NSURL URLWithString:@"https://api.example.com/client_api/v1/configuration"]); + expect(returnedClientToken.authorizationFingerprint).to.equal(@"an_authorization_fingerprint|created_at=2014-02-12T18:02:30+0000&customer_id=1234567&public_key=integration_public_key"); +} + +#pragma mark - isEqual + +- (void)testIsEqual_whenTokensContainTheSameValues_returnsTrue { + NSString *clientTokenEncodedJSON = [BTTestClientTokenFactory tokenWithVersion:2 overrides:@{ BTClientTokenKeyAuthorizationFingerprint: @"abcd" }]; + BTClientToken *clientToken = [[BTClientToken alloc] initWithClientToken:clientTokenEncodedJSON error:NULL]; + BTClientToken *clientToken2 = [[BTClientToken alloc] initWithClientToken:clientTokenEncodedJSON error:NULL]; + + XCTAssertNotNil(clientToken); + XCTAssertTrue([clientToken isEqual:clientToken2]); +} + +- (void)testIsEqual_whenTokensDoNotContainTheSameValues_returnsFalse { + NSString *clientTokenString1 = [BTTestClientTokenFactory tokenWithVersion:2 overrides:@{ BTClientTokenKeyAuthorizationFingerprint: @"one_auth_fingerprint" }]; + NSString *clientTokenString2 = [BTTestClientTokenFactory tokenWithVersion:2 overrides:@{ BTClientTokenKeyAuthorizationFingerprint: @"different_auth_fingerprint" }]; + BTClientToken *clientToken = [[BTClientToken alloc] initWithClientToken:clientTokenString1 error:nil]; + BTClientToken *clientToken2 = [[BTClientToken alloc] initWithClientToken:clientTokenString2 error:nil]; + + XCTAssertNotNil(clientToken); + XCTAssertFalse([clientToken isEqual:clientToken2]); +} + +#pragma mark - NSCopying + +- (void)testCopy_returnsADifferentInstance { + NSString *clientTokenRawJSON = [BTTestClientTokenFactory tokenWithVersion:2]; + BTClientToken *clientToken = [[BTClientToken alloc] initWithClientToken:clientTokenRawJSON error:NULL]; + + XCTAssertTrue([clientToken copy] != clientToken); +} + +- (void)testCopy_returnsAnEquivalentInstance { + NSString *clientTokenRawJSON = [BTTestClientTokenFactory tokenWithVersion:2]; + BTClientToken *clientToken = [[BTClientToken alloc] initWithClientToken:clientTokenRawJSON error:NULL]; + + XCTAssertEqualObjects([clientToken copy], clientToken); +} + +- (void)testCopy_returnsAnInstanceWithEqualValues { + NSString *clientTokenRawJSON = [BTTestClientTokenFactory tokenWithVersion:2]; + BTClientToken *clientToken = [[BTClientToken alloc] initWithClientToken:clientTokenRawJSON error:NULL]; + BTClientToken *copiedClientToken = [clientToken copy]; + + XCTAssertEqualObjects(copiedClientToken.configURL, clientToken.configURL); + XCTAssertEqualObjects(copiedClientToken.json.asDictionary, clientToken.json.asDictionary); + XCTAssertEqualObjects(copiedClientToken.authorizationFingerprint, clientToken.authorizationFingerprint); + XCTAssertEqualObjects(copiedClientToken.originalValue, clientToken.originalValue); +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTConfiguration_Tests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTConfiguration_Tests.swift new file mode 100644 index 0000000..d28b8ef --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTConfiguration_Tests.swift @@ -0,0 +1,222 @@ +import XCTest +import PassKit + +class BTConfiguration_Tests: XCTestCase { + + override func tearDown() { + BTConfiguration.setBetaPaymentOption("venmo", isEnabled: false) + } + + func testInitWithJSON_setsJSON() { + let json = BTJSON(value: [ + "some": "things", + "number": 1, + "array": [1, 2, 3]]) + let configuration = BTConfiguration(json: json) + + XCTAssertEqual(configuration.json, json) + } + + // MARK: - Beta enabled payment option + + func testIsBetaEnabledPaymentOption_returnsFalse() { + XCTAssertFalse(BTConfiguration.isBetaEnabledPaymentOption("venmo")) + } + + // MARK: - Venmo category methods + + func testIsVenmoEnabled_whenBetaVenmoIsEnabledAndAccessTokenIsPresent_returnsTrue() { + let configurationJSON = BTJSON(value: [ + "payWithVenmo": [ "accessToken": "some access token" ] + ]) + let configuration = BTConfiguration(json: configurationJSON) + + XCTAssertTrue(configuration.isVenmoEnabled) + } + + func testIsVenmoEnabled_whenBetaVenmoIsEnabledAndAccessTokenNotPresent_returnsFalse() { + let configurationJSON = BTJSON(value: [ + "payWithVenmo": [:] + ]) + let configuration = BTConfiguration(json: configurationJSON) + + XCTAssertFalse(configuration.isVenmoEnabled) + } + + func testVenmoAccessToken_returnsVenmoAccessToken() { + let configurationJSON = BTJSON(value: [ + "payWithVenmo": [ "accessToken": "some access token" ] + ]) + let configuration = BTConfiguration(json: configurationJSON) + + XCTAssertEqual(configuration.venmoAccessToken, "some access token") + } + + func testVenmoEnvironment_returnsVenmoEnvironment() { + let configurationJSON = BTJSON(value: [ + "payWithVenmo": [ "environment": "rockbox" ] + ]) + let configuration = BTConfiguration(json: configurationJSON) + + XCTAssertEqual(configuration.venmoEnvironment, "rockbox") + } + + func testEnableVenmo_whenDisabled_setsVenmoBetaPaymentOptionToFalse() { + BTConfiguration.enableVenmo(false) + XCTAssertFalse(BTConfiguration.isBetaEnabledPaymentOption("venmo")) + } + + // MARK: - PayPal category methods + + func testIsPayPalEnabled_returnsPayPalEnabledStatusFromConfigurationJSON() { + for isPayPalEnabled in [true, false] { + let configurationJSON = BTJSON(value: [ "paypalEnabled": isPayPalEnabled ]) + let configuration = BTConfiguration(json: configurationJSON) + + XCTAssertTrue(configuration.isPayPalEnabled == isPayPalEnabled) + } + } + + func testIsPayPalEnabled_whenPayPalEnabledStatusNotPresentInConfigurationJSON_returnsFalse() { + let configuration = BTConfiguration(json: BTJSON(value: [])) + XCTAssertFalse(configuration.isPayPalEnabled) + } + + func testIsBillingAgreementsEnabled_returnsBillingAgreementsStatusFromConfigurationJSON() { + for isBillingAgreementsEnabled in [true, false] { + let configurationJSON = BTJSON(value: [ + "paypal": [ "billingAgreementsEnabled": isBillingAgreementsEnabled] + ]) + let configuration = BTConfiguration(json: configurationJSON) + XCTAssertTrue(configuration.isBillingAgreementsEnabled == isBillingAgreementsEnabled) + } + } + + // MARK: - Apple Pay category methods + + func testIsApplePayEnabled_whenApplePayStatusFromConfigurationJSONIsAString_returnsTrue() { + for applePayStatus in ["mock", "production", "asdfasdf"] { + let configurationJSON = BTJSON(value: [ + "applePay": [ "status": applePayStatus ] + ]) + let configuration = BTConfiguration(json: configurationJSON) + + XCTAssertTrue(configuration.isApplePayEnabled) + } + } + + func testIsApplePayEnabled_whenApplePayStatusFromConfigurationJSONIsGarbage_returnsFalse() { + let configurationJSON = BTJSON(value: [ + "applePay": [ "status": 3.14 ] + ]) + let configuration = BTConfiguration(json: configurationJSON) + + XCTAssertFalse(configuration.isApplePayEnabled) + } + + func testIsApplePayEnabled_whenApplePayStatusFromConfigurationJSONIsOff_returnsFalse() { + let configurationJSON = BTJSON(value: [ + "applePay": [ "status": "off" ] + ]) + let configuration = BTConfiguration(json: configurationJSON) + + XCTAssertFalse(configuration.isApplePayEnabled) + } + + func testApplePayCountryCode_returnsCountryCode() { + let configurationJSON = BTJSON(value: [ + "applePay": [ "countryCode": "US" ] + ]) + let configuration = BTConfiguration(json: configurationJSON) + + XCTAssertEqual(configuration.applePayCountryCode!, "US") + } + + func testApplePayCurrencyCode_returnsCurrencyCode() { + let configurationJSON = BTJSON(value: [ + "applePay": [ "currencyCode": "USD" ] + ]) + let configuration = BTConfiguration(json: configurationJSON) + + XCTAssertEqual(configuration.applePayCurrencyCode!, "USD") + } + + func testApplePayMerchantIdentifier_returnsMerchantIdentifier() { + let configurationJSON = BTJSON(value: [ + "applePay": [ "merchantIdentifier": "com.merchant.braintree-unit-tests" ] + ]) + let configuration = BTConfiguration(json: configurationJSON) + + XCTAssertEqual(configuration.applePayMerchantIdentifier!, "com.merchant.braintree-unit-tests") + } + + func testApplePaySupportedNetworks_returnsSupportedNetworks() { + let configurationJSON = BTJSON(value: [ + "applePay": [ "supportedNetworks": ["visa", "mastercard", "amex"] ] + ]) + let configuration = BTConfiguration(json: configurationJSON) + + XCTAssertEqual(configuration.applePaySupportedNetworks!, [PKPaymentNetwork.visa, PKPaymentNetwork.masterCard, PKPaymentNetwork.amex]) + } + + func testApplePaySupportedNetworks_whenRunningBelowiOS9_doesNotReturnDiscover() { + let configurationJSON = BTJSON(value: [ + "applePay": [ "supportedNetworks": ["discover"] ] + ]) + let configuration = BTConfiguration(json: configurationJSON) + + guard #available(iOS 9, *) else { + XCTAssertEqual(configuration.applePaySupportedNetworks!, []) + return + } + } + + @available(iOS 9.0, *) + func testApplePaySupportedNetworks_whenSupportedNetworksIncludesDiscover_returnsSupportedNetworks() { + let configurationJSON = BTJSON(value: [ + "applePay": [ "supportedNetworks": ["discover"] ] + ]) + let configuration = BTConfiguration(json: configurationJSON) + + XCTAssertEqual(configuration.applePaySupportedNetworks!, [PKPaymentNetwork.discover]) + } + + func testApplePaySupportedNetworks_doesNotPassesThroughUnknownValuesFromConfiguration() { + let configurationJSON = BTJSON(value: [ + "applePay": [ "supportedNetworks": ["ChinaUnionPay", "Interac", "PrivateLabel"] ] + ]) + let configuration = BTConfiguration(json: configurationJSON) + + XCTAssertEqual(configuration.applePaySupportedNetworks!, []) + + } + + // MARK: - UnionPay category methods + + func testIsUnionPayEnabled_whenUnionPayEnabledFromConfigurationJSONIsTrue_returnsTrue() { + let configurationJSON = BTJSON(value: [ + "unionPay": [ "enabled": true ] + ]) + let configuration = BTConfiguration(json: configurationJSON) + + XCTAssertTrue(configuration.isUnionPayEnabled) + } + + func testIsUnionPayEnabled_whenUnionPayEnabledFromConfigurationJSONIsFalse_returnsFalse() { + let configurationJSON = BTJSON(value: [ + "unionPay": [ "enabled": false ] + ]) + let configuration = BTConfiguration(json: configurationJSON) + + XCTAssertFalse(configuration.isUnionPayEnabled) + + } + + func testIsUnionPayEnabled_whenUnionPayEnabledFromConfigurationJSONIsMissing_returnsFalse() { + let configurationJSON = BTJSON(value: []) + let configuration = BTConfiguration(json: configurationJSON) + + XCTAssertFalse(configuration.isUnionPayEnabled) + } + +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTDataCollector_Tests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTDataCollector_Tests.swift new file mode 100644 index 0000000..40c5424 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTDataCollector_Tests.swift @@ -0,0 +1,302 @@ +import XCTest +import PayPalDataCollector + +// FIXME: comparison operators with optionals were removed from the Swift Standard Libary. +// Consider refactoring the code to use the non-optional operators. +fileprivate func < (lhs: T?, rhs: T?) -> Bool { + switch (lhs, rhs) { + case let (l?, r?): + return l < r + case (nil, _?): + return true + default: + return false + } +} + +// FIXME: comparison operators with optionals were removed from the Swift Standard Libary. +// Consider refactoring the code to use the non-optional operators. +fileprivate func >= (lhs: T?, rhs: T?) -> Bool { + switch (lhs, rhs) { + case let (l?, r?): + return l >= r + default: + return !(lhs < rhs) + } +} + +// FIXME: comparison operators with optionals were removed from the Swift Standard Libary. +// Consider refactoring the code to use the non-optional operators. +fileprivate func > (lhs: T?, rhs: T?) -> Bool { + switch (lhs, rhs) { + case let (l?, r?): + return l > r + default: + return rhs < lhs + } +} + + +class BTDataCollector_Tests: XCTestCase { + + var testDelegate: TestDelegateForBTDataCollector? + + /// We check the delegate because it's the only exposed property of the dataCollector + func testInitsWithNilDelegate() { + let dataCollector = BTDataCollector(environment: BTDataCollectorEnvironment.sandbox) + XCTAssertNil(dataCollector.delegate) + } + + func testSuccessfullyCollectsCardDataAndCallsDelegateMethods() { + let dataCollector = BTDataCollector(environment: .sandbox) + testDelegate = TestDelegateForBTDataCollector(didStartExpectation: expectation(description: "didStart"), didCompleteExpectation: expectation(description: "didComplete")) + dataCollector.delegate = testDelegate + let stubKount = FakeDeviceCollectorSDK() + dataCollector.kount = stubKount + + let jsonString = dataCollector.collectCardFraudData() + + let data = jsonString.data(using: String.Encoding.utf8) + let dictionary = try! JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! Dictionary + XCTAssert((dictionary["device_session_id"] as! String).count >= 32) + XCTAssertEqual(dictionary["fraud_merchant_id"] as? String, "600000") // BTDataCollectorSharedMerchantId + waitForExpectations(timeout: 10, handler: nil) + } + + /// Ensure that both Kount and PayPal data can be collected together + func testCollectFraudData() { + let dataCollector = BTDataCollector(environment: .sandbox) + testDelegate = TestDelegateForBTDataCollector(didStartExpectation: expectation(description: "didStart"), didCompleteExpectation: expectation(description: "didComplete")) + dataCollector.delegate = testDelegate + let stubKount = FakeDeviceCollectorSDK() + dataCollector.kount = stubKount + BTDataCollector.setPayPalDataCollectorClass(FakePPDataCollector.self) + + let jsonString = dataCollector.collectFraudData() + + let data = jsonString.data(using: String.Encoding.utf8) + let dictionary = try! JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! Dictionary + XCTAssert((dictionary["device_session_id"] as! String).count >= 32) + XCTAssertEqual(dictionary["fraud_merchant_id"] as? String, "600000") // BTDataCollectorSharedMerchantId + + // Ensure correlation_id (clientMetadataId) is not nil and has a length of at least 12. + // This is just a guess of a reasonable id length. In practice, the id + // typically has a length of 32. + XCTAssertEqual(dictionary["correlation_id"] as? String, "fakeclientmetadataid") + + waitForExpectations(timeout: 2, handler: nil) + } + + func testCollectCardFraudData_doesNotReturnCorrelationId() { + let config = [ + "environment":"development" as AnyObject, + "kount": [ + "enabled": true, + "kountMerchantId": "500000" + ] + ] as [String : Any] + let apiClient = clientThatReturnsConfiguration(config as [String : AnyObject]) + + let dataCollector = BTDataCollector(apiClient: apiClient) + let expectation = self.expectation(description: "Returns fraud data") + + dataCollector.collectCardFraudData { (fraudData: String) in + let json = BTJSON(data: fraudData.data(using: String.Encoding.utf8)!) + XCTAssertNil(json["correlation_id"] as? String) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testOverrideMerchantId_usesMerchantProvidedId() { + let config = [ + "environment":"development", + "kount": [ + "enabled": true, + "kountMerchantId": "500000" + ] + ] as [String : Any] + + let apiClient = clientThatReturnsConfiguration(config as [String : AnyObject]) + + let dataCollector = BTDataCollector(apiClient: apiClient) + dataCollector.setFraudMerchantId("500001") + let expectation = self.expectation(description: "Returns fraud data") + + dataCollector.collectFraudData { (fraudData: String) in + let json = BTJSON(data: fraudData.data(using: String.Encoding.utf8)!) + XCTAssertEqual((json["fraud_merchant_id"] as AnyObject).asString(), "500001") + XCTAssert((json["device_session_id"] as AnyObject).asString()?.count >= 32) + XCTAssert((json["correlation_id"] as AnyObject).asString()?.count > 0) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testCollectFraudDataWithCompletionBlock_whenMerchantHasKountConfiguration_usesConfiguration() { + let config = [ + "environment": "development" as AnyObject, + "kount": [ + "enabled": true, + "kountMerchantId": "500000" + ] + ] as [String : Any] + let apiClient = clientThatReturnsConfiguration(config as [String : AnyObject]) + let dataCollector = BTDataCollector(apiClient: apiClient) + + let expectation = self.expectation(description: "Returns fraud data") + dataCollector.collectFraudData { fraudData in + let json = BTJSON(data: fraudData.data(using: String.Encoding.utf8)!) + XCTAssertEqual((json["fraud_merchant_id"] as AnyObject).asString(), "500000") + XCTAssert((json["device_session_id"] as AnyObject).asString()!.count >= 32) + XCTAssert((json["correlation_id"] as AnyObject).asString()!.count > 0) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testCollectFraudDataWithCompletionBlock_whenMerchantHasKountConfiguration_setsMerchantIDOnKount() { + let config = [ + "environment": "sandbox", + "kount": [ + "enabled": true, + "kountMerchantId": "500000" + ] + ] as [String : Any] + let apiClient = clientThatReturnsConfiguration(config as [String : AnyObject]) + let dataCollector = BTDataCollector(apiClient: apiClient) + let stubKount = FakeDeviceCollectorSDK() + dataCollector.kount = stubKount + + let expectation = self.expectation(description: "Returns fraud data") + dataCollector.collectFraudData { fraudData in + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + + XCTAssertEqual(500000, stubKount.merchantID) + XCTAssertEqual(KEnvironment.test, stubKount.environment) + } + + func testCollectFraudData_doesNotCollectKountDataIfDisabledInConfiguration() { + let apiClient = clientThatReturnsConfiguration([ + "environment":"development" as AnyObject + ]) + + let dataCollector = BTDataCollector(apiClient: apiClient) + let expectation = self.expectation(description: "Returns fraud data") + dataCollector.collectFraudData { fraudData in + let json = BTJSON(data: fraudData.data(using: String.Encoding.utf8)!) + XCTAssertNil(json["fraud_merchant_id"] as? String) + XCTAssertNil(json["device_session_id"] as? String) + XCTAssert((json["correlation_id"] as AnyObject).asString()?.count > 0) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } +} + +func clientThatReturnsConfiguration(_ configuration: [String:AnyObject]) -> BTAPIClient { + let apiClient = BTAPIClient(authorization: "development_tokenization_key", sendAnalyticsEvent: false)! + let fakeHttp = BTFakeHTTP()! + let cannedConfig = BTJSON(value: configuration) + fakeHttp.cannedConfiguration = cannedConfig + fakeHttp.cannedStatusCode = 200 + apiClient.configurationHTTP = fakeHttp + + return apiClient +} + +class TestDelegateForBTDataCollector: NSObject, BTDataCollectorDelegate { + + var didStartExpectation: XCTestExpectation? + var didCompleteExpectation: XCTestExpectation? + + var didFailExpectation: XCTestExpectation? + var error: NSError? + + init(didStartExpectation: XCTestExpectation, didCompleteExpectation: XCTestExpectation) { + self.didStartExpectation = didStartExpectation + self.didCompleteExpectation = didCompleteExpectation + } + + init(didFailExpectation: XCTestExpectation) { + self.didFailExpectation = didFailExpectation + } + + func dataCollectorDidStart(_ dataCollector: BTDataCollector) { + didStartExpectation?.fulfill() + } + + func dataCollectorDidComplete(_ dataCollector: BTDataCollector) { + didCompleteExpectation?.fulfill() + } + + func dataCollector(_ dataCollector: BTDataCollector, didFailWithError error: Error) { + self.error = error as NSError + self.didFailExpectation?.fulfill() + } +} + +class FakeDeviceCollectorSDK: KDataCollector { + + var lastCollectSessionID: String? + var forceError = false + + override func collect(forSession sessionID: String, completion completionBlock: ((String, Bool, Error?) -> Void)? = nil) { + lastCollectSessionID = sessionID + if forceError { + completionBlock?("1981", false, NSError(domain: "Fake", code: 1981, userInfo: nil)) + } else { + completionBlock?(sessionID, true, nil) + } + } +} + +class FakePPDataCollector: PPDataCollector { + + public static var didGetClientMetadataID = false + public static var lastClientMetadataId = "" + public static var lastData: [AnyHashable: Any]? = [:] + public static var lastBeaconState = false + + override class func clientMetadataID(_ pairingID: String?) -> String { + return generateClientMetadataID(pairingID, disableBeacon: false, data: nil) + } + + override class func generateClientMetadataID() -> String { + return generateClientMetadataID(nil, disableBeacon: false, data: nil) + } + + override class func generateClientMetadataIDWithoutBeacon(_ clientMetadataID: String?, data: [AnyHashable : Any]?) -> String { + return generateClientMetadataID(clientMetadataID, disableBeacon: true, data: data) + } + + override class func generateClientMetadataID(_ clientMetadataID: String?, disableBeacon: Bool, data: [AnyHashable : Any]?) -> String { + if (data != nil) { + lastData = data! + } else { + lastData = nil + } + if (clientMetadataID != nil) { + lastClientMetadataId = clientMetadataID! + } else { + lastClientMetadataId = "fakeclientmetadataid" + } + lastBeaconState = disableBeacon + didGetClientMetadataID = true + return lastClientMetadataId + } + + class func resetState() -> Void { + lastBeaconState = false + didGetClientMetadataID = false + lastData = nil + lastClientMetadataId = "" + } +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTDropInErrorState_Tests.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTDropInErrorState_Tests.m new file mode 100644 index 0000000..4bca235 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTDropInErrorState_Tests.m @@ -0,0 +1,122 @@ +#import +#import "BTHTTP.h" +#import "BTDropInErrorState.h" +#import "BTErrors.h" +#import "BTUICardFormView.h" + +@interface BTDropInErrorState_Tests : XCTestCase + +@end + +@implementation BTDropInErrorState_Tests + +- (void)testErrorTitle_returnsErrorTitleBasedOnNSErrorTopLevelErrorMessage { + NSDictionary *validationErrors = @{@"error": @{ + @"message": @"Credit Card is Invalid" }, + @"fieldErrors": @[ + @{ + @"field": @"creditCard", + @"fieldErrors": @[ + @{ + @"field": @"cvv", + @"message": @"CVV is required" } + ] + }]}; + + NSDictionary *userInfo = @{BTCustomerInputBraintreeValidationErrorsKey: validationErrors}; + NSError *error = [[NSError alloc] initWithDomain:BTHTTPErrorDomain + code:BTHTTPErrorCodeClientError + userInfo:userInfo]; + BTDropInErrorState *state = [[BTDropInErrorState alloc] initWithError:error]; + XCTAssertEqualObjects(state.errorTitle, @"Credit Card is Invalid"); +} + +- (void)testErrorTitle_whenThereAreNoFieldErrorsAssociated_returnsErrorTitleBasedOnNSErrorTopLevelErrorMessage { + NSDictionary *validationErrors = @{ @"error": @{ @"message": @"Everything is Invalid" } }; + NSDictionary *userInfo = @{BTCustomerInputBraintreeValidationErrorsKey: validationErrors}; + NSError *error = [[NSError alloc] initWithDomain:BTHTTPErrorDomain + code:BTHTTPErrorCodeClientError + userInfo:userInfo]; + + BTDropInErrorState *state = [[BTDropInErrorState alloc] initWithError:error]; + XCTAssertEqualObjects(state.errorTitle, @"Everything is Invalid"); +} + +- (void)testHighlightedFields_whenErrorUserInfoHasFieldErrors_returnsSetOfFieldsWithValidationErrorsAssociated { + NSDictionary *validationErrors = @{@"error": @{ + @"message": @"Credit Card is Invalid" }, + @"fieldErrors": @[ + @{ + @"field": @"creditCard", + @"fieldErrors": @[ + @{ @"field": @"cvv", + @"message": @"CVV is required" }, + @{ @"field": @"billingAddress", + @"fieldErrors": @[@{ @"field": @"postalCode", + @"message": @"Postal Code is required" }], + }, + @{ @"field": @"number", + @"message": @"Number is required" }, + @{ @"field": @"expirationDate", + @"message": @"Expiration date is required" }, + ] + }]}; + + NSDictionary *userInfo = @{BTCustomerInputBraintreeValidationErrorsKey: validationErrors}; + NSError *error = [[NSError alloc] initWithDomain:BTHTTPErrorDomain + code:BTHTTPErrorCodeClientError + userInfo:userInfo]; + + BTDropInErrorState *state = [[BTDropInErrorState alloc] initWithError:error]; + + XCTAssertTrue(state.highlightedFields.count == 4); + XCTAssertTrue([state.highlightedFields containsObject:@(BTUICardFormFieldNumber)]); + XCTAssertTrue([state.highlightedFields containsObject:@(BTUICardFormFieldExpiration)]); + XCTAssertTrue([state.highlightedFields containsObject:@(BTUICardFormFieldCvv)]); + XCTAssertTrue([state.highlightedFields containsObject:@(BTUICardFormFieldPostalCode)]); +} + +- (void)testHighlightedFields_whenErrorUserInfoHasNoFieldErrors_returnsEmptySet { + NSDictionary *validationErrors = @{@"error": @{ + @"message": @"Credit Card is Invalid" }, + @"fieldErrors": @[ + @{ + @"field": @"creditCard", + @"fieldErrors": @[ + @{ @"field": @"paymentMethodNonce", + @"message": @"Payment method nonces cannot be used to update an existing card." }, + ] + }]}; + NSDictionary *userInfo = @{BTCustomerInputBraintreeValidationErrorsKey: validationErrors}; + NSError *error = [[NSError alloc] initWithDomain:BTHTTPErrorDomain + code:BTHTTPErrorCodeClientError + userInfo:userInfo]; + + BTDropInErrorState *state = [[BTDropInErrorState alloc] initWithError:error]; + + XCTAssertTrue(state.highlightedFields.count == 0); +} + +- (void)testHighlightedFields_whenErrorContainsUnknownFields_ignoresThem { + NSDictionary *validationErrors = @{@"error": @{ @"message": @"Everything is invalid" }, + @"fieldErrors": @[ + @{ + @"field": @"creditCard", + @"fieldErrors": @[ + @{ @"field": @"unknownField", + @"message": @"You can't highlight what you can't understand!" }, + ] + }] + }; + + NSDictionary *userInfo = @{BTCustomerInputBraintreeValidationErrorsKey: validationErrors}; + NSError *error = [[NSError alloc] initWithDomain:BTHTTPErrorDomain + code:BTHTTPErrorCodeClientError + userInfo:userInfo]; + + BTDropInErrorState *state = [[BTDropInErrorState alloc] initWithError:error]; + + XCTAssertTrue(state.highlightedFields.count == 0); +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTDropInUtil_Tests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTDropInUtil_Tests.swift new file mode 100644 index 0000000..f86a99d --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTDropInUtil_Tests.swift @@ -0,0 +1,17 @@ +import XCTest + +class BTDropInUtil_Tests: XCTestCase { + func testBTDropInUtil_topViewControllerReturnsViewController() { + let topInitialTopController = BTDropInUtil.topViewController() + XCTAssertNotNil(topInitialTopController, "Top UIViewController should not be nil") + + let windowRootController = UIViewController() + let secondWindow = UIWindow(frame: UIScreen.main.bounds) + secondWindow.rootViewController = windowRootController + secondWindow.makeKeyAndVisible() + secondWindow.windowLevel = UIWindow.Level(rawValue: 100) + let topSecondTopController = BTDropInUtil.topViewController() + XCTAssertNotEqual(topInitialTopController, topSecondTopController) + XCTAssertEqual(windowRootController, topSecondTopController) + } +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTDropInViewController_Tests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTDropInViewController_Tests.swift new file mode 100644 index 0000000..a3c067d --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTDropInViewController_Tests.swift @@ -0,0 +1,215 @@ +import XCTest + +class BTDropInViewController_Tests: XCTestCase { + + class BTDropInViewControllerTestDelegate : NSObject, BTDropInViewControllerDelegate { + var didLoadExpectation: XCTestExpectation + + init(didLoadExpectation: XCTestExpectation) { + self.didLoadExpectation = didLoadExpectation + } + + @objc func drop(_ viewController: BTDropInViewController, didSucceedWithTokenization paymentMethodNonce: BTPaymentMethodNonce) {} + + @objc func drop(inViewControllerDidCancel viewController: BTDropInViewController) {} + + @objc func drop(inViewControllerDidLoad viewController: BTDropInViewController) { + didLoadExpectation.fulfill() + } + } + + var window : UIWindow! + var viewController : UIViewController! + let ValidClientToken = "eyJ2ZXJzaW9uIjoyLCJhdXRob3JpemF0aW9uRmluZ2VycHJpbnQiOiI3ODJhZmFlNDJlZTNiNTA4NWUxNmMzYjhkZTY3OGQxNTJhODFlYzk5MTBmZDNhY2YyYWU4MzA2OGI4NzE4YWZhfGNyZWF0ZWRfYXQ9MjAxNS0wOC0yMFQwMjoxMTo1Ni4yMTY1NDEwNjErMDAwMFx1MDAyNmN1c3RvbWVyX2lkPTM3OTU5QTE5LThCMjktNDVBNC1CNTA3LTRFQUNBM0VBOEM4Nlx1MDAyNm1lcmNoYW50X2lkPWRjcHNweTJicndkanIzcW5cdTAwMjZwdWJsaWNfa2V5PTl3d3J6cWszdnIzdDRuYzgiLCJjb25maWdVcmwiOiJodHRwczovL2FwaS5zYW5kYm94LmJyYWludHJlZWdhdGV3YXkuY29tOjQ0My9tZXJjaGFudHMvZGNwc3B5MmJyd2RqcjNxbi9jbGllbnRfYXBpL3YxL2NvbmZpZ3VyYXRpb24iLCJjaGFsbGVuZ2VzIjpbXSwiZW52aXJvbm1lbnQiOiJzYW5kYm94IiwiY2xpZW50QXBpVXJsIjoiaHR0cHM6Ly9hcGkuc2FuZGJveC5icmFpbnRyZWVnYXRld2F5LmNvbTo0NDMvbWVyY2hhbnRzL2RjcHNweTJicndkanIzcW4vY2xpZW50X2FwaSIsImFzc2V0c1VybCI6Imh0dHBzOi8vYXNzZXRzLmJyYWludHJlZWdhdGV3YXkuY29tIiwiYXV0aFVybCI6Imh0dHBzOi8vYXV0aC52ZW5tby5zYW5kYm94LmJyYWludHJlZWdhdGV3YXkuY29tIiwiYW5hbHl0aWNzIjp7InVybCI6Imh0dHBzOi8vY2xpZW50LWFuYWx5dGljcy5zYW5kYm94LmJyYWludHJlZWdhdGV3YXkuY29tIn0sInRocmVlRFNlY3VyZUVuYWJsZWQiOnRydWUsInRocmVlRFNlY3VyZSI6eyJsb29rdXBVcmwiOiJodHRwczovL2FwaS5zYW5kYm94LmJyYWludHJlZWdhdGV3YXkuY29tOjQ0My9tZXJjaGFudHMvZGNwc3B5MmJyd2RqcjNxbi90aHJlZV9kX3NlY3VyZS9sb29rdXAifSwicGF5cGFsRW5hYmxlZCI6dHJ1ZSwicGF5cGFsIjp7ImRpc3BsYXlOYW1lIjoiQWNtZSBXaWRnZXRzLCBMdGQuIChTYW5kYm94KSIsImNsaWVudElkIjpudWxsLCJwcml2YWN5VXJsIjoiaHR0cDovL2V4YW1wbGUuY29tL3BwIiwidXNlckFncmVlbWVudFVybCI6Imh0dHA6Ly9leGFtcGxlLmNvbS90b3MiLCJiYXNlVXJsIjoiaHR0cHM6Ly9hc3NldHMuYnJhaW50cmVlZ2F0ZXdheS5jb20iLCJhc3NldHNVcmwiOiJodHRwczovL2NoZWNrb3V0LnBheXBhbC5jb20iLCJkaXJlY3RCYXNlVXJsIjpudWxsLCJhbGxvd0h0dHAiOnRydWUsImVudmlyb25tZW50Tm9OZXR3b3JrIjp0cnVlLCJlbnZpcm9ubWVudCI6Im9mZmxpbmUiLCJ1bnZldHRlZE1lcmNoYW50IjpmYWxzZSwiYnJhaW50cmVlQ2xpZW50SWQiOiJtYXN0ZXJjbGllbnQzIiwiYmlsbGluZ0FncmVlbWVudHNFbmFibGVkIjpmYWxzZSwibWVyY2hhbnRBY2NvdW50SWQiOiJzdGNoMm5mZGZ3c3p5dHc1IiwiY3VycmVuY3lJc29Db2RlIjoiVVNEIn0sImNvaW5iYXNlRW5hYmxlZCI6dHJ1ZSwiY29pbmJhc2UiOnsiY2xpZW50SWQiOiIxMWQyNzIyOWJhNThiNTZkN2UzYzAxYTA1MjdmNGQ1YjQ0NmQ0ZjY4NDgxN2NiNjIzZDI1NWI1NzNhZGRjNTliIiwibWVyY2hhbnRBY2NvdW50IjoiY29pbmJhc2UtZGV2ZWxvcG1lbnQtbWVyY2hhbnRAZ2V0YnJhaW50cmVlLmNvbSIsInNjb3BlcyI6ImF1dGhvcml6YXRpb25zOmJyYWludHJlZSB1c2VyIiwicmVkaXJlY3RVcmwiOiJodHRwczovL2Fzc2V0cy5icmFpbnRyZWVnYXRld2F5LmNvbS9jb2luYmFzZS9vYXV0aC9yZWRpcmVjdC1sYW5kaW5nLmh0bWwiLCJlbnZpcm9ubWVudCI6Im1vY2sifSwibWVyY2hhbnRJZCI6ImRjcHNweTJicndkanIzcW4iLCJ2ZW5tbyI6Im9mZmxpbmUiLCJhcHBsZVBheSI6eyJzdGF0dXMiOiJtb2NrIiwiY291bnRyeUNvZGUiOiJVUyIsImN1cnJlbmN5Q29kZSI6IlVTRCIsIm1lcmNoYW50SWRlbnRpZmllciI6Im1lcmNoYW50LmNvbS5icmFpbnRyZWVwYXltZW50cy5zYW5kYm94LkJyYWludHJlZS1EZW1vIiwic3VwcG9ydGVkTmV0d29ya3MiOlsidmlzYSIsIm1hc3RlcmNhcmQiLCJhbWV4Il19fQ==" + + override func setUp() { + super.setUp() + + viewController = UIApplication.shared.windows[0].rootViewController + } + + override func tearDown() { + if viewController.presentedViewController != nil { + viewController.dismiss(animated: false, completion: nil) + } + + super.tearDown() + } + + func testInitializesWithCheckoutRequestCorrectly() { + let apiClient = BTAPIClient(authorization: "development_testing_integration_merchant_id")! + let request = BTPaymentRequest() + let dropInViewController = BTDropInViewController(apiClient: apiClient) + dropInViewController.paymentRequest = request + XCTAssertEqual(request, dropInViewController.paymentRequest) + XCTAssertEqual(apiClient.tokenizationKey, dropInViewController.apiClient.tokenizationKey) + + // By default, Drop-in does not set any bar button items. The developer should embed Drop-in in a navigation controller + // as seen in BraintreeDemoDropInViewController, or provide some other way to dismiss Drop-in. + XCTAssertNil(dropInViewController.navigationItem.leftBarButtonItem) + XCTAssertNil(dropInViewController.navigationItem.rightBarButtonItem) + + let didLoadExpectation = self.expectation(description: "Drop-in did finish loading") + let testDelegate = BTDropInViewControllerTestDelegate(didLoadExpectation: didLoadExpectation) // for strong reference + dropInViewController.delegate = testDelegate + + DispatchQueue.main.async { () -> Void in + self.viewController.present(dropInViewController, animated: false, completion: nil) + } + + self.waitForExpectations(timeout: 5, handler: nil) + } + + func testInitializesWithoutCheckoutRequestCorrectly() { + let apiClient = BTAPIClient(authorization: "development_testing_integration_merchant_id")! + let request = BTPaymentRequest() + + // When this is true, the call to action control will be hidden from Drop-in's content view. Instead, a submit button will be + // added as a navigation bar button item. The default value is false. + request.shouldHideCallToAction = true + + let dropInViewController = BTDropInViewController(apiClient: apiClient) + dropInViewController.paymentRequest = request + + XCTAssertEqual(request, dropInViewController.paymentRequest) + XCTAssertEqual(apiClient.tokenizationKey, dropInViewController.apiClient.tokenizationKey) + XCTAssertNil(dropInViewController.navigationItem.leftBarButtonItem) + + // There will be a rightBarButtonItem instead of a call to action control because it has been set to hide. + XCTAssertNotNil(dropInViewController.navigationItem.rightBarButtonItem) + + let didLoadExpectation = self.expectation(description: "Drop-in did finish loading") + let testDelegate = BTDropInViewControllerTestDelegate(didLoadExpectation: didLoadExpectation) // for strong reference + dropInViewController.delegate = testDelegate + + DispatchQueue.main.async { () -> Void in + self.viewController.present(dropInViewController, animated: false, completion: nil) + } + self.waitForExpectations(timeout: 5, handler: nil) + } + + func testDropIn_canSetNewCheckoutRequestAfterPresentation() { + let apiClient = BTAPIClient(authorization: "development_testing_integration_merchant_id")! + let request = BTPaymentRequest() + let dropInViewController = BTDropInViewController(apiClient: apiClient) + dropInViewController.paymentRequest = request + XCTAssertEqual(request, dropInViewController.paymentRequest) + XCTAssertEqual(apiClient.tokenizationKey, dropInViewController.apiClient.tokenizationKey) + + // By default, Drop-in does not set any bar button items. The developer should embed Drop-in in a navigation controller + // as seen in BraintreeDemoDropInViewController, or provide some other way to dismiss Drop-in. + XCTAssertNil(dropInViewController.navigationItem.leftBarButtonItem) + XCTAssertNil(dropInViewController.navigationItem.rightBarButtonItem) + + let didLoadExpectation = self.expectation(description: "Drop-in did finish loading") + let testDelegate = BTDropInViewControllerTestDelegate(didLoadExpectation: didLoadExpectation) // for strong reference + dropInViewController.delegate = testDelegate + + DispatchQueue.main.async { () -> Void in + self.viewController.present(dropInViewController, animated: false, completion: nil) + } + self.waitForExpectations(timeout: 5, handler: nil) + + let newRequest = BTPaymentRequest() + newRequest.shouldHideCallToAction = true + dropInViewController.paymentRequest = newRequest + XCTAssertNil(dropInViewController.navigationItem.leftBarButtonItem) + + // There will now be a rightBarButtonItem because shouldHideCallToAction = true; this button is the replacement + // of the call to action control. + XCTAssertNotNil(dropInViewController.navigationItem.rightBarButtonItem) + } + + func testDropIn_addPaymentMethodViewController_hidesCTA() { + let apiClient = BTAPIClient(authorization: "development_testing_integration_merchant_id")! + let dropInViewController = BTDropInViewController(apiClient: apiClient) + let addPaymentMethodDropInViewController = dropInViewController.addPaymentMethod() + XCTAssertTrue((addPaymentMethodDropInViewController?.paymentRequest!.shouldHideCallToAction)!) + XCTAssertNotNil(addPaymentMethodDropInViewController?.navigationItem.rightBarButtonItem) + + let didLoadExpectation = self.expectation(description: "Add payment method view controller did finish loading") + let testDelegate = BTDropInViewControllerTestDelegate(didLoadExpectation: didLoadExpectation) // for strong reference + addPaymentMethodDropInViewController?.delegate = testDelegate + + DispatchQueue.main.async { () -> Void in + self.viewController.present(addPaymentMethodDropInViewController!, animated: false, completion: nil) + } + + self.waitForExpectations(timeout: 5, handler: nil) + } + + func testDropIn_whenPresentViewControllersFromTopIsTrue_presentsViewControllersFromTopViewController() { + let apiClient = BTAPIClient(authorization: "development_testing_integration_merchant_id")! + let dropInViewController = BTDropInViewController(apiClient: apiClient) + let paymentRequest = BTPaymentRequest() + paymentRequest.presentViewControllersFromTop = true + dropInViewController.paymentRequest = paymentRequest + let mockViewController = UIViewController() + let windowRootController = UIViewController() + let secondWindow = UIWindow(frame: UIScreen.main.bounds) + secondWindow.rootViewController = windowRootController + secondWindow.makeKeyAndVisible() + secondWindow.windowLevel = UIWindow.Level(rawValue: 100) + let topSecondTopController = BTDropInUtil.topViewController() + + dropInViewController.paymentDriver(nil, requestsPresentationOf: mockViewController) + + let expectation = self.expectation(description: "Sleeping for presentation") + DispatchQueue.global(qos: .background).async { + sleep(1) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + + XCTAssertEqual(mockViewController.presentingViewController, topSecondTopController) + } + + // MARK: - Metadata + + func testAPIClientMetadata_afterInstantiation_hasIntegrationSetToDropIn() { + let apiClient = BTAPIClient(authorization: "development_testing_integration_merchant_id")! + let dropIn = BTDropInViewController(apiClient: apiClient) + + XCTAssertEqual(dropIn.apiClient.metadata.integration, BTClientMetadataIntegrationType.dropIn) + } + + func testAPIClientMetadata_afterInstantiation_hasSourceSetToOriginalAPIClientMetadataSource() { + var apiClient = BTAPIClient(authorization: "development_testing_integration_merchant_id")! + apiClient = apiClient.copy(with: BTClientMetadataSourceType.unknown, integration: BTClientMetadataIntegrationType.custom) + let dropIn = BTDropInViewController(apiClient: apiClient) + + XCTAssertEqual(dropIn.apiClient.metadata.source, BTClientMetadataSourceType.unknown) + } + + // MARK: - Payment method fetching + + func testFetchPaymentMethods_byDefault_doesNotCallAPIClientWithDefaultSortedFirst() { + let mockAPIClient = MockAPIClient(authorization: ValidClientToken)! + let dropIn = BTDropInViewController(apiClient: mockAPIClient) + + let expectation = self.expectation(description: "Callback invoked") + dropIn.fetchPaymentMethods { () -> Void in + XCTAssertTrue(mockAPIClient.didFetchPaymentMethods(sorted: false)) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testFetchPaymentMethods_sortDefaultFirstOverriden_callsAPIClientWithDefaultSortedFirst() { + let mockAPIClient = MockAPIClient(authorization: ValidClientToken)! + let paymentRequest = BTPaymentRequest() + paymentRequest.showDefaultPaymentMethodNonceFirst = false + let dropIn = BTDropInViewController(apiClient: mockAPIClient) + dropIn.paymentRequest = paymentRequest + + let expectation = self.expectation(description: "Callback invoked") + dropIn.fetchPaymentMethods { () -> Void in + XCTAssertTrue(mockAPIClient.didFetchPaymentMethods(sorted: false)) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTGraphQLHTTP_Tests.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTGraphQLHTTP_Tests.m new file mode 100644 index 0000000..620822a --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTGraphQLHTTP_Tests.m @@ -0,0 +1,475 @@ +#import "BTGraphQLHTTP.h" +#import "BTHTTPTestProtocol.h" +#import "BTSpecHelper.h" +#import +#import + +@interface BTGraphQLHTTPTests : XCTestCase +@end + +@implementation BTGraphQLHTTPTests { + BTGraphQLHTTP *http; +} + +- (void)setUp { + [super setUp]; + + http = [[BTGraphQLHTTP alloc] initWithBaseURL:[BTHTTPTestProtocol testBaseURL] authorizationFingerprint:@"test-authorization-fingerprint"]; +} + +- (void)tearDown { + [OHHTTPStubs removeAllStubs]; + [super tearDown]; +} + +- (NSURLSession *)fakeSession { + NSURLSessionConfiguration *testConfiguration = [NSURLSessionConfiguration ephemeralSessionConfiguration]; + [testConfiguration setProtocolClasses:@[[BTHTTPTestProtocol class]]]; + return [NSURLSession sessionWithConfiguration:testConfiguration]; +} + +#pragma mark - Basic request handling + +- (void)testRequests_useTheHostAtTheBaseURL { + XCTestExpectation *expectation = [self expectationWithDescription:@"GET callback"]; + http.session = [self fakeSession]; + + [http POST:@"" completion:^(BTJSON *body, __unused NSHTTPURLResponse *response, __unused NSError *error) { + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + + expect(httpRequest.URL.absoluteString).to.startWith(@"bt-http-test://base.example.com:1234/base/path"); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testRequests_ignoreThePath { + XCTestExpectation *expectation = [self expectationWithDescription:@"GET callback"]; + http.session = [self fakeSession]; + + [http POST:@"hey/go/here.html" completion:^(BTJSON *body, __unused NSHTTPURLResponse *response, __unused NSError *error) { + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + + XCTAssertEqualObjects(httpRequest.URL.absoluteString, @"bt-http-test://base.example.com:1234/base/path"); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +#pragma mark - Unsupported requests + +- (void)testGETRequests_areUnsupported { + XCTestExpectation *expectation = [self expectationWithDescription:@"GET callback"]; + + @try { + [http GET:@"" completion:^(__unused BTJSON * _Nullable body, __unused NSHTTPURLResponse * _Nullable response, __unused NSError * _Nullable error) { + }]; + } + @catch (NSException *exception) { + XCTAssertEqualObjects(exception.reason, @"GET is unsupported"); + [expectation fulfill]; + } + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testPUTRequests_areUnsupported { + XCTestExpectation *expectation = [self expectationWithDescription:@"GET callback"]; + + @try { + [http PUT:@"" completion:^(__unused BTJSON * _Nullable body, __unused NSHTTPURLResponse * _Nullable response, __unused NSError * _Nullable error) { + }]; + } + @catch (NSException *exception) { + XCTAssertEqualObjects(exception.reason, @"PUT is unsupported"); + [expectation fulfill]; + } + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testDELETERequests_areUnsupported { + XCTestExpectation *expectation = [self expectationWithDescription:@"GET callback"]; + + @try { + [http DELETE:@"" completion:^(__unused BTJSON * _Nullable body, __unused NSHTTPURLResponse * _Nullable response, __unused NSError * _Nullable error) { + }]; + } + @catch (NSException *exception) { + XCTAssertEqualObjects(exception.reason, @"DELETE is unsupported"); + [expectation fulfill]; + } + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +#pragma mark - POST requests + +- (void)testPOSTRequests_sendsParametersInBody { + XCTestExpectation *expectation = [self expectationWithDescription:@"GET callback"]; + http.session = [self fakeSession]; + + [http POST:@"" parameters:@{@"hey": @"now"} completion:^(BTJSON *body, __unused NSHTTPURLResponse *response, __unused NSError *error) { + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + NSData *bodyJSONData = [[BTHTTPTestProtocol parseRequestBodyFromTestResponseBody:body] dataUsingEncoding:NSUTF8StringEncoding]; + id bodyJSON = [NSJSONSerialization JSONObjectWithData:bodyJSONData options:0 error:NULL]; + + XCTAssertEqualObjects(httpRequest.URL.absoluteString, @"bt-http-test://base.example.com:1234/base/path"); + XCTAssertEqualObjects(bodyJSON, @{@"hey": @"now"}); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testPOSTRequests_whenSuccessful_returnsData { + XCTestExpectation *expectation = [self expectationWithDescription:@"GET callback"]; + id stubResponseData = @{@"success": @YES}; + + [OHHTTPStubs stubRequestsPassingTest:^BOOL(__unused NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(__unused NSURLRequest *request) { + return [OHHTTPStubsResponse responseWithData:[NSJSONSerialization dataWithJSONObject:stubResponseData options:NSJSONWritingPrettyPrinted error:NULL] statusCode:200 headers:@{@"Content-Type": @"application/json"}]; + }]; + + [http POST:@"" parameters:@{@"hey": @"now"} completion:^(BTJSON *body, __unused NSHTTPURLResponse *response, __unused NSError *error) { + XCTAssertEqualObjects([body asDictionary], stubResponseData); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +#pragma mark - Headers + +- (void)testRequests_sendUserAgentHeader { + XCTestExpectation *expectation = [self expectationWithDescription:@"callback invoked"]; + http.session = [self fakeSession]; + + [http POST:@"" parameters:nil completion:^(BTJSON *body, __unused NSHTTPURLResponse *response, __unused NSError *error) { + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + NSDictionary *requestHeaders = httpRequest.allHTTPHeaderFields; + expect(requestHeaders[@"User-Agent"]).to.match(@"^Braintree/iOS/\\d+\\.\\d+\\.\\d+(-[0-9a-zA-Z-]+)?$"); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testRequests_sendBraintreeVersionHeader { + XCTestExpectation *expectation = [self expectationWithDescription:@"callback invoked"]; + http.session = [self fakeSession]; + + [http POST:@"" parameters:nil completion:^(BTJSON *body, __unused NSHTTPURLResponse *response, __unused NSError *error) { + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + NSDictionary *requestHeaders = httpRequest.allHTTPHeaderFields; + XCTAssertEqualObjects(requestHeaders[@"Braintree-Version"], @"2018-03-06"); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testRequests_whenUsingTokenizationKey_sendsItInHeaders { + XCTestExpectation *expectation = [self expectationWithDescription:@"callback invoked"]; + + http = [[BTGraphQLHTTP alloc] initWithBaseURL:[BTHTTPTestProtocol testBaseURL] tokenizationKey:@"development_testing_key"]; + http.session = [self fakeSession]; + + [http POST:@"" parameters:nil completion:^(BTJSON *body, __unused NSHTTPURLResponse *response, __unused NSError *error) { + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + NSDictionary *requestHeaders = httpRequest.allHTTPHeaderFields; + XCTAssertEqualObjects(requestHeaders[@"Authorization"], @"Bearer development_testing_key"); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testRequests_whenUsingAuthorizationFingerprint_sendsItInHeaders { + XCTestExpectation *expectation = [self expectationWithDescription:@"callback invoked"]; + http.session = [self fakeSession]; + + [http POST:@"" parameters:nil completion:^(BTJSON *body, __unused NSHTTPURLResponse *response, __unused NSError *error) { + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + NSDictionary *requestHeaders = httpRequest.allHTTPHeaderFields; + XCTAssertEqualObjects(requestHeaders[@"Authorization"], @"Bearer test-authorization-fingerprint"); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +#pragma mark - Error handling + +- (void)testErrorResponse_whenErrorTypeIsUserError_containsExpectedError { + id stubGraphQLErrorResponse = @{ + @"data": @{@"tokenizeCreditCard": NSNull.null}, + @"errors": @[ + @{ + @"message": @"Expiration month is invalid", + @"path": @[@"tokenizeCreditCard"], + @"locations": @[ + @{@"line": @(1), @"column": @(66)} + ], + @"extensions": @{ + @"errorType": @"user_error", + @"legacyCode": @"81712", + @"inputPath": @[@"input", @"creditCard", @"expirationMonth"] + } + }, + @{ + @"message": @"Expiration year is invalid", + @"path": @[@"tokenizeCreditCard"], + @"locations": @[ + @{@"line": @(1), @"column": @(66)} + ], + @"extensions": @{ + @"errorType": @"user_error", + @"legacyCode": @"81713", + @"inputPath": @[@"input", @"creditCard", @"expirationYear"] + } + }, + @{ + @"message": @"CVV verification failed", + @"path": @[@"tokenizeCreditCard"], + @"locations": @[ + @{@"line": @(1), @"column": @(66)} + ], + @"extensions": @{ + @"errorType": @"user_error", + @"legacyCode": @"81736", + @"inputPath": @[@"input", @"creditCard", @"cvv"] + } + }, + @{ + @"message": @"Street address verification failed", + @"path": @[@"tokenizeCreditCard"], + @"locations": @[ + @{@"line": @(1), @"column": @(66)} + ], + @"extensions": @{ + @"errorType": @"user_error", + @"legacyCode": @"12345", + @"inputPath": @[@"input", @"creditCard", @"billingAddress", @"streetAddress"] + } + } + ], + @"extensions": @{@"requestId": @"de1f7c67-4861-455f-89bb-1d208915f270"} + }; + id expectedErrorBody = @{ + @"error": @{@"message": @"Input is invalid"}, + @"fieldErrors": @[ + @{ + @"field": @"creditCard", + @"fieldErrors": @[ + @{ + @"field": @"expirationMonth", + @"code": @"81712", + @"message": @"Expiration month is invalid" + }, + @{ + @"field": @"expirationYear", + @"code": @"81713", + @"message": @"Expiration year is invalid" + }, + @{ + @"field": @"cvv", + @"code": @"81736", + @"message": @"CVV verification failed" + }, + @{ + @"field": @"billingAddress", + @"fieldErrors": @[ + @{ + @"field": @"streetAddress", + @"code": @"12345", + @"message": @"Street address verification failed" + } + ] + } + ] + } + ] + }; + + [OHHTTPStubs stubRequestsPassingTest:^BOOL(__unused NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(__unused NSURLRequest *request) { + return [OHHTTPStubsResponse responseWithData:[NSJSONSerialization dataWithJSONObject:stubGraphQLErrorResponse options:NSJSONWritingPrettyPrinted error:NULL] statusCode:200 headers:@{@"Content-Type": @"application/json"}]; + }]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"callback invoked"]; + [http POST:@"" completion:^(BTJSON *body, __unused NSHTTPURLResponse *response, NSError *error) { + XCTAssertEqualObjects(body.asDictionary, expectedErrorBody); + XCTAssertEqualObjects([error.userInfo[BTHTTPJSONResponseBodyKey] asDictionary], expectedErrorBody); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testErrorResponse_whenErrorTypeIsNotUserError_containsExpectedError { + id stubGraphQLErrorResponse = @{ + @"data": @{@"tokenizeCard": NSNull.null}, + @"errors": @[ + @{ + @"message": @"Validation is not supported for requests authorized with a tokenization key.", + @"locations": @[ + @{ + @"line": @(2), + @"column": @(9) + } + ], + @"path": @[ + @"tokenizeCreditCard" + ], + @"extensions": @{ + @"errorType": @"developer_error", + @"legacyCode": @"50000", + @"inputPath": @[@"input", @"options", @"validate"] + } + } + ] + }; + id expectedErrorBody = @{ + @"error": @{@"message": @"Validation is not supported for requests authorized with a tokenization key."} + }; + + [OHHTTPStubs stubRequestsPassingTest:^BOOL(__unused NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(__unused NSURLRequest *request) { + return [OHHTTPStubsResponse responseWithData:[NSJSONSerialization dataWithJSONObject:stubGraphQLErrorResponse options:NSJSONWritingPrettyPrinted error:NULL] statusCode:200 headers:@{@"Content-Type": @"application/json"}]; + }]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"callback invoked"]; + [http POST:@"" completion:^(BTJSON *body, __unused NSHTTPURLResponse *response, NSError *error) { + XCTAssertEqualObjects(body.asDictionary, expectedErrorBody); + XCTAssertEqualObjects([error.userInfo[BTHTTPJSONResponseBodyKey] asDictionary], expectedErrorBody); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testErrorResponse_withNoErrorType_containsGenericMessage { + id stubGraphQLErrorResponse = @{ + @"data": NSNull.null, + @"errors": @[ + @{@"message": @"This is a bad error message"} + ] + }; + id expectedNestedErrorBody = @{ + @"error": @{@"message": @"An unexpected error occurred"} + }; + + [OHHTTPStubs stubRequestsPassingTest:^BOOL(__unused NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(__unused NSURLRequest *request) { + return [OHHTTPStubsResponse responseWithData:[NSJSONSerialization dataWithJSONObject:stubGraphQLErrorResponse options:NSJSONWritingPrettyPrinted error:NULL] statusCode:200 headers:@{@"Content-Type": @"application/json"}]; + }]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"callback invoked"]; + [http POST:@"" completion:^(BTJSON *body, __unused NSHTTPURLResponse *response, NSError *error) { + XCTAssertEqualObjects(body.asDictionary, expectedNestedErrorBody); + XCTAssertEqualObjects([error.userInfo[BTHTTPJSONResponseBodyKey] asDictionary], expectedNestedErrorBody); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testErrorResponse_withGarbage_containsGenericMessage { + id stubGraphQLErrorResponse = @"something went wrong"; + id expectedErrorBody = @{ + @"error": @{@"message": @"An unexpected error occurred"} + }; + + [OHHTTPStubs stubRequestsPassingTest:^BOOL(__unused NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(__unused NSURLRequest *request) { + return [OHHTTPStubsResponse responseWithData:[stubGraphQLErrorResponse dataUsingEncoding:NSUTF8StringEncoding] statusCode:200 headers:@{@"Content-Type": @"text/plain; charset=UTF-8"}]; + }]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"callback invoked"]; + [http POST:@"" completion:^(BTJSON *body, __unused NSHTTPURLResponse *response, NSError *error) { + XCTAssertEqualObjects(body.asDictionary, expectedErrorBody); + XCTAssertEqualObjects([error.userInfo[BTHTTPJSONResponseBodyKey] asDictionary], expectedErrorBody); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testErrorResponse_correctlyMapsErrorTypeToStatusCode { + NSDictionary *errorTypes = @{ + @"user_error": @(422), + @"developer_error": @(403), + @"unknown_error": @(500) + }; + NSDictionary *errorCodes = @{ + @"user_error": @(BTHTTPErrorCodeClientError), + @"developer_error": @(BTHTTPErrorCodeClientError), + @"unknown_error": @(BTHTTPErrorCodeServerError) + }; + + for (NSString *errorType in errorTypes) { + NSNumber *expectedStatusCode = errorTypes[errorType]; + id stubGraphQLErrorResponse = @{ + @"errors": @[ + @{ + @"extensions": @{ + @"errorType": errorType + } + } + ] + }; + + + id stub = [OHHTTPStubs stubRequestsPassingTest:^BOOL(__unused NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(__unused NSURLRequest *request) { + return [OHHTTPStubsResponse responseWithData:[NSJSONSerialization dataWithJSONObject:stubGraphQLErrorResponse options:NSJSONWritingPrettyPrinted error:NULL] statusCode:200 headers:@{@"Content-Type": @"application/json"}]; + }]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"callback invoked"]; + [http POST:@"" completion:^(__unused BTJSON *body, __unused NSHTTPURLResponse *response, NSError *error) { + NSHTTPURLResponse *nestedResponse = error.userInfo[BTHTTPURLResponseKey]; + XCTAssertEqual(nestedResponse.statusCode, expectedStatusCode.longValue); + + XCTAssertEqualObjects(error.domain, BTHTTPErrorDomain); + XCTAssertEqual(error.code, errorCodes[errorType].longValue); + + [OHHTTPStubs removeStub:stub]; + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; + } +} + +- (void)testNetworkError_returnsError { + [OHHTTPStubs stubRequestsPassingTest:^BOOL(__unused NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(__unused NSURLRequest *request) { + return [OHHTTPStubsResponse responseWithError:[NSError errorWithDomain:NSURLErrorDomain code:-1002 userInfo:@{}]]; + }]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"callback invoked"]; + [http POST:@"" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNil(body); + XCTAssertNil(response); + XCTAssertEqualObjects(error.domain, NSURLErrorDomain); + XCTAssertEqual(error.code, -1002); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + + +// TODO - add test for getRequestSslCertificateSuccessful, getRequestBadCertificateCheck for sandbox/prod in integration tests + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTHTTPSpec.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTHTTPSpec.m new file mode 100644 index 0000000..2a78c14 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTHTTPSpec.m @@ -0,0 +1,1044 @@ +#import "BTHTTP.h" +#import "BTHTTPTestProtocol.h" +#import "BTSpecHelper.h" +#import +#import + +NSURL *validDataURL() { + NSDictionary *validObject = @{@"clientId":@"a-client-id", @"nest": @{@"nested":@"nested-value"}}; + NSError *jsonSerializationError; + NSData *configurationData = [NSJSONSerialization dataWithJSONObject:validObject + options:0 + error:&jsonSerializationError]; + NSString *base64EncodedConfigurationData = [configurationData base64EncodedStringWithOptions:0]; + NSString *dataURLString = [NSString stringWithFormat:@"data:application/json;base64,%@", base64EncodedConfigurationData]; + return [NSURL URLWithString:dataURLString]; +} + +NSDictionary *parameterDictionary() { + return @{@"stringParameter": @"value", + @"crazyStringParameter[]": @"crazy%20and&value", + @"numericParameter": @42, + @"trueBooleanParameter": @YES, + @"falseBooleanParameter": @NO, + @"dictionaryParameter": @{ @"dictionaryKey": @"dictionaryValue" }, + @"arrayParameter": @[@"arrayItem1", @"arrayItem2"] + }; +} + +void withStub(void (^block)(void (^removeStub)(void))) { + id stub = [OHHTTPStubs stubRequestsPassingTest:^BOOL(__unused NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(__unused NSURLRequest *request) { + NSData *jsonResponse = [NSJSONSerialization dataWithJSONObject:@{@"requestHeaders": [request allHTTPHeaderFields]} options:NSJSONWritingPrettyPrinted error:nil]; + return [OHHTTPStubsResponse responseWithData:jsonResponse statusCode:200 headers:@{@"Content-Type": @"application/json"}]; + }]; + + block(^{ + [OHHTTPStubs removeStub:stub]; + }); +} + +NSURLSession *testURLSession() { + NSURLSessionConfiguration *testConfiguration = [NSURLSessionConfiguration ephemeralSessionConfiguration]; + [testConfiguration setProtocolClasses:@[[BTHTTPTestProtocol class]]]; + return [NSURLSession sessionWithConfiguration:testConfiguration]; +} + +@interface BTHTTPSpec : XCTestCase +@end + +@implementation BTHTTPSpec { + BTHTTP *http; + id stubDescriptor; +} + +#pragma mark - performing a request + +- (void)setUp { + [super setUp]; + + http = [[BTHTTP alloc] initWithBaseURL:[BTHTTPTestProtocol testBaseURL] authorizationFingerprint:@"test-authorization-fingerprint"]; + http.session = testURLSession(); +} + +- (void)tearDown { + [OHHTTPStubs removeAllStubs]; + + [super tearDown]; +} + +#pragma mark - base URL + +- (void)testRequests_useTheSpecifiedURLScheme { + XCTestExpectation *expectation = [self expectationWithDescription:@"GET callback"]; + + [http GET:@"200.json" completion:^(BTJSON *body, __unused NSHTTPURLResponse *response, NSError *error) { + XCTAssertNil(error); + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + + XCTAssertEqualObjects(httpRequest.URL.scheme, @"bt-http-test"); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testRequests_useTheHostAtTheBaseURL { + XCTestExpectation *expectation = [self expectationWithDescription:@"GET callback"]; + + [http GET:@"200.json" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + + expect(httpRequest.URL.absoluteString).to.startWith(@"bt-http-test://base.example.com:1234/base/path/200.json"); + + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testItAppendsThePathToTheBaseURL { + waitUntil(^(DoneCallback done){ + [self->http GET:@"200.json" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + + expect(httpRequest.URL.path).to.equal(@"/base/path/200.json"); + done(); + }]; + }); +} + +- (void)test_whenThePathIsNil_itHitsTheBaseURL { + waitUntil(^(DoneCallback done){ + [self->http GET:@"/" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + + expect(httpRequest.URL.path).to.equal(@"/base/path"); + done(); + }]; + }); + + pending(@"returns a json serialization error if the parameters cannot be serialized"); + pending(@"appends the authorization fingerprint to all requests"); +} + +#pragma mark - data base URLs + +- (void)testReturnsTheData { + waitUntil(^(DoneCallback done) { + self->http = [[BTHTTP alloc] initWithBaseURL:validDataURL() authorizationFingerprint:@"test-authorization-fingerprint"]; + + [self->http GET:@"/" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + + expect([body[@"clientId"] asString]).to.equal(@"a-client-id"); + expect([body[@"nest"][@"nested"] asString]).to.equal(@"nested-value"); + done(); + }]; + }); +} + +- (void)testIgnoresPOSTData { + XCTestExpectation *expectation = [self expectationWithDescription:@"Perform request"]; + + http = [[BTHTTP alloc] initWithBaseURL:validDataURL() authorizationFingerprint:@"test-authorization-fingerprint"]; + + [http POST:@"/" parameters:@{@"a-post-param":@"POST"} completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + + expect(response.statusCode).to.equal(200); + expect(error).to.beNil(); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:10 handler:nil]; +} + +- (void)testIgnoresGETParameters { + XCTestExpectation *expectation = [self expectationWithDescription:@"Perform request"]; + + http = [[BTHTTP alloc] initWithBaseURL:validDataURL() authorizationFingerprint:@"test-authorization-fingerprint"]; + + [http GET:@"/" parameters:@{@"a-get-param": @"GET"} completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + + expect(response.statusCode).to.equal(200); + expect(error).to.beNil(); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:10 handler:nil]; +} +- (void)testIgnoresTheSpecifiedPath { + XCTestExpectation *expectation = [self expectationWithDescription:@"Perform request"]; + + http = [[BTHTTP alloc] initWithBaseURL:validDataURL() authorizationFingerprint:@"test-authorization-fingerprint"]; + + [http GET:@"/resource" completion:^(__unused BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + + expect(response.statusCode).to.equal(200); + expect(error).to.beNil(); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:10 handler:nil]; +} + +- (void)testSetsTheContentTypeHeader { + NSURL *dataURL = [NSURL URLWithString:@"data:text/plain;base64,SGVsbG8sIFdvcmxkIQo="]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Perform request"]; + + http = [[BTHTTP alloc] initWithBaseURL:dataURL authorizationFingerprint:@"test-authorization-fingerprint"]; + + [http GET:@"/" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNil(body); + XCTAssertNil(response); + expect(error.domain).to.equal(BTHTTPErrorDomain); + expect(error.code).to.equal(BTHTTPErrorCodeResponseContentTypeNotAcceptable); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:10 handler:nil]; +} + +- (void)testSetsTheResponseStatusCode { + XCTestExpectation *expectation = [self expectationWithDescription:@"Perform request"]; + + http = [[BTHTTP alloc] initWithBaseURL:validDataURL() authorizationFingerprint:@"test-authorization-fingerprint"]; + + [http GET:@"/" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + + expect(response.statusCode).notTo.beNil(); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:10 handler:nil]; +} + +- (void)testFailsLikeAnHTTP500WhenTheBase64EncodedDataIsInvalid { + XCTestExpectation *expectation = [self expectationWithDescription:@"Perform request"]; + + NSString *dataURLString = [NSString stringWithFormat:@"data:application/json;base64,%@", @"BAD-BASE-64-STRING"]; + + http = [[BTHTTP alloc] initWithBaseURL:[NSURL URLWithString:dataURLString] authorizationFingerprint:@"test-authorization-fingerprint"]; + [http GET:@"/" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNil(body); + XCTAssertNil(response); + XCTAssertNotNil(error); + + expect(response).to.beNil(); + expect(error).notTo.beNil(); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:10 handler:nil]; +} + +#pragma mark - HTTP methods + +- (void)testSendsGETRequest { + waitUntil(^(DoneCallback done){ + [self->http GET:@"200.json" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + expect(httpRequest.URL.path).to.match(@"/200.json$"); + expect(httpRequest.HTTPMethod).to.equal(@"GET"); + expect(httpRequest.HTTPBody).to.beNil(); + done(); + }]; + }); +} + +- (void)testSendsGETRequestWithParameters { + waitUntil(^(DoneCallback done){ + [self->http GET:@"200.json" parameters:@{@"param": @"value"} completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + expect(httpRequest.URL.path).to.match(@"/200.json$"); + expect(httpRequest.URL.query).to.contain(@"param=value"); + expect(httpRequest.HTTPMethod).to.equal(@"GET"); + expect(httpRequest.HTTPBody).to.beNil(); + done(); + }]; + }); +} + +- (void)testSendsPOSTRequest { + waitUntil(^(DoneCallback done) { + [self->http POST:@"200.json" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + expect(httpRequest.URL.path).to.match(@"/200.json$"); + expect(httpRequest.HTTPBody).to.beNil(); + expect(httpRequest.HTTPMethod).to.equal(@"POST"); + expect(httpRequest.URL.query).to.beNil(); + done(); + }]; + }); +} + +- (void)testSendsPOSTRequestWithParameters { + waitUntil(^(DoneCallback done) { + [self->http POST:@"200.json" parameters:@{@"param": @"value"} completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + NSString *httpRequestBody = [BTHTTPTestProtocol parseRequestBodyFromTestResponseBody:body]; + expect(httpRequest.URL.path).to.match(@"/200.json$"); + BTJSON *json = [[BTJSON alloc] initWithData:[httpRequestBody dataUsingEncoding:NSUTF8StringEncoding]]; + expect([json[@"param"] asString]).to.equal(@"value"); + expect(httpRequest.HTTPMethod).to.equal(@"POST"); + expect(httpRequest.URL.query).to.beNil(); + done(); + }]; + }); +} + +- (void)testSendsPUTRequest { + waitUntil(^(DoneCallback done) { + [self->http PUT:@"200.json" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + expect(httpRequest.URL.path).to.match(@"200.json$"); + expect(httpRequest.HTTPBody).to.beNil(); + expect(httpRequest.HTTPMethod).to.equal(@"PUT"); + expect(httpRequest.URL.query).to.beNil(); + done(); + }]; + }); +} + +- (void)testSendsPUTRequestWithParameters { + waitUntil(^(DoneCallback done) { + [self->http PUT:@"200.json" parameters:@{@"param": @"value"} completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + NSString *httpRequestBody = [BTHTTPTestProtocol parseRequestBodyFromTestResponseBody:body]; + expect(httpRequest.URL.path).to.match(@"200.json$"); + BTJSON *json = [[BTJSON alloc] initWithData:[httpRequestBody dataUsingEncoding:NSUTF8StringEncoding]]; + expect([json[@"param"] asString]).to.equal(@"value"); + expect(httpRequest.HTTPMethod).to.equal(@"PUT"); + expect(httpRequest.URL.query).to.beNil(); + done(); + }]; + }); +} + + +- (void)testSendsADELETERequest { + waitUntil(^(DoneCallback done){ + [self->http DELETE:@"200.json" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + expect(httpRequest.URL.path).to.match(@"200.json$"); + expect(httpRequest.HTTPBody).to.beNil(); + expect(httpRequest.HTTPMethod).to.equal(@"DELETE"); + done(); + }]; + }); +} + +- (void)testSendsDELETERequestWithParameters { + waitUntil(^(DoneCallback done) { + [self->http DELETE:@"200.json" parameters:@{@"param": @"value"} completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + + expect(httpRequest.URL.path).to.match(@"/200.json$"); + expect(httpRequest.URL.query).to.contain(@"param=value"); + expect(httpRequest.HTTPMethod).to.equal(@"DELETE"); + expect(httpRequest.HTTPBody).to.beNil(); + done(); + }]; + }); +} + +#pragma mark Authentication + +- (void)testGETRequests_whenBTHTTPInitializedWithAuthorizationFingerprint_sendAuthorizationInQueryParams { + waitUntil(^(DoneCallback done){ + [self->http GET:@"200.json" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + expect(httpRequest.URL.query).to.equal(@"authorization_fingerprint=test-authorization-fingerprint"); + + done(); + }]; + }); +} + +- (void)testGETRequests_whenBTHTTPInitializedWithTokenizationKey_sendTokenizationKeyInHeader { + http = [[BTHTTP alloc] initWithBaseURL:[BTHTTPTestProtocol testBaseURL] tokenizationKey:@"development_tokenization_key"]; + http.session = testURLSession(); + + XCTestExpectation *expectation = [self expectationWithDescription:@"GET callback"]; + [http GET:@"200.json" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + + XCTAssertEqualObjects(httpRequest.allHTTPHeaderFields[@"Client-Key"], @"development_tokenization_key"); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testPOSTRequests_whenBTHTTPInitializedWithAuthorizationFingerprint_sendAuthorizationInBody { + waitUntil(^(DoneCallback done){ + [self->http POST:@"200.json" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + + NSString *httpRequestBody = [BTHTTPTestProtocol parseRequestBodyFromTestResponseBody:body]; + expect(httpRequestBody).to.equal(@"{\"authorization_fingerprint\":\"test-authorization-fingerprint\"}"); + + done(); + }]; + }); +} + +- (void)testPOSTRequests_whenBTHTTPInitializedWithTokenizationKey_sendAuthorization { + http = [[BTHTTP alloc] initWithBaseURL:[BTHTTPTestProtocol testBaseURL] tokenizationKey:@"development_tokenization_key"]; + http.session = testURLSession(); + + XCTestExpectation *expectation = [self expectationWithDescription:@"GET callback"]; + [http POST:@"200.json" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + XCTAssertEqualObjects(httpRequest.allHTTPHeaderFields[@"Client-Key"], @"development_tokenization_key"); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testPUTRequests_whenBTHTTPInitializedWithAuthorizationFingerprint_sendAuthorizationInBody { + waitUntil(^(DoneCallback done){ + [self->http PUT:@"200.json" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + + NSString *httpRequestBody = [BTHTTPTestProtocol parseRequestBodyFromTestResponseBody:body]; + expect(httpRequestBody).to.equal(@"{\"authorization_fingerprint\":\"test-authorization-fingerprint\"}"); + + done(); + }]; + }); +} + +- (void)testPUTRequests_whenBTHTTPInitializedWithTokenizationKey_sendAuthorization { + http = [[BTHTTP alloc] initWithBaseURL:[BTHTTPTestProtocol testBaseURL] tokenizationKey:@"development_tokenization_key"]; + http.session = testURLSession(); + + XCTestExpectation *expectation = [self expectationWithDescription:@"GET callback"]; + [http PUT:@"200.json" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + XCTAssertEqualObjects(httpRequest.allHTTPHeaderFields[@"Client-Key"], @"development_tokenization_key"); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testDELETERequests_whenBTHTTPInitializedWithAuthorizationFingerprint_sendAuthorizationInQueryParams { + waitUntil(^(DoneCallback done) { + [self->http DELETE:@"200.json" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + expect(httpRequest.URL.query).to.equal(@"authorization_fingerprint=test-authorization-fingerprint"); + + done(); + }]; + }); +} + +- (void)testDELETERequests_whenBTHTTPInitializedWithTokenizationKey_sendAuthorization { + http = [[BTHTTP alloc] initWithBaseURL:[BTHTTPTestProtocol testBaseURL] tokenizationKey:@"development_tokenization_key"]; + http.session = testURLSession(); + + XCTestExpectation *expectation = [self expectationWithDescription:@"GET callback"]; + [http DELETE:@"200.json" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + XCTAssertEqualObjects(httpRequest.allHTTPHeaderFields[@"Client-Key"], @"development_tokenization_key"); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +#pragma mark - default headers + +- (void)testIncludeAccept { + waitUntil(^(DoneCallback done){ + withStub(^(void (^removeStub)(void)){ + [self->http GET:@"stub://200/resource" parameters:nil completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + NSDictionary *requestHeaders = httpRequest.allHTTPHeaderFields; + expect(requestHeaders[@"Accept"]).to.equal(@"application/json"); + removeStub(); + done(); + }]; + }); + }); +} + +- (void)testIncludeUserAgent { + waitUntil(^(DoneCallback done){ + withStub(^(void (^removeStub)(void)){ + [self->http GET:@"stub://200/resource" parameters:nil completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + NSDictionary *requestHeaders = httpRequest.allHTTPHeaderFields; + expect(requestHeaders[@"User-Agent"]).to.match(@"^Braintree/iOS/\\d+\\.\\d+\\.\\d+(-[0-9a-zA-Z-]+)?$"); + removeStub(); + done(); + }]; + }); + }); +} + +- (void)testIncludeAcceptLanguage { + waitUntil(^(DoneCallback done) { + withStub(^(void (^removeStub)(void)) { + [self->http GET:@"stub://200/resource" parameters:nil completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + NSDictionary *requestHeaders = httpRequest.allHTTPHeaderFields; + NSLocale *locale = [NSLocale currentLocale]; + NSString *expectedLanguageString = [NSString stringWithFormat:@"%@-%@", [locale objectForKey:NSLocaleLanguageCode], [locale objectForKey:NSLocaleCountryCode]]; + expect(requestHeaders[@"Accept-Language"]).to.equal(expectedLanguageString); + removeStub(); + done(); + }]; + }); + }); +} + + +#pragma mark parameters + +#pragma mark in GET requests +- (void)testTransmitsTheParametersAsURLEncodedQueryParameters { + waitUntil(^(DoneCallback done){ + NSArray *expectedQueryParameters = @[ @"numericParameter=42", + @"falseBooleanParameter=0", + @"dictionaryParameter%5BdictionaryKey%5D=dictionaryValue", + @"trueBooleanParameter=1", + @"stringParameter=value", + @"crazyStringParameter%5B%5D=crazy%2520and%26value", + @"arrayParameter%5B%5D=arrayItem1", + @"arrayParameter%5B%5D=arrayItem2" ]; + + [self->http GET:@"200.json" parameters:parameterDictionary() completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + NSArray *actualQueryComponents = [httpRequest.URL.query componentsSeparatedByString:@"&"]; + + for(NSString *expectedComponent in expectedQueryParameters){ + expect(actualQueryComponents).to.contain(expectedComponent); + } + + done(); + }]; + }); +} + +#pragma mark in non-GET requests + +- (void)testTransmitsTheParametersAsJSON { + waitUntil(^(DoneCallback done){ + NSDictionary *expectedParameters = @{ @"numericParameter": @42, + @"falseBooleanParameter": @NO, + @"dictionaryParameter": @{ + @"dictionaryKey": @"dictionaryValue" + }, + @"trueBooleanParameter": @YES, + @"stringParameter": @"value", + @"crazyStringParameter[]": @"crazy%20and&value", + @"arrayParameter": @[ @"arrayItem1", @"arrayItem2" ], + @"authorization_fingerprint": @"test-authorization-fingerprint" }; + + [self->http POST:@"200.json" parameters:parameterDictionary() completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + + NSURLRequest *httpRequest = [BTHTTPTestProtocol parseRequestFromTestResponseBody:body]; + NSString *httpRequestBody = [BTHTTPTestProtocol parseRequestBodyFromTestResponseBody:body]; + + expect([httpRequest valueForHTTPHeaderField:@"Content-type"]).to.equal(@"application/json; charset=utf-8"); + NSDictionary *actualParameters = [NSJSONSerialization JSONObjectWithData:[httpRequestBody dataUsingEncoding:NSUTF8StringEncoding] + options:0 + error:NULL]; + expect(actualParameters).to.equal(expectedParameters); + done(); + }]; + }); +} + +#pragma mark interpreting responses + +- (void)testCallsBackOnMainQueue { + XCTestExpectation *expectation = [self expectationWithDescription:@"receive callback"]; + [http GET:@"200.json" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + expect(dispatch_get_current_queue()).to.equal(dispatch_get_main_queue()); +#pragma clang diagnostic pop + [expectation fulfill]; + }]; + [self waitForExpectationsWithTimeout:10 handler:nil]; +} + +- (void)testCallsBackOnSpecifiedQueue { + XCTestExpectation *expectation = [self expectationWithDescription:@"receive callback"]; + http.dispatchQueue = dispatch_queue_create("com.braintreepayments.BTHTTPSpec.callbackQueueTest", DISPATCH_QUEUE_SERIAL); + [http GET:@"200.json" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + expect(dispatch_get_current_queue()).to.equal(self->http.dispatchQueue); +#pragma clang diagnostic pop + [expectation fulfill]; + }]; + [self waitForExpectationsWithTimeout:10 handler:nil]; +} + +#pragma mark response code parser + +- (void)testInterprets2xxAsACompletionWithSuccess { + http = [[BTHTTP alloc] initWithBaseURL:[NSURL URLWithString:@"stub://stub"] authorizationFingerprint:@"test-authorization-fingerprint"]; + + waitUntil(^(DoneCallback done){ + idstub = [OHHTTPStubs stubRequestsPassingTest:^BOOL(__unused NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(__unused NSURLRequest *request) { + return [OHHTTPStubsResponse responseWithData:[NSJSONSerialization dataWithJSONObject:@{} options:NSJSONWritingPrettyPrinted error:NULL] statusCode:200 headers:@{@"Content-Type": @"application/json"}]; + }]; + + [self->http GET:@"200.json" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + + expect(response.statusCode).to.equal(200); + + expect(error).to.beNil(); + + [OHHTTPStubs removeStub:stub]; + done(); + }]; + }); +} + +- (void)testResponseCodeParsing_whenStatusCodeIs4xx_returnsError { + http = [[BTHTTP alloc] initWithBaseURL:[NSURL URLWithString:@"stub://stub"] authorizationFingerprint:@"test-authorization-fingerprint"]; + NSDictionary *errorBody = @{ + @"error": @{ + @"message": @"This is an error message from the gateway" + } + }; + + XCTestExpectation *expectation = [self expectationWithDescription:@"GET callback"]; + + idstub = [OHHTTPStubs stubRequestsPassingTest:^BOOL(__unused NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(__unused NSURLRequest *request) { + return [OHHTTPStubsResponse responseWithData:[NSJSONSerialization dataWithJSONObject:errorBody options:NSJSONWritingPrettyPrinted error:NULL] statusCode:403 headers:@{@"Content-Type": @"application/json"}]; + }]; + + [http GET:@"403.json" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertEqualObjects(body.asDictionary, errorBody); + XCTAssertNotNil(response); + XCTAssertEqualObjects(error.domain, BTHTTPErrorDomain); + XCTAssertEqual(error.code, BTHTTPErrorCodeClientError); + XCTAssertEqualObjects(((BTJSON *)error.userInfo[BTHTTPJSONResponseBodyKey]).asDictionary, errorBody); + XCTAssertTrue([error.userInfo[BTHTTPURLResponseKey] isKindOfClass:[NSHTTPURLResponse class]]); + XCTAssertEqualObjects(error.localizedDescription, @"This is an error message from the gateway"); + XCTAssertNotNil(error.userInfo[NSLocalizedFailureReasonErrorKey]); + + [OHHTTPStubs removeStub:stub]; + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testResponseCodeParsingFromBraintreeAPI_whenStatusCodeIs4xx_returnsError { + http = [[BTHTTP alloc] initWithBaseURL:[NSURL URLWithString:@"stub://stub"] authorizationFingerprint:@"test-authorization-fingerprint"]; + NSDictionary *errorBody = @{ + @"error": @{ + @"developer_message": @"This is an error message from the gateway" + } + }; + + XCTestExpectation *expectation = [self expectationWithDescription:@"GET callback"]; + + idstub = [OHHTTPStubs stubRequestsPassingTest:^BOOL(__unused NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(__unused NSURLRequest *request) { + return [OHHTTPStubsResponse responseWithData:[NSJSONSerialization dataWithJSONObject:errorBody options:NSJSONWritingPrettyPrinted error:NULL] statusCode:403 headers:@{@"Content-Type": @"application/json"}]; + }]; + + [http GET:@"400.json" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertEqualObjects(body.asDictionary, errorBody); + XCTAssertNotNil(response); + XCTAssertEqualObjects(error.domain, BTHTTPErrorDomain); + XCTAssertEqual(error.code, BTHTTPErrorCodeClientError); + XCTAssertEqualObjects(((BTJSON *)error.userInfo[BTHTTPJSONResponseBodyKey]).asDictionary, errorBody); + XCTAssertTrue([error.userInfo[BTHTTPURLResponseKey] isKindOfClass:[NSHTTPURLResponse class]]); + XCTAssertEqualObjects(error.localizedDescription, @"This is an error message from the gateway"); + XCTAssertNotNil(error.userInfo[NSLocalizedFailureReasonErrorKey]); + + [OHHTTPStubs removeStub:stub]; + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testResponseCodeParsing_whenStatusCodeIs429_returnsRateLimitError { + http = [[BTHTTP alloc] initWithBaseURL:[NSURL URLWithString:@"stub://stub"] authorizationFingerprint:@"test-authorization-fingerprint"]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"GET callback"]; + + idstub = [OHHTTPStubs stubRequestsPassingTest:^BOOL(__unused NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(__unused NSURLRequest *request) { + return [OHHTTPStubsResponse responseWithData:[NSJSONSerialization dataWithJSONObject:@{} options:NSJSONWritingPrettyPrinted error:NULL] statusCode:429 headers:@{@"Content-Type": @"application/json"}]; + }]; + + [http GET:@"429.json" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertEqualObjects(body.asDictionary, @{}); + XCTAssertNotNil(response); + XCTAssertEqualObjects(error.domain, BTHTTPErrorDomain); + XCTAssertEqual(error.code, BTHTTPErrorCodeRateLimitError); + XCTAssertEqualObjects(((BTJSON *)error.userInfo[BTHTTPJSONResponseBodyKey]).asDictionary, @{}); + XCTAssertTrue([error.userInfo[BTHTTPURLResponseKey] isKindOfClass:[NSHTTPURLResponse class]]); + XCTAssertNotNil(error.userInfo[NSLocalizedFailureReasonErrorKey]); + XCTAssertEqualObjects(error.userInfo[NSLocalizedDescriptionKey], @"You are being rate-limited."); + XCTAssertEqualObjects(error.userInfo[NSLocalizedRecoverySuggestionErrorKey], @"Please try again in a few minutes."); + + [OHHTTPStubs removeStub:stub]; + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testResponseCodeParsing_whenStatusCodeIs5xx_returnsError { + http = [[BTHTTP alloc] initWithBaseURL:[NSURL URLWithString:@"stub://stub"] authorizationFingerprint:@"test-authorization-fingerprint"]; + NSDictionary *errorBody = @{ + @"error": @{ + @"message": @"This is an error message from the gateway" + } + }; + + XCTestExpectation *expectation = [self expectationWithDescription:@"GET callback"]; + + idstub = [OHHTTPStubs stubRequestsPassingTest:^BOOL(__unused NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(__unused NSURLRequest *request) { + return [OHHTTPStubsResponse responseWithData:[NSJSONSerialization dataWithJSONObject:errorBody options:NSJSONWritingPrettyPrinted error:NULL] statusCode:503 headers:@{@"Content-Type": @"application/json"}]; + }]; + + [http GET:@"403.json" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertEqualObjects(body.asDictionary, errorBody); + XCTAssertNotNil(response); + XCTAssertEqualObjects(error.domain, BTHTTPErrorDomain); + XCTAssertEqual(error.code, BTHTTPErrorCodeServerError); + XCTAssertEqualObjects(((BTJSON *)error.userInfo[BTHTTPJSONResponseBodyKey]).asDictionary, errorBody); + XCTAssertTrue([error.userInfo[BTHTTPURLResponseKey] isKindOfClass:[NSHTTPURLResponse class]]); + XCTAssertEqualObjects(error.localizedDescription, @"This is an error message from the gateway"); + XCTAssertEqualObjects(error.localizedRecoverySuggestion, @"Please try again later."); + XCTAssertNotNil(error.userInfo[NSLocalizedFailureReasonErrorKey]); + + [OHHTTPStubs removeStub:stub]; + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + + +- (void)testInterpretsTheNetworkBeingDownAsAnError { + http = [[BTHTTP alloc] initWithBaseURL:[NSURL URLWithString:@"stub://stub"] authorizationFingerprint:@"test-authorization-fingerprint"]; + + waitUntil(^(DoneCallback done){ + idstub = [OHHTTPStubs stubRequestsPassingTest:^BOOL(__unused NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(__unused NSURLRequest *request) { + return [OHHTTPStubsResponse responseWithError:[NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorNotConnectedToInternet userInfo:nil]]; + }]; + + [self->http GET:@"network-down" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + expect(body).to.beNil(); + expect(response).to.beNil(); + expect(error.domain).to.equal(NSURLErrorDomain); + expect(error.code).to.equal(NSURLErrorNotConnectedToInternet); + [OHHTTPStubs removeStub:stub]; + done(); + }]; + }); +} + +- (void)testInterpretsTheServerBeingUnavailableAsAnError { + http = [[BTHTTP alloc] initWithBaseURL:[NSURL URLWithString:@"stub://stub"] authorizationFingerprint:@"test-authorization-fingerprint"]; + + waitUntil(^(DoneCallback done){ + idstub = [OHHTTPStubs stubRequestsPassingTest:^BOOL(__unused NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(__unused NSURLRequest *request) { + return [OHHTTPStubsResponse responseWithError:[NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorCannotConnectToHost userInfo:nil]]; + }]; + + + [self->http GET:@"gateway-down" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + expect(body).to.beNil(); + expect(response).to.beNil(); + expect(error.domain).to.equal(NSURLErrorDomain); + expect(error.code).to.equal(NSURLErrorCannotConnectToHost); + [OHHTTPStubs removeStub:stub]; + done(); + }]; + }); +} + +#pragma mark response body parser + +- (void)testParsesAJSONResponseBody { + http = [[BTHTTP alloc] initWithBaseURL:[NSURL URLWithString:@"stub://stub"] authorizationFingerprint:@"test-authorization-fingerprint"]; + + waitUntil(^(DoneCallback done){ + idstub = [OHHTTPStubs stubRequestsPassingTest:^BOOL(__unused NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(__unused NSURLRequest *request) { + return [OHHTTPStubsResponse responseWithData:[@"{\"status\": \"OK\"}" dataUsingEncoding:NSUTF8StringEncoding] statusCode:200 headers:@{@"Content-Type": @"application/json"}]; + }]; + + [self->http GET:@"200.json" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error){ + XCTAssertNotNil(body); + XCTAssertNotNil(response); + XCTAssertNil(error); + + expect([body[@"status"] asString]).to.equal(@"OK"); + + [OHHTTPStubs removeStub:stub]; + done(); + }]; + }); +} + +- (void)testAcceptsEmptyResponses { + http = [[BTHTTP alloc] initWithBaseURL:[NSURL URLWithString:@"stub://stub"] authorizationFingerprint:@"test-authorization-fingerprint"]; + + waitUntil(^(DoneCallback done){ + idstub = [OHHTTPStubs stubRequestsPassingTest:^BOOL(__unused NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(__unused NSURLRequest *request) { + return [OHHTTPStubsResponse responseWithData:[[NSData alloc] init] statusCode:200 headers:@{@"Content-Type": @"application/json"}]; + }]; + + [self->http GET:@"empty.json" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error){ + expect(response.statusCode).to.equal(200); + expect(body).to.beKindOf([BTJSON class]); + expect(body.isObject).to.beTruthy(); + expect(body.asDictionary.count).to.equal(0); + expect(error).to.beNil(); + + [OHHTTPStubs removeStub:stub]; + done(); + }]; + }); +} + +- (void)testInterpretsInvalidJSONResponsesAsAJSONError { + http = [[BTHTTP alloc] initWithBaseURL:[NSURL URLWithString:@"stub://stub"] authorizationFingerprint:@"test-authorization-fingerprint"]; + + waitUntil(^(DoneCallback done){ + idstub = [OHHTTPStubs stubRequestsPassingTest:^BOOL(__unused NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(__unused NSURLRequest *request) { + return [OHHTTPStubsResponse responseWithData:[@"{ really invalid json ]" dataUsingEncoding:NSUTF8StringEncoding] statusCode:200 headers:@{@"Content-Type": @"application/json"}]; + }]; + + [self->http GET:@"invalid.json" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + expect(response).to.beNil(); + expect(body).to.beNil(); + expect(error.domain).to.equal(NSCocoaErrorDomain); + + [OHHTTPStubs removeStub:stub]; + done(); + }]; + }); +} + +- (void)testInterpretsNonJSONResponsesAsAContentTypeNotAcceptableError { + http = [[BTHTTP alloc] initWithBaseURL:[NSURL URLWithString:@"stub://stub"] authorizationFingerprint:@"test-authorization-fingerprint"]; + + waitUntil(^(DoneCallback done){ + idstub = [OHHTTPStubs stubRequestsPassingTest:^BOOL(__unused NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(__unused NSURLRequest *request) { + return [OHHTTPStubsResponse responseWithData:[@"response" dataUsingEncoding:NSUTF8StringEncoding] statusCode:200 headers:@{@"Content-Type": @"text/html"}]; + }]; + + [self->http GET:@"200.html" completion:^(BTJSON *body, NSHTTPURLResponse *response, NSError *error) { + XCTAssertNil(body); + XCTAssertNil(response); + XCTAssertNotNil(error); + + expect(response).to.beNil(); + + expect(error.domain).to.equal(BTHTTPErrorDomain); + expect(error.code).to.equal(BTHTTPErrorCodeResponseContentTypeNotAcceptable); + + [OHHTTPStubs removeStub:stub]; + done(); + }]; + }); +} + +- (void)testNoopsForANilCompletionBlock { + http = [[BTHTTP alloc] initWithBaseURL:[NSURL URLWithString:@"stub://stub"] authorizationFingerprint:@"test-authorization-fingerprint"]; + + waitUntil(^(DoneCallback done){ + setAsyncSpecTimeout(2); + + [self->http GET:@"200.json" parameters:nil completion:nil]; + + wait_for_potential_async_exceptions(done); + }); +} + +#pragma mark isEqual: + +- (void)testReturnsYESIfBTHTTPsHaveTheSameBaseURLAndAuthorizationFingerprint { + NSURL *baseURL = [NSURL URLWithString:@"an-url://hi"]; + BTHTTP *http1 = [[BTHTTP alloc] initWithBaseURL:baseURL authorizationFingerprint:@"test-authorization-fingerprint"]; + BTHTTP *http2 = [[BTHTTP alloc] initWithBaseURL:baseURL authorizationFingerprint:@"test-authorization-fingerprint"]; + + expect(http1).to.equal(http2); +} + +- (void)testReturnsNOIfBTHTTPsDoNotHaveTheSameBaseURL { + NSURL *baseURL1 = [NSURL URLWithString:@"an-url://hi"]; + NSURL *baseURL2 = [NSURL URLWithString:@"an-url://hi-again"]; + BTHTTP *http1 = [[BTHTTP alloc] initWithBaseURL:baseURL1 authorizationFingerprint:@"test-authorization-fingerprint"]; + BTHTTP *http2 = [[BTHTTP alloc] initWithBaseURL:baseURL2 authorizationFingerprint:@"test-authorization-fingerprint"]; + + expect(http1).notTo.equal(http2); +} + +- (void)testReturnsNOIfBTHTTPsDoNotHaveTheSameAuthorizationFingerprint { + NSURL *baseURL1 = [NSURL URLWithString:@"an-url://hi"]; + BTHTTP *http1 = [[BTHTTP alloc] initWithBaseURL:baseURL1 authorizationFingerprint:@"test-authorization-fingerprint"]; + BTHTTP *http2 = [[BTHTTP alloc] initWithBaseURL:baseURL1 authorizationFingerprint:@"OTHER"]; + + expect(http1).notTo.equal(http2); +} + +#pragma mark copy + +- (void)testReturnsADifferentInstance { + http = [[BTHTTP alloc] initWithBaseURL:[BTHTTPTestProtocol testBaseURL] authorizationFingerprint:@"test-authorization-fingerprint"]; + + expect(self->http).toNot.beIdenticalTo([http copy]); +} + +- (void)testReturnsAnEqualInstance { + http = [[BTHTTP alloc] initWithBaseURL:[BTHTTPTestProtocol testBaseURL] authorizationFingerprint:@"test-authorization-fingerprint"]; + + expect([self->http copy]).to.equal(http); +} + +- (void)testReturnedInstanceHasTheSameCertificates { + http = [[BTHTTP alloc] initWithBaseURL:[BTHTTPTestProtocol testBaseURL] authorizationFingerprint:@"test-authorization-fingerprint"]; + + BTHTTP *copiedHTTP = [http copy]; + expect(copiedHTTP.pinnedCertificates).to.equal(http.pinnedCertificates); +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTJSON_Tests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTJSON_Tests.swift new file mode 100644 index 0000000..7534a34 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTJSON_Tests.swift @@ -0,0 +1,295 @@ +import XCTest + +class BTJSON_Tests: XCTestCase { + func testEmptyJSON() { + let empty = BTJSON() + + XCTAssertNotNil(empty) + + XCTAssertTrue(empty.isObject) + + XCTAssertNil(empty.asString()) + XCTAssertNil(empty.asArray()) + XCTAssertNil(empty.asNumber()) + XCTAssertNil(empty.asURL()) + XCTAssertNil(empty.asStringArray()) + XCTAssertNil(empty.asError()) + + XCTAssertFalse(empty.isString) + XCTAssertFalse(empty.isNumber) + XCTAssertFalse(empty.isArray) + XCTAssertFalse(empty.isTrue) + XCTAssertFalse(empty.isFalse) + XCTAssertFalse(empty.isNull) + } + + func testInitializationFromValue() { + let string = BTJSON(value: "") + XCTAssertTrue(string.isString) + + let truth = BTJSON(value: true) + XCTAssertTrue(truth.isTrue) + + let falsehood = BTJSON(value: false) + XCTAssertTrue(falsehood.isFalse) + + let number = BTJSON(value: 42) + XCTAssertTrue(number.isNumber) + + let ary = BTJSON(value: [1,2,3]) + XCTAssertTrue(ary.isArray) + + let obj = BTJSON(value: ["one": 1, "two": 2]) + XCTAssertTrue(obj.isObject) + + let null = BTJSON(value: NSNull()) + XCTAssertTrue(null.isNull) + } + + func testInitializationFromEmptyData() { + let emptyDataJSON = BTJSON(data: Data()) + XCTAssertTrue(emptyDataJSON.isError) + } + + func testStringJSON() { + let JSON = "\"Hello, JSON!\"".data(using: String.Encoding.utf8)! + let string = BTJSON(data: JSON) + + XCTAssertTrue(string.isString) + XCTAssertEqual(string.asString()!, "Hello, JSON!") + } + + func testArrayJSON() { + let JSON = "[\"One\", \"Two\", \"Three\"]".data(using: String.Encoding.utf8)! + let array = BTJSON(data: JSON) + + XCTAssertTrue(array.isArray) + XCTAssertEqual((array as BTJSON).asArray()! as NSArray, ["One", "Two", "Three"]) + } + + func testArrayAccess() { + let JSON = "[\"One\", \"Two\", \"Three\"]".data(using: String.Encoding.utf8)! + let array = BTJSON(data: JSON) + + XCTAssertTrue(array[0].isString) + XCTAssertEqual(array[0].asString()!, "One") + XCTAssertEqual(array[1].asString()!, "Two") + XCTAssertEqual(array[2].asString()!, "Three") + + XCTAssertNil(array[3].asString()) + XCTAssertFalse(array[3].isString) + + XCTAssertNil((array["hello"] as AnyObject).asString()) + } + + func testObjectAccess() { + let JSON = "{ \"key\": \"value\" }".data(using: String.Encoding.utf8)! + let obj = BTJSON(data: JSON) + + XCTAssertEqual((obj["key"] as AnyObject).asString()!, "value") + + XCTAssertNil((obj["not present"] as AnyObject).asString()) + XCTAssertNil(obj[0].asString()) + + XCTAssertFalse((obj["not present"] as AnyObject).isError as Bool) + + XCTAssertTrue(obj[0].isError) + } + + func testParsingError() { + let JSON = "INVALID JSON".data(using: String.Encoding.utf8)! + let obj = BTJSON(data: JSON) + + XCTAssertTrue(obj.isError) + guard let error = obj.asError() as NSError? else {return} + XCTAssertEqual(error.domain, NSCocoaErrorDomain) + } + + func testMultipleErrorsTakesFirst() { + let JSON = "INVALID JSON".data(using: String.Encoding.utf8)! + let string = BTJSON(data: JSON) + + let error = (((string[0])["key"] as! BTJSON)[0]) + + XCTAssertTrue(error.isError as Bool) + guard let err = error.asError() as NSError? else {return} + XCTAssertEqual(err.domain, NSCocoaErrorDomain) + } + + func testNestedObjects() { + let JSON = "{ \"numbers\": [\"one\", \"two\", { \"tens\": 0, \"ones\": 1 } ], \"truthy\": true }".data(using: String.Encoding.utf8)! + let nested = BTJSON(data: JSON) + + XCTAssertEqual((nested["numbers"] as! BTJSON)[0].asString()!, "one") + XCTAssertEqual((nested["numbers"] as! BTJSON)[1].asString()!, "two") + XCTAssertEqual(((nested["numbers"] as! BTJSON)[2]["tens"] as! BTJSON).asNumber()!, NSDecimalNumber.zero) + XCTAssertEqual(((nested["numbers"] as! BTJSON)[2]["ones"] as! BTJSON).asNumber()!, NSDecimalNumber.one) + XCTAssertTrue((nested["truthy"] as! BTJSON).isTrue as Bool) + } + + func testTrueBoolInterpretation() { + let JSON = "true".data(using: String.Encoding.utf8)! + let truthy = BTJSON(data: JSON) + XCTAssertTrue(truthy.isTrue) + XCTAssertFalse(truthy.isFalse) + } + + func testFalseBoolInterpretation() { + let JSON = "false".data(using: String.Encoding.utf8)! + let truthy = BTJSON(data: JSON) + XCTAssertFalse(truthy.isTrue) + XCTAssertTrue(truthy.isFalse) + } + + func testAsURL() { + let JSON = "{ \"url\": \"http://example.com\" }".data(using: String.Encoding.utf8)! + let url = BTJSON(data: JSON) + XCTAssertEqual((url["url"] as AnyObject).asURL()!, URL(string: "http://example.com")!) + } + + func testAsURLForInvalidValue() { + let JSON = "{ \"url\": 42 }".data(using: String.Encoding.utf8)! + let url = BTJSON(data: JSON) + XCTAssertNil((url["url"] as AnyObject).asURL()) + } + + func testAsStringArray() { + let JSON = "[\"one\", \"two\", \"three\"]".data(using: String.Encoding.utf8)! + let stringArray = BTJSON(data: JSON) + XCTAssertEqual(stringArray.asStringArray()!, ["one", "two", "three"]) + } + + func testAsStringArrayForInvalidValue() { + let JSON = "[1, 2, false]".data(using: String.Encoding.utf8)! + let stringArray = BTJSON(data: JSON) + XCTAssertNil(stringArray.asStringArray()) + } + + func testAsStringArrayForHeterogeneousValue() { + let JSON = "[\"string\", false]".data(using: String.Encoding.utf8)! + let stringArray = BTJSON(data: JSON) + XCTAssertNil(stringArray.asStringArray()) + } + + func testAsStringArrayForEmptyArray() { + let JSON = "[]".data(using: String.Encoding.utf8)! + let stringArray = BTJSON(data: JSON) + XCTAssertEqual(stringArray.asStringArray()!, []) + } + + func testAsDictionary() { + let JSON = "{ \"key\": \"value\" }".data(using: String.Encoding.utf8)! + let obj = BTJSON(data: JSON) + + XCTAssertEqual((obj.asDictionary()! as AnyObject) as! NSDictionary, ["key":"value"] as NSDictionary) + } + + func testAsDictionaryInvalidValue() { + let JSON = "[]".data(using: String.Encoding.utf8)! + let obj = BTJSON(data: JSON) + + XCTAssertNil(obj.asDictionary()) + } + + func testAsIntegerOrZero() { + let cases = [ + "1": 1, + "1.2": 1, + "1.5": 1, + "1.9": 1, + "-4": -4, + "0": 0, + "\"Hello\"": 0, + ] + for (k,v) in cases { + let JSON = BTJSON(data: k.data(using: String.Encoding.utf8)!) + XCTAssertEqual(JSON.asIntegerOrZero(), v) + } + } + + func testAsEnumOrDefault() { + let JSON = "\"enum one\"".data(using: String.Encoding.utf8)! + let obj = BTJSON(data: JSON) + + XCTAssertEqual(obj.asEnum(["enum one" : 1], orDefault: 0), 1) + } + + func testAsEnumOrDefaultWhenMappingNotPresentReturnsDefault() { + let JSON = "\"enum one\"".data(using: String.Encoding.utf8)! + let obj = BTJSON(data: JSON) + + XCTAssertEqual(obj.asEnum(["enum two" : 2], orDefault: 1000), 1000) + } + + func testAsEnumOrDefaultWhenMapValueIsNotNumberReturnsDefault() { + let JSON = "\"enum one\"".data(using: String.Encoding.utf8)! + let obj = BTJSON(data: JSON) + + XCTAssertEqual(obj.asEnum(["enum one" : "one"], orDefault: 1000), 1000) + } + + func testIsNull() { + let JSON = "null".data(using: String.Encoding.utf8)! + let obj = BTJSON(data: JSON) + + XCTAssertTrue(obj.isNull); + } + + func testIsObject() { + let JSON = "{}".data(using: String.Encoding.utf8)! + let obj = BTJSON(data: JSON) + + XCTAssertTrue(obj.isObject); + } + + func testIsObjectForNonObject() { + let JSON = "[]".data(using: String.Encoding.utf8)! + let obj = BTJSON(data: JSON) + + XCTAssertFalse(obj.isObject); + } + + func testLargerMixedJSONWithEmoji() { + let JSON = ("{" + + "\"aString\": \"Hello, JSON 😍!\"," + + "\"anArray\": [1, 2, 3 ]," + + "\"aSetOfValues\": [\"a\", \"b\", \"c\"]," + + "\"aSetWithDuplicates\": [\"a\", \"a\", \"b\", \"b\" ]," + + "\"aLookupDictionary\": {" + + "\"foo\": { \"definition\": \"A meaningless word\"," + + "\"letterCount\": 3," + + "\"meaningful\": false }" + + "}," + + "\"aURL\": \"https://test.example.com:1234/path\"," + + "\"anInvalidURL\": \":™£¢://://://???!!!\"," + + "\"aTrue\": true," + + "\"aFalse\": false" + + "}").data(using: String.Encoding.utf8)! + let obj = BTJSON(data: JSON) + XCTAssertEqual((obj["aString"] as! BTJSON).asString(), "Hello, JSON 😍!") + XCTAssertNil((obj["notAString"] as! BTJSON).asString()) // nil for absent keys + XCTAssertNil((obj["anArray"] as! BTJSON).asString()) // nil for invalid values + XCTAssertEqual((obj["anArray"] as! BTJSON).asArray()! as NSArray, [1, 2, 3]) + XCTAssertNil((obj["notAnArray"] as! BTJSON).asArray()) // nil for absent keys + XCTAssertNil((obj["aString"] as! BTJSON).asArray()) // nil for invalid values + // sets can be parsed as arrays: + XCTAssertEqual((obj["aSetOfValues"] as! BTJSON).asArray()! as NSArray, ["a", "b", "c"]) + XCTAssertEqual((obj["aSetWithDuplicates"] as! BTJSON).asArray()! as NSArray, ["a", "a", "b", "b"]) + let dictionary = (obj["aLookupDictionary"] as! BTJSON).asDictionary()! + let foo = dictionary["foo"]! as! Dictionary + XCTAssertEqual((foo["definition"] as! String), "A meaningless word") + let letterCount = foo["letterCount"] as! NSNumber + XCTAssertEqual(letterCount, 3) + XCTAssertFalse(foo["meaningful"] as! Bool) + XCTAssertNil((obj["notADictionary"] as AnyObject).asDictionary()) + XCTAssertNil((obj["aString"] as AnyObject).asDictionary()) + XCTAssertEqual((obj["aURL"] as AnyObject).asURL(), URL(string: "https://test.example.com:1234/path")) + XCTAssertNil((obj["notAURL"] as AnyObject).asURL()) + XCTAssertNil((obj["aString"] as AnyObject).asURL()) + XCTAssertNil((obj["anInvalidURL"] as AnyObject).asURL()) // nil for invalid URLs + // nested resources: + let btJson = (obj["aLookupDictionary"] as! BTJSON).asDictionary() as! [String: AnyObject] + XCTAssertEqual((btJson["foo"] as! NSDictionary)["definition"] as! String, "A meaningless word") + XCTAssert((((obj["aLookupDictionary"] as! BTJSON)["aString"] as! BTJSON)["anyting"] as! BTJSON).isError as Bool) + } +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTLogger_Internal_Tests.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTLogger_Internal_Tests.m new file mode 100644 index 0000000..9ac2a8a --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTLogger_Internal_Tests.m @@ -0,0 +1,57 @@ +#import +#import "BTLogger_Internal.h" + +@interface BTLogger_Internal_Tests : XCTestCase +@end + +@implementation BTLogger_Internal_Tests + +- (void)testSharedLogger_returnsSingletonLogger { + BTLogger *logger1 = [BTLogger sharedLogger]; + BTLogger *logger2 = [BTLogger sharedLogger]; + XCTAssertTrue(logger1 == logger2); + XCTAssertTrue([logger1 isKindOfClass:[BTLogger class]]); +} + +- (void)testLevel_byDefault_isInfo { + XCTAssertEqual([[BTLogger alloc] init].level, BTLogLevelInfo); +} + +- (void)testLog_whenLogBlockIsDefined_invokesBlockWithLogMessageAndLogLevel { + BTLogger *logger = [[BTLogger alloc] init]; + NSString *messageLogged = @"BTLogger logBlock works!"; + XCTestExpectation *expectation = [self expectationWithDescription:@"logBlock invoked"]; + logger.logBlock = ^(BTLogLevel level, NSString *messageReceived) { + XCTAssertEqualObjects(messageReceived, messageLogged); + XCTAssertEqual(level, BTLogLevelInfo); + [expectation fulfill]; + }; + + [logger log:messageLogged]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; +} + +- (void)testLog_whenLoggingAtOrBelowLevel_logsMessage { + BTLogger *logger = [[BTLogger alloc] init]; + for (BTLogLevel level = BTLogLevelNone; level <= BTLogLevelDebug; level++) { + NSString *message = [NSString stringWithFormat:@"test %lu", (unsigned long)level]; + NSMutableArray *messagesLogged = [NSMutableArray array]; + __block BTLogLevel maxLevel = level; + logger.logBlock = ^(BTLogLevel actualLevel, NSString *messageReceived) { + XCTAssertTrue(actualLevel <= maxLevel); + [messagesLogged addObject:messageReceived]; + }; + + logger.level = level; + [logger critical:message]; + [logger error:message]; + [logger warning:message]; + [logger info:message]; + [logger debug:message]; + + XCTAssertEqual(messagesLogged.count, level); + } +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTMacroTests.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTMacroTests.m new file mode 100644 index 0000000..ccb067a --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTMacroTests.m @@ -0,0 +1,18 @@ +#import +#import "BraintreeCore.h" + +@interface BTMacroTests : XCTestCase + +@end + +@implementation BTMacroTests + +- (void)test__BT_AVAILABLE_returnsTrueForAvailableClass { + XCTAssertTrue(__BT_AVAILABLE(@"BTAPIClient")); +} + +- (void)test__BT_AVAILABLE_returnsFalseForUnavailableClass { + XCTAssertFalse(__BT_AVAILABLE(@"BTNotARealClass")); +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTPayPalDriver_Tests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTPayPalDriver_Tests.swift new file mode 100644 index 0000000..3509820 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTPayPalDriver_Tests.swift @@ -0,0 +1,2583 @@ +import XCTest + +// MARK: Authorization + +class BTPayPalDriver_Authorization_Tests: XCTestCase { + + var mockAPIClient : MockAPIClient = MockAPIClient(authorization: "development_tokenization_key")! + var observers : [NSObjectProtocol] = [] + let ValidClientToken = "eyJ2ZXJzaW9uIjoyLCJhdXRob3JpemF0aW9uRmluZ2VycHJpbnQiOiI3ODJhZmFlNDJlZTNiNTA4NWUxNmMzYjhkZTY3OGQxNTJhODFlYzk5MTBmZDNhY2YyYWU4MzA2OGI4NzE4YWZhfGNyZWF0ZWRfYXQ9MjAxNS0wOC0yMFQwMjoxMTo1Ni4yMTY1NDEwNjErMDAwMFx1MDAyNmN1c3RvbWVyX2lkPTM3OTU5QTE5LThCMjktNDVBNC1CNTA3LTRFQUNBM0VBOEM4Nlx1MDAyNm1lcmNoYW50X2lkPWRjcHNweTJicndkanIzcW5cdTAwMjZwdWJsaWNfa2V5PTl3d3J6cWszdnIzdDRuYzgiLCJjb25maWdVcmwiOiJodHRwczovL2FwaS5zYW5kYm94LmJyYWludHJlZWdhdGV3YXkuY29tOjQ0My9tZXJjaGFudHMvZGNwc3B5MmJyd2RqcjNxbi9jbGllbnRfYXBpL3YxL2NvbmZpZ3VyYXRpb24iLCJjaGFsbGVuZ2VzIjpbXSwiZW52aXJvbm1lbnQiOiJzYW5kYm94IiwiY2xpZW50QXBpVXJsIjoiaHR0cHM6Ly9hcGkuc2FuZGJveC5icmFpbnRyZWVnYXRld2F5LmNvbTo0NDMvbWVyY2hhbnRzL2RjcHNweTJicndkanIzcW4vY2xpZW50X2FwaSIsImFzc2V0c1VybCI6Imh0dHBzOi8vYXNzZXRzLmJyYWludHJlZWdhdGV3YXkuY29tIiwiYXV0aFVybCI6Imh0dHBzOi8vYXV0aC52ZW5tby5zYW5kYm94LmJyYWludHJlZWdhdGV3YXkuY29tIiwiYW5hbHl0aWNzIjp7InVybCI6Imh0dHBzOi8vY2xpZW50LWFuYWx5dGljcy5zYW5kYm94LmJyYWludHJlZWdhdGV3YXkuY29tIn0sInRocmVlRFNlY3VyZUVuYWJsZWQiOnRydWUsInRocmVlRFNlY3VyZSI6eyJsb29rdXBVcmwiOiJodHRwczovL2FwaS5zYW5kYm94LmJyYWludHJlZWdhdGV3YXkuY29tOjQ0My9tZXJjaGFudHMvZGNwc3B5MmJyd2RqcjNxbi90aHJlZV9kX3NlY3VyZS9sb29rdXAifSwicGF5cGFsRW5hYmxlZCI6dHJ1ZSwicGF5cGFsIjp7ImRpc3BsYXlOYW1lIjoiQWNtZSBXaWRnZXRzLCBMdGQuIChTYW5kYm94KSIsImNsaWVudElkIjpudWxsLCJwcml2YWN5VXJsIjoiaHR0cDovL2V4YW1wbGUuY29tL3BwIiwidXNlckFncmVlbWVudFVybCI6Imh0dHA6Ly9leGFtcGxlLmNvbS90b3MiLCJiYXNlVXJsIjoiaHR0cHM6Ly9hc3NldHMuYnJhaW50cmVlZ2F0ZXdheS5jb20iLCJhc3NldHNVcmwiOiJodHRwczovL2NoZWNrb3V0LnBheXBhbC5jb20iLCJkaXJlY3RCYXNlVXJsIjpudWxsLCJhbGxvd0h0dHAiOnRydWUsImVudmlyb25tZW50Tm9OZXR3b3JrIjp0cnVlLCJlbnZpcm9ubWVudCI6Im9mZmxpbmUiLCJ1bnZldHRlZE1lcmNoYW50IjpmYWxzZSwiYnJhaW50cmVlQ2xpZW50SWQiOiJtYXN0ZXJjbGllbnQzIiwiYmlsbGluZ0FncmVlbWVudHNFbmFibGVkIjpmYWxzZSwibWVyY2hhbnRBY2NvdW50SWQiOiJzdGNoMm5mZGZ3c3p5dHc1IiwiY3VycmVuY3lJc29Db2RlIjoiVVNEIn0sImNvaW5iYXNlRW5hYmxlZCI6dHJ1ZSwiY29pbmJhc2UiOnsiY2xpZW50SWQiOiIxMWQyNzIyOWJhNThiNTZkN2UzYzAxYTA1MjdmNGQ1YjQ0NmQ0ZjY4NDgxN2NiNjIzZDI1NWI1NzNhZGRjNTliIiwibWVyY2hhbnRBY2NvdW50IjoiY29pbmJhc2UtZGV2ZWxvcG1lbnQtbWVyY2hhbnRAZ2V0YnJhaW50cmVlLmNvbSIsInNjb3BlcyI6ImF1dGhvcml6YXRpb25zOmJyYWludHJlZSB1c2VyIiwicmVkaXJlY3RVcmwiOiJodHRwczovL2Fzc2V0cy5icmFpbnRyZWVnYXRld2F5LmNvbS9jb2luYmFzZS9vYXV0aC9yZWRpcmVjdC1sYW5kaW5nLmh0bWwiLCJlbnZpcm9ubWVudCI6Im1vY2sifSwibWVyY2hhbnRJZCI6ImRjcHNweTJicndkanIzcW4iLCJ2ZW5tbyI6Im9mZmxpbmUiLCJhcHBsZVBheSI6eyJzdGF0dXMiOiJtb2NrIiwiY291bnRyeUNvZGUiOiJVUyIsImN1cnJlbmN5Q29kZSI6IlVTRCIsIm1lcmNoYW50SWRlbnRpZmllciI6Im1lcmNoYW50LmNvbS5icmFpbnRyZWVwYXltZW50cy5zYW5kYm94LkJyYWludHJlZS1EZW1vIiwic3VwcG9ydGVkTmV0d29ya3MiOlsidmlzYSIsIm1hc3RlcmNhcmQiLCJhbWV4Il19fQ==" + + + override func setUp() { + super.setUp() + + mockAPIClient = MockAPIClient(authorization: "development_tokenization_key")! + FakePayPalOneTouchCore.setCannedIsWalletAppAvailable(true) + } + + override func tearDown() { + for observer in observers { NotificationCenter.default.removeObserver(observer) } + super.tearDown() + } + + func testAuthorization_whenAPIClientIsNil_callsBackWithError() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + payPalDriver.apiClient = nil + + let expectation = self.expectation(description: "Authorization fails with error") + payPalDriver.authorizeAccount { (tokenizedPayPalAccount, error) -> Void in + XCTAssertNil(tokenizedPayPalAccount) + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTPayPalDriverErrorDomain) + XCTAssertEqual(error.code, BTPayPalDriverErrorType.integration.rawValue) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testAuthorization_whenRemoteConfigurationFetchFails_callsBackWithConfigurationError() { + mockAPIClient.cannedConfigurationResponseError = NSError(domain: "", code: 0, userInfo: nil) + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + + let expectation = self.expectation(description: "Authorization fails with error") + payPalDriver.authorizeAccount { (tokenizedPayPalAccount, error) -> Void in + XCTAssertEqual(error! as NSError, self.mockAPIClient.cannedConfigurationResponseError!) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testAuthorization_whenPayPalConfigurationDisabled_callsBackWithError() { + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ "paypalEnabled": false ]) + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + + let expectation = self.expectation(description: "authorization callback") + payPalDriver.authorizeAccount { (tokenizedPayPalAccount, error) -> Void in + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTPayPalDriverErrorDomain) + XCTAssertEqual(error.code, BTPayPalDriverErrorType.disabled.rawValue) + expectation.fulfill() + } + waitForExpectations(timeout: 2, handler: nil) + } + + func testAuthorization_whenReturnURLSchemeIsNil_logsCriticalMessageAndCallsBackWithError() { + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ "paypalEnabled": true ]) + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + BTAppSwitch.setReturnURLScheme("") + payPalDriver.returnURLScheme = "" + + var criticalMessageLogged = false + BTLogger.shared().logBlock = { + (level: BTLogLevel, message: String?) in + if (level == BTLogLevel.critical && message == "PayPal requires a return URL scheme to be configured via [BTAppSwitch setReturnURLScheme:]. This custom URL scheme must also be registered with your app.") { + criticalMessageLogged = true + } + BTLogger.shared().logBlock = nil + return + } + + let expectation = self.expectation(description: "authorization callback") + payPalDriver.authorizeAccount { (tokenizedPayPalAccount, error) -> Void in + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTPayPalDriverErrorDomain) + XCTAssertEqual(error.code, BTPayPalDriverErrorType.integrationReturnURLScheme.rawValue) + expectation.fulfill() + } + + XCTAssertTrue(criticalMessageLogged) + + waitForExpectations(timeout: 2, handler: nil) + } + + func testAuthorization_whenRemoteConfigurationIsAvailable_performsPayPalRequestAppSwitch() { + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "paypalEnabled": true, + "paypal": [ + "environment": "offline" + ] ]) + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + let mockRequestFactory = FakePayPalRequestFactory() + payPalDriver.requestFactory = mockRequestFactory + // Depending on whether it's iOS 9 or not, we use different stub delegates to wait for the app switch to occur + let stubViewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + let stubAppSwitchDelegate = MockAppSwitchDelegate() + if #available(iOS 11.0, *) { + // do nothing + } else if #available(iOS 9.0, *) { + stubViewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = expectation(description: "Delegate received requestsPresentationOfViewController") + payPalDriver.viewControllerPresentingDelegate = stubViewControllerPresentingDelegate + } else { + stubAppSwitchDelegate.willPerformAppSwitchExpectation = expectation(description: "Delegate received willPerformAppSwitch") + stubAppSwitchDelegate.didPerformAppSwitchExpectation = expectation(description: "Delegate received didPerformAppSwitch") + stubAppSwitchDelegate.appContextWillSwitchExpectation = expectation(description: "Delegate received appContextWillSwitch") + payPalDriver.appSwitchDelegate = stubAppSwitchDelegate + } + + payPalDriver.authorizeAccount { _,_ -> Void in } + + if #available(iOS 11.0, *) { + XCTAssertNotNil(payPalDriver.safariAuthenticationSession) + XCTAssertTrue(payPalDriver.isSFAuthenticationSessionStarted) + } else { + waitForExpectations(timeout: 2, handler: nil) + } + XCTAssertTrue(mockRequestFactory.authorizationRequest.appSwitchPerformed) + } + + func testAuthorization_whenBillingAgreementsEnabledInConfiguration_performsBillingAgreements() { + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "paypalEnabled": true, + "paypal": [ + "environment": "offline", + "billingAgreementsEnabled": true, + "currencyIsoCode": "GBP", + ] ]) + + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + + payPalDriver.authorizeAccount { _,_ -> Void in + } + + XCTAssertEqual("v1/paypal_hermes/setup_billing_agreement", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + // We want to make sure that currency is not used for Billing Agreements + XCTAssertTrue(lastPostParameters["currency_iso_code"] == nil) + // We want to make sure that intent is not used for Billing Agreements + XCTAssertTrue(lastPostParameters["intent"] == nil) + XCTAssertEqual(lastPostParameters["return_url"] as? String, "scheme://return") + XCTAssertEqual(lastPostParameters["cancel_url"] as? String, "scheme://cancel") + } + + func testAuthorizationRequest_byDefault_containsEmailAndFuturePaymentsScopes() { + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "paypalEnabled": true, + "paypal": [ + "environment": "offline" + ] ]) + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + payPalDriver.returnURLScheme = "foo://" + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + let mockRequestFactory = FakePayPalRequestFactory() + payPalDriver.requestFactory = mockRequestFactory + // Depending on whether it's iOS 9 or not, we use different stub delegates to wait for the app switch to occur + let stubViewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + let stubAppSwitchDelegate = MockAppSwitchDelegate() + if #available(iOS 11.0, *) { + + } else if #available(iOS 9.0, *) { + stubViewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = expectation(description: "Delegate received requestsPresentationOfViewController") + payPalDriver.viewControllerPresentingDelegate = stubViewControllerPresentingDelegate + } else { + stubAppSwitchDelegate.willPerformAppSwitchExpectation = expectation(description: "Delegate received willPerformAppSwitch") + stubAppSwitchDelegate.didPerformAppSwitchExpectation = expectation(description: "Delegate received didPerformAppSwitch") + stubAppSwitchDelegate.appContextWillSwitchExpectation = expectation(description: "Delegate received appContextWillSwitch") + payPalDriver.appSwitchDelegate = stubAppSwitchDelegate + } + + payPalDriver.authorizeAccount { _,_ -> Void in } + + if #available(iOS 11.0, *) { + XCTAssertNotNil(payPalDriver.safariAuthenticationSession) + XCTAssertTrue(payPalDriver.isSFAuthenticationSessionStarted) + } else { + waitForExpectations(timeout: 2, handler: nil) + } + + for expectedScope in ["email", "https://uri.paypal.com/services/payments/futurepayments"] { + XCTAssertTrue(mockRequestFactory.lastScopeValues!.contains(expectedScope as NSObject)) + } + } + + func testAuthorizationRequest_whenAdditionalScopesAreSpecified_includesThoseAdditionalScopes() { + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "paypalEnabled": true, + "paypal": [ + "environment": "offline" + ] ]) + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + payPalDriver.returnURLScheme = "foo://" + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + let mockRequestFactory = FakePayPalRequestFactory() + payPalDriver.requestFactory = mockRequestFactory + // Depending on whether it's iOS 9 or not, we use different stub delegates to wait for the app switch to occur + let stubViewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + let stubAppSwitchDelegate = MockAppSwitchDelegate() + if #available(iOS 11.0, *) { + // do nothing + } else if #available(iOS 9.0, *) { + stubViewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = expectation(description: "Delegate received requestsPresentationOfViewController") + payPalDriver.viewControllerPresentingDelegate = stubViewControllerPresentingDelegate + } else { + stubAppSwitchDelegate.willPerformAppSwitchExpectation = expectation(description: "Delegate received willPerformAppSwitch") + stubAppSwitchDelegate.didPerformAppSwitchExpectation = expectation(description: "Delegate received didPerformAppSwitch") + stubAppSwitchDelegate.appContextWillSwitchExpectation = expectation(description: "Delegate received appContextWillSwitch") + payPalDriver.appSwitchDelegate = stubAppSwitchDelegate + } + + payPalDriver.authorizeAccount(withAdditionalScopes: Set(["foo", "bar"])) { _,_ -> Void in } + + if #available(iOS 11.0, *) { + XCTAssertNotNil(payPalDriver.safariAuthenticationSession) + XCTAssertTrue(payPalDriver.isSFAuthenticationSessionStarted) + } else { + waitForExpectations(timeout: 2, handler: nil) + } + + for expectedScope in ["email", "https://uri.paypal.com/services/payments/futurepayments", "foo", "bar"] { + XCTAssertTrue(mockRequestFactory.lastScopeValues!.contains(expectedScope as NSObject)) + } + } + + func testAuthorizationRequest_whenUsingTokenizationKey_includesTokenizationKeyInAdditionalPayloadAttributes() { + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "paypalEnabled": true, + "paypal": [ + "environment": "offline" + ] ]) + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + payPalDriver.returnURLScheme = "foo://" + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + let mockRequestFactory = FakePayPalRequestFactory() + payPalDriver.requestFactory = mockRequestFactory + let mockRequest = mockRequestFactory.authorizationRequest + // Depending on whether it's iOS 9 or not, we use different stub delegates to wait for the app switch to occur + let stubViewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + let stubAppSwitchDelegate = MockAppSwitchDelegate() + if #available(iOS 11.0, *) { + // do nothing + } else if #available(iOS 9.0, *) { + stubViewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = expectation(description: "Delegate received requestsPresentationOfViewController") + payPalDriver.viewControllerPresentingDelegate = stubViewControllerPresentingDelegate + } else { + stubAppSwitchDelegate.willPerformAppSwitchExpectation = expectation(description: "Delegate received willPerformAppSwitch") + stubAppSwitchDelegate.didPerformAppSwitchExpectation = expectation(description: "Delegate received didPerformAppSwitch") + stubAppSwitchDelegate.appContextWillSwitchExpectation = expectation(description: "Delegate received appContextWillSwitch") + payPalDriver.appSwitchDelegate = stubAppSwitchDelegate + } + + payPalDriver.authorizeAccount { _,_ -> Void in } + + if #available(iOS 11.0, *) { + XCTAssertNotNil(payPalDriver.safariAuthenticationSession) + XCTAssertTrue(payPalDriver.isSFAuthenticationSessionStarted) + } else { + waitForExpectations(timeout: 5, handler: nil) + } + + XCTAssertEqual(mockRequest.additionalPayloadAttributes["client_key"] as? String, "development_tokenization_key") + } + + func testAuthorizationRequest_whenUsingClientToken_includesClientTokenInAdditionalPayloadAttributes() { + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "paypalEnabled": true, + "paypal": [ + "environment": "offline" + ] ]) + mockAPIClient.tokenizationKey = nil + mockAPIClient.clientToken = try! BTClientToken(clientToken: ValidClientToken) + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + payPalDriver.returnURLScheme = "foo://" + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + let mockRequestFactory = FakePayPalRequestFactory() + payPalDriver.requestFactory = mockRequestFactory + let mockRequest = mockRequestFactory.authorizationRequest + // Depending on whether it's iOS 9 or not, we use different stub delegates to wait for the app switch to occur + let stubViewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + let stubAppSwitchDelegate = MockAppSwitchDelegate() + if #available(iOS 11.0, *) { + // do nothing + } else if #available(iOS 9.0, *) { + stubViewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = expectation(description: "Delegate received requestsPresentationOfViewController") + payPalDriver.viewControllerPresentingDelegate = stubViewControllerPresentingDelegate + } else { + stubAppSwitchDelegate.willPerformAppSwitchExpectation = expectation(description: "Delegate received willPerformAppSwitch") + stubAppSwitchDelegate.didPerformAppSwitchExpectation = expectation(description: "Delegate received didPerformAppSwitch") + stubAppSwitchDelegate.appContextWillSwitchExpectation = expectation(description: "Delegate received appContextWillSwitch") + payPalDriver.appSwitchDelegate = stubAppSwitchDelegate + } + + payPalDriver.authorizeAccount { _,_ -> Void in } + + if #available(iOS 11.0, *) { + XCTAssertNotNil(payPalDriver.safariAuthenticationSession) + XCTAssertTrue(payPalDriver.isSFAuthenticationSessionStarted) + } else { + waitForExpectations(timeout: 5, handler: nil) + } + + XCTAssertEqual(mockRequest.additionalPayloadAttributes["client_token"] as? String, ValidClientToken) + } + + func testAuthorization_whenAppSwitchCancels_callsBackWithNoResultOrError() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + BTPayPalDriver.payPalClass().cannedResult()?.cannedType = PPOTResultType.cancel + + let expectation = self.expectation(description: "App switch return block invoked") + payPalDriver.setAuthorizationAppSwitchReturn { (tokenizedAccount, error) -> Void in + XCTAssertNil(tokenizedAccount) + XCTAssertNil(error) + expectation.fulfill() + } + BTPayPalDriver.handleAppSwitchReturn(URL(string: "bar://hello/world")!) + + waitForExpectations(timeout: 2, handler: nil) + } + + func testAuthorization_whenAppSwitchSucceeds_tokenizesPayPalAccount() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + payPalDriver.clientMetadataId = "a-correlation-id" + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + BTPayPalDriver.payPalClass().cannedResult()?.cannedType = PPOTResultType.success + payPalDriver.payPalRequest = BTPayPalRequest(); + mockAPIClient.cannedResponseBody = BTJSON(value: ["paypalAccounts": [ + ["nonce": "fake-nonce"] + ] ] ) + + payPalDriver.setAuthorizationAppSwitchReturn { _,_ -> Void in } + BTPayPalDriver.handleAppSwitchReturn(URL(string: "bar://hello/world")!) + + XCTAssertEqual(mockAPIClient.lastPOSTPath, "/v1/payment_methods/paypal_accounts") + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail("Expected POST to contain parameters") + return + } + + let paypalAccount = lastPostParameters["paypal_account"] as! NSDictionary + XCTAssertEqual(paypalAccount["correlation_id"] as? String, "a-correlation-id") + XCTAssertTrue(paypalAccount["intent"] == nil) + XCTAssertEqual(paypalAccount, FakePayPalOneTouchCoreResult().response as AnyObject as! NSDictionary) + } + + func testAuthorization_whenAppSwitchingToApp_makesAppSwitchDelegateCallbacks() { + if #available(iOS 9.0, *) { + return + } + + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "paypalEnabled": true, + "paypal": [ + "environment": "offline" + ] ]) + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + payPalDriver.returnURLScheme = "foo://" + let mockRequestFactory = FakePayPalRequestFactory() + payPalDriver.requestFactory = mockRequestFactory + let delegate = MockAppSwitchDelegate(willPerform: expectation(description: "willPerformAppSwitch called"), didPerform: expectation(description: "didPerformAppSwitch called")) + delegate.appContextWillSwitchExpectation = expectation(description: "appContextWillSwitch called") + delegate.appContextDidReturnExpectation = expectation(description: "appContextDidReturn called") + delegate.willProcessAppSwitchExpectation = expectation(description: "willProcessPaymentInfo called") + payPalDriver.appSwitchDelegate = delegate + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + BTPayPalDriver.payPalClass().cannedResult()?.cannedType = PPOTResultType.success + + payPalDriver.authorizeAccount { _,_ -> Void in } + payPalDriver.setAuthorizationAppSwitchReturn { _,_ -> Void in } + BTPayPalDriver.handleAppSwitchReturn(URL(string: "bar://hello/world")!) + + waitForExpectations(timeout: 2, handler: nil) + } + + func testAuthorization_whenAppSwitchingToApp_postsNotifications() { + if #available(iOS 9.0, *) { + return + } + + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "paypalEnabled": true, + "paypal": [ + "environment": "offline" + ] ]) + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + payPalDriver.returnURLScheme = "foo://" + let mockRequestFactory = FakePayPalRequestFactory() + payPalDriver.requestFactory = mockRequestFactory + let delegate = MockAppSwitchDelegate() + delegate.willPerformAppSwitchExpectation = expectation(description: "willPerformAppSwitch called") + payPalDriver.appSwitchDelegate = delegate + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + BTPayPalDriver.payPalClass().cannedResult()?.cannedType = PPOTResultType.success + + let willAppSwitchNotificationExpectation = expectation(description: "willAppSwitch notification received") + observers.append(NotificationCenter.default.addObserver(forName: NSNotification.Name.BTAppSwitchWillSwitch, object: nil, queue: nil) { (notification) -> Void in + willAppSwitchNotificationExpectation.fulfill() + }) + + let appContextWillSwitchNotificationExpectation = expectation(description: "appContextWillSwitch notification received") + observers.append(NotificationCenter.default.addObserver(forName: NSNotification.Name.BTAppContextWillSwitch, object: nil, queue: nil) { (notification) -> Void in + appContextWillSwitchNotificationExpectation.fulfill() + }) + + let didAppSwitchNotificationExpectation = expectation(description: "didAppSwitch notification received") + observers.append(NotificationCenter.default.addObserver(forName: NSNotification.Name.BTAppSwitchDidSwitch, object: nil, queue: nil) { (notification) -> Void in + didAppSwitchNotificationExpectation.fulfill() + }) + + payPalDriver.authorizeAccount { _,_ -> Void in } + + let appContextDidReturnNotificationExpectation = expectation(description: "appContextDidReturn notification received") + observers.append(NotificationCenter.default.addObserver(forName: NSNotification.Name.BTAppContextDidReturn, object: nil, queue: nil) { (notification) -> Void in + appContextDidReturnNotificationExpectation.fulfill() + }) + + let willProcessNotificationExpectation = expectation(description: "willProcess notification received") + observers.append(NotificationCenter.default.addObserver(forName: NSNotification.Name.BTAppSwitchWillProcessPaymentInfo, object: nil, queue: nil) { (notification) -> Void in + willProcessNotificationExpectation.fulfill() + }) + + payPalDriver.setAuthorizationAppSwitchReturn { _,_ -> Void in } + BTPayPalDriver.handleAppSwitchReturn(URL(string: "bar://hello/world")!) + + waitForExpectations(timeout: 2, handler: nil) + } + + func testAuthorization_whenSwitchingToSFSafariViewController_makesViewControllerPresentingDelegateCallbacks() { + guard #available(iOS 9.0, *) else { + return + } + + if #available(iOS 11.0, *) { + return + } + + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "paypalEnabled": true, + "paypal": [ + "environment": "offline" + ] ]) + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + BTPayPalDriver.payPalClass().cannedResult()?.cannedType = PPOTResultType.success + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + payPalDriver.returnURLScheme = "foo://" + payPalDriver.requestFactory = FakePayPalRequestFactory() + let mockViewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + mockViewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = expectation(description: "Delegate received requestsPresentationOfViewController") + payPalDriver.viewControllerPresentingDelegate = mockViewControllerPresentingDelegate + + payPalDriver.authorizeAccount { _,_ -> Void in } + waitForExpectations(timeout: 2, handler: nil) + + // Test dismissal of view controller + XCTAssertTrue(mockViewControllerPresentingDelegate.lastViewController is SFSafariViewController) + + let safariViewController = mockViewControllerPresentingDelegate.lastViewController + mockViewControllerPresentingDelegate.lastViewController = nil + mockViewControllerPresentingDelegate.lastPaymentDriver = nil + mockViewControllerPresentingDelegate.requestsDismissalOfViewControllerExpectation = expectation(description: "Delegate received requestsDismissalOfViewController") + + BTPayPalDriver.handleAppSwitchReturn(URL(string: "bar://hello/world")!) + waitForExpectations(timeout: 2, handler: nil) + + XCTAssertEqual(mockViewControllerPresentingDelegate.lastViewController, safariViewController) + XCTAssertEqual(mockViewControllerPresentingDelegate.lastPaymentDriver as? BTPayPalDriver, payPalDriver) + } + + func testAuthorization_whenSwitchingToSFSafariViewController_doesNotMakeAppSwitchDelegateCallbacks() { + guard #available(iOS 9.0, *) else { + return + } + + if #available(iOS 11.0, *) { + return + } + + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "paypalEnabled": true, + "paypal": [ + "environment": "offline" + ] ]) + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + BTPayPalDriver.payPalClass().cannedResult()?.cannedType = PPOTResultType.success + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + payPalDriver.returnURLScheme = "foo://" + payPalDriver.requestFactory = FakePayPalRequestFactory() + let stubViewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + stubViewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = expectation(description: "Delegate received requestsPresentationOfViewController") + payPalDriver.viewControllerPresentingDelegate = stubViewControllerPresentingDelegate + let mockAppSwitchDelegate = MockAppSwitchDelegate() + payPalDriver.appSwitchDelegate = mockAppSwitchDelegate + + payPalDriver.authorizeAccount { _,_ -> Void in } + waitForExpectations(timeout: 2, handler: nil) + + XCTAssertFalse(mockAppSwitchDelegate.willPerformAppSwitchCalled) + XCTAssertFalse(mockAppSwitchDelegate.didPerformAppSwitchCalled) + + stubViewControllerPresentingDelegate.requestsDismissalOfViewControllerExpectation = expectation(description: "Delegate received requestsDismissalOfViewController") + + BTPayPalDriver.handleAppSwitchReturn(URL(string: "bar://hello/world")!) + waitForExpectations(timeout: 2, handler: nil) + + XCTAssertFalse(mockAppSwitchDelegate.willProcessAppSwitchCalled) + } + + func testAuthorization_whenSwitchingToSFSafariViewController_makesContextSwitchDelegateCallbacks() { + guard #available(iOS 9.0, *) else { + return + } + + if #available(iOS 11.0, *) { + return + } + + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "paypalEnabled": true, + "paypal": [ + "environment": "offline" + ] ]) + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + BTPayPalDriver.payPalClass().cannedResult()?.cannedType = PPOTResultType.success + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + payPalDriver.returnURLScheme = "foo://" + payPalDriver.requestFactory = FakePayPalRequestFactory() + let stubViewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + stubViewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = expectation(description: "Delegate received requestsPresentationOfViewController") + payPalDriver.viewControllerPresentingDelegate = stubViewControllerPresentingDelegate + let mockAppSwitchDelegate = MockAppSwitchDelegate() + payPalDriver.appSwitchDelegate = mockAppSwitchDelegate + + payPalDriver.authorizeAccount { _,_ -> Void in } + waitForExpectations(timeout: 2, handler: nil) + + XCTAssertTrue(mockAppSwitchDelegate.appContextWillSwitchCalled) + XCTAssertFalse(mockAppSwitchDelegate.appContextDidReturnCalled) + + stubViewControllerPresentingDelegate.requestsDismissalOfViewControllerExpectation = expectation(description: "Delegate received requestsDismissalOfViewController") + + BTPayPalDriver.handleAppSwitchReturn(URL(string: "bar://hello/world")!) + waitForExpectations(timeout: 2, handler: nil) + + XCTAssertTrue(mockAppSwitchDelegate.appContextDidReturnCalled) + } + + func testAuthorization_whenSwitchingToSFSafariViewControllerAndURLIsNotHTTP_callsBackWithError() { + guard #available(iOS 9.0, *) else { + return + } + + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "paypalEnabled": true, + "paypal": [ + "environment": "offline" + ] ]) + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + BTPayPalDriver.payPalClass().cannedResult()?.cannedType = PPOTResultType.success + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + payPalDriver.returnURLScheme = "foo://" + let stubPayPalRequestFactory = FakePayPalRequestFactory() + stubPayPalRequestFactory.authorizationRequest.cannedURL = URL(string: "garbage://garbage") + payPalDriver.requestFactory = stubPayPalRequestFactory + let stubViewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + payPalDriver.viewControllerPresentingDelegate = stubViewControllerPresentingDelegate + let mockAppSwitchDelegate = MockAppSwitchDelegate() + payPalDriver.appSwitchDelegate = mockAppSwitchDelegate + + let expectation = self.expectation(description: "Callback invoked") + payPalDriver.authorizeAccount { (tokenizedPayPalAccount, error) -> Void in + guard let error = error as NSError? else { return } + XCTAssertEqual(error.domain, BTPayPalDriverErrorDomain) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testAuthorization_whenAppSwitchResultIsError_returnsUnderlyingError() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + BTPayPalDriver.payPalClass().cannedResult()?.cannedType = PPOTResultType.error + let fakeError = NSError(domain: "FakeError", code: 1, userInfo: nil) + BTPayPalDriver.payPalClass().cannedResult()?.cannedError = fakeError + + let expectation = self.expectation(description: "App switch completion callback") + payPalDriver.setAuthorizationAppSwitchReturn { (tokenizedAccount, error) -> Void in + guard let error = error else { + XCTFail() + return + } + XCTAssertEqual(error as NSError, fakeError) + expectation.fulfill() + } + + BTPayPalDriver.handleAppSwitchReturn(URL(string: "bar://hello/world")!) + + waitForExpectations(timeout: 5, handler: nil) + } + + func testTokenizedPayPalAccount_containsPayerInfo() { + let authResponse = [ + "paypalAccounts": [ + [ + "nonce": "a-nonce", + "description": "A description", + "details": [ + "email": "hello@world.com", + "payerInfo": [ + "accountAddress": [ + "recipientName": "Foo Bar", + "street1": "1 Foo Ct", + "street2": "Apt Bar", + "city": "Fubar", + "state": "FU", + "postalCode": "42", + "country": "USA" + ] + ] + ] + ] ] ] + assertSuccessfulAuthorizationResponse(authResponse as [String : AnyObject], + assertionBlock: { (tokenizedPayPalAccount, error) -> Void in + XCTAssertEqual(tokenizedPayPalAccount!.nonce, "a-nonce") + XCTAssertEqual(tokenizedPayPalAccount!.localizedDescription, "A description") + XCTAssertEqual(tokenizedPayPalAccount!.email, "hello@world.com") + let shippingAddress = tokenizedPayPalAccount!.shippingAddress! + XCTAssertEqual(shippingAddress.recipientName, "Foo Bar") + XCTAssertEqual(shippingAddress.streetAddress, "1 Foo Ct") + XCTAssertEqual(shippingAddress.extendedAddress, "Apt Bar") + XCTAssertEqual(shippingAddress.locality, "Fubar") + XCTAssertEqual(shippingAddress.region, "FU") + XCTAssertEqual(shippingAddress.postalCode, "42") + XCTAssertEqual(shippingAddress.countryCodeAlpha2, "USA") + }) + } + + func testTokenizedPayPalAccount_whenEmailAddressIsNestedInsidePayerInfoJSON_usesNestedEmailAddress() { + let authResponse = [ + "paypalAccounts": [ + [ + "nonce": "fake-nonce", + "details": [ + "email": "not-hello@world.com", + "payerInfo": [ + "email": "hello@world.com", + ] + ], + ] + ] ] + assertSuccessfulAuthorizationResponse(authResponse as [String : AnyObject], + assertionBlock: { (tokenizedPayPalAccount, error) -> Void in + XCTAssertEqual(tokenizedPayPalAccount!.email, "hello@world.com") + }) + } + + func testTokenizedPayPalAccount_whenDescriptionJSONIsPayPal_usesEmailAsLocalizedDescription() { + let authResponse = [ + "paypalAccounts": [ + [ + "nonce": "fake-nonce", + "description": "PayPal", + "details": [ + "email": "hello@world.com", + ], + ] + ] ] + assertSuccessfulAuthorizationResponse(authResponse as [String : AnyObject], + assertionBlock: { (tokenizedPayPalAccount, error) -> Void in + XCTAssertEqual(tokenizedPayPalAccount!.localizedDescription, "hello@world.com") + }) + } + + // MARK: _meta parameter + + func testMetaParameter_whenAuthorizationAppSwitchIsSuccessful_isPOSTedToServer() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + let stubPayPalClass = FakePayPalOneTouchCore.self + stubPayPalClass.cannedResult()?.cannedType = .success + stubPayPalClass.setCannedIsWalletAppAvailable(true) + BTPayPalDriver.setPayPalClass(stubPayPalClass) + payPalDriver.setAuthorizationAppSwitchReturn { _,_ -> Void in } + BTPayPalDriver.handleAppSwitchReturn(URL(string: "bar://hello/world")!) + + XCTAssertEqual(mockAPIClient.lastPOSTPath, "/v1/payment_methods/paypal_accounts") + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + let metaParameters = lastPostParameters["_meta"] as! NSDictionary + XCTAssertEqual(metaParameters["source"] as? String, "paypal-app") + XCTAssertEqual(metaParameters["integration"] as? String, "custom") + XCTAssertEqual(metaParameters["sessionId"] as? String, mockAPIClient.metadata.sessionId) + } + + func testMetaParameter_whenAuthorizationBrowserSwitchIsSuccessful_isPOSTedToServer() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + let stubPayPalClass = FakePayPalOneTouchCore.self + stubPayPalClass.cannedResult()?.cannedType = .success + stubPayPalClass.setCannedIsWalletAppAvailable(false) + BTPayPalDriver.setPayPalClass(stubPayPalClass) + payPalDriver.setAuthorizationAppSwitchReturn { _,_ -> Void in } + BTPayPalDriver.handleAppSwitchReturn(URL(string: "bar://hello/world")!) + + XCTAssertEqual(mockAPIClient.lastPOSTPath, "/v1/payment_methods/paypal_accounts") + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + let metaParameters = lastPostParameters["_meta"] as! NSDictionary + XCTAssertEqual(metaParameters["source"] as? String, "paypal-browser") + XCTAssertEqual(metaParameters["integration"] as? String, "custom") + XCTAssertEqual(metaParameters["sessionId"] as? String, mockAPIClient.metadata.sessionId) + } + + // MARK: Helpers + + func assertSuccessfulAuthorizationResponse(_ response: [String:AnyObject], assertionBlock: @escaping (BTPayPalAccountNonce?, NSError?) -> Void) { + mockAPIClient.cannedResponseBody = BTJSON(value: response) + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + BTPayPalDriver.payPalClass().cannedResult()?.cannedType = .success + + payPalDriver.setAuthorizationAppSwitchReturn { (tokenizedPayPalAccount, error) -> Void in + assertionBlock(tokenizedPayPalAccount, error as NSError?) + } + BTPayPalDriver.handleAppSwitchReturn(URL(string: "bar://hello/world")!) + + XCTAssertEqual(mockAPIClient.lastPOSTPath, "/v1/payment_methods/paypal_accounts") + } +} + +// MARK: - Checkout + +class BTPayPalDriver_Checkout_Tests: XCTestCase { + + var mockAPIClient : MockAPIClient = MockAPIClient(authorization: "development_tokenization_key")! + + override func setUp() { + super.setUp() + + mockAPIClient = MockAPIClient(authorization: "development_tokenization_key")! + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "paypalEnabled": true, + "paypal": [ + "environment": "offline" + ] ]) + mockAPIClient.cannedResponseBody = BTJSON(value: [ + "paymentResource": [ + "redirectUrl": "fakeURL://" + ] ]) + + } + + func testCheckout_whenAPIClientIsNil_callsBackWithError() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + payPalDriver.apiClient = nil + + let request = BTPayPalRequest(amount: "1") + let expectation = self.expectation(description: "Checkout fails with error") + + payPalDriver.requestOneTimePayment(request) { (tokenizedPayPalAccount, error) -> Void in + XCTAssertNil(tokenizedPayPalAccount) + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTPayPalDriverErrorDomain) + XCTAssertEqual(error.code, BTPayPalDriverErrorType.integration.rawValue) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testCheckout_whenRemoteConfigurationFetchFails_callsBackWithConfigurationError() { + mockAPIClient.cannedConfigurationResponseBody = nil + mockAPIClient.cannedConfigurationResponseError = NSError(domain: "", code: 0, userInfo: nil) + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + + let request = BTPayPalRequest(amount: "1") + let expectation = self.expectation(description: "Checkout fails with error") + payPalDriver.requestOneTimePayment(request) { (_, error) -> Void in + XCTAssertEqual(error! as NSError, self.mockAPIClient.cannedConfigurationResponseError!) + expectation.fulfill() + } + + self.waitForExpectations(timeout: 2, handler: nil) + } + + func testCheckout_whenRemoteConfigurationFetchSucceeds_postsPaymentResource() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let request = BTPayPalRequest(amount: "1") + request.currencyCode = "GBP" + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + payPalDriver.requestOneTimePayment(request) { _,_ -> Void in } + + XCTAssertEqual("v1/paypal_hermes/create_payment_resource", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + XCTAssertEqual(lastPostParameters["amount"] as? String, "1") + XCTAssertEqual(lastPostParameters["currency_iso_code"] as? String, "GBP") + XCTAssertEqual(lastPostParameters["return_url"] as? String, "scheme://return") + XCTAssertEqual(lastPostParameters["cancel_url"] as? String, "scheme://cancel") + } + + func testCheckout_byDefault_postsPaymentResourceWithNoShipping() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let request = BTPayPalRequest(amount: "1") + request.currencyCode = "GBP" + // no_shipping = true should be the default. + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + payPalDriver.requestOneTimePayment(request) { _,_ -> Void in } + + XCTAssertEqual("v1/paypal_hermes/create_payment_resource", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + guard let experienceProfile = lastPostParameters["experience_profile"] as? Dictionary else { + XCTFail() + return + } + XCTAssertEqual(experienceProfile["no_shipping"] as? Bool, true) + } + + func testCheckout_whenShippingAddressIsRequired_postsPaymentResourceWithNoShippingAsFalse() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let request = BTPayPalRequest(amount: "1") + request.currencyCode = "GBP" + request.isShippingAddressRequired = true + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + payPalDriver.requestOneTimePayment(request) { _,_ -> Void in } + + XCTAssertEqual("v1/paypal_hermes/create_payment_resource", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + guard let experienceProfile = lastPostParameters["experience_profile"] as? Dictionary else { + XCTFail() + return + } + XCTAssertEqual(experienceProfile["no_shipping"] as? Bool, false) + } + + func testCheckout_whenIntentIsNotSpecified_postsPaymentResourceWithAuthorizeIntent() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let request = BTPayPalRequest(amount: "1") + request.currencyCode = "GBP" + request.isShippingAddressRequired = true + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + + payPalDriver.requestOneTimePayment(request) { _,_ -> Void in } + + XCTAssertEqual("v1/paypal_hermes/create_payment_resource", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + XCTAssertEqual(lastPostParameters["intent"] as? String, "authorize") + XCTAssertEqual(request.intent, BTPayPalRequestIntent.authorize) + } + + func testCheckout_whenIntentIsSetToAuthorize_postsPaymentResourceWithIntent() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let request = BTPayPalRequest(amount: "1") + request.currencyCode = "GBP" + request.intent = .authorize; + request.isShippingAddressRequired = true + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + + payPalDriver.requestOneTimePayment(request) { _,_ -> Void in } + + XCTAssertEqual("v1/paypal_hermes/create_payment_resource", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + XCTAssertEqual(lastPostParameters["intent"] as? String, "authorize") + } + + func testCheckout_whenIntentIsSetToSale_postsPaymentResourceWithIntent() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let request = BTPayPalRequest(amount: "1") + request.currencyCode = "GBP" + request.intent = .sale; + request.isShippingAddressRequired = true + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + + payPalDriver.requestOneTimePayment(request) { _,_ -> Void in } + + XCTAssertEqual("v1/paypal_hermes/create_payment_resource", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + XCTAssertEqual(lastPostParameters["intent"] as? String, "sale") + } + + func testCheckout_whenIntentIsSetToOrder_postsPaymentResourceWithIntent() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let request = BTPayPalRequest(amount: "1") + request.currencyCode = "GBP" + request.intent = .order; + request.isShippingAddressRequired = true + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + + payPalDriver.requestOneTimePayment(request) { _,_ -> Void in } + + XCTAssertEqual("v1/paypal_hermes/create_payment_resource", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + XCTAssertEqual(lastPostParameters["intent"] as? String, "order") + } + + func testCheckout_whenLandingPageTypeIsNotSpecified_doesNotPostPaymentResourceWithLandingPageType() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let request = BTPayPalRequest(amount: "1") + request.currencyCode = "GBP" + XCTAssertEqual(BTPayPalRequestLandingPageType.default, request.landingPageType) + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + + payPalDriver.requestOneTimePayment(request) { _,_ -> Void in } + + XCTAssertEqual("v1/paypal_hermes/create_payment_resource", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + + guard let experienceProfile = lastPostParameters["experience_profile"] as? Dictionary else { + XCTFail() + return + } + XCTAssertNil(experienceProfile["landing_page_type"]) + } + + func testCheckout_whenLandingPageTypeIsBilling_postsPaymentResourceWithBillingLandingPageType() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let request = BTPayPalRequest(amount: "1") + request.currencyCode = "GBP" + request.landingPageType = .billing + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + + payPalDriver.requestOneTimePayment(request) { _,_ -> Void in } + + XCTAssertEqual("v1/paypal_hermes/create_payment_resource", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + + guard let experienceProfile = lastPostParameters["experience_profile"] as? Dictionary else { + XCTFail() + return + } + XCTAssertEqual(experienceProfile["landing_page_type"] as? String, "billing") + } + + func testCheckout_whenLandingPageTypeIsLogin_postsPaymentResourceWithLoginLandingPageType() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let request = BTPayPalRequest(amount: "1") + request.currencyCode = "GBP" + request.landingPageType = .login + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + + payPalDriver.requestOneTimePayment(request) { _,_ -> Void in } + + XCTAssertEqual("v1/paypal_hermes/create_payment_resource", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + + guard let experienceProfile = lastPostParameters["experience_profile"] as? Dictionary else { + XCTFail() + return + } + XCTAssertEqual(experienceProfile["landing_page_type"] as? String, "login") + } + + func testCheckout_whenUserActionIsNotSet_approvalUrlIsNotModified() { + mockAPIClient.cannedResponseBody = BTJSON(value: [ + "paymentResource": [ + "redirectUrl": "https://www.paypal.com/checkout/?EC-Token=EC-Random-Value" + ] ]) + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let request = BTPayPalRequest(amount: "1") + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + let mockRequestFactory = FakePayPalRequestFactory() + payPalDriver.requestFactory = mockRequestFactory + + payPalDriver.requestOneTimePayment(request) { _,_ -> Void in } + + guard let lastApprovalURL = mockRequestFactory.lastApprovalURL, + let approvalURLComponents = URLComponents(url: lastApprovalURL, resolvingAgainstBaseURL: false) else { + XCTFail("Did not find the last approval URL") + return + } + XCTAssertEqual(approvalURLComponents.queryItems?.filter({ $0.name == "EC-Token" && $0.value == "EC-Random-Value" }).count, 1, + "Did not find existing query parameter") + XCTAssertEqual(approvalURLComponents.queryItems?.filter({ $0.name == "useraction" }).count, 0, + "Found useraction query item when not expected") + } + + func testCheckout_whenUserActionIsSetToDefault_approvalUrlIsNotModified() { + mockAPIClient.cannedResponseBody = BTJSON(value: [ + "paymentResource": [ + "redirectUrl": "https://www.paypal.com/checkout/?EC-Token=EC-Random-Value" + ] ]) + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let request = BTPayPalRequest(amount: "1") + request.userAction = BTPayPalRequestUserAction.default + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + let mockRequestFactory = FakePayPalRequestFactory() + payPalDriver.requestFactory = mockRequestFactory + + payPalDriver.requestOneTimePayment(request) { _,_ -> Void in } + + guard let lastApprovalURL = mockRequestFactory.lastApprovalURL, + let approvalURLComponents = URLComponents(url: lastApprovalURL, resolvingAgainstBaseURL: false) else { + XCTFail("Did not find the last approval URL") + return + } + XCTAssertEqual(approvalURLComponents.queryItems?.filter({ $0.name == "EC-Token" && $0.value == "EC-Random-Value" }).count, 1, + "Did not find existing query parameter") + XCTAssertEqual(approvalURLComponents.queryItems?.filter({ $0.name == "useraction" }).count, 0, + "Found useraction query item when not expected") + } + + func testCheckout_whenUserActionIsSetToCommit_approvalUrlIsModified() { + mockAPIClient.cannedResponseBody = BTJSON(value: [ + "paymentResource": [ + "redirectUrl": "https://www.paypal.com/checkout/?EC-Token=EC-Random-Value" + ] ]) + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let request = BTPayPalRequest(amount: "1") + request.userAction = BTPayPalRequestUserAction.commit + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + let mockRequestFactory = FakePayPalRequestFactory() + payPalDriver.requestFactory = mockRequestFactory + + payPalDriver.requestOneTimePayment(request) { _,_ -> Void in } + + guard let lastApprovalURL = mockRequestFactory.lastApprovalURL, + let approvalURLComponents = URLComponents(url: lastApprovalURL, resolvingAgainstBaseURL: false) else { + XCTFail("Did not find the last approval URL") + return + } + + XCTAssertEqual(approvalURLComponents.queryItems?.filter({ $0.name == "EC-Token" && $0.value == "EC-Random-Value" }).count, 1, + "Did not find existing query parameter") + XCTAssertEqual(approvalURLComponents.queryItems?.filter({ $0.name == "useraction" && $0.value == "commit" }).count, 1, + "Did not find useraction query item") + } + + func testCheckout_whenDisplayNameIsNotSet_doesNotPostPaymentResourceWithBrandName() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let request = BTPayPalRequest(amount: "1") + request.currencyCode = "GBP" + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + + XCTAssertNil(request.displayName) + + payPalDriver.requestOneTimePayment(request) { _,_ -> Void in } + + XCTAssertEqual("v1/paypal_hermes/create_payment_resource", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + + guard let experienceProfile = lastPostParameters["experience_profile"] as? Dictionary else { + XCTFail() + return + } + XCTAssertFalse(experienceProfile.keys.contains("brand_name")) + } + + func testCheckout_whenDisplayNameIsSet_postsPaymentResourceWithDisplayName() { + let merchantName = "My Random Merchant Name" + + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let request = BTPayPalRequest(amount: "1") + request.currencyCode = "GBP" + request.displayName = merchantName + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + + payPalDriver.requestOneTimePayment(request) { _,_ -> Void in } + + XCTAssertEqual("v1/paypal_hermes/create_payment_resource", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + + guard let experienceProfile = lastPostParameters["experience_profile"] as? Dictionary else { + XCTFail() + return + } + XCTAssertEqual(experienceProfile["brand_name"] as? String, merchantName) + } + + func testCheckout_whenMerchantAccountIdIsSet_postsPaymentResourceWithMerchantAccountId() { + let merchantAccountId = "alternate-merchant-account-id" + + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let request = BTPayPalRequest(amount: "1") + request.currencyCode = "GBP" + request.merchantAccountId = merchantAccountId + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + + payPalDriver.requestOneTimePayment(request) { _,_ -> Void in } + + XCTAssertEqual("v1/paypal_hermes/create_payment_resource", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + + XCTAssertEqual(lastPostParameters["merchant_account_id"] as? String, merchantAccountId) + } + + func testCheckout_whenDisplayNameIsSetInConfiguration_postsPaymentResourceWithConfigurationBrandName() { + let merchantName = "My Random Merchant Name" + + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "paypalEnabled": true, + "paypal": [ + "displayName": merchantName + ] + ]) + payPalDriver.returnURLScheme = "foo://" + let request = BTPayPalRequest(amount: "1") + request.currencyCode = "GBP" + request.displayName = merchantName + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + + payPalDriver.requestOneTimePayment(request) { _,_ -> Void in } + + XCTAssertEqual("v1/paypal_hermes/create_payment_resource", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + + guard let experienceProfile = lastPostParameters["experience_profile"] as? Dictionary else { + XCTFail() + return + } + XCTAssertEqual(experienceProfile["brand_name"] as? String, merchantName) + } + + func testCheckout_whenRemoteConfigurationFetchSucceeds_postsPaymentResourceWithShippingAddress() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let request = BTPayPalRequest(amount: "1") + request.currencyCode = "GBP" + let address : BTPostalAddress = BTPostalAddress() + address.streetAddress = "1234 Fake St." + address.extendedAddress = "Apt. 0" + address.region = "CA" + address.locality = "Oakland" + address.countryCodeAlpha2 = "US" + address.postalCode = "12345" + request.shippingAddressOverride = address + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + payPalDriver.requestOneTimePayment(request) { _,_ -> Void in } + + XCTAssertEqual("v1/paypal_hermes/create_payment_resource", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + guard let experienceProfile = lastPostParameters["experience_profile"] as? Dictionary else { + XCTFail() + return + } + XCTAssertEqual(lastPostParameters["offer_paypal_credit"] as? Bool, false) + XCTAssertEqual(experienceProfile["address_override"] as? Bool, true) + XCTAssertEqual(lastPostParameters["line1"] as? String, "1234 Fake St.") + XCTAssertEqual(lastPostParameters["line2"] as? String, "Apt. 0") + XCTAssertEqual(lastPostParameters["city"] as? String, "Oakland") + XCTAssertEqual(lastPostParameters["state"] as? String, "CA") + XCTAssertEqual(lastPostParameters["postal_code"] as? String, "12345") + XCTAssertEqual(lastPostParameters["country_code"] as? String, "US") + } + + func testCheckout_whenRemoteConfigurationFetchSucceeds_postsPaymentResourceWithPartialShippingAddress() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let request = BTPayPalRequest(amount: "1") + request.currencyCode = "GBP" + let address : BTPostalAddress = BTPostalAddress() + address.streetAddress = "1234 Fake St." + address.region = "CA" + address.locality = "Oakland" + address.countryCodeAlpha2 = "US" + address.postalCode = "12345" + request.shippingAddressOverride = address + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + payPalDriver.requestOneTimePayment(request) { _,_ -> Void in } + + XCTAssertEqual("v1/paypal_hermes/create_payment_resource", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + guard let experienceProfile = lastPostParameters["experience_profile"] as? Dictionary else { + XCTFail() + return + } + XCTAssertEqual(lastPostParameters["offer_paypal_credit"] as? Bool, false) + XCTAssertEqual(experienceProfile["address_override"] as? Bool, true) + XCTAssertEqual(lastPostParameters["line1"] as? String, "1234 Fake St.") + XCTAssertNil(lastPostParameters["line2"]) + XCTAssertEqual(lastPostParameters["city"] as? String, "Oakland") + XCTAssertEqual(lastPostParameters["state"] as? String, "CA") + XCTAssertEqual(lastPostParameters["postal_code"] as? String, "12345") + XCTAssertEqual(lastPostParameters["country_code"] as? String, "US") + } + + func testCheckout_postsPaymentResourceWithShippingAddressEditable() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let request = BTPayPalRequest(amount: "1") + request.currencyCode = "GBP" + let address : BTPostalAddress = BTPostalAddress() + request.shippingAddressOverride = address + request.isShippingAddressEditable = true + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + payPalDriver.requestOneTimePayment(request) { _,_ -> Void in } + + XCTAssertEqual("v1/paypal_hermes/create_payment_resource", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + guard let experienceProfile = lastPostParameters["experience_profile"] as? Dictionary else { + XCTFail() + return + } + XCTAssertEqual(experienceProfile["address_override"] as? Bool, false) + } + + func testCheckout_whenRemoteConfigurationFetchSucceeds_postsPaymentResourceWithLineItems() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let request = BTPayPalRequest(amount: "1") + + let lineItem1 = BTPayPalLineItem.init(quantity: "2", + unitAmount: "1.23", + name: "itemName", + kind: .debit) + lineItem1.unitTaxAmount = "0.34" + lineItem1.itemDescription = "itemDescription" + lineItem1.productCode = "productCode" + lineItem1.url = URL.init(string: "https://www.example.com") + + let lineItem2 = BTPayPalLineItem.init(quantity: "3", + unitAmount: "2.34", + name: "itemName2", + kind: .credit) + + request.lineItems = [lineItem1, lineItem2] + + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + payPalDriver.requestOneTimePayment(request) { _,_ -> Void in } + + XCTAssertEqual("v1/paypal_hermes/create_payment_resource", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + + guard let lineItems = lastPostParameters["line_items"] as? Array else { + XCTFail() + return + } + + XCTAssertEqual(lineItems.count, 2) + + guard let firstLineItem = lineItems.first as? Dictionary else { + XCTFail() + return + } + + XCTAssertEqual(firstLineItem["quantity"], "2") + XCTAssertEqual(firstLineItem["unit_amount"], "1.23") + XCTAssertEqual(firstLineItem["name"], "itemName") + XCTAssertEqual(firstLineItem["kind"], "debit") + XCTAssertEqual(firstLineItem["unit_tax_amount"], "0.34") + XCTAssertEqual(firstLineItem["description"], "itemDescription") + XCTAssertEqual(firstLineItem["product_code"], "productCode") + XCTAssertEqual(firstLineItem["url"], "https://www.example.com") + + guard let secondLineItem = lineItems[1] as? Dictionary else { + XCTFail() + return + } + + XCTAssertEqual(secondLineItem["kind"], "credit") + } + + func testCheckout_whenPayPalCreditOffered_performsSwitchCorrectly() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let request = BTPayPalRequest(amount: "1") + request.currencyCode = "GBP" + request.offerCredit = true + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + + let mockRequestFactory = FakePayPalRequestFactory() + payPalDriver.requestFactory = mockRequestFactory + // Depending on whether it's iOS 9 or not, we use different stub delegates to wait for the app switch to occur + let stubViewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + let stubAppSwitchDelegate = MockAppSwitchDelegate() + + if #available(iOS 11.0, *) { + // do nothing + } else if #available(iOS 9.0, *) { + stubViewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = expectation(description: "Delegate received requestsPresentationOfViewController") + payPalDriver.viewControllerPresentingDelegate = stubViewControllerPresentingDelegate + } else { + stubAppSwitchDelegate.willPerformAppSwitchExpectation = expectation(description: "Delegate received willPerformAppSwitch") + stubAppSwitchDelegate.didPerformAppSwitchExpectation = expectation(description: "Delegate received didPerformAppSwitch") + stubAppSwitchDelegate.appContextWillSwitchExpectation = expectation(description: "Delegate received appContextWillSwitch") + payPalDriver.appSwitchDelegate = stubAppSwitchDelegate + } + + payPalDriver.requestOneTimePayment(request) { _,_ in } + + if #available(iOS 11.0, *) { + XCTAssertNotNil(payPalDriver.safariAuthenticationSession) + XCTAssertTrue(payPalDriver.isSFAuthenticationSessionStarted) + } else { + self.waitForExpectations(timeout: 2, handler: nil) + } + XCTAssertTrue(mockRequestFactory.checkoutRequest.appSwitchPerformed) + + // Ensure the payment resource had the correct parameters + XCTAssertEqual("v1/paypal_hermes/create_payment_resource", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + XCTAssertEqual(lastPostParameters["offer_paypal_credit"] as? Bool, true) + + // Make sure analytics event was sent when switch occurred + let postedAnalyticsEvents = mockAPIClient.postedAnalyticsEvents + + if #available(iOS 9.0, *) { + XCTAssertTrue(postedAnalyticsEvents.contains("ios.paypal-single-payment.webswitch.credit.offered.started")) + } else { + XCTAssertTrue(postedAnalyticsEvents.contains("ios.paypal-single-payment.appswitch.credit.offered.started")) + } + } + + func testCheckout_whenPayPalPaymentCreationSuccessful_performsAppSwitch() { + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let mockRequestFactory = FakePayPalRequestFactory() + payPalDriver.requestFactory = mockRequestFactory + // Depending on whether it's iOS 9 or not, we use different stub delegates to wait for the app switch to occur + let stubViewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + let stubAppSwitchDelegate = MockAppSwitchDelegate() + if #available(iOS 11.0, *) { + // do nothing + } else if #available(iOS 9.0, *) { + stubViewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = expectation(description: "Delegate received requestsPresentationOfViewController") + payPalDriver.viewControllerPresentingDelegate = stubViewControllerPresentingDelegate + } else { + stubAppSwitchDelegate.willPerformAppSwitchExpectation = expectation(description: "Delegate received willPerformAppSwitch") + stubAppSwitchDelegate.didPerformAppSwitchExpectation = expectation(description: "Delegate received didPerformAppSwitch") + stubAppSwitchDelegate.appContextWillSwitchExpectation = expectation(description: "Delegate received appContextWillSwitch") + payPalDriver.appSwitchDelegate = stubAppSwitchDelegate + } + + let request = BTPayPalRequest(amount: "1") + payPalDriver.requestOneTimePayment(request) { _,_ -> Void in } + + if #available(iOS 11.0, *) { + XCTAssertNotNil(payPalDriver.safariAuthenticationSession) + XCTAssertTrue(payPalDriver.isSFAuthenticationSessionStarted) + } else { + self.waitForExpectations(timeout: 2, handler: nil) + } + XCTAssertTrue(mockRequestFactory.checkoutRequest.appSwitchPerformed) + XCTAssertEqual(payPalDriver.clientMetadataId, "fake-canned-metadata-id") + } + + func testCheckout_whenPaymentResourceCreationFails_callsBackWithError() { + mockAPIClient.cannedResponseError = NSError(domain: "", code: 0, userInfo: nil) + + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + let dummyRequest = BTPayPalRequest(amount: "1") + let expectation = self.expectation(description: "Checkout fails with error") + payPalDriver.requestOneTimePayment(dummyRequest) { (_, error) -> Void in + XCTAssertEqual(error! as NSError, self.mockAPIClient.cannedResponseError!) + expectation.fulfill() + } + self.waitForExpectations(timeout: 2, handler: nil) + } + + func testCheckout_whenAppSwitchCancels_callsBackWithNoResultOrError() { + let payPalDriver = BTPayPalDriver(apiClient:mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let returnURL = URL(string: "bar://hello/world")! + + let continuationExpectation = self.expectation(description: "Continuation called") + + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + BTPayPalDriver.payPalClass().cannedResult()?.cannedType = .cancel + payPalDriver.setOneTimePaymentAppSwitchReturn ({ (tokenizedCheckout, error) -> Void in + XCTAssertNil(tokenizedCheckout) + XCTAssertNil(error) + continuationExpectation.fulfill() + }) + + BTPayPalDriver.handleAppSwitchReturn(returnURL) + + self.waitForExpectations(timeout: 2, handler: nil) + } + + func testCheckout_whenAppSwitchErrors_callsBackWithError() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let returnURL = URL(string: "bar://hello/world")! + + let continuationExpectation = self.expectation(description: "Continuation called") + + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + BTPayPalDriver.payPalClass().cannedResult()?.cannedType = .error + BTPayPalDriver.payPalClass().cannedResult()?.cannedError = NSError(domain: "", code: 0, userInfo: nil) + + payPalDriver.setOneTimePaymentAppSwitchReturn ({ (tokenizedCheckout, error) -> Void in + guard let error = error else {return} + XCTAssertNil(tokenizedCheckout) + XCTAssertEqual(error as NSError, FakePayPalOneTouchCore.self.cannedResult()!.error! as NSError) + continuationExpectation.fulfill() + }) + + BTPayPalDriver.handleAppSwitchReturn(returnURL) + + self.waitForExpectations(timeout: 2, handler: nil) + } + + func testCheckout_whenAppSwitchSucceeds_tokenizesPayPalCheckout() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + BTPayPalDriver.payPalClass().cannedResult()?.cannedType = .success + + payPalDriver.setOneTimePaymentAppSwitchReturn ({ _,_ -> Void in }) + BTPayPalDriver.handleAppSwitchReturn(URL(string: "bar://hello/world")!) + + XCTAssertEqual(mockAPIClient.lastPOSTPath, "/v1/payment_methods/paypal_accounts") + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + let paypalAccount = lastPostParameters["paypal_account"] as! NSDictionary + let options = paypalAccount["options"] as! NSDictionary + let validate = (options["validate"] as! NSNumber).boolValue + XCTAssertFalse(validate) + } + + func testCheckout_whenAppSwitchSucceeds_intentShouldExistAsPayPalAccountParameter() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + BTPayPalDriver.payPalClass().cannedResult()?.cannedType = .success + payPalDriver.payPalRequest = BTPayPalRequest(amount: "1.34") + payPalDriver.payPalRequest.intent = .sale + + payPalDriver.setOneTimePaymentAppSwitchReturn ({ _,_ -> Void in }) + BTPayPalDriver.handleAppSwitchReturn(URL(string: "bar://hello/world")!) + + XCTAssertEqual(mockAPIClient.lastPOSTPath, "/v1/payment_methods/paypal_accounts") + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + let paypalAccount = lastPostParameters["paypal_account"] as! NSDictionary + XCTAssertEqual(paypalAccount["intent"] as? String, "sale") + let options = paypalAccount["options"] as! NSDictionary + let validate = (options["validate"] as! NSNumber).boolValue + XCTAssertFalse(validate) + } + + func testCheckout_whenAppSwitchSucceeds_merchantAccountIdIsSet() { + let merchantAccountId = "alternate-merchant-account-id" + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + BTPayPalDriver.payPalClass().cannedResult()?.cannedType = .success + payPalDriver.payPalRequest = BTPayPalRequest(amount: "1.34") + payPalDriver.payPalRequest.merchantAccountId = merchantAccountId + + payPalDriver.setOneTimePaymentAppSwitchReturn ({ _,_ -> Void in }) + BTPayPalDriver.handleAppSwitchReturn(URL(string: "bar://hello/world")!) + + XCTAssertEqual(mockAPIClient.lastPOSTPath, "/v1/payment_methods/paypal_accounts") + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + XCTAssertEqual(lastPostParameters["merchant_account_id"] as? String, merchantAccountId) + } + + func testCheckout_whenCreditFinancingNotReturned_shouldNotSendCreditAcceptedAnalyticsEvent() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + mockAPIClient.cannedResponseBody = BTJSON(value: [ "paypalAccounts": + [ + [ + "description": "jane.doe@example.com", + "details": [ + "email": "jane.doe@example.com", + ], + "nonce": "a-nonce", + "type": "PayPalAccount", + ] + ] + ]) + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + BTPayPalDriver.payPalClass().cannedResult()?.cannedType = .success + payPalDriver.payPalRequest = BTPayPalRequest(amount: "1.34") + + payPalDriver.setOneTimePaymentAppSwitchReturn ({ _,_ -> Void in }) + BTPayPalDriver.handleAppSwitchReturn(URL(string: "bar://hello/world")!) + + XCTAssertFalse(mockAPIClient.postedAnalyticsEvents.contains("ios.paypal-single-payment.credit.accepted")) + } + + func testCheckout_whenCreditFinancingReturned_shouldSendCreditAcceptedAnalyticsEvent() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + mockAPIClient.cannedResponseBody = BTJSON(value: [ "paypalAccounts": + [ + [ + "description": "jane.doe@example.com", + "details": [ + "email": "jane.doe@example.com", + "creditFinancingOffered": [ + "cardAmountImmutable": true, + "monthlyPayment": [ + "currency": "USD", + "value": "13.88", + ], + "payerAcceptance": true, + "term": 18, + "totalCost": [ + "currency": "USD", + "value": "250.00", + ], + "totalInterest": [ + "currency": "USD", + "value": "0.00", + ], + ], + ], + "nonce": "a-nonce", + "type": "PayPalAccount", + ] + ] + ]) + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + BTPayPalDriver.payPalClass().cannedResult()?.cannedType = .success + payPalDriver.payPalRequest = BTPayPalRequest(amount: "1.34") + + payPalDriver.setOneTimePaymentAppSwitchReturn ({ _,_ -> Void in }) + BTPayPalDriver.handleAppSwitchReturn(URL(string: "bar://hello/world")!) + + XCTAssertTrue(mockAPIClient.postedAnalyticsEvents.contains("ios.paypal-single-payment.credit.accepted")) + } + + func testCheckout_whenAppSwitchSucceeds_makesDelegateCallback() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + let delegate = MockAppSwitchDelegate() + delegate.appContextDidReturnExpectation = expectation(description: "appContextDidReturn called") + payPalDriver.appSwitchDelegate = delegate + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + BTPayPalDriver.payPalClass().cannedResult()?.cannedType = .success + + payPalDriver.setOneTimePaymentAppSwitchReturn ({ _,_ -> Void in }) + BTPayPalDriver.handleAppSwitchReturn(URL(string: "bar://hello/world")!) + + waitForExpectations(timeout: 2, handler: nil) + } + + func testCheckout_whenAppSwitchResultIsError_returnsUnderlyingError() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + BTPayPalDriver.payPalClass().cannedResult()?.cannedType = .error + let fakeError = NSError(domain: "FakeError", code: 1, userInfo: nil) + BTPayPalDriver.payPalClass().cannedResult()?.cannedError = fakeError + + let expectation = self.expectation(description: "App switch completion callback") + payPalDriver.setOneTimePaymentAppSwitchReturn ({ (tokenizedCheckout, error) -> Void in + guard let error = error else { + XCTFail() + return + } + XCTAssertEqual(error as NSError, fakeError) + expectation.fulfill() + }) + + BTPayPalDriver.handleAppSwitchReturn(URL(string: "bar://hello/world")!) + + self.waitForExpectations(timeout: 5, handler: nil) + } + + func testCheckout_whenUsingCustomHandler_callsHandleApprovalDelegateMethod() { + guard #available(iOS 9.0, *) else { + return + } + + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + + let handler = MockPayPalApprovalHandlerDelegate() + handler.url = NSURL(string: "some://url") + + handler.handleApprovalExpectation = self.expectation(description: "Delegate received handleApproval") + let blockExpectation = self.expectation(description: "Completion block reached") + payPalDriver.requestOneTimePayment(BTPayPalRequest(amount: "1"), handler: handler) { (_, _) in + XCTAssertNotNil(handler); + blockExpectation.fulfill() + } + + self.waitForExpectations(timeout: 2, handler: nil) + } + + func testtokenizedPayPalAccount_containsPayerInfo() { + let checkoutResponse = [ + "paypalAccounts": [ + [ + "nonce": "a-nonce", + "description": "A description", + "details": [ + "email": "hello@world.com", + "payerInfo": [ + "firstName": "Some", + "lastName": "Dude", + "phone": "867-5309", + "payerId": "FAKE-PAYER-ID", + "accountAddress": [ + "street1": "1 Foo Ct", + "street2": "Apt Bar", + "city": "Fubar", + "state": "FU", + "postalCode": "42", + "country": "USA" + ], + "billingAddress": [ + "recipientName": "Bar Foo", + "line1": "2 Foo Ct", + "line2": "Apt Foo", + "city": "Barfoo", + "state": "BF", + "postalCode": "24", + "countryCode": "ASU" + ], + "shippingAddress": [ + "recipientName": "Some Dude", + "line1": "3 Foo Ct", + "line2": "Apt 5", + "city": "Dudeville", + "state": "CA", + "postalCode": "24", + "countryCode": "US" + ] + ] + ] + ] ] ] + assertSuccessfulCheckoutResponse(checkoutResponse as [String : AnyObject], + assertionBlock: { (tokenizedPayPalAccount, error) -> Void in + XCTAssertEqual(tokenizedPayPalAccount!.nonce, "a-nonce") + XCTAssertEqual(tokenizedPayPalAccount!.localizedDescription, "A description") + XCTAssertEqual(tokenizedPayPalAccount!.firstName, "Some") + XCTAssertEqual(tokenizedPayPalAccount!.lastName, "Dude") + XCTAssertEqual(tokenizedPayPalAccount!.phone, "867-5309") + XCTAssertEqual(tokenizedPayPalAccount!.email, "hello@world.com") + XCTAssertEqual(tokenizedPayPalAccount!.payerId, "FAKE-PAYER-ID") + let billingAddress = tokenizedPayPalAccount!.billingAddress! + let shippingAddress = tokenizedPayPalAccount!.shippingAddress! + XCTAssertEqual(billingAddress.recipientName, "Bar Foo") + XCTAssertEqual(billingAddress.streetAddress, "2 Foo Ct") + XCTAssertEqual(billingAddress.extendedAddress, "Apt Foo") + XCTAssertEqual(billingAddress.locality, "Barfoo") + XCTAssertEqual(billingAddress.region, "BF") + XCTAssertEqual(billingAddress.postalCode, "24") + XCTAssertEqual(billingAddress.countryCodeAlpha2, "ASU") + XCTAssertEqual(shippingAddress.recipientName, "Some Dude") + XCTAssertEqual(shippingAddress.streetAddress, "3 Foo Ct") + XCTAssertEqual(shippingAddress.extendedAddress, "Apt 5") + XCTAssertEqual(shippingAddress.locality, "Dudeville") + XCTAssertEqual(shippingAddress.region, "CA") + XCTAssertEqual(shippingAddress.postalCode, "24") + XCTAssertEqual(shippingAddress.countryCodeAlpha2, "US") + }) + } + + func testtokenizedPayPalAccount_whenEmailAddressIsNestedInsidePayerInfoJSON_usesNestedEmailAddress() { + let checkoutResponse = [ + "paypalAccounts": [ + [ + "nonce": "fake-nonce", + "details": [ + "email": "not-hello@world.com", + "payerInfo": [ + "email": "hello@world.com", + ] + ], + ] + ] ] + assertSuccessfulCheckoutResponse(checkoutResponse as [String : AnyObject], + assertionBlock: { (tokenizedPayPalAccount, error) -> Void in + XCTAssertEqual(tokenizedPayPalAccount!.email, "hello@world.com") + }) + } + + func testtokenizedPayPalAccount_whenDescriptionJSONIsPayPal_usesEmailAsLocalizedDescription() { + let checkoutResponse = [ + "paypalAccounts": [ + [ + "nonce": "fake-nonce", + "description": "PayPal", + "details": [ + "email": "hello@world.com", + ], + ] + ] ] + assertSuccessfulCheckoutResponse(checkoutResponse as [String : AnyObject], + assertionBlock: { (tokenizedPayPalAccount, error) -> Void in + XCTAssertEqual(tokenizedPayPalAccount!.localizedDescription, "hello@world.com") + }) + } + + // MARK: _meta parameter + + func testMetadata_whenCheckoutAppSwitchIsSuccessful_isPOSTedToServer() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + let stubPayPalClass = FakePayPalOneTouchCore.self + stubPayPalClass.cannedResult()?.cannedType = .success + stubPayPalClass.setCannedIsWalletAppAvailable(true) + BTPayPalDriver.setPayPalClass(stubPayPalClass) + payPalDriver.setOneTimePaymentAppSwitchReturn ({ _,_ -> Void in }) + BTPayPalDriver.handleAppSwitchReturn(URL(string: "bar://hello/world")!) + + XCTAssertEqual(mockAPIClient.lastPOSTPath, "/v1/payment_methods/paypal_accounts") + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + let metaParameters = lastPostParameters["_meta"] as! NSDictionary + XCTAssertEqual(metaParameters["source"] as? String, "paypal-app") + XCTAssertEqual(metaParameters["integration"] as? String, "custom") + XCTAssertEqual(metaParameters["sessionId"] as? String, mockAPIClient.metadata.sessionId) + } + + func testMetadata_whenCheckoutBrowserSwitchIsSuccessful_isPOSTedToServer() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + let stubPayPalClass = FakePayPalOneTouchCore.self + stubPayPalClass.cannedResult()?.cannedType = .success + stubPayPalClass.setCannedIsWalletAppAvailable(false) + BTPayPalDriver.setPayPalClass(stubPayPalClass) + payPalDriver.setOneTimePaymentAppSwitchReturn ({ _,_ -> Void in }) + BTPayPalDriver.handleAppSwitchReturn(URL(string: "bar://hello/world")!) + + XCTAssertEqual(mockAPIClient.lastPOSTPath, "/v1/payment_methods/paypal_accounts") + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + let metaParameters = lastPostParameters["_meta"] as! NSDictionary + XCTAssertEqual(metaParameters["source"] as? String, "paypal-browser") + XCTAssertEqual(metaParameters["integration"] as? String, "custom") + XCTAssertEqual(metaParameters["sessionId"] as? String, mockAPIClient.metadata.sessionId) + } + + // MARK: Helpers + + func assertSuccessfulCheckoutResponse(_ response: [String:AnyObject], assertionBlock: @escaping (BTPayPalAccountNonce?, NSError?) -> Void) { + mockAPIClient.cannedResponseBody = BTJSON(value: response) + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + BTPayPalDriver.payPalClass().cannedResult()?.cannedType = .success + + payPalDriver.setOneTimePaymentAppSwitchReturn ({ (tokenizedPayPalAccount, error) -> Void in + assertionBlock(tokenizedPayPalAccount, error as NSError?) + }) + BTPayPalDriver.handleAppSwitchReturn(URL(string: "bar://hello/world")!) + } + + // MARK: - Analytics + + func testAPIClientMetadata_whenWalletAppIsInstalled_hasSourceSetToPayPalApp() { + // API client by default uses source = .Unknown and integration = .Custom + let apiClient = BTAPIClient(authorization: "development_testing_integration_merchant_id")! + // It is critical to stub PayPalClass before instantiating the driver, since that is when source is set + let stubPayPalClass = FakePayPalOneTouchCore.self + stubPayPalClass.setCannedIsWalletAppAvailable(true) + BTPayPalDriver.setPayPalClass(stubPayPalClass) + let payPalDriver = BTPayPalDriver(apiClient: apiClient) + + XCTAssertEqual(payPalDriver.apiClient?.metadata.integration, BTClientMetadataIntegrationType.custom) + XCTAssertEqual(payPalDriver.apiClient?.metadata.source, BTClientMetadataSourceType.payPalApp) + } + + func testAPIClientMetadata_whenWalletAppIsNotAvailable_hasSourceSetToPayPalBrowser() { + let apiClient = BTAPIClient(authorization: "development_testing_integration_merchant_id")! + let stubPayPalClass = FakePayPalOneTouchCore.self + stubPayPalClass.setCannedIsWalletAppAvailable(false) + BTPayPalDriver.setPayPalClass(stubPayPalClass) + let payPalDriver = BTPayPalDriver(apiClient: apiClient) + + XCTAssertEqual(payPalDriver.apiClient?.metadata.integration, BTClientMetadataIntegrationType.custom) + XCTAssertEqual(payPalDriver.apiClient?.metadata.source, BTClientMetadataSourceType.payPalBrowser) + } +} + +// MARK: - Billing Agreements + +class BTPayPalDriver_BillingAgreements_Tests: XCTestCase { + + var mockAPIClient : MockAPIClient = MockAPIClient(authorization: "development_tokenization_key")! + + override func setUp() { + super.setUp() + + mockAPIClient = MockAPIClient(authorization: "development_tokenization_key")! + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "paypalEnabled": true, + "paypal": [ + "environment": "offline" + ] ]) + mockAPIClient.cannedResponseBody = BTJSON(value: [ + "paymentResource": [ + "redirectUrl": "fakeURL://" + ] ]) + + } + + func testBillingAgreement_whenAPIClientIsNil_callsBackWithError() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + payPalDriver.apiClient = nil + + let request = BTPayPalRequest(amount: "1") + let expectation = self.expectation(description: "Billing Agreement fails with error") + payPalDriver.requestBillingAgreement(request) { (tokenizedPayPalAccount, error) -> Void in + XCTAssertNil(tokenizedPayPalAccount) + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTPayPalDriverErrorDomain) + XCTAssertEqual(error.code, BTPayPalDriverErrorType.integration.rawValue) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testBillingAgreement_whenRemoteConfigurationFetchFails_callsBackWithConfigurationError() { + mockAPIClient.cannedConfigurationResponseBody = nil + mockAPIClient.cannedConfigurationResponseError = NSError(domain: "", code: 0, userInfo: nil) + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + + let request = BTPayPalRequest() + let expectation = self.expectation(description: "Checkout fails with error") + payPalDriver.requestBillingAgreement(request) { (_, error) -> Void in + XCTAssertEqual(error! as NSError, self.mockAPIClient.cannedConfigurationResponseError!) + expectation.fulfill() + } + + self.waitForExpectations(timeout: 2, handler: nil) + } + + func testBillingAgreement_whenRemoteConfigurationFetchSucceeds_postsSetupBillingAgreement() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + + payPalDriver.requestBillingAgreement(BTPayPalRequest()) { _,_ -> Void in } + + XCTAssertEqual("v1/paypal_hermes/setup_billing_agreement", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + XCTAssertEqual(lastPostParameters["return_url"] as? String, "scheme://return") + XCTAssertEqual(lastPostParameters["cancel_url"] as? String, "scheme://cancel") + XCTAssertEqual(lastPostParameters["offer_paypal_credit"] as? Bool, false) + } + + func testBillingAgreement_whenMerchantAccountIdIsSet_postsPaymentResourceWithMerchantAccountId() { + let merchantAccountId = "alternate-merchant-account-id" + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + let request = BTPayPalRequest() + request.merchantAccountId = merchantAccountId + + payPalDriver.requestBillingAgreement(request) { _,_ -> Void in } + + XCTAssertEqual("v1/paypal_hermes/setup_billing_agreement", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + XCTAssertEqual(lastPostParameters["merchant_account_id"] as? String, merchantAccountId) + } + + func testBillingAgreement_whenPayPalCreditOffered_performsSwitchCorrectly() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let request = BTPayPalRequest() + request.offerCredit = true + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + + let mockRequestFactory = FakePayPalRequestFactory() + payPalDriver.requestFactory = mockRequestFactory + // Depending on whether it's iOS 9 or not, we use different stub delegates to wait for the app switch to occur + let stubViewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + let stubAppSwitchDelegate = MockAppSwitchDelegate() + if #available(iOS 11.0, *) { + // do nothing + } else if #available(iOS 9.0, *) { + stubViewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = expectation(description: "Delegate received requestsPresentationOfViewController") + payPalDriver.viewControllerPresentingDelegate = stubViewControllerPresentingDelegate + } else { + stubAppSwitchDelegate.willPerformAppSwitchExpectation = expectation(description: "Delegate received willPerformAppSwitch") + stubAppSwitchDelegate.didPerformAppSwitchExpectation = expectation(description: "Delegate received didPerformAppSwitch") + stubAppSwitchDelegate.appContextWillSwitchExpectation = expectation(description: "Delegate received appContextWillSwitch") + payPalDriver.appSwitchDelegate = stubAppSwitchDelegate + } + + payPalDriver.requestBillingAgreement(request) { _,_ in } + + if #available(iOS 11.0, *) { + XCTAssertNotNil(payPalDriver.safariAuthenticationSession) + XCTAssertTrue(payPalDriver.isSFAuthenticationSessionStarted) + } else { + self.waitForExpectations(timeout: 2, handler: nil) + } + + XCTAssertTrue(mockRequestFactory.billingAgreementRequest.appSwitchPerformed) + + // Ensure the payment resource had the correct parameters + XCTAssertEqual("v1/paypal_hermes/setup_billing_agreement", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + XCTAssertEqual(lastPostParameters["offer_paypal_credit"] as? Bool, true) + + // Make sure analytics event was sent when switch occurred + let postedAnalyticsEvents = mockAPIClient.postedAnalyticsEvents + + if #available(iOS 9.0, *) { + XCTAssertTrue(postedAnalyticsEvents.contains("ios.paypal-ba.webswitch.credit.offered.started")) + } else { + XCTAssertTrue(postedAnalyticsEvents.contains("ios.paypal-ba.appswitch.credit.offered.started")) + } + } + + func testBillingAgreement_whenAppSwitchSucceeds_tokenizesPayPalAccount() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + BTPayPalDriver.payPalClass().cannedResult()?.cannedType = .success + + payPalDriver.setBillingAgreementAppSwitchReturn ({ _,_ -> Void in }) + BTPayPalDriver.handleAppSwitchReturn(URL(string: "bar://hello/world")!) + + XCTAssertEqual(mockAPIClient.lastPOSTPath, "/v1/payment_methods/paypal_accounts") + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + let paypalAccount = lastPostParameters["paypal_account"] as! NSDictionary + XCTAssertEqual(paypalAccount, FakePayPalOneTouchCoreResult().response as AnyObject as! NSDictionary) + } + + func testBillingAgreement_whenConfigurationHasCurrency_doesNotSendCurrencyOrIntentViaPOSTParameters() { + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "paypalEnabled": true, + "paypal": [ + "environment": "offline", + "currencyIsoCode": "GBP", + ] ]) + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + + payPalDriver.requestBillingAgreement(BTPayPalRequest()) { _,_ -> Void in } + + XCTAssertEqual("v1/paypal_hermes/setup_billing_agreement", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + XCTAssertTrue(lastPostParameters["currency_iso_code"] == nil) + XCTAssertTrue(lastPostParameters["intent"] == nil) + } + + func testBillingAgreement_whenCheckoutRequestHasCurrency_doesNotSendCurrencyViaPOSTParameters() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + let request = BTPayPalRequest() + request.currencyCode = "GBP" + + payPalDriver.requestBillingAgreement(request) { _,_ -> Void in } + + XCTAssertEqual("v1/paypal_hermes/setup_billing_agreement", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + XCTAssertTrue(lastPostParameters["currency_iso_code"] == nil) + } + + func testBillingAgreement_whenRequestHasBillingAgreementDescription_sendsDescriptionInParameters() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + let request = BTPayPalRequest() + request.billingAgreementDescription = "My Billing Agreement description" + + payPalDriver.requestBillingAgreement(request) { _,_ -> Void in } + + XCTAssertEqual("v1/paypal_hermes/setup_billing_agreement", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + XCTAssertEqual(lastPostParameters["description"] as? String, "My Billing Agreement description") + } + + func testBillingAgreement_whenSetupBillingAgreementCreationSuccessful_performsPayPalRequestAppSwitch() { + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let mockRequestFactory = FakePayPalRequestFactory() + payPalDriver.requestFactory = mockRequestFactory + // Depending on whether it's iOS 9 or not, we use different stub delegates to wait for the app switch to occur + let stubViewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + let stubAppSwitchDelegate = MockAppSwitchDelegate() + if #available(iOS 11.0, *) { + // do nothing + } else if #available(iOS 9.0, *) { + stubViewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = expectation(description: "Delegate received requestsPresentationOfViewController") + payPalDriver.viewControllerPresentingDelegate = stubViewControllerPresentingDelegate + } else { + stubAppSwitchDelegate.willPerformAppSwitchExpectation = expectation(description: "Delegate received willPerformAppSwitch") + stubAppSwitchDelegate.didPerformAppSwitchExpectation = expectation(description: "Delegate received didPerformAppSwitch") + stubAppSwitchDelegate.appContextWillSwitchExpectation = expectation(description: "Delegate received appContextWillSwitch") + payPalDriver.appSwitchDelegate = stubAppSwitchDelegate + } + + let request = BTPayPalRequest() + payPalDriver.requestBillingAgreement(request) { _,_ -> Void in } + + if #available(iOS 11.0, *) { + XCTAssertNotNil(payPalDriver.safariAuthenticationSession) + XCTAssertTrue(payPalDriver.isSFAuthenticationSessionStarted) + } else { + self.waitForExpectations(timeout: 2, handler: nil) + } + XCTAssertTrue(mockRequestFactory.billingAgreementRequest.appSwitchPerformed) + } + + func testBillingAgreement_whenSetupBillingAgreementCreationFails_callsBackWithError() { + mockAPIClient.cannedResponseError = NSError(domain: "", code: 0, userInfo: nil) + + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + let dummyRequest = BTPayPalRequest() + let expectation = self.expectation(description: "Checkout fails with error") + payPalDriver.requestBillingAgreement(dummyRequest) { (_, error) -> Void in + XCTAssertEqual(error! as NSError, self.mockAPIClient.cannedResponseError!) + expectation.fulfill() + } + self.waitForExpectations(timeout: 2, handler: nil) + } + + + func testBillingAgreement_whenSFSafariViewControllerIsAvailable_callsViewControllerPresentationDelegateMethods() { + guard #available(iOS 9.0, *) else { + return + } + + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + let viewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + + // Setup for requestsPersentationOfViewController + viewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = self.expectation(description: "Delegate received requestsPresentationOfViewController") + + payPalDriver.viewControllerPresentingDelegate = viewControllerPresentingDelegate + payPalDriver.informDelegatePresentingViewControllerRequestPresent(URL(string: "http://example.com")!) + + self.waitForExpectations(timeout: 2, handler: nil) + + XCTAssertTrue(viewControllerPresentingDelegate.lastViewController is SFSafariViewController) + XCTAssertEqual(viewControllerPresentingDelegate.lastViewController, payPalDriver.safariViewController) + let payPalDriverViewControllerPresented = payPalDriver.safariViewController + XCTAssertEqual(viewControllerPresentingDelegate.lastPaymentDriver as? BTPayPalDriver, payPalDriver) + + viewControllerPresentingDelegate.lastViewController = nil + viewControllerPresentingDelegate.lastPaymentDriver = nil + + // Setup for requestsDismissalOfViewController + viewControllerPresentingDelegate.requestsDismissalOfViewControllerExpectation = self.expectation(description: "Delegate received requestsDismissalOfViewController") + payPalDriver.informDelegatePresentingViewControllerNeedsDismissal() + + self.waitForExpectations(timeout: 2, handler: nil) + + XCTAssertTrue(viewControllerPresentingDelegate.lastViewController is SFSafariViewController) + XCTAssertEqual(viewControllerPresentingDelegate.lastViewController as? SFSafariViewController, payPalDriverViewControllerPresented) + XCTAssertNil(payPalDriver.safariViewController) + + XCTAssertEqual(viewControllerPresentingDelegate.lastPaymentDriver as? BTPayPalDriver, payPalDriver) + } + + func testBillingAgreement_whenSFSafariViewControllerIsAvailableButNoViewControllerPresentingDelegateSet_logsError() { + guard #available(iOS 9.0, *) else { + return + } + + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + + var criticalMessageLogged = false + BTLogger.shared().logBlock = { + (level: BTLogLevel, message: String?) in + if (level == BTLogLevel.critical && message == "Unable to display View Controller to continue PayPal flow. BTPayPalDriver needs a viewControllerPresentingDelegate to be set.") { + criticalMessageLogged = true + } + return + } + + payPalDriver.informDelegatePresentingViewControllerRequestPresent(URL(string: "http://example.com")!) + XCTAssertTrue(criticalMessageLogged) + } + + func testBillingAgreement_whenSFSafariViewControllerIsAvailable_doesNotCallAppSwitchDelegateMethods() { + guard #available(iOS 9.0, *) else { + return + } + + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "paypalEnabled": true, + "paypal": [ + "environment": "offline" + ] ]) + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + BTPayPalDriver.payPalClass().cannedResult()?.cannedType = PPOTResultType.success + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + payPalDriver.returnURLScheme = "foo://" + payPalDriver.requestFactory = FakePayPalRequestFactory() + let stubViewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + if #available(iOS 11.0, *) { + // do nothing + } else if #available(iOS 9.0, *) { + stubViewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = expectation(description: "Delegate received requestsPresentationOfViewController") + } + payPalDriver.viewControllerPresentingDelegate = stubViewControllerPresentingDelegate + let mockAppSwitchDelegate = MockAppSwitchDelegate() + payPalDriver.appSwitchDelegate = mockAppSwitchDelegate + + payPalDriver.requestBillingAgreement(BTPayPalRequest(amount: "1")) { _,_ -> Void in } + + if #available(iOS 11.0, *) { + XCTAssertNotNil(payPalDriver.safariAuthenticationSession) + XCTAssertTrue(payPalDriver.isSFAuthenticationSessionStarted) + } else { + self.waitForExpectations(timeout: 2, handler: nil) + } + + XCTAssertFalse(mockAppSwitchDelegate.willPerformAppSwitchCalled) + XCTAssertFalse(mockAppSwitchDelegate.didPerformAppSwitchCalled) + + if #available(iOS 11.0, *) { + // do nothing + } else if #available(iOS 9.0, *) { + stubViewControllerPresentingDelegate.requestsDismissalOfViewControllerExpectation = expectation(description: "Delegate received requestsDismissalOfViewController") + } + + BTPayPalDriver.handleAppSwitchReturn(URL(string: "bar://hello/world")!) + + if #available(iOS 11.0, *) { + XCTAssertNotNil(payPalDriver.safariAuthenticationSession) + XCTAssertTrue(payPalDriver.isSFAuthenticationSessionStarted) + } else { + self.waitForExpectations(timeout: 2, handler: nil) + } + + XCTAssertFalse(mockAppSwitchDelegate.willProcessAppSwitchCalled) + } + + func testBillingAgreement_whenSFSafariViewControllerIsAvailable_makesContextSwitchDelegateCallbacks() { + guard #available(iOS 9.0, *) else { + return + } + + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "paypalEnabled": true, + "paypal": [ + "environment": "offline" + ] ]) + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + BTPayPalDriver.payPalClass().cannedResult()?.cannedType = PPOTResultType.success + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + payPalDriver.returnURLScheme = "foo://" + payPalDriver.requestFactory = FakePayPalRequestFactory() + let stubViewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + if #available(iOS 11.0, *) { + // do nothing + } else if #available(iOS 9.0, *) { + stubViewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = expectation(description: "Delegate received requestsPresentationOfViewController") + } + payPalDriver.viewControllerPresentingDelegate = stubViewControllerPresentingDelegate + let mockAppSwitchDelegate = MockAppSwitchDelegate() + payPalDriver.appSwitchDelegate = mockAppSwitchDelegate + + payPalDriver.requestBillingAgreement(BTPayPalRequest(amount: "1")) { _,_ -> Void in } + + if #available(iOS 11.0, *) { + XCTAssertNotNil(payPalDriver.safariAuthenticationSession) + XCTAssertTrue(payPalDriver.isSFAuthenticationSessionStarted) + } else { + self.waitForExpectations(timeout: 2, handler: nil) + } + + XCTAssertTrue(mockAppSwitchDelegate.appContextWillSwitchCalled) + XCTAssertFalse(mockAppSwitchDelegate.appContextDidReturnCalled) + + if #available(iOS 11.0, *) { + // do nothing + } else if #available(iOS 9.0, *) { + stubViewControllerPresentingDelegate.requestsDismissalOfViewControllerExpectation = expectation(description: "Delegate received requestsDismissalOfViewController") + } + + BTPayPalDriver.handleAppSwitchReturn(URL(string: "bar://hello/world")!) + + if #available(iOS 11.0, *) { + XCTAssertNotNil(payPalDriver.safariAuthenticationSession) + XCTAssertTrue(payPalDriver.isSFAuthenticationSessionStarted) + } else { + self.waitForExpectations(timeout: 2, handler: nil) + } + + XCTAssertTrue(mockAppSwitchDelegate.appContextDidReturnCalled) + } + + func testBillingAgreement_whenUsingCustomHandler_callsHandleApprovalDelegateMethod() { + guard #available(iOS 9.0, *) else { + return + } + + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + + let handler = MockPayPalApprovalHandlerDelegate() + handler.url = NSURL(string: "some://url") + + handler.handleApprovalExpectation = self.expectation(description: "Delegate received handleApproval") + let blockExpectation = self.expectation(description: "Completion block reached") + payPalDriver.requestBillingAgreement(BTPayPalRequest(), handler: handler) { (_, _) in + XCTAssertNotNil(handler); + blockExpectation.fulfill() + } + + self.waitForExpectations(timeout: 2, handler: nil) + } + + func testBillingAgreement_whenCreditFinancingNotReturned_shouldNotSendCreditAcceptedAnalyticsEvent() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + mockAPIClient.cannedResponseBody = BTJSON(value: [ "paypalAccounts": + [ + [ + "description": "jane.doe@example.com", + "details": [ + "email": "jane.doe@example.com", + ], + "nonce": "a-nonce", + "type": "PayPalAccount", + ] + ] + ]) + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + BTPayPalDriver.payPalClass().cannedResult()?.cannedType = .success + payPalDriver.payPalRequest = BTPayPalRequest() + + payPalDriver.setBillingAgreementAppSwitchReturn ({ _,_ -> Void in }) + BTPayPalDriver.handleAppSwitchReturn(URL(string: "bar://hello/world")!) + + XCTAssertFalse(mockAPIClient.postedAnalyticsEvents.contains("ios.paypal-ba.credit.accepted")) + } + + func testBillingAgreement_whenCreditFinancingReturned_shouldSendCreditAcceptedAnalyticsEvent() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + mockAPIClient.cannedResponseBody = BTJSON(value: [ "paypalAccounts": + [ + [ + "description": "jane.doe@example.com", + "details": [ + "email": "jane.doe@example.com", + "creditFinancingOffered": [ + "cardAmountImmutable": true, + "monthlyPayment": [ + "currency": "USD", + "value": "13.88", + ], + "payerAcceptance": true, + "term": 18, + "totalCost": [ + "currency": "USD", + "value": "250.00", + ], + "totalInterest": [ + "currency": "USD", + "value": "0.00", + ], + ], + ], + "nonce": "a-nonce", + "type": "PayPalAccount", + ] + ] + ]) + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + BTPayPalDriver.payPalClass().cannedResult()?.cannedType = .success + payPalDriver.payPalRequest = BTPayPalRequest() + + payPalDriver.setBillingAgreementAppSwitchReturn ({ _,_ -> Void in }) + BTPayPalDriver.handleAppSwitchReturn(URL(string: "bar://hello/world")!) + + XCTAssertTrue(mockAPIClient.postedAnalyticsEvents.contains("ios.paypal-ba.credit.accepted")) + } + + func testBillingAgreement_whenRemoteConfigurationFetchSucceeds_postsPaymentResourceWithShippingAddress() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let request = BTPayPalRequest() + request.currencyCode = "GBP" + let address : BTPostalAddress = BTPostalAddress() + address.streetAddress = "1234 Fake St." + address.extendedAddress = "Apt. 0" + address.region = "CA" + address.locality = "Oakland" + address.countryCodeAlpha2 = "US" + address.postalCode = "12345" + request.shippingAddressOverride = address + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + payPalDriver.requestBillingAgreement(request) { _,_ -> Void in } + + XCTAssertEqual("v1/paypal_hermes/setup_billing_agreement", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + guard let experienceProfile = lastPostParameters["experience_profile"] as? Dictionary else { + XCTFail() + return + } + guard let shippingAddress = lastPostParameters["shipping_address"] as? Dictionary else { + XCTFail() + return + } + XCTAssertEqual(lastPostParameters["offer_paypal_credit"] as? Bool, false) + XCTAssertEqual(experienceProfile["address_override"] as? Bool, true) + XCTAssertEqual(shippingAddress["line1"] as? String, "1234 Fake St.") + XCTAssertEqual(shippingAddress["line2"] as? String, "Apt. 0") + XCTAssertEqual(shippingAddress["city"] as? String, "Oakland") + XCTAssertEqual(shippingAddress["state"] as? String, "CA") + XCTAssertEqual(shippingAddress["postal_code"] as? String, "12345") + XCTAssertEqual(shippingAddress["country_code"] as? String, "US") + } + + func testBillingAgreement_whenRemoteConfigurationFetchSucceeds_postsPaymentResourceWithPartialShippingAddress() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let request = BTPayPalRequest() + request.currencyCode = "GBP" + let address : BTPostalAddress = BTPostalAddress() + address.streetAddress = "1234 Fake St." + address.region = "CA" + address.locality = "Oakland" + address.countryCodeAlpha2 = "US" + address.postalCode = "12345" + request.shippingAddressOverride = address + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + payPalDriver.requestBillingAgreement(request) { _,_ -> Void in } + + XCTAssertEqual("v1/paypal_hermes/setup_billing_agreement", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + guard let experienceProfile = lastPostParameters["experience_profile"] as? Dictionary else { + XCTFail() + return + } + guard let shippingAddress = lastPostParameters["shipping_address"] as? Dictionary else { + XCTFail() + return + } + XCTAssertEqual(lastPostParameters["offer_paypal_credit"] as? Bool, false) + XCTAssertEqual(experienceProfile["address_override"] as? Bool, true) + XCTAssertEqual(shippingAddress["line1"] as? String, "1234 Fake St.") + XCTAssertNil(shippingAddress["line2"]) + XCTAssertEqual(shippingAddress["city"] as? String, "Oakland") + XCTAssertEqual(shippingAddress["state"] as? String, "CA") + XCTAssertEqual(shippingAddress["postal_code"] as? String, "12345") + XCTAssertEqual(shippingAddress["country_code"] as? String, "US") + } + + func testBillingAgreement_postsPaymentResourceWithShippingAddressEditable() { + let payPalDriver = BTPayPalDriver(apiClient: mockAPIClient) + mockAPIClient = payPalDriver.apiClient as! MockAPIClient + payPalDriver.returnURLScheme = "foo://" + let request = BTPayPalRequest() + request.currencyCode = "GBP" + let address : BTPostalAddress = BTPostalAddress() + request.shippingAddressOverride = address + request.isShippingAddressEditable = true + BTPayPalDriver.setPayPalClass(FakePayPalOneTouchCore.self) + payPalDriver.requestBillingAgreement(request) { _,_ -> Void in } + + XCTAssertEqual("v1/paypal_hermes/setup_billing_agreement", mockAPIClient.lastPOSTPath) + guard let lastPostParameters = mockAPIClient.lastPOSTParameters else { + XCTFail() + return + } + guard let experienceProfile = lastPostParameters["experience_profile"] as? Dictionary else { + XCTFail() + return + } + XCTAssertEqual(experienceProfile["address_override"] as? Bool, false) + } +} + +class BTPayPalDriver_DropIn_Tests: XCTestCase { + + var mockAPIClient : MockAPIClient = MockAPIClient(authorization: "development_tokenization_key")! + + override func setUp() { + super.setUp() + + mockAPIClient = MockAPIClient(authorization: "development_tokenization_key")! + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "paypalEnabled": true, + "paypal": [ + "environment": "offline" + ] ]) + mockAPIClient.cannedResponseBody = BTJSON(value: [ + "paymentResource": [ + "redirectUrl": "fakeURL://" + ] ]) + } + + func testDropInViewDelegateSet() { + let dropInViewController = BTDropInViewController(apiClient: mockAPIClient) + + var paymentButton : BTPaymentButton? = nil + for subView in dropInViewController.view.subviews.first!.subviews.first!.subviews { + if let view = subView as? BTPaymentButton { + paymentButton = view + } + } + + XCTAssertNotNil(paymentButton) + XCTAssertNotNil(paymentButton?.viewControllerPresentingDelegate) + XCTAssertEqual(paymentButton?.viewControllerPresentingDelegate as? BTDropInViewController, dropInViewController) + } + +} + diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTPaymentButton_Tests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTPaymentButton_Tests.swift new file mode 100644 index 0000000..dc27451 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTPaymentButton_Tests.swift @@ -0,0 +1,70 @@ +import XCTest + +class BTPaymentButton_Tests: XCTestCase { + + var window : UIWindow! + var viewController : UIViewController! + + override func setUp() { + super.setUp() + + viewController = UIApplication.shared.windows[0].rootViewController + } + + override func tearDown() { + if viewController.presentedViewController != nil { + viewController.dismiss(animated: false, completion: nil) + } + + super.tearDown() + } + + func testPaymentButton_whenUsingTokenizationKey_doesNotCrash() { + let apiClient = BTAPIClient(authorization: "development_testing_integration_merchant_id")! + let paymentButton = BTPaymentButton(apiClient: apiClient) { _,_ in } + let paymentButtonViewController = UIViewController() + paymentButtonViewController.view.addSubview(paymentButton) + + viewController.present(paymentButtonViewController, animated: true, completion: nil) + } + + func testPaymentButton_byDefault_hasAllPaymentOptions() { + let stubAPIClient = MockAPIClient(authorization: "development_tokenization_key")! + let paymentButton = BTPaymentButton(apiClient: stubAPIClient) { _,_ in } + + XCTAssertEqual(paymentButton.enabledPaymentOptions, NSOrderedSet(array: ["PayPal", "Venmo"])) + } + + func testPaymentButton_whenPayPalIsEnabledInConfiguration_checksConfigurationForPaymentOptionAvailability() { + let stubAPIClient = MockAPIClient(authorization: "development_tokenization_key")! + let paymentButton = BTPaymentButton(apiClient: stubAPIClient) { _,_ in } + paymentButton.configuration = BTConfiguration(json: BTJSON(value: [ "paypalEnabled": true ])) + + XCTAssertEqual(paymentButton.enabledPaymentOptions, NSOrderedSet(array: ["PayPal"])) + } + + func testPaymentButton_whenVenmoIsEnabledInConfiguration_checksConfigurationForPaymentOptionAvailability() { + let stubAPIClient = MockAPIClient(authorization: "development_tokenization_key")! + let paymentButton = BTPaymentButton(apiClient: stubAPIClient) { _,_ in } + let fakeApplication = FakeApplication() + fakeApplication.cannedCanOpenURL = true + paymentButton.application = fakeApplication + paymentButton.configuration = BTConfiguration(json: BTJSON(value: [ "payWithVenmo": ["accessToken": "ACCESS_TOKEN"] ])) + BTConfiguration.setBetaPaymentOption("venmo", isEnabled: true) + + XCTAssertEqual(paymentButton.enabledPaymentOptions, NSOrderedSet(array: ["Venmo"])) + } + + func testPaymentButton_whenEnabledPaymentOptionsIsSetManually_skipsConfigurationValidation() { + let stubAPIClient = MockAPIClient(authorization: "development_tokenization_key")! + let paymentButton = BTPaymentButton(apiClient: stubAPIClient) { _,_ in } + paymentButton.configuration = BTConfiguration(json: BTJSON(value: [ "paypalEnabled": false ])) + + paymentButton.enabledPaymentOptions = NSOrderedSet(array: ["PayPal"]) + XCTAssertEqual(paymentButton.enabledPaymentOptions, NSOrderedSet(array: ["PayPal"])) + + paymentButton.enabledPaymentOptions = NSOrderedSet(array: ["Venmo"]) + XCTAssertEqual(paymentButton.enabledPaymentOptions, NSOrderedSet(array: ["Venmo"])) + } + +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTPaymentMethodNonceParser_Tests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTPaymentMethodNonceParser_Tests.swift new file mode 100644 index 0000000..fc21036 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTPaymentMethodNonceParser_Tests.swift @@ -0,0 +1,303 @@ +import XCTest +import BraintreeCore + +class BTPaymentMethodNonceParser_Tests: XCTestCase { + + var parser : BTPaymentMethodNonceParser = BTPaymentMethodNonceParser() + + func testRegisterType_addsTypeToTypes() { + parser.registerType("MyType") { _ -> BTPaymentMethodNonce? in return nil} + + XCTAssertTrue(parser.allTypes.contains("MyType")) + } + + func testAllTypes_whenTypeIsNotRegistered_doesntContainType() { + XCTAssertEqual(parser.allTypes.count, 0) + } + + func testIsTypeAvailable_whenTypeIsRegistered_isTrue() { + parser.registerType("MyType") { _ -> BTPaymentMethodNonce? in return nil} + XCTAssertTrue(parser.isTypeAvailable("MyType")) + } + + func testIsTypeAvailable_whenTypeIsNotRegistered_isFalse() { + XCTAssertFalse(parser.isTypeAvailable("MyType")) + } + + func testParseJSON_whenTypeIsRegistered_callsParsingBlock() { + let expectation = self.expectation(description: "Parsing block called") + parser.registerType("MyType") { _ -> BTPaymentMethodNonce? in + expectation.fulfill() + return nil + } + parser.parseJSON(BTJSON(), withParsingBlockForType: "MyType") + + waitForExpectations(timeout: 3, handler: nil) + } + + func testParseJSON_whenTypeIsNotRegisteredAndJSONContainsNonce_returnsBasicTokenizationObject() { + let json = BTJSON(value: ["nonce": "valid-nonce", + "description": "My Description"]) + + let paymentMethodNonce = parser.parseJSON(json, withParsingBlockForType: "MyType") + + XCTAssertEqual(paymentMethodNonce?.nonce, "valid-nonce") + XCTAssertEqual(paymentMethodNonce?.localizedDescription, "My Description") + } + + func testParseJSON_whenTypeIsNotRegisteredAndJSONDoesNotContainNonce_returnsNil() { + let paymentMethodNonce = parser.parseJSON(BTJSON(value: ["description": "blah"]), withParsingBlockForType: "MyType") + + XCTAssertNil(paymentMethodNonce) + } + + // MARK: - Payment-specific tests + + func testSharedParser_whenTypeIsCreditCard_returnsCorrectCardNonce() { + let sharedParser = BTPaymentMethodNonceParser.shared() + + let creditCardJSON = BTJSON(value: [ + "consumed": false, + "description": "ending in 31", + "details": [ + "cardType": "American Express", + "lastTwo": "31", + ], + "isLocked": false, + "nonce": "0099b1d0-7a1c-44c3-b1e4-297082290bb9", + "securityQuestions": ["cvv"], + "threeDSecureInfo": NSNull(), + "type": "CreditCard", + "default": true + ]) + + let cardNonce = sharedParser.parseJSON(creditCardJSON, withParsingBlockForType:"CreditCard")! + + XCTAssertEqual(cardNonce.nonce, "0099b1d0-7a1c-44c3-b1e4-297082290bb9") + XCTAssertEqual(cardNonce.type, "AMEX") + XCTAssertTrue(cardNonce.isDefault) + } + + func testSharedParser_whenTypeIsPayPal_returnsPayPalAccountNonce() { + let sharedParser = BTPaymentMethodNonceParser.shared() + let payPalAccountJSON = BTJSON(value: [ + "consumed": false, + "description": "jane.doe@example.com", + "details": [ + "email": "jane.doe@example.com", + ], + "isLocked": false, + "nonce": "a-nonce", + "securityQuestions": [], + "type": "PayPalAccount", + "default": true + ]) + + let payPalAccountNonce = sharedParser.parseJSON(payPalAccountJSON, withParsingBlockForType: "PayPalAccount") as! BTPayPalAccountNonce + + XCTAssertEqual(payPalAccountNonce.nonce, "a-nonce") + XCTAssertEqual(payPalAccountNonce.type, "PayPal") + XCTAssertEqual(payPalAccountNonce.email, "jane.doe@example.com") + XCTAssertTrue(payPalAccountNonce.isDefault) + XCTAssertNil(payPalAccountNonce.creditFinancing) + } + + func testParsePayPalCreditFinancingAmount() { + let payPalCreditFinancingAmount = BTJSON(value: [ + "currency": "USD", + "value": "123.45", + ]) + + guard let amount = BTPayPalDriver.creditFinancingAmount(from: payPalCreditFinancingAmount) else { + XCTFail("Expected amount") + return + } + XCTAssertEqual(amount.currency, "USD") + XCTAssertEqual(amount.value, "123.45") + } + + func testParsePayPalCreditFinancing() { + let payPalCreditFinancing = BTJSON(value: [ + "cardAmountImmutable": false, + "monthlyPayment": [ + "currency": "USD", + "value": "123.45", + ], + "payerAcceptance": false, + "term": 3, + "totalCost": [ + "currency": "ABC", + "value": "789.01", + ], + "totalInterest": [ + "currency": "XYZ", + "value": "456.78", + ], + ]) + + guard let creditFinancing = BTPayPalDriver.creditFinancing(from: payPalCreditFinancing) else { + XCTFail("Expected credit financing") + return + } + + XCTAssertFalse(creditFinancing.cardAmountImmutable) + guard let monthlyPayment = creditFinancing.monthlyPayment else { + XCTFail("Expected monthly payment details") + return + } + XCTAssertEqual(monthlyPayment.currency, "USD") + XCTAssertEqual(monthlyPayment.value, "123.45") + + XCTAssertFalse(creditFinancing.payerAcceptance) + XCTAssertEqual(creditFinancing.term, 3) + + XCTAssertNotNil(creditFinancing.totalCost) + + guard let totalCost = creditFinancing.totalCost else { + XCTFail("Expected total cost details") + return + } + XCTAssertEqual(totalCost.currency, "ABC") + XCTAssertEqual(totalCost.value, "789.01") + + guard let totalInterest = creditFinancing.totalInterest else { + XCTFail("Expected total interest details") + return + } + XCTAssertEqual(totalInterest.currency, "XYZ") + XCTAssertEqual(totalInterest.value, "456.78") + } + + func testSharedParser_whenTypeIsPayPal_returnsPayPalAccountNonceWithCreditFinancingOffered() { + let sharedParser = BTPaymentMethodNonceParser.shared() + let payPalAccountJSON = BTJSON(value: [ + "consumed": false, + "description": "jane.doe@example.com", + "details": [ + "email": "jane.doe@example.com", + "creditFinancingOffered": [ + "cardAmountImmutable": true, + "monthlyPayment": [ + "currency": "USD", + "value": "13.88", + ], + "payerAcceptance": true, + "term": 18, + "totalCost": [ + "currency": "USD", + "value": "250.00", + ], + "totalInterest": [ + "currency": "USD", + "value": "0.00", + ], + ], + ], + "isLocked": false, + "nonce": "a-nonce", + "securityQuestions": [], + "type": "PayPalAccount", + "default": true, + ]) + + let payPalAccountNonce = sharedParser.parseJSON(payPalAccountJSON, withParsingBlockForType: "PayPalAccount") as! BTPayPalAccountNonce + + XCTAssertEqual(payPalAccountNonce.nonce, "a-nonce") + XCTAssertEqual(payPalAccountNonce.type, "PayPal") + XCTAssertEqual(payPalAccountNonce.email, "jane.doe@example.com") + XCTAssertTrue(payPalAccountNonce.isDefault) + + guard let creditFinancing = payPalAccountNonce.creditFinancing else { + XCTFail("Expected credit financing terms") + return + } + + XCTAssertTrue(creditFinancing.cardAmountImmutable) + guard let monthlyPayment = creditFinancing.monthlyPayment else { + XCTFail("Expected monthly payment details") + return + } + XCTAssertEqual(monthlyPayment.currency, "USD") + XCTAssertEqual(monthlyPayment.value, "13.88") + + XCTAssertTrue(creditFinancing.payerAcceptance) + XCTAssertEqual(creditFinancing.term, 18) + + XCTAssertNotNil(creditFinancing.totalCost) + + guard let totalCost = creditFinancing.totalCost else { + XCTFail("Expected total cost details") + return + } + XCTAssertEqual(totalCost.currency, "USD") + XCTAssertEqual(totalCost.value, "250.00") + + guard let totalInterest = creditFinancing.totalInterest else { + XCTFail("Expected total interest details") + return + } + XCTAssertEqual(totalInterest.currency, "USD") + XCTAssertEqual(totalInterest.value, "0.00") + } + + func testSharedParser_whenTypeIsVenmo_returnsVenmoAccountNonce() { + let sharedParser = BTPaymentMethodNonceParser.shared() + let venmoAccountJSON = BTJSON(value: [ + "consumed": false, + "description": "VenmoAccount", + "details": ["username": "jane.doe.username@example.com", "cardType": "Discover"], + "isLocked": false, + "nonce": "a-nonce", + "securityQuestions": [], + "type": "VenmoAccount", + "default": true + ]) + + let venmoAccountNonce = sharedParser.parseJSON(venmoAccountJSON, withParsingBlockForType: "VenmoAccount") as! BTVenmoAccountNonce + + XCTAssertEqual(venmoAccountNonce.nonce, "a-nonce") + XCTAssertEqual(venmoAccountNonce.type, "Venmo") + XCTAssertEqual(venmoAccountNonce.username, "jane.doe.username@example.com") + XCTAssertTrue(venmoAccountNonce.isDefault) + } + + func testSharedParser_whenTypeIsApplePayCard_returnsApplePayCardNonce() { + let sharedParser = BTPaymentMethodNonceParser.shared() + let applePayCard = BTJSON(value: [ + "consumed": false, + "description": "Apple Pay Card ending in 11", + "details": [ + "cardType": "American Express" + ], + "isLocked": false, + "nonce": "a-nonce", + "securityQuestions": [], + "type": "ApplePayCard", + ]) + + let applePayCardNonce = sharedParser.parseJSON(applePayCard, withParsingBlockForType: "ApplePayCard") as? BTApplePayCardNonce + + XCTAssertEqual(applePayCardNonce?.nonce, "a-nonce") + XCTAssertEqual(applePayCardNonce?.type, "American Express") + XCTAssertEqual(applePayCardNonce?.localizedDescription, "Apple Pay Card ending in 11") + } + + func testSharedParser_whenTypeIsUnknown_returnsBasePaymentMethodNonce() { + let sharedParser = BTPaymentMethodNonceParser.shared() + let JSON = BTJSON(value: [ + "consumed": false, + "description": "Some thing", + "details": [], + "isLocked": false, + "nonce": "a-nonce", + "type": "asdfasdfasdf", + "default": true + ]) + + let unknownNonce = sharedParser.parseJSON(JSON, withParsingBlockForType: "asdfasdfasdf")! + + XCTAssertEqual(unknownNonce.nonce, "a-nonce") + XCTAssertEqual(unknownNonce.type, "Unknown") + XCTAssertTrue(unknownNonce.isDefault) + } +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTThreeDSecureDriver_Tests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTThreeDSecureDriver_Tests.swift new file mode 100644 index 0000000..b644bed --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTThreeDSecureDriver_Tests.swift @@ -0,0 +1,236 @@ +import XCTest + +class BTThreeDSecureDriver_Tests: XCTestCase { + + let originalNonce_lookupEnrolledAuthenticationNotRequired = "some-credit-card-nonce-where-3ds-succeeds-without-user-authentication" + let originalNonce_lookupEnrolledAuthenticationRequired = "some-credit-card-nonce-where-3ds-succeeds-after-user-authentication" + let originalNonce_lookupCardNotEnrolled = "some-credit-card-nonce-where-card-is-not-enrolled-for-3ds" + let viewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + var mockAPIClient : MockAPIClient = MockAPIClient(authorization: "development_client_key")! + var observers : [NSObjectProtocol] = [] + + override func setUp() { + super.setUp() + + mockAPIClient = MockAPIClient(authorization: "development_client_key")! + } + + override func tearDown() { + for observer in observers { NotificationCenter.default.removeObserver(observer) } + super.tearDown() + } + + func testInitialization_initializesWithClientAndDelegate() { + let threeDSecureDriver = BTThreeDSecureDriver.init(apiClient: mockAPIClient, delegate:viewControllerPresentingDelegate ) + XCTAssertNotNil(threeDSecureDriver) + } + + func testVerification_whenAPIClientIsNil_callsBackWithError() { + let threeDSecureDriver = BTThreeDSecureDriver.init(apiClient: mockAPIClient, delegate:viewControllerPresentingDelegate ) + threeDSecureDriver.apiClient = nil + + let expectation = self.expectation(description: "verification fails with errors") + + threeDSecureDriver.verifyCard(withNonce: originalNonce_lookupEnrolledAuthenticationNotRequired, amount: NSDecimalNumber.one, completion: { (tokenizedCard, error) -> Void in + XCTAssertNil(tokenizedCard) + XCTAssertNotNil(error) + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTThreeDSecureErrorDomain) + XCTAssertEqual(error.code, BTThreeDSecureErrorType.integration.rawValue) + expectation.fulfill() + }) + + waitForExpectations(timeout: 2, handler: nil) + } + + func testVerification_whenRemoteConfigurationFetchFails_callsBackWithConfigurationError() { + mockAPIClient.cannedConfigurationResponseError = NSError(domain: "", code: 0, userInfo: nil) + let threeDSecureDriver = BTThreeDSecureDriver.init(apiClient: mockAPIClient, delegate:viewControllerPresentingDelegate ) + mockAPIClient = threeDSecureDriver.apiClient as! MockAPIClient + + let expectation = self.expectation(description: "verification fails with errors") + + threeDSecureDriver.verifyCard(withNonce: originalNonce_lookupEnrolledAuthenticationNotRequired, amount: NSDecimalNumber.one, completion: { (tokenizedCard, error) -> Void in + XCTAssertEqual(error! as NSError, self.mockAPIClient.cannedConfigurationResponseError!) + expectation.fulfill() + }) + + waitForExpectations(timeout: 2, handler: nil) + } + + func testVerification_withCardThatDoesntRequireAuthentication_callsCompletionWithACard() { + let responseBody = [ + "paymentMethod": [ + "consumed": false, + "description": "ending in 02", + "details": [ + "cardType": "Visa", + "lastTwo": "02", + ], + "nonce": "f689056d-aee1-421e-9d10-f2c9b34d4d6f", + "threeDSecureInfo": [ + "enrolled": "Y", + "liabilityShiftPossible": true, + "liabilityShifted": true, + "status": "authenticate_successful", + ], + "type": "CreditCard", + ], + "success": true, + "threeDSecureInfo": [ + "liabilityShiftPossible": true, + "liabilityShifted": true, + ] + ] as [String : Any] + mockAPIClient.cannedResponseBody = BTJSON(value: responseBody) + + let threeDSecureDriver = BTThreeDSecureDriver.init(apiClient: mockAPIClient, delegate:viewControllerPresentingDelegate ) + + let expectation = self.expectation(description: "willCallCompletion") + + threeDSecureDriver.verifyCard(withNonce: originalNonce_lookupEnrolledAuthenticationNotRequired, amount: NSDecimalNumber.one, completion: { (tokenizedCard, error) -> Void in + XCTAssert(isANonce(tokenizedCard!.nonce)) + XCTAssertNil(error) + XCTAssert(tokenizedCard!.liabilityShifted) + XCTAssert(tokenizedCard!.liabilityShiftPossible) + expectation.fulfill() + }) + + waitForExpectations(timeout: 3, handler: nil) + } + + func testVerification_withCardThatRequiresAuthentication_requestsPresentationOfViewController() { + let responseBody = [ + "paymentMethod": [ + "consumed": false, + "description": "ending in 02", + "details": [ + "cardType": "Visa", + "lastTwo": "02", + ], + "nonce": "f689056d-aee1-421e-9d10-f2c9b34d4d6f", + "threeDSecureInfo": [ + "enrolled": "Y", + "liabilityShiftPossible": true, + "liabilityShifted": true, + "status": "authenticate_successful", + ], + "type": "CreditCard", + ], + "success": true, + "threeDSecureInfo": [ + "liabilityShiftPossible": true, + "liabilityShifted": true, + ], + "lookup": [ + "acsUrl": "http://example.com", + "pareq": "", + "md": "", + "termUrl": "http://example.com" + ] + ] as [String : Any] + mockAPIClient.cannedResponseBody = BTJSON(value: responseBody) + + let threeDSecureDriver = BTThreeDSecureDriver.init(apiClient: mockAPIClient, delegate:viewControllerPresentingDelegate ) + let mockDelegate = MockViewControllerPresentationDelegate() + threeDSecureDriver.delegate = mockDelegate + + threeDSecureDriver.verifyCard(withNonce: originalNonce_lookupEnrolledAuthenticationRequired, amount: NSDecimalNumber.one) { (tokenizedCard, error) -> Void in } + + XCTAssertNotNil(mockDelegate.lastViewController) + } + + func testVerification_whenCardIsNotEnrolled_returnsCardWithNewNonceAndCorrectLiabilityShiftInformation() { + let responseBody = [ + "paymentMethod": [ + "consumed": false, + "description": "ending in 02", + "details": [ + "cardType": "Visa", + "lastTwo": "02", + ], + "nonce": "f689056d-aee1-421e-9d10-f2c9b34d4d6f", + "threeDSecureInfo": [ + "enrolled": "N", + "liabilityShiftPossible": false, + "liabilityShifted": false, + "status": "authenticate_successful_issuer_not_participating", + ], + "type": "CreditCard", + ], + "success": true, + "threeDSecureInfo": [ + "liabilityShiftPossible": false, + "liabilityShifted": false, + ] + ] as [String : Any] + mockAPIClient.cannedResponseBody = BTJSON(value: responseBody) + let threeDSecureDriver = BTThreeDSecureDriver.init(apiClient: mockAPIClient, delegate:viewControllerPresentingDelegate) + + let expectation = self.expectation(description: "Card is tokenized") + threeDSecureDriver.verifyCard(withNonce: originalNonce_lookupCardNotEnrolled, amount: NSDecimalNumber.one) { (tokenizedCard, error) -> Void in + guard let tokenizedCard = tokenizedCard else { + XCTFail() + return + } + XCTAssertTrue(isANonce(tokenizedCard.nonce)) + XCTAssertNotEqual(tokenizedCard.nonce, self.originalNonce_lookupCardNotEnrolled); + XCTAssertNil(error) + XCTAssertFalse(tokenizedCard.liabilityShifted) + XCTAssertFalse(tokenizedCard.liabilityShiftPossible) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testError_whenFinishIsCalledMoreThanOnce_sendsErrorAnalyticsEvent() { + let responseBody = [ + "paymentMethod": [ + "consumed": false, + "description": "ending in 02", + "details": [ + "cardType": "Visa", + "lastTwo": "02", + ], + "nonce": "f689056d-aee1-421e-9d10-f2c9b34d4d6f", + "threeDSecureInfo": [ + "enrolled": "N", + "liabilityShiftPossible": false, + "liabilityShifted": false, + "status": "authenticate_successful_issuer_not_participating", + ], + "type": "CreditCard", + ], + "success": true, + "threeDSecureInfo": [ + "liabilityShiftPossible": false, + "liabilityShifted": false, + ] + ] as [String : Any] + mockAPIClient.cannedResponseBody = BTJSON(value: responseBody) + let threeDSecureDriver = BTThreeDSecureDriver.init(apiClient: mockAPIClient, delegate:viewControllerPresentingDelegate) + + let expectation = self.expectation(description: "Card is tokenized") + threeDSecureDriver.verifyCard(withNonce: originalNonce_lookupCardNotEnrolled, amount: NSDecimalNumber.one) { (tokenizedCard, error) -> Void in + guard let tokenizedCard = tokenizedCard else { + XCTFail() + return + } + XCTAssertTrue(isANonce(tokenizedCard.nonce)) + XCTAssertNotEqual(tokenizedCard.nonce, self.originalNonce_lookupCardNotEnrolled); + XCTAssertNil(error) + XCTAssertFalse(tokenizedCard.liabilityShifted) + XCTAssertFalse(tokenizedCard.liabilityShiftPossible) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + + let threeDSecureAuthenticationViewController = BTThreeDSecureAuthenticationViewController.init(lookupResult: BTThreeDSecureLookupResult.init()) + threeDSecureDriver.perform(#selector(threeDSecureDriver.threeDSecureViewControllerDidFinish(_:)), with: threeDSecureAuthenticationViewController) + + XCTAssertEqual(mockAPIClient.postedAnalyticsEvents.last!, "ios.threedsecure.error.finished-without-handler") + } +} + diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTThreeDSecureLookupResult_Tests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTThreeDSecureLookupResult_Tests.swift new file mode 100644 index 0000000..9b30667 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTThreeDSecureLookupResult_Tests.swift @@ -0,0 +1,24 @@ +import XCTest + +class BTThreeDSecureLookupResult_Tests: XCTestCase { + + func testRequiresUserAuthentication_whenAcsUrlIsPresent_returnsTrue() { + let lookup = BTThreeDSecureLookupResult() + lookup.acsURL = URL(string: "http://example.com") + lookup.termURL = URL(string: "http://example.com") + lookup.md = "an-md" + lookup.paReq = "a-PAReq" + + XCTAssertTrue(lookup.requiresUserAuthentication()) + } + + func testRequiresUserAuthentication_whenAcsUrlIsNotPresent_returnsFalse() { + let lookup = BTThreeDSecureLookupResult() + lookup.acsURL = nil + lookup.termURL = URL(string: "http://example.com") + lookup.md = "an-md" + lookup.paReq = "a-PAReq" + + XCTAssertFalse(lookup.requiresUserAuthentication()) + } +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTTokenizationService_Tests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTTokenizationService_Tests.swift new file mode 100644 index 0000000..f9b57cd --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTTokenizationService_Tests.swift @@ -0,0 +1,150 @@ +import XCTest + +class BTTokenizationService_Tests: XCTestCase { + + var tokenizationService : BTTokenizationService! + + override func setUp() { + super.setUp() + tokenizationService = BTTokenizationService() + } + + override func tearDown() { + super.tearDown() + } + + func testRegisterType_addsTypeToTypes() { + tokenizationService.registerType("MyType") { _,_,_ -> Void in } + XCTAssertTrue(tokenizationService.allTypes.contains("MyType")) + } + + func testAllTypes_whenTypeIsNotRegistered_doesntContainType() { + XCTAssertFalse(tokenizationService.allTypes.contains("MyType")) + } + + func testIsTypeAvailable_whenTypeIsRegistered_isTrue() { + tokenizationService.registerType("MyType") { _,_,_ -> Void in } + XCTAssertTrue(tokenizationService.isTypeAvailable("MyType")) + } + + func testIsTypeAvailable_whenTypeIsNotRegistered_returnsFalse() { + XCTAssertFalse(tokenizationService.isTypeAvailable("MyType")) + } + + func testTokenizeType_whenTypeIsRegistered_callsTokenizationBlock() { + let expectation = self.expectation(description: "tokenization block called") + tokenizationService.registerType("MyType") { _,_,_ -> Void in + expectation.fulfill() + } + + tokenizationService.tokenizeType("MyType", options: nil, with: BTAPIClient(authorization: "development_testing_integration_merchant_id")!) { _,_ -> Void in + //nada + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testTokenizeType_whenCalledWithOptions_callsTokenizationBlockAndPassesInOptions() { + let expectation = self.expectation(description: "tokenization block called") + let expectedOptions = ["Some Custom Option Key": "The Option Value"] + tokenizationService.registerType("MyType") { (_, options, _) -> Void in + XCTAssertEqual(options as! [String : String], expectedOptions) + expectation.fulfill() + } + + tokenizationService.tokenizeType("MyType", options: expectedOptions, with:BTAPIClient(authorization: "development_testing_integration_merchant_id")!) { _,_ -> Void in } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testTokenizeType_whenTypeIsNotRegistered_returnsError() { + let expectation = self.expectation(description: "Callback invoked") + tokenizationService.tokenizeType("UnknownType", options: nil, with:BTAPIClient(authorization: "development_testing_integration_merchant_id")!) { nonce, error -> Void in + XCTAssertNil(nonce) + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTTokenizationServiceErrorDomain) + XCTAssertEqual(error.code, BTTokenizationServiceError.typeNotRegistered.rawValue) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler:nil) + } + + // MARK: - Payment-specific tests + + func testSingleton_hasExpectedTypesAvailable() { + let sharedService = BTTokenizationService.shared() + + XCTAssertTrue(sharedService.isTypeAvailable("PayPal")) + XCTAssertTrue(sharedService.isTypeAvailable("Venmo")) + XCTAssertTrue(sharedService.isTypeAvailable("Card")) + } + + func testSingleton_canTokenizeCards() { + let sharedService = BTTokenizationService.shared() + let card = BTCard(number: "4111111111111111", expirationMonth: "12", expirationYear: "2020", cvv: "123") + let stubAPIClient = MockAPIClient(authorization: "development_fake_key")! + stubAPIClient.cannedResponseBody = BTJSON(value: [ + "creditCards": [ + [ + "nonce": "a-nonce", + "description": "A card" + ] + ] + ]) + + let expectation = self.expectation(description: "Card is tokenized") + sharedService.tokenizeType("Card", options: card.parameters() as? [String : AnyObject], with: stubAPIClient) { (cardNonce, error) -> Void in + XCTAssertEqual(cardNonce?.nonce, "a-nonce") + XCTAssertNil(error) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + // This test only verifies that SFSafariViewController is presented + func testSingleton_canAuthorizePayPalThroughSFSafariViewController() { + guard #available(iOS 9.0, *) else { + return + } + + if #available(iOS 11.0, *) { + return + } + let sharedService = BTTokenizationService.shared() + let stubAPIClient = MockAPIClient(authorization: "development_fake_key")! + stubAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "paypalEnabled": true, + "paypal": [ + "environment": "offline", + "privacyUrl": "", + "userAgreementUrl": "", + ] ]) + let mockDelegate = MockViewControllerPresentationDelegate() + BTAppSwitch.setReturnURLScheme("com.braintreepayments.Demo.payments") + + sharedService.tokenizeType("PayPal", options: [BTTokenizationServiceViewPresentingDelegateOption: mockDelegate], with: stubAPIClient) { _,_ -> Void in } + + XCTAssertTrue(mockDelegate.lastViewController is SFSafariViewController) + } + + func testSingleton_canAuthorizeVenmo() { + let sharedService = BTTokenizationService.shared() + BTOCMockHelper().stubApplicationCanOpenURL() + BTAppSwitch.setReturnURLScheme("com.braintreepayments.Demo.payments") + let stubAPIClient = MockAPIClient(authorization: "development_fake_key")! + stubAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "payWithVenmo": [ + "environment": "sandbox", + "merchantId": "stubmerchantid", + "accessToken": "stubacesstoken" + ], + ]) + let mockDelegate = MockAppSwitchDelegate(willPerform: expectation(description: "Will authorize Venmo Account"), didPerform: nil) + + sharedService.tokenizeType("Venmo", options: [BTTokenizationServiceAppSwitchDelegateOption: mockDelegate], with: stubAPIClient) { _,_ -> Void in } + + waitForExpectations(timeout: 2, handler: nil) + } +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTURLUtils_Tests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTURLUtils_Tests.swift new file mode 100644 index 0000000..de2db49 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTURLUtils_Tests.swift @@ -0,0 +1,93 @@ +import XCTest + +class BTURLUtils_Tests: XCTestCase { + + // MARK: - dictionaryForQueryString: + + func testDictionaryForQueryString_whenQueryStringIsNil_returnsEmptyDictionary() { + XCTAssertEqual(BTURLUtils.dictionary(forQueryString: nil) as NSDictionary, [:]) + } + + func testDictionaryForQueryString_whenQueryStringIsEmpty_returnsEmptyDictionary() { + XCTAssertEqual(BTURLUtils.dictionary(forQueryString: "") as NSDictionary, [:]) + } + + func testDictionaryForQueryString_whenQueryStringIsHasItems_returnsDictionaryContainingItems() { + XCTAssertEqual(BTURLUtils.dictionary(forQueryString: "foo=bar&baz=quux") as NSDictionary, [ + "foo": "bar", + "baz": "quux"]) + } + + func testDictionaryForQueryString_hasNSNullValueWhenKeyOnly() { + XCTAssertEqual(BTURLUtils.dictionary(forQueryString: "foo") as NSDictionary, [ + "foo": NSNull(), + ]) + } + + func testDictionaryForQueryString_whenKeyIsEmpty_hasEmptyStringForKey() { + XCTAssertEqual(BTURLUtils.dictionary(forQueryString: "&=asdf&") as NSDictionary, [ + "": "asdf" + ]) + } + + func testDictionaryForQueryString_withDuplicateKeys_usesRightMostValue() { + XCTAssertEqual(BTURLUtils.dictionary(forQueryString: "key=value1&key=value2") as NSDictionary, [ + "key": "value2" + ]) + } + + func testDictionaryForQueryString_replacesPlusWithSpace() { + XCTAssertEqual(BTURLUtils.dictionary(forQueryString: "foo+bar=baz+yaz") as NSDictionary, [ + "foo bar": "baz yaz" + ]) + } + + func testDictionaryForQueryString_decodesPercentEncodedCharacters() { + XCTAssertEqual(BTURLUtils.dictionary(forQueryString: "%20%2C=%26") as NSDictionary, [ + " ,": "&" + ]) + } + + func testDictionaryForQueryString_skipsKeysWithUndecodableCharacters() { + XCTAssertEqual(BTURLUtils.dictionary(forQueryString: "%84") as NSDictionary, [:]) + } + + // MARK: - URLfromURL:withAppendedQueryDictionary: + + func testURLWithAppendedQueryDictionary_appendsDictionaryAsQueryStringToURL() { + let url = URL(string: "http://example.com:80/path/to/file")! + + let appendedURL = BTURLUtils.urLfromURL(url, withAppendedQueryDictionary: ["key": "value"]) + + XCTAssertEqual(appendedURL, URL(string: "http://example.com:80/path/to/file?key=value")) + } + + func testURLWithAppendedQueryDictionary_acceptsNilDictionaries() { + let url = URL(string: "http://example.com")! + + let appendedURL = BTURLUtils.urLfromURL(url, withAppendedQueryDictionary: nil) + + XCTAssertEqual(appendedURL, URL(string: "http://example.com?")) + } + + func testURLWithAppendedQueryDictionary_whenDictionaryHasKeyValuePairsWithSpecialCharacters_percentEscapesThem() { + let url = URL(string: "http://example.com")! + + let appendedURL = BTURLUtils.urLfromURL(url, withAppendedQueryDictionary: ["space ": "sym&bol="]) + + XCTAssertEqual(appendedURL, URL(string: "http://example.com?space%20=sym%26bol%3D")) + } + + func testURLWithAppendedQueryDictionary_whenURLIsNil_returnsNil() { + XCTAssertNil(BTURLUtils.urLfromURL(nil, withAppendedQueryDictionary: [:])) + } + + func testURLWithAppendedQueryDictionary_whenURLIsRelative_returnsExpectedURL() { + let url = URL(string: "/relative/path")! + + let appendedURL = BTURLUtils.urLfromURL(url, withAppendedQueryDictionary: ["key": "value"]) + + XCTAssertEqual(appendedURL, URL(string: "/relative/path?key=value")) + } + +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTVenmoAppSwitchReturnURLSpec.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTVenmoAppSwitchReturnURLSpec.m new file mode 100644 index 0000000..cbc2934 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTVenmoAppSwitchReturnURLSpec.m @@ -0,0 +1,87 @@ +#import "BTVenmoAppSwitchReturnURL.h" +#import "BTSpecHelper.h" +#import +#import +#import + +SpecBegin(BTVenmoAppSwitchReturnURL) + +describe(@"URL parsing", ^{ + describe(@"valid success return URL", ^{ + it(@"creates the payment method", ^{ + BTVenmoAppSwitchReturnURL *returnURL = [[BTVenmoAppSwitchReturnURL alloc] initWithURL:[NSURL URLWithString:@"com.example.app://x-callback-url/vzero/auth/venmo/success?paymentMethodNonce=a-nonce"]]; + expect(returnURL.nonce).to.equal(@"a-nonce"); + expect(returnURL.error).to.beNil(); + }); + + it(@"sets the state to succeeded", ^{ + BTVenmoAppSwitchReturnURL *returnURL = [[BTVenmoAppSwitchReturnURL alloc] initWithURL:[NSURL URLWithString:@"com.example.app://x-callback-url/vzero/auth/venmo/success?paymentMethodNonce=a-nonce"]]; + expect(returnURL.state).to.equal(BTVenmoAppSwitchReturnURLStateSucceeded); + }); + + }); + + describe(@"valid cancel return URL", ^{ + it(@"sets the state canceled", ^{ + BTVenmoAppSwitchReturnURL *returnURL = [[BTVenmoAppSwitchReturnURL alloc] initWithURL:[NSURL URLWithString:@"com.example.app://x-callback-url/vzero/auth/venmo/cancel"]]; + + expect(returnURL.state).to.equal(BTVenmoAppSwitchReturnURLStateCanceled); + }); + + it(@"does not parse an error or payment method", ^{ + BTVenmoAppSwitchReturnURL *returnURL = [[BTVenmoAppSwitchReturnURL alloc] initWithURL:[NSURL URLWithString:@"com.example.app://x-callback-url/vzero/auth/venmo/cancel"]]; + + expect(returnURL.error).to.beNil(); + expect(returnURL.nonce).to.beNil(); + }); + }); + + describe(@"valid error return URL", ^{ + it(@"sets the state to failed", ^{ + BTVenmoAppSwitchReturnURL *returnURL = [[BTVenmoAppSwitchReturnURL alloc] initWithURL:[NSURL URLWithString:@"com.example.app://x-callback-url/vzero/auth/venmo/error?errorMessage=Venmo%20Fail&errorCode=-7"]]; + expect(returnURL.state).to.equal(BTVenmoAppSwitchReturnURLStateFailed); + }); + + it(@"parses the error message and code from a failed Venmo App Switch return", ^{ + BTVenmoAppSwitchReturnURL *returnURL = [[BTVenmoAppSwitchReturnURL alloc] initWithURL:[NSURL URLWithString:@"com.example.app://x-callback-url/vzero/auth/venmo/error?errorMessage=Venmo%20Fail&errorCode=-7"]]; + + expect(returnURL.nonce).to.beNil(); + expect(returnURL.error).to.equal([NSError errorWithDomain:BTVenmoAppSwitchReturnURLErrorDomain + code:-7 + userInfo:@{ + NSLocalizedDescriptionKey: @"Venmo Fail" + }]); + }); + }); + + describe(@"invalid return URL", ^{ + it(@"sets the state to unknown", ^{ + BTVenmoAppSwitchReturnURL *returnURL = [[BTVenmoAppSwitchReturnURL alloc] initWithURL:[NSURL URLWithString:@"com.example.app://x-callback-url/vzero/auth/venmo/something"]]; + expect(returnURL.state).to.equal(BTVenmoAppSwitchReturnURLStateUnknown); + }); + }); +}); + +describe(@"isValidURL:sourceApplication:", ^{ + NSURL *url = [NSURL URLWithString:@"scheme://x-callback-url/vzero/auth/venmo/foo"]; + + it(@"accepts app switches received from Venmo", ^{ + expect([BTVenmoAppSwitchReturnURL isValidURL:url sourceApplication:@"net.kortina.labs.Venmo"]).to.beTruthy(); + }); + + it(@"accepts app switches received from other Venmo builds", ^{ + expect([BTVenmoAppSwitchReturnURL isValidURL:url sourceApplication:@"net.kortina.labs.Venmo.debug"]).to.beTruthy(); + expect([BTVenmoAppSwitchReturnURL isValidURL:url sourceApplication:@"net.kortina.labs.Venmo.internal"]).to.beTruthy(); + expect([BTVenmoAppSwitchReturnURL isValidURL:url sourceApplication:@"net.kortina.labs.Venmo.some-new-feature"]).to.beTruthy(); + }); + + it(@"accepts app switches received from PayPal Debug (for developer-facing test wallet)", ^{ + expect([BTVenmoAppSwitchReturnURL isValidURL:url sourceApplication:@"com.paypal.PPClient.Debug"]).to.beTruthy(); + }); + + it(@"rejects app switches received from all others", ^{ + expect([BTVenmoAppSwitchReturnURL isValidURL:url sourceApplication:@"com.YourCompany.Some-App"]).to.beFalsy(); + }); +}); + +SpecEnd diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTVenmoAppSwitchURLSpec.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTVenmoAppSwitchURLSpec.m new file mode 100644 index 0000000..e0f1a84 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTVenmoAppSwitchURLSpec.m @@ -0,0 +1,69 @@ +#import +#import +#import +#import + +#import "BTVenmoAppSwitchRequestURL.h" +#import "BTVenmoDriver.h" +#import "Braintree-Version.h" +#import "BTSpecHelper.h" + +SpecBegin(BTVenmoAppSwitchRequestURL) + +describe(@"appSwitchURLForMerchantID:accessToken:sdkVersion:returnURLScheme:bundleDisplayName:environment:", ^{ + context(@"with valid params", ^{ + it(@"returns a URL containing params in query string", ^{ + + BTMutableClientMetadata *meta = [BTMutableClientMetadata new]; + [meta setSessionId:@"session-id"]; + [meta setIntegration:BTClientMetadataIntegrationCustom]; + + NSURL *url = [BTVenmoAppSwitchRequestURL appSwitchURLForMerchantID:@"merchant-id" + accessToken:@"access-token" + returnURLScheme:@"a.scheme" + bundleDisplayName:@"An App" + environment:@"sandbox" + metadata:meta]; + + NSURLComponents *urlComponents = [[NSURLComponents alloc] initWithURL:url resolvingAgainstBaseURL:NO]; + for (NSURLQueryItem *queryItem in urlComponents.queryItems) { + if ([queryItem.name isEqualToString:@"braintree_environment"]) { + expect(queryItem.value).to.equal(@"sandbox"); + }else if ([queryItem.name isEqualToString:@"braintree_access_token"]) { + expect(queryItem.value).to.equal(@"access-token"); + }else if ([queryItem.name isEqualToString:@"braintree_merchant_id"]) { + expect(queryItem.value).to.equal(@"merchant-id"); + }else if ([queryItem.name isEqualToString:@"x-source"]) { + expect(queryItem.value).to.equal(@"An App"); + }else if ([queryItem.name isEqualToString:@"braintree_auth_fingerprint"]) { + expect(queryItem.value).to.equal(@"a.fingerprint"); + }else if ([queryItem.name isEqualToString:@"braintree_validate"]) { + expect(queryItem.value).to.beTruthy(); + }else if ([queryItem.name isEqualToString:@"braintree_sdk_data"]) { + expect(queryItem.value).toNot.beNil(); + + NSData *data = [[NSData alloc] initWithBase64EncodedString:queryItem.value options:0]; + BTJSON *json = [[BTJSON alloc] initWithData:data]; + + BTJSON *meta = json[@"_meta"]; + expect([meta[@"sessionId"] asString]).to.equal(@"session-id"); + expect([meta[@"platform"] asString]).to.equal(@"ios"); + expect([meta[@"integration"] asString]).to.equal(@"custom"); + expect([meta[@"version"] asString]).to.equal(BRAINTREE_VERSION); + } + } + }); + }); + +}); + +describe(@"baseAppSwitchURL", ^{ + it(@"returns expected base URL for Pay with Venmo", ^{ + expect([BTVenmoAppSwitchRequestURL baseAppSwitchURL].scheme).to.equal(@"com.venmo.touch.v2"); + expect([BTVenmoAppSwitchRequestURL baseAppSwitchURL].host).to.equal(@"x-callback-url"); + expect([BTVenmoAppSwitchRequestURL baseAppSwitchURL].path).to.equal(@"/vzero/auth"); + expect([BTVenmoAppSwitchRequestURL baseAppSwitchURL].query).to.beNil(); + }); +}); + +SpecEnd diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTVenmoDriver_Tests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTVenmoDriver_Tests.swift new file mode 100644 index 0000000..0ff38c2 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTVenmoDriver_Tests.swift @@ -0,0 +1,731 @@ +import UIKit +import XCTest + +class FakeApplication { + var lastOpenURL : URL? = nil + var openURLWasCalled : Bool = false + var cannedOpenURLSuccess : Bool = true + var cannedCanOpenURL : Bool = true + var canOpenURLWhitelist : [URL] = [] + + @objc func openURL(_ url: URL) -> Bool { + lastOpenURL = url + openURLWasCalled = true + return cannedOpenURLSuccess + } + + @objc func canOpenURL(_ url: URL) -> Bool { + for whitelistURL in canOpenURLWhitelist { + if whitelistURL.scheme == url.scheme { + return true + } + } + return cannedCanOpenURL + } +} + +class FakeBundle : Bundle { + override func object(forInfoDictionaryKey key: String) -> Any? { + return "An App"; + } +} + +class FakeDevice : UIDevice { + var fakeSystemVersion:String = "8.9" + override var systemVersion: String { + get { + return fakeSystemVersion + } + set(newSystemVersion) { + fakeSystemVersion = newSystemVersion + } + } +} + +class BTVenmoDriver_Tests: XCTestCase { + var mockAPIClient : MockAPIClient = MockAPIClient(authorization: "development_tokenization_key")! + var observers : [NSObjectProtocol] = [] + var viewController : UIViewController! + + override func setUp() { + super.setUp() + viewController = UIApplication.shared.windows[0].rootViewController + mockAPIClient = MockAPIClient(authorization: "development_tokenization_key")! + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "payWithVenmo" : [ + "environment": "sandbox", + "merchantId": "venmo_merchant_id", + "accessToken": "venmo-access-token" + ] + ]) + } + + override func tearDown() { + if viewController.presentedViewController != nil { + viewController.dismiss(animated: false, completion: nil) + } + + for observer in observers { NotificationCenter.default.removeObserver(observer) } + super.tearDown() + } + + func testAuthorizeAccount_whenAPIClientIsNil_callsBackWithError() { + let venmoDriver = BTVenmoDriver(apiClient: mockAPIClient) + venmoDriver.apiClient = nil + + let expectation = self.expectation(description: "Callback invoked with error") + venmoDriver.authorizeAccountAndVault(false) { (venmoAccount, error) -> Void in + XCTAssertNil(venmoAccount) + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTVenmoDriverErrorDomain) + XCTAssertEqual(error.code, BTVenmoDriverErrorType.integration.rawValue) + expectation.fulfill() + } + + self.waitForExpectations(timeout: 10, handler: nil) + } + + func testAuthorizeAccount_whenRemoteConfigurationFetchFails_callsBackWithConfigurationError() { + mockAPIClient.cannedConfigurationResponseError = NSError(domain: "", code: 0, userInfo: nil) + let venmoDriver = BTVenmoDriver(apiClient: mockAPIClient) + BTAppSwitch.sharedInstance().returnURLScheme = "scheme" + + let expectation = self.expectation(description: "Tokenize fails with error") + venmoDriver.authorizeAccountAndVault(false) { (venmoAccount, error) -> Void in + XCTAssertEqual(error! as NSError, self.mockAPIClient.cannedConfigurationResponseError!) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testAuthorizeAccount_whenVenmoConfigurationDisabled_callsBackWithError() { + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [:]) + let venmoDriver = BTVenmoDriver(apiClient: mockAPIClient) + BTAppSwitch.sharedInstance().returnURLScheme = "scheme" + + let expectation = self.expectation(description: "tokenization callback") + venmoDriver.authorizeAccountAndVault(false) { (venmoAccount, error) -> Void in + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTVenmoDriverErrorDomain) + XCTAssertEqual(error.code, BTVenmoDriverErrorType.disabled.rawValue) + expectation.fulfill() + } + waitForExpectations(timeout: 2, handler: nil) + } + + func testAuthorizeAccount_whenVenmoConfigurationMissing_callsBackWithError() { + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [:]) + let venmoDriver = BTVenmoDriver(apiClient: mockAPIClient) + BTAppSwitch.sharedInstance().returnURLScheme = "scheme" + + let expectation = self.expectation(description: "tokenization callback") + venmoDriver.authorizeAccountAndVault(false) { (venmoAccount, error) -> Void in + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTVenmoDriverErrorDomain) + XCTAssertEqual(error.code, BTVenmoDriverErrorType.disabled.rawValue) + expectation.fulfill() + } + waitForExpectations(timeout: 2, handler: nil) + } + + func testAuthorization_whenReturnURLSchemeIsNil_logsCriticalMessageAndCallsBackWithError() { + let venmoDriver = BTVenmoDriver(apiClient: mockAPIClient) + BTAppSwitch.sharedInstance().returnURLScheme = "" + + + var criticalMessageLogged = false + BTLogger.shared().logBlock = { + (level: BTLogLevel, message: String?) in + if (level == BTLogLevel.critical && message == "Venmo requires a return URL scheme to be configured via [BTAppSwitch setReturnURLScheme:]") { + criticalMessageLogged = true + } + BTLogger.shared().logBlock = nil + return + } + + let expectation = self.expectation(description: "authorization callback") + venmoDriver.authorizeAccountAndVault(false) { (venmoAccount, error) -> Void in + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTVenmoDriverErrorDomain) + XCTAssertEqual(error.code, BTVenmoDriverErrorType.appNotAvailable.rawValue) + expectation.fulfill() + } + + XCTAssertTrue(criticalMessageLogged) + + waitForExpectations(timeout: 2, handler: nil) + } + + func testAuthorization_whenVenmoIsEnabledInControlPanelAndConfiguredCorrectly_opensVenmoURL() { + let venmoDriver = BTVenmoDriver(apiClient: mockAPIClient) + BTAppSwitch.sharedInstance().returnURLScheme = "scheme" + let fakeApplication = FakeApplication() + venmoDriver.application = fakeApplication + venmoDriver.bundle = FakeBundle() + + venmoDriver.authorizeAccountAndVault(false) { _,_ -> Void in } + + XCTAssertTrue(fakeApplication.openURLWasCalled) + XCTAssertEqual(fakeApplication.lastOpenURL!.scheme, "com.venmo.touch.v2") + XCTAssertNotNil(fakeApplication.lastOpenURL!.absoluteString.range(of: "venmo_merchant_id")); + XCTAssertNotNil(fakeApplication.lastOpenURL!.absoluteString.range(of: "venmo-access-token")); + XCTAssertNotNil(fakeApplication.lastOpenURL!.absoluteString.range(of: "sandbox")); + } + + func testAuthorizeAccount_beforeAppSwitch_informsDelegate() { + let venmoDriver = BTVenmoDriver(apiClient: mockAPIClient) + let delegate = MockAppSwitchDelegate(willPerform: expectation(description: "willPerform called"), didPerform: expectation(description: "didPerform called")) + delegate.appContextWillSwitchExpectation = self.expectation(description: "Delegate received appContextWillSwitch") + venmoDriver.appSwitchDelegate = delegate + BTAppSwitch.sharedInstance().returnURLScheme = "scheme" + let fakeApplication = FakeApplication() + venmoDriver.application = fakeApplication + venmoDriver.bundle = FakeBundle() + + venmoDriver.authorizeAccountAndVault(false) { _,_ -> Void in + XCTAssertEqual(delegate.lastAppSwitcher as? BTVenmoDriver, venmoDriver) + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testAuthorizeAccount_whenUsingTokenizationKeyAndAppSwitchSucceeds_tokenizesVenmoAccount() { + let venmoDriver = BTVenmoDriver(apiClient: mockAPIClient) + BTAppSwitch.sharedInstance().returnURLScheme = "scheme" + venmoDriver.application = FakeApplication() + venmoDriver.bundle = FakeBundle() + + let expectation = self.expectation(description: "Callback") + venmoDriver.authorizeAccountAndVault(false) { (venmoAccount, error) -> Void in + guard let venmoAccount = venmoAccount else { + XCTFail("Received an error: \(String(describing: error))") + return + } + + XCTAssertNil(error) + XCTAssertEqual(venmoAccount.nonce, "fake-nonce") + XCTAssertEqual(venmoAccount.localizedDescription, "fake-username") + XCTAssertEqual(venmoAccount.username, "fake-username") + expectation.fulfill() + } + BTVenmoDriver.handleAppSwitchReturn(URL(string: "scheme://x-callback-url/vzero/auth/venmo/success?paymentMethodNonce=fake-nonce&username=fake-username")!) + + self.waitForExpectations(timeout: 2, handler: nil) + } + + func testAuthorizeAccount_whenUsingClientTokenAndAppSwitchSucceeds_tokenizesVenmoAccount() { + // Test setup sets up mockAPIClient with a tokenization key, we want a client token + mockAPIClient.tokenizationKey = nil + mockAPIClient.clientToken = try! BTClientToken(clientToken: BTTestClientTokenFactory.token(withVersion: 2)) + let venmoDriver = BTVenmoDriver(apiClient: mockAPIClient) + BTAppSwitch.sharedInstance().returnURLScheme = "scheme" + venmoDriver.application = FakeApplication() + venmoDriver.bundle = FakeBundle() + + let expectation = self.expectation(description: "Callback") + venmoDriver.authorizeAccountAndVault(false) { (venmoAccount, error) -> Void in + guard let venmoAccount = venmoAccount else { + XCTFail("Received an error: \(String(describing: error))") + return + } + + XCTAssertNil(error) + XCTAssertEqual(venmoAccount.nonce, "fake-nonce") + XCTAssertEqual(venmoAccount.localizedDescription, "fake-username") + XCTAssertEqual(venmoAccount.username, "fake-username") + expectation.fulfill() + } + BTVenmoDriver.handleAppSwitchReturn(URL(string: "scheme://x-callback-url/vzero/auth/venmo/success?paymentMethodNonce=fake-nonce&username=fake-username")!) + + self.waitForExpectations(timeout: 2, handler: nil) + } + + func testAuthorizeAccount_whenAppSwitchSucceeds_makesDelegateCallbacks() { + let venmoDriver = BTVenmoDriver(apiClient: mockAPIClient) + let delegate = MockAppSwitchDelegate(willPerform: self.expectation(description: "willPerform called"), didPerform: self.expectation(description: "didPerform called")) + delegate.appContextWillSwitchExpectation = self.expectation(description: "Delegate received appContextWillSwitch") + venmoDriver.appSwitchDelegate = delegate + BTAppSwitch.sharedInstance().returnURLScheme = "scheme" + venmoDriver.application = FakeApplication() + venmoDriver.bundle = FakeBundle() + + let expectation = self.expectation(description: "Callback") + venmoDriver.authorizeAccountAndVault(false) { _,_ -> Void in + XCTAssertEqual(delegate.lastAppSwitcher as? BTVenmoDriver, venmoDriver) + expectation.fulfill() + } + BTVenmoDriver.handleAppSwitchReturn(URL(string: "scheme://x-callback-url/vzero/auth/venmo/success?paymentMethodNonce=fake-nonce&username=fake-username")!) + + self.waitForExpectations(timeout: 2, handler: nil) + } + + func testAuthorizeAccount_whenAppSwitchSucceeds_postsNotifications() { + let venmoDriver = BTVenmoDriver(apiClient: mockAPIClient) + let delegate = MockAppSwitchDelegate(willPerform: expectation(description: "willPerform called"), didPerform: expectation(description: "didPerform called")) + venmoDriver.appSwitchDelegate = delegate + BTAppSwitch.sharedInstance().returnURLScheme = "scheme" + venmoDriver.application = FakeApplication() + venmoDriver.bundle = FakeBundle() + + let willAppSwitchNotificationExpectation = expectation(description: "willAppSwitch notification received") + observers.append(NotificationCenter.default.addObserver(forName: NSNotification.Name.BTAppSwitchWillSwitch, object: nil, queue: nil) { (notification) -> Void in + willAppSwitchNotificationExpectation.fulfill() + }) + + let appContextWillSwitchNotificationExpectation = expectation(description: "appContextWillSwitch notification received") + observers.append(NotificationCenter.default.addObserver(forName: NSNotification.Name.BTAppContextWillSwitch, object: nil, queue: nil) { (notification) -> Void in + appContextWillSwitchNotificationExpectation.fulfill() + }) + + let didAppSwitchNotificationExpectation = expectation(description: "didAppSwitch notification received") + observers.append(NotificationCenter.default.addObserver(forName: NSNotification.Name.BTAppSwitchDidSwitch, object: nil, queue: nil) { (notification) -> Void in + didAppSwitchNotificationExpectation.fulfill() + }) + + venmoDriver.authorizeAccountAndVault(false) { _,_ -> Void in } + + let appContextDidReturnNotificationExpectation = expectation(description: "appContextDidReturn notification received") + observers.append(NotificationCenter.default.addObserver(forName: NSNotification.Name.BTAppContextDidReturn, object: nil, queue: nil) { (notification) -> Void in + appContextDidReturnNotificationExpectation.fulfill() + }) + + let willProcessNotificationExpectation = expectation(description: "willProcess notification received") + observers.append(NotificationCenter.default.addObserver(forName: NSNotification.Name.BTAppSwitchWillProcessPaymentInfo, object: nil, queue: nil) { (notification) -> Void in + willProcessNotificationExpectation.fulfill() + }) + + BTVenmoDriver.handleAppSwitchReturn(URL(string: "scheme://x-callback-url/vzero/auth/venmo/success?paymentMethodNonce=fake-nonce&username=fake-username")!) + + self.waitForExpectations(timeout: 2, handler: nil) + } + + func testAuthorizeAccount_whenAppSwitchFails_callsBackWithError() { + let venmoDriver = BTVenmoDriver(apiClient: mockAPIClient) + BTAppSwitch.sharedInstance().returnURLScheme = "scheme" + venmoDriver.application = FakeApplication() + venmoDriver.bundle = FakeBundle() + + let expectation = self.expectation(description: "Callback invoked") + venmoDriver.authorizeAccountAndVault(false) { (venmoAccount, error) -> Void in + XCTAssertNil(venmoAccount) + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, "com.braintreepayments.BTVenmoAppSwitchReturnURLErrorDomain") + expectation.fulfill() + } + BTVenmoDriver.handleAppSwitchReturn(URL(string: "scheme://x-callback-url/vzero/auth/venmo/error")!) + + self.waitForExpectations(timeout: 2, handler: nil) + } + + func testAuthorizeAccount_vaultTrue_setsShouldVaultProperty() { + let venmoDriver = BTVenmoDriver(apiClient: mockAPIClient) + BTAppSwitch.sharedInstance().returnURLScheme = "scheme" + venmoDriver.application = FakeApplication() + venmoDriver.bundle = FakeBundle() + + let expectation = self.expectation(description: "Callback invoked") + + venmoDriver.authorizeAccountAndVault(true) { (venmoAccount, error) -> Void in + XCTAssertTrue(venmoDriver.shouldVault) + expectation.fulfill() + } + + BTVenmoDriver.handleAppSwitchReturn(URL(string: "scheme://x-callback-url/vzero/auth/venmo/success?paymentMethodNonce=fake-nonce&username=fake-username")!) + self.waitForExpectations(timeout: 2, handler: nil) + } + + func testAuthorizeAccount_vaultFalse_setsVaultToFalse() { + let venmoDriver = BTVenmoDriver(apiClient: mockAPIClient) + BTAppSwitch.sharedInstance().returnURLScheme = "scheme" + venmoDriver.application = FakeApplication() + venmoDriver.bundle = FakeBundle() + + let expectation = self.expectation(description: "Callback invoked") + + venmoDriver.authorizeAccountAndVault(false) { (venmoAccount, error) -> Void in + XCTAssertFalse(venmoDriver.shouldVault) + expectation.fulfill() + } + + BTVenmoDriver.handleAppSwitchReturn(URL(string: "scheme://x-callback-url/vzero/auth/venmo/success?paymentMethodNonce=fake-nonce&username=fake-username")!) + self.waitForExpectations(timeout: 2, handler: nil) + } + + func testAuthorizeAccount_vaultTrue_callsBackWithNonce() { + mockAPIClient.tokenizationKey = nil + mockAPIClient.clientToken = try! BTClientToken(clientToken: BTValidTestClientToken) + mockAPIClient.cannedResponseBody = BTJSON(value: [ + "venmoAccounts": [[ + "type": "VenmoAccount", + "nonce": "abcd-venmo-nonce", + "description": "VenmoAccount", + "consumed": false, + "default": true, + "details": [ + "cardType": "Discover", + "username": "venmojoe" + ]] + ] + ]) + let venmoDriver = BTVenmoDriver(apiClient: mockAPIClient) + + BTAppSwitch.sharedInstance().returnURLScheme = "scheme" + venmoDriver.application = FakeApplication() + venmoDriver.bundle = FakeBundle() + + let expectation = self.expectation(description: "Callback invoked") + + venmoDriver.authorizeAccountAndVault(true) { (venmoAccount, error) -> Void in + XCTAssertNil(error) + + XCTAssertEqual(venmoAccount?.username, "venmojoe") + XCTAssertEqual(venmoAccount?.nonce, "abcd-venmo-nonce") + XCTAssertTrue(venmoAccount!.isDefault) + + expectation.fulfill() + } + + BTVenmoDriver.handleAppSwitchReturn(URL(string: "scheme://x-callback-url/vzero/auth/venmo/success?paymentMethodNonce=fake-nonce&username=fake-username")!) + self.waitForExpectations(timeout: 2, handler: nil) + } + + func testAuthorizeAccount_vaultTrue_sendsSucessAnalyticsEvent() { + mockAPIClient.tokenizationKey = nil + mockAPIClient.clientToken = try! BTClientToken(clientToken: BTValidTestClientToken) + mockAPIClient.cannedResponseBody = BTJSON(value: [ + "venmoAccounts": [[ + "type": "VenmoAccount", + "nonce": "abcd-venmo-nonce", + "description": "VenmoAccount", + "consumed": false, + "default": true, + "details": [ + "cardType": "Discover", + "username": "venmojoe" + ] + ]] + ]) + let venmoDriver = BTVenmoDriver(apiClient: mockAPIClient) + venmoDriver.application = FakeApplication() + venmoDriver.bundle = FakeBundle() + BTAppSwitch.sharedInstance().returnURLScheme = "scheme" + + let expectation = self.expectation(description: "Callback invoked") + + venmoDriver.authorizeAccountAndVault(true) { (venmoAccount, error) -> Void in + XCTAssertNil(error) + + XCTAssertEqual(venmoAccount?.username, "venmojoe") + XCTAssertEqual(venmoAccount?.nonce, "abcd-venmo-nonce") + XCTAssertTrue(venmoAccount!.isDefault) + + expectation.fulfill() + } + + BTVenmoDriver.handleAppSwitchReturn(URL(string: "scheme://x-callback-url/vzero/auth/venmo/success?paymentMethodNonce=fake-nonce&username=fake-username")!) + self.waitForExpectations(timeout: 2, handler: nil) + + XCTAssertEqual(mockAPIClient.postedAnalyticsEvents.last!, "ios.pay-with-venmo.vault.success") + } + + func testAuthorizeAccount_vaultTrue_sendsFailureAnalyticsEvent() { + mockAPIClient.tokenizationKey = nil + mockAPIClient.clientToken = try! BTClientToken(clientToken: BTValidTestClientToken) + mockAPIClient.cannedResponseError = NSError(domain: "Fake Error", code: 400, userInfo: nil) + let venmoDriver = BTVenmoDriver(apiClient: mockAPIClient) + venmoDriver.application = FakeApplication() + venmoDriver.bundle = FakeBundle() + BTAppSwitch.sharedInstance().returnURLScheme = "scheme" + + let expectation = self.expectation(description: "Callback invoked") + + venmoDriver.authorizeAccountAndVault(true) { (venmoAccount, error) -> Void in + XCTAssertNotNil(error) + expectation.fulfill() + } + + BTVenmoDriver.handleAppSwitchReturn(URL(string: "scheme://x-callback-url/vzero/auth/venmo/success?paymentMethodNonce=fake-nonce&username=fake-username")!) + self.waitForExpectations(timeout: 2, handler: nil) + + XCTAssertEqual(mockAPIClient.postedAnalyticsEvents.last!, "ios.pay-with-venmo.vault.failure") + } + + func testAuthorizeAccount_whenAppSwitchCancelled_callsBackWithNoError() { + let venmoDriver = BTVenmoDriver(apiClient: mockAPIClient) + venmoDriver.application = FakeApplication() + venmoDriver.bundle = FakeBundle() + BTAppSwitch.sharedInstance().returnURLScheme = "scheme" + + let expectation = self.expectation(description: "Callback invoked") + venmoDriver.authorizeAccountAndVault(false) { (venmoAccount, error) -> Void in + XCTAssertNil(venmoAccount) + XCTAssertNil(error) + expectation.fulfill() + } + BTVenmoDriver.handleAppSwitchReturn(URL(string: "scheme://x-callback-url/vzero/auth/venmo/cancel")!) + + self.waitForExpectations(timeout: 2, handler: nil) + } + + func testAuthorizeAccountWithProfileID_withNilProfileID_usesDefaultProfileIDAndAccessTokenFromConfiguration() { + let venmoDriver = BTVenmoDriver(apiClient: mockAPIClient) + BTAppSwitch.sharedInstance().returnURLScheme = "scheme" + let fakeApplication = FakeApplication() + venmoDriver.application = fakeApplication + venmoDriver.bundle = FakeBundle() + + venmoDriver.authorizeAccount(profileID: nil, vault: false) { (_, _) in } + + XCTAssertTrue(fakeApplication.openURLWasCalled) + XCTAssertEqual(fakeApplication.lastOpenURL!.scheme, "com.venmo.touch.v2") + XCTAssertNotNil(fakeApplication.lastOpenURL!.absoluteString.range(of: "venmo_merchant_id")); + XCTAssertNotNil(fakeApplication.lastOpenURL!.absoluteString.range(of: "venmo-access-token")); + } + + func testAuthorizeAccountWithProfileID_withProfileID_usesProfileIDToAppSwitch() { + let venmoDriver = BTVenmoDriver(apiClient: mockAPIClient) + BTAppSwitch.sharedInstance().returnURLScheme = "scheme" + let fakeApplication = FakeApplication() + venmoDriver.application = fakeApplication + venmoDriver.bundle = FakeBundle() + + venmoDriver.authorizeAccount(profileID: "second_venmo_merchant_id", vault: false) { (_, _) in } + + XCTAssertTrue(fakeApplication.openURLWasCalled) + XCTAssertEqual(fakeApplication.lastOpenURL!.scheme, "com.venmo.touch.v2") + XCTAssertNotNil(fakeApplication.lastOpenURL!.absoluteString.range(of: "second_venmo_merchant_id")); + XCTAssertNotNil(fakeApplication.lastOpenURL!.absoluteString.range(of: "venmo-access-token")); + } + + // MARK: - Analytics + + func testAPIClientMetadata_hasSourceSetToVenmoApp() { + // API client by default uses source = .Unknown and integration = .Custom + let apiClient = BTAPIClient(authorization: "development_testing_integration_merchant_id")! + let venmoDriver = BTVenmoDriver(apiClient: apiClient) + + XCTAssertEqual(venmoDriver.apiClient.metadata.integration, BTClientMetadataIntegrationType.custom) + XCTAssertEqual(venmoDriver.apiClient.metadata.source, BTClientMetadataSourceType.venmoApp) + } + + // MARK: - BTAppSwitchHandler + + func testIsiOSAppSwitchAvailable_whenApplicationCanOpenVenmoURL_returnsTrue() { + let venmoDriver = BTVenmoDriver(apiClient: mockAPIClient) + BTAppSwitch.sharedInstance().returnURLScheme = "scheme" + let fakeApplication = FakeApplication() + fakeApplication.cannedCanOpenURL = false + fakeApplication.canOpenURLWhitelist.append(URL(string: "com.venmo.touch.v2://x-callback-url/path")!) + venmoDriver.application = fakeApplication + + XCTAssertTrue(venmoDriver.isiOSAppAvailableForAppSwitch()) + } + + func testIsiOSAppSwitchAvailable_whenApplicationCantOpenVenmoURL_returnsFalse() { + let venmoDriver = BTVenmoDriver(apiClient: mockAPIClient) + BTAppSwitch.sharedInstance().returnURLScheme = "scheme" + let fakeApplication = FakeApplication() + fakeApplication.cannedCanOpenURL = false + venmoDriver.application = fakeApplication + + XCTAssertFalse(venmoDriver.isiOSAppAvailableForAppSwitch()) + } + + func testIsiOSAppSwitchAvailable_whenApplicationCanOpenVenmoURL_andIosLessThan9_returnsFalse() { + let venmoDriver = BTVenmoDriver(apiClient: mockAPIClient) + BTAppSwitch.sharedInstance().returnURLScheme = "scheme" + let fakeApplication = FakeApplication() + fakeApplication.cannedCanOpenURL = false + fakeApplication.canOpenURLWhitelist.append(URL(string: "com.venmo.touch.v2://x-callback-url/path")!) + venmoDriver.application = fakeApplication + let fakeDevice = FakeDevice() + venmoDriver.device = fakeDevice + + XCTAssertFalse(venmoDriver.isiOSAppAvailableForAppSwitch()) + } + + func testIsiOSAppSwitchAvailable_whenApplicationCantOpenVenmoURL_andIosEqualTo9_3_returnsFalse() { + let venmoDriver = BTVenmoDriver(apiClient: mockAPIClient) + BTAppSwitch.sharedInstance().returnURLScheme = "scheme" + let fakeApplication = FakeApplication() + fakeApplication.cannedCanOpenURL = false + venmoDriver.application = fakeApplication + let fakeDevice = FakeDevice() + fakeDevice.systemVersion = "9.3" + venmoDriver.device = fakeDevice + + XCTAssertFalse(venmoDriver.isiOSAppAvailableForAppSwitch()) + } + + func testIsiOSAppSwitchAvailable_whenApplicationCanOpenVenmoURL_andIosEqualTo11_1_returnsTrue() { + let venmoDriver = BTVenmoDriver(apiClient: mockAPIClient) + BTAppSwitch.sharedInstance().returnURLScheme = "scheme" + let fakeApplication = FakeApplication() + fakeApplication.cannedCanOpenURL = false + fakeApplication.canOpenURLWhitelist.append(URL(string: "com.venmo.touch.v2://x-callback-url/path")!) + venmoDriver.application = fakeApplication + let fakeDevice = FakeDevice() + fakeDevice.systemVersion = "11.1" + venmoDriver.device = fakeDevice + + XCTAssertTrue(venmoDriver.isiOSAppAvailableForAppSwitch()) + } + + let venmoProductionSourceApplication = "net.kortina.labs.Venmo" + let venmoDebugSourceApplication = "net.kortina.labs.Venmo.debug" + let fakeWalletSourceApplication = "com.paypal.PPClient.Debug" + + func testCanHandleAppSwitchReturnURL_whenSourceApplicationIsVenmoDebugApp_returnsTrue() { + XCTAssertTrue(BTVenmoDriver.canHandleAppSwitchReturn(URL(string: "fake://fake")!, sourceApplication: venmoProductionSourceApplication)) + } + + func testCanHandleAppSwitchReturnURL_whenSourceApplicationIsVenmoProductionApp_returnsTrue() { + XCTAssertTrue(BTVenmoDriver.canHandleAppSwitchReturn(URL(string: "fake://fake")!, sourceApplication: venmoDebugSourceApplication)) + } + + func testCanHandleAppSwitchReturnURL_whenSourceApplicationIsFakeWalletAppAndURLIsValid_returnsTrue() { + XCTAssertTrue(BTVenmoDriver.canHandleAppSwitchReturn(URL(string: "doesntmatter://x-callback-url/vzero/auth/venmo/stuffffff")!, sourceApplication: fakeWalletSourceApplication)) + } + + func testCanHandleAppSwitchReturnURL_whenSourceApplicationIsNotVenmo_returnsFalse() { + XCTAssertFalse(BTVenmoDriver.canHandleAppSwitchReturn(URL(string: "fake://fake")!, sourceApplication: "invalid.source.application")) + } + + func testAuthorizeAccountWithTokenizationKey_vaultTrue_willNotAttemptToVault() { + let venmoDriver = BTVenmoDriver(apiClient: mockAPIClient) + mockAPIClient.cannedResponseBody = BTJSON(value: [ + "venmoAccounts": [[ + "type": "VenmoAccount", + "nonce": "abcd-venmo-nonce", + "description": "VenmoAccount", + "consumed": false, + "default": true, + "details": [ + "cardType": "Discover", + "username": "venmojoe" + ] + ]] + ]) + + BTAppSwitch.sharedInstance().returnURLScheme = "scheme" + + venmoDriver.application = FakeApplication() + venmoDriver.bundle = FakeBundle() + + let expectation = self.expectation(description: "Callback invoked") + + venmoDriver.authorizeAccountAndVault(true) { (venmoAccount, error) -> Void in + XCTAssertNil(error) + + XCTAssertEqual(venmoAccount?.username, "venmotim") + XCTAssertEqual(venmoAccount?.nonce, "lmnop-venmo-nonce") + XCTAssertFalse(venmoAccount!.isDefault) + + expectation.fulfill() + } + + BTVenmoDriver.handleAppSwitchReturn(URL(string: "scheme://x-callback-url/vzero/auth/venmo/success?paymentMethodNonce=lmnop-venmo-nonce&username=venmotim")!) + self.waitForExpectations(timeout: 2, handler: nil) + + XCTAssertEqual(mockAPIClient.postedAnalyticsEvents.last!, "ios.pay-with-venmo.appswitch.handle.success") + } + + // Note: testing of handleAppSwitchReturnURL is done implicitly while testing authorizeAccountWithCompletion + + // MARK: - Drop-in + + /// Helper + func client(_ configurationDictionary: Dictionary) -> BTAPIClient { + let apiClient = BTAPIClient(authorization: "development_tokenization_key")! + let fakeHttp = BTFakeHTTP()! + fakeHttp.cannedResponse = BTJSON(value: configurationDictionary) + fakeHttp.cannedStatusCode = 200 + apiClient.configurationHTTP = fakeHttp + return apiClient + } + + func clientWithJson(_ configurationJson: BTJSON) -> BTAPIClient { + let apiClient = BTAPIClient(authorization: "development_tokenization_key")! + let fakeHttp = BTFakeHTTP()! + fakeHttp.cannedResponse = configurationJson + fakeHttp.cannedStatusCode = 200 + apiClient.configurationHTTP = fakeHttp + return apiClient + } + + class BTDropInViewControllerTestDelegate : NSObject, BTDropInViewControllerDelegate { + var didLoadExpectation: XCTestExpectation + + init(didLoadExpectation: XCTestExpectation) { + self.didLoadExpectation = didLoadExpectation + } + + @objc func drop(_ viewController: BTDropInViewController, didSucceedWithTokenization paymentMethodNonce: BTPaymentMethodNonce) {} + + @objc func drop(inViewControllerDidCancel viewController: BTDropInViewController) {} + + @objc func drop(inViewControllerDidLoad viewController: BTDropInViewController) { + didLoadExpectation.fulfill() + } + } + + func testGotoVenmoInAppStore_opensVenmoAppStoreURL_andSendsAnalyticsEvent() { + let venmoDriver = BTVenmoDriver(apiClient: mockAPIClient) + BTAppSwitch.sharedInstance().returnURLScheme = "scheme" + let fakeApplication = FakeApplication() + venmoDriver.application = fakeApplication + venmoDriver.bundle = FakeBundle() + + venmoDriver.openVenmoAppPageInAppStore() + + XCTAssertTrue(fakeApplication.openURLWasCalled) + XCTAssertEqual(fakeApplication.lastOpenURL!.absoluteString, "https://itunes.apple.com/us/app/venmo-send-receive-money/id351727428") + XCTAssertEqual(mockAPIClient.postedAnalyticsEvents.last!, "ios.pay-with-venmo.app-store.invoked") + } + + // Flaky + func pendDropIn_whenVenmoIsNotEnabled_doesNotDisplayVenmoButton() { + let apiClient = self.client([:]) + + let dropInViewController = BTDropInViewController(apiClient: apiClient) + let didLoadExpectation = self.expectation(description: "Drop-in did finish loading") + + // Must be assigned here for a strong reference. The delegate property of the BTDropInViewController is a weak reference. + let testDelegate = BTDropInViewControllerTestDelegate(didLoadExpectation: didLoadExpectation) + dropInViewController.delegate = testDelegate + + viewController.present(dropInViewController, animated: false, completion: nil) + + self.waitForExpectations(timeout: 5, handler: nil) + + let enabledPaymentOptions = dropInViewController.dropInContentView.paymentButton.enabledPaymentOptions + XCTAssertFalse(enabledPaymentOptions.contains("Venmo")) + } + + // Flaky + func pendDropIn_whenVenmoIsEnabled_displaysVenmoButton() { + let json = BTJSON(value: [ + "payWithVenmo" : ["accessToken" : "access-token"], + "merchantId": "merchant_id" ]) + let apiClient = self.clientWithJson(json) + + let dropInViewController = BTDropInViewController(apiClient: apiClient) + let didLoadExpectation = self.expectation(description: "Drop-in did finish loading") + + // Must be assigned here for a strong reference. The delegate property of the BTDropInViewController is a weak reference. + let testDelegate = BTDropInViewControllerTestDelegate(didLoadExpectation: didLoadExpectation) + + dropInViewController.delegate = testDelegate + + dropInViewController.dropInContentView.paymentButton.application = FakeApplication() + + viewController.present(dropInViewController, animated: false, completion: nil) + + self.waitForExpectations(timeout: 5, handler: nil) + + let enabledPaymentOptions = dropInViewController.dropInContentView.paymentButton.enabledPaymentOptions + XCTAssertTrue(enabledPaymentOptions.contains("Venmo")) + } +} + diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTVersion_Tests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTVersion_Tests.swift new file mode 100644 index 0000000..42e9d82 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BTVersion_Tests.swift @@ -0,0 +1,11 @@ +import XCTest + +class BTVersion_Tests: XCTestCase { + + func testVersion_returnsAVersion() { + let regex = try! NSRegularExpression(pattern: "\\d+\\.\\d+\\.\\d+", options: []) + let matches = regex.matches(in: BRAINTREE_VERSION, options: [], range: NSMakeRange(0, BRAINTREE_VERSION.count)) + XCTAssertTrue(matches.count == 1) + } + +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Braintree-UI-Specs/BTUICardExpirationValidatorSpec.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Braintree-UI-Specs/BTUICardExpirationValidatorSpec.m new file mode 100644 index 0000000..67bb6b2 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Braintree-UI-Specs/BTUICardExpirationValidatorSpec.m @@ -0,0 +1,112 @@ +#import +#import "BTSpecDependencies.h" +#import "BTUICardExpirationValidator.h" + +SpecBegin(BTUICardExpirationValidator) + +describe(@"month:year:validForDate:", ^{ + context(@"validating month and year relative to given validation date", ^{ + __block NSDate *today; + + beforeEach(^{ + NSDateComponents *components = [[NSDateComponents alloc] init]; + components.calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; + components.day = 2; + components.month = 5; + components.year = 2014; + today = components.date; + }); + + it(@"returns false when the month year are before the provided date ", ^{ + BOOL monthYearBeforeTodayValid = [BTUICardExpirationValidator month:4 year:14 validForDate:today]; + expect(monthYearBeforeTodayValid).to.beFalsy(); + }); + + it(@"returns true when the month year are the same as the provided date ", ^{ + BOOL monthYearSameAsTodayValid = [BTUICardExpirationValidator month:5 year:14 validForDate:today]; + expect(monthYearSameAsTodayValid).to.beTruthy(); + }); + + it(@"returns true when the month year are after the provided date ", ^{ + BOOL monthYearAfterTodayValid = [BTUICardExpirationValidator month:8 year:14 validForDate:today]; + expect(monthYearAfterTodayValid).to.beTruthy(); + }); + + describe(@"Year in YYYY", ^{ + it(@"returns true when the month year are after the provided date", ^{ + BOOL monthYearValid = [BTUICardExpirationValidator month:8 year:2014 validForDate:today]; + expect(monthYearValid).to.beTruthy(); + }); + + it(@"returns false when the month year are before the provided date", ^{ + BOOL monthYearValid = [BTUICardExpirationValidator month:4 year:2014 validForDate:today]; + expect(monthYearValid).to.beFalsy(); + }); + }); + }); + + context(@"validating dates at the end of the year", ^{ + __block NSDate *endOfYearToday; + beforeEach(^{ + NSDateComponents *components = [[NSDateComponents alloc] init]; + components.calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; + components.day = 1; + components.month = 12; + components.year = 2014; + endOfYearToday = components.date; + }); + + it(@"returns true when the month/year are the same as the provided date", ^{ + BOOL monthYearValid = [BTUICardExpirationValidator month:12 year:2014 validForDate:endOfYearToday]; + expect(monthYearValid).to.beTruthy(); + }); + }); + + context(@"validating dates far in the future", ^{ + __block NSDate *today; + + beforeEach(^{ + NSDateComponents *components = [[NSDateComponents alloc] init]; + components.calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; + components.day = 2; + components.month = 5; + components.year = 2014; + today = components.date; + }); + + it(@"returns true when the month year are before but near the far future date", ^{ + BOOL monthYearValid = [BTUICardExpirationValidator month:4 year:14 + kBTUICardExpirationValidatorFarFutureYears validForDate:today]; + expect(monthYearValid).to.beTruthy(); + }); + + it(@"returns false when the month year are not before the far future date", ^{ + BOOL monthYearValid = [BTUICardExpirationValidator month:5 year:14 + kBTUICardExpirationValidatorFarFutureYears validForDate:today]; + expect(monthYearValid).to.beFalsy(); + }); + }); + + context(@"month and year formats", ^{ + __block NSDate *today; + + beforeEach(^{ + NSDateComponents *components = [[NSDateComponents alloc] init]; + components.calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; + components.day = 2; + components.month = 2; + components.year = 2014; + today = components.date; + }); + + it(@"accepts 2 digit years", ^{ + BOOL monthYearValid = [BTUICardExpirationValidator month:4 year:14 validForDate:today]; + expect(monthYearValid).to.beTruthy(); + }); + + it(@"accepts 4 digit years", ^{ + BOOL monthYearValid = [BTUICardExpirationValidator month:4 year:2014 validForDate:today]; + expect(monthYearValid).to.beTruthy(); + }); + }); +}); + +SpecEnd diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Braintree-UI-Specs/BTUICardExpiryFormatterSpec.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Braintree-UI-Specs/BTUICardExpiryFormatterSpec.m new file mode 100644 index 0000000..f3e31e3 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Braintree-UI-Specs/BTUICardExpiryFormatterSpec.m @@ -0,0 +1,133 @@ +#import +#import "BTSpecDependencies.h" +#import "BTUICardExpiryFormat.h" + +SpecBegin(BTUICardExpiryFormatter) + +describe(@"formattedValue", ^{ + + __block BTUICardExpiryFormat *format; + beforeEach(^{ + format = [[BTUICardExpiryFormat alloc] init]; + }); + + describe(@"backspace", ^{ + beforeEach(^{ + format.backspace = YES; + }); + + it(@"is a no-op when the value is empty", ^{ + format.value = @""; + NSString *formattedValue; + NSUInteger formattedCursorLocation; + [format formattedValue:&formattedValue cursorLocation:&formattedCursorLocation]; + + expect(formattedValue).to.equal(@""); + expect(formattedCursorLocation).to.equal(0); + }); + + it(@"maintains the slash when deleting the first year digit", ^{ + format.value = @"12/"; + format.cursorLocation = 3; + format.backspace = YES; + NSString *formattedValue; + NSUInteger formattedCursorLocation; + [format formattedValue:&formattedValue cursorLocation:&formattedCursorLocation]; + + expect(formattedValue).to.equal(@"12/"); + expect(formattedCursorLocation).to.equal(3); + }); + + it(@"deletes the second month digit when backspacing the slash", ^{ + format.value = @"12"; + format.cursorLocation = 2; + format.backspace = YES; + NSString *formattedValue; + NSUInteger formattedCursorLocation; + [format formattedValue:&formattedValue cursorLocation:&formattedCursorLocation]; + + expect(formattedValue).to.equal(@"1"); + expect(formattedCursorLocation).to.equal(1); + }); + }); + + describe(@"insertion", ^{ + it(@"is a no-op when the value is empty", ^{ + format.value = @""; + NSString *formattedValue; + NSUInteger formattedCursorLocation; + [format formattedValue:&formattedValue cursorLocation:&formattedCursorLocation]; + + expect(formattedValue).to.equal(@""); + expect(formattedCursorLocation).to.equal(0); + }); + + it(@"prepends 0 and appends / if one digit >1 is entered", ^{ + format.value = @"2"; + format.cursorLocation = 1; + NSString *formattedValue; + NSUInteger formattedCursorLocation; + [format formattedValue:&formattedValue cursorLocation:&formattedCursorLocation]; + + expect(formattedValue).to.equal(@"02/"); + expect(formattedCursorLocation).to.equal(3); + }); + + it(@"does not insert a slash when appending the first month digit", ^{ + format.value = @"1"; + format.cursorLocation = 1; + NSString *formattedValue; + NSUInteger formattedCursorLocation; + [format formattedValue:&formattedValue cursorLocation:&formattedCursorLocation]; + + expect(formattedValue).to.equal(@"1"); + expect(formattedCursorLocation).to.equal(1); + }); + + it(@"inserts a slash when appending the second digit of the month", ^{ + format.value = @"12"; + format.cursorLocation = 2; + NSString *formattedValue; + NSUInteger formattedCursorLocation; + [format formattedValue:&formattedValue cursorLocation:&formattedCursorLocation]; + + expect(formattedValue).to.equal(@"12/"); + expect(formattedCursorLocation).to.equal(3); + }); + + it(@"maintains the slash when inserting a digit before", ^{ + format.value = @"012/"; + format.cursorLocation = 3; + NSString *formattedValue; + NSUInteger formattedCursorLocation; + [format formattedValue:&formattedValue cursorLocation:&formattedCursorLocation]; + + expect(formattedValue).to.equal(@"01/2"); + expect(formattedCursorLocation).to.equal(4); + }); + + it(@"maintains the slash when inserting two digits before", ^{ + format.value = @"0123/"; + format.cursorLocation = 4; + NSString *formattedValue; + NSUInteger formattedCursorLocation; + [format formattedValue:&formattedValue cursorLocation:&formattedCursorLocation]; + + expect(formattedValue).to.equal(@"01/23"); + expect(formattedCursorLocation).to.equal(5); + }); + + it(@"inserts the slash when pasting in a non-slash date", ^{ + format.value = @"0123"; + format.cursorLocation = 4; + NSString *formattedValue; + NSUInteger formattedCursorLocation; + [format formattedValue:&formattedValue cursorLocation:&formattedCursorLocation]; + + expect(formattedValue).to.equal(@"01/23"); + expect(formattedCursorLocation).to.equal(5); + }); + }); +}); + +SpecEnd diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Braintree-UI-Specs/BTUICardTypeSpec.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Braintree-UI-Specs/BTUICardTypeSpec.m new file mode 100644 index 0000000..bb65a6e --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Braintree-UI-Specs/BTUICardTypeSpec.m @@ -0,0 +1,246 @@ +#import +#import "BTSpecDependencies.h" +#import "BTUICardType.h" +#import "EXPMatchers+haveKerning.h" +#import "BTUIViewUtil.h" + +SpecBegin(BTUICardType) + +describe(@"BTUICardType", ^{ + + it(@"should only have one instance of each brand", ^{ + BTUICardType *t1 = [BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_AMERICAN_EXPRESS)]; + BTUICardType *t2 = [BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_AMERICAN_EXPRESS)]; + expect(t1).to.beIdenticalTo(t2); + }); + + describe(@"possible card types for number", ^{ + + it(@"should recognize all cards with empty string", ^{ + NSArray *possibleCardTypes = [BTUICardType possibleCardTypesForNumber:@""]; + expect(possibleCardTypes.count).to.equal(9); + }); + + it(@"should recognize no cards starting with 1", ^{ + NSArray *possibleCardTypes = [BTUICardType possibleCardTypesForNumber:@"1"]; + expect(possibleCardTypes.count).to.equal(0); + }); + + it(@"should recognize AmEx and Diners Club and JCB cards with 3", ^{ + NSArray *possibleCardTypes = [BTUICardType possibleCardTypesForNumber:@"3"]; + expect(possibleCardTypes.count).to.equal(3); + expect(possibleCardTypes).to.contain([BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_DINERS_CLUB)]); + expect(possibleCardTypes).to.contain([BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_AMERICAN_EXPRESS)]); + expect(possibleCardTypes).to.contain([BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_JCB)]); + }); + + it(@"should recognize MasterCard and Maestro with a 5", ^{ + NSArray *possibleCardTypes = [BTUICardType possibleCardTypesForNumber:@"5"]; + expect(possibleCardTypes.count).to.equal(2); + expect(possibleCardTypes).to.contain([BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_MASTER_CARD)]); + expect(possibleCardTypes).to.contain([BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_MAESTRO)]); + }); + + it(@"should recognize Maestro cards starting with 63", ^{ + NSArray *possibleCardTypes = [BTUICardType possibleCardTypesForNumber:@"63"]; + expect(possibleCardTypes).to.contain([BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_MAESTRO)]); + }); + + it(@"should recognize Maestro cards starting with 67", ^{ + NSArray *possibleCardTypes = [BTUICardType possibleCardTypesForNumber:@"67"]; + expect(possibleCardTypes).to.contain([BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_MAESTRO)]); + }); + + it(@"should recognize the start of a Visa", ^{ + NSArray *possibleCardTypes = [BTUICardType possibleCardTypesForNumber:@"4"]; + expect(possibleCardTypes).to.contain([BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_VISA)]); + expect(possibleCardTypes.count).to.equal(1); + }); + + it(@"should recognize a whole Visa", ^{ + NSArray *possibleCardTypes = [BTUICardType possibleCardTypesForNumber:@"4111111111111111"]; + expect(possibleCardTypes).to.contain([BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_VISA)]); + expect(possibleCardTypes.count).to.equal(1); + }); + }); + + describe(@"payment method type for card type", ^{ + it(@"recognizes Visa", ^{ + BTUICardType *cardType = [BTUICardType cardTypeForBrand:@"Visa"]; + expect([BTUIViewUtil paymentMethodTypeForCardType:cardType]).to.equal(BTUIPaymentOptionTypeVisa); + }); + + it(@"recognizes MasterCard", ^{ + BTUICardType *cardType = [BTUICardType cardTypeForBrand:@"MasterCard"]; + expect([BTUIViewUtil paymentMethodTypeForCardType:cardType]).to.equal(BTUIPaymentOptionTypeMasterCard); + }); + + it(@"recognizes Amex", ^{ + BTUICardType *cardType = [BTUICardType cardTypeForBrand:@"American Express"]; + expect([BTUIViewUtil paymentMethodTypeForCardType:cardType]).to.equal(BTUIPaymentOptionTypeAMEX); + }); + + it(@"recognizes Discover", ^{ + BTUICardType *cardType = [BTUICardType cardTypeForBrand:@"Discover"]; + expect([BTUIViewUtil paymentMethodTypeForCardType:cardType]).to.equal(BTUIPaymentOptionTypeDiscover); + }); + + it(@"recognizes JCB", ^{ + BTUICardType *cardType = [BTUICardType cardTypeForBrand:@"JCB"]; + expect([BTUIViewUtil paymentMethodTypeForCardType:cardType]).to.equal(BTUIPaymentOptionTypeJCB); + }); + + it(@"recognizes Maestro", ^{ + BTUICardType *cardType = [BTUICardType cardTypeForBrand:@"Maestro"]; + expect([BTUIViewUtil paymentMethodTypeForCardType:cardType]).to.equal(BTUIPaymentOptionTypeMaestro); + }); + + it(@"recognizes Diners Club", ^{ + BTUICardType *cardType = [BTUICardType cardTypeForBrand:@"Diners Club"]; + expect([BTUIViewUtil paymentMethodTypeForCardType:cardType]).to.equal(BTUIPaymentOptionTypeDinersClub); + }); + + it(@"ignores unknown card brands", ^{ + BTUICardType *cardType = [BTUICardType cardTypeForBrand:@"Unknown Card Brand"]; + expect([BTUIViewUtil paymentMethodTypeForCardType:cardType]).to.equal(BTUIPaymentOptionTypeUnknown); + }); + }); + + describe(@"card number recognition", ^{ + + it(@"should recognize a valid, formatted Visa", ^{ + expect([BTUICardType cardTypeForNumber:@"4111 1111 1111 1111"]).to.equal([BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_VISA)]); + }); + + it(@"should recognize an invalid Visa", ^{ + expect([BTUICardType cardTypeForNumber:@"4111 1111 1111 1112"]).to.equal([BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_VISA)]); + }); + + it(@"should recognize a non-formatted Visa", ^{ + expect([BTUICardType cardTypeForNumber:@"4111111111111111"]).to.equal([BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_VISA)]); + }); + + it(@"should recognize an incomplete Visa", ^{ + expect([BTUICardType cardTypeForNumber:@"4"]).to.equal([BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_VISA)]); + }); + + it(@"should recognize a valid MasterCard", ^{ + expect([BTUICardType cardTypeForNumber:@"5555555555554444"]).to.equal([BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_MASTER_CARD)]); + }); + + it(@"should recognize a valid American Express", ^{ + expect([BTUICardType cardTypeForNumber:@"378282246310005"]).to.equal([BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_AMERICAN_EXPRESS)]); + }); + + it(@"should recognize a valid Discover", ^{ + expect([BTUICardType cardTypeForNumber:@"6011 1111 1111 1117"]).to.equal([BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_DISCOVER)]); + }); + + it(@"should recognize a valid JCB", ^{ + expect([BTUICardType cardTypeForNumber:@"3530 1113 3330 0000"]).to.equal([BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_JCB)]); + }); + + it(@"should recognize a valid Union Pay", ^{ + expect([BTUICardType cardTypeForNumber:@"6221 2345 6789 0123 450"]).to.equal([BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_UNION_PAY)]); + }); + + it(@"should not recognize a non-number", ^{ + expect([BTUICardType cardTypeForNumber:@"notanumber"]).to.beNil(); + }); + + it(@"should not recognize an unrecognizable number", ^{ + expect([BTUICardType cardTypeForNumber:@"notanumber"]).to.beNil(); + }); + + }); + + describe(@"validNumber", ^{ + NSArray *braintreeTestCardNumbers = + @[ + @[@"378282246310005", BTUILocalizedString(CARD_TYPE_AMERICAN_EXPRESS)], + @[@"371449635398431", BTUILocalizedString(CARD_TYPE_AMERICAN_EXPRESS)], + @[@"6011111111111117", BTUILocalizedString(CARD_TYPE_DISCOVER)], + @[@"3530111333300000", BTUILocalizedString(CARD_TYPE_JCB)], + @[@"6304000000000000", BTUILocalizedString(CARD_TYPE_MAESTRO)], + @[@"5555555555554444", BTUILocalizedString(CARD_TYPE_MASTER_CARD)], + @[@"4111111111111111", BTUILocalizedString(CARD_TYPE_VISA)], + @[@"4005519200000004", BTUILocalizedString(CARD_TYPE_VISA)], + @[@"4009348888881881", BTUILocalizedString(CARD_TYPE_VISA)], + @[@"4012000033330026", BTUILocalizedString(CARD_TYPE_VISA)], + @[@"4012000077777777", BTUILocalizedString(CARD_TYPE_VISA)], + @[@"4012888888881881", BTUILocalizedString(CARD_TYPE_VISA)], + @[@"4217651111111119", BTUILocalizedString(CARD_TYPE_VISA)], + @[@"4500600000000061", BTUILocalizedString(CARD_TYPE_VISA)], + @[@"6221234567890123450", BTUILocalizedString(CARD_TYPE_UNION_PAY)] + ]; + + for (NSArray *testCase in braintreeTestCardNumbers) { + NSString *testNumber = testCase[0]; + NSString *cardBrand = testCase[1]; + BTUICardType *cardType = [BTUICardType cardTypeForBrand:cardBrand]; + it([NSString stringWithFormat:@"should recognize %@ as a valid %@", testNumber, cardBrand], ^{ + expect([cardType validNumber:testNumber]).to.beTruthy(); + }); + } + }); + + describe(@"validAndNecessarilyCompleteNumber", ^{ + + it(@"should return NO for short Maestro", ^{ + BTUICardType *cardType = [BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_MAESTRO)]; + expect([cardType validAndNecessarilyCompleteNumber:@"630400000000"]).to.beFalsy(); + expect([cardType validAndNecessarilyCompleteNumber:@"6304000000000000"]).to.beFalsy(); + }); + + it(@"should return YES for full-length Maestro", ^{ + BTUICardType *cardType = [BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_MAESTRO)]; + expect([cardType validAndNecessarilyCompleteNumber:@"6304000000000000000"]).to.beTruthy(); + }); + + }); + + describe(@"card number formatting", ^{ + + it(@"should format a non-number as an empty string", ^{ + expect([[[BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_VISA)] formatNumber:@"notanumber"] string]).to.equal(@""); + }); + + it(@"should return a too-long number without formatting", ^{ + expect([[[BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_VISA)] formatNumber:@"00000000000000000"] string]).to.equal(@"00000000000000000"); + }); + + it(@"should format a valid, formatted number as a Visa", ^{ + expect([[BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_VISA)] formatNumber:@"0000 0000 0000 0000"]).to.haveKerning(@[@3, @7, @11]); + }); + + it(@"should format a non-formatted number as a Visa", ^{ + expect([[BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_VISA)] formatNumber:@"0000000000000000"]).to.haveKerning(@[@3, @7, @11]); + }); + + it(@"should format an incomplete number as a Visa", ^{ + expect([[[BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_VISA)] formatNumber:@"0"] string]).to.equal(@"0"); + }); + + it(@"should format as a MasterCard", ^{ + expect([[BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_MASTER_CARD)] formatNumber:@"0000000000000000"]).to.haveKerning(@[@3, @7, @11]); + }); + + it(@"should format as an American Express", ^{ + expect([[BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_AMERICAN_EXPRESS)] formatNumber:@"000000000000000"]).to.haveKerning(@[@3, @9]); + }); + + it(@"should format as an incomplete American Express", ^{ + expect([[BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_AMERICAN_EXPRESS)] formatNumber:@"00000"]).to.haveKerning(@[@3]); + }); + + it(@"should format as a Discover", ^{ + expect([[BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_DISCOVER)] formatNumber:@"1234123412341234"]).to.haveKerning(@[@3, @7, @11]); + }); + + it(@"should format as a JCB", ^{ + expect([[BTUICardType cardTypeForBrand:BTUILocalizedString(CARD_TYPE_JCB)] formatNumber:@"1234123412341234"]).to.haveKerning(@[@3, @7, @11]); + }); + }); +}); + +SpecEnd diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Braintree-UI-Specs/BTUISpec.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Braintree-UI-Specs/BTUISpec.m new file mode 100644 index 0000000..fbed892 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Braintree-UI-Specs/BTUISpec.m @@ -0,0 +1,24 @@ +#import +#import "BTSpecDependencies.h" +#import "BTUI.h" + +SpecBegin(BTUI) + +describe(@"BTUI", ^{ + it(@"has a braintree theme", ^{ + BTUI *theme = [BTUI braintreeTheme]; + expect(theme.callToActionColor).notTo.beNil(); + }); +}); + +describe(@"activity indicator style", ^{ + it(@"returns white for a dark background", ^{ + expect([BTUI activityIndicatorViewStyleForBarTintColor:[UIColor blackColor]]).to.equal(UIActivityIndicatorViewStyleWhite); + }); + + it(@"returns gray for a light background", ^{ + expect([BTUI activityIndicatorViewStyleForBarTintColor:[UIColor whiteColor]]).to.equal(UIActivityIndicatorViewStyleGray); + }); +}); + +SpecEnd diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Braintree-UI-Specs/BTUI_UIColor.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Braintree-UI-Specs/BTUI_UIColor.m new file mode 100644 index 0000000..25c777f --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Braintree-UI-Specs/BTUI_UIColor.m @@ -0,0 +1,53 @@ +#import +#import "BTSpecDependencies.h" +#import "UIColor+BTUI.h" + +SpecBegin(BTUI_UIColor) + +describe(@"UIColor+BTUI", ^{ + describe(@"bt_colorFromHex", ^{ + it(@"converts simple valid strings", ^{ + UIColor *red = [UIColor bt_colorFromHex:@"#ff0000" alpha:1.0f]; + expect(red).to.equal([UIColor redColor]); + UIColor *green = [UIColor bt_colorFromHex:@"#00ff00" alpha:1.0f]; + expect(green).to.equal([UIColor greenColor]); + UIColor *blue = [UIColor bt_colorFromHex:@"#0000ff" alpha:1.0f]; + expect(blue).to.equal([UIColor blueColor]); + }); + + it(@"converts mixed color strings", ^{ + UIColor *c = [UIColor bt_colorFromHex:@"#ffffff" alpha:1.0f]; + expect(CGColorGetNumberOfComponents(c.CGColor)).to.equal(4); + CGFloat r, g, b, a; + [c getRed:&r green:&g blue:&b alpha:&a]; + expect(r).to.equal(1.0f); + expect(g).to.equal(1.0f); + expect(b).to.equal(1.0f); + expect(a).to.equal(1.0f); + + }); + + it(@"can take an alpha value", ^{ + UIColor *blueClear = [UIColor bt_colorFromHex:@"#0000ff" alpha:0.0f]; + expect(blueClear).notTo.equal([UIColor blueColor]); + expect(CGColorGetNumberOfComponents(blueClear.CGColor)).to.equal(4); + CGFloat r, g, b, a; + [blueClear getRed:&r green:&g blue:&b alpha:&a]; + expect(r).to.equal(0.0f); + expect(g).to.equal(0.0f); + expect(b).to.equal(1.0f); + expect(a).to.equal(0.0f); + }); + + it(@"doesn't choke on invalid strings", ^{ + UIColor *c; + c = [UIColor bt_colorFromHex:@"#nnn" alpha:1.0f]; + expect(c).to.equal([UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:1.0f]); + + c = [UIColor bt_colorFromHex:@"#im un ur hex and i am not real" alpha:1.0f]; + expect(c).to.equal([UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:1.0f]); + }); + }); +}); + +SpecEnd diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Braintree-UI-Specs/EXPMatchers+haveKerning.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Braintree-UI-Specs/EXPMatchers+haveKerning.h new file mode 100644 index 0000000..9ebb2ac --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Braintree-UI-Specs/EXPMatchers+haveKerning.h @@ -0,0 +1,5 @@ +#import "Expecta.h" + +EXPMatcherInterface(haveKerning, (NSArray *expectedIndices)); + +#define haveKerning haveKerning diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Braintree-UI-Specs/EXPMatchers+haveKerning.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Braintree-UI-Specs/EXPMatchers+haveKerning.m new file mode 100644 index 0000000..b1d1ffb --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Braintree-UI-Specs/EXPMatchers+haveKerning.m @@ -0,0 +1,51 @@ +#import "EXPMatchers+haveKerning.h" +#import + +EXPMatcherImplementationBegin(haveKerning, (NSArray *expectedIndices)) { + BOOL actualIsNil = (actual == nil); + BOOL expectedIsNil = (expectedIndices == nil); + + prerequisite(^BOOL { + return !(actualIsNil || expectedIsNil); + // Return `NO` if matcher should fail whether or not the result is inverted + // using `.Not`. + }); + + match(^BOOL { + for (NSNumber *n in expectedIndices) { + NSUInteger i = [n unsignedIntegerValue]; + NSDictionary *attributes = [actual attributesAtIndex:i effectiveRange:nil]; + NSNumber *v = [attributes objectForKey:NSKernAttributeName]; + if ([v floatValue] <= 0) { + return NO; + } + } + return YES; + }); + + failureMessageForTo(^NSString * { + if (actualIsNil) + return @"the actual value is nil/null"; + if (expectedIsNil) + return @"the expected value is nil/null"; + return [NSString + stringWithFormat:@"expected: %@" + "got: an instance of %@ with non-matching kerning", + expectedIndices, [actual class]]; + // Return the message to be displayed when the match function returns `YES`. + }); + + failureMessageForNotTo(^NSString * { + return @"fail"; +// if (actualIsNil) +// return @"the actual value is nil/null"; +// if (expectedIsNil) +// return @"the expected value is nil/null"; +// return [NSString +// stringWithFormat:@"expected: not a kind of %@, " +// "got: an instance of %@, which is a kind of %@", +// [expected class], [actual class], [expected class]]; +// // Return the message to be displayed when the match function returns `NO`. + }); +} +EXPMatcherImplementationEnd diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BraintreePaymentFlow_UnitTests/BTLocalPayment_Tests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BraintreePaymentFlow_UnitTests/BTLocalPayment_Tests.swift new file mode 100644 index 0000000..463efa6 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BraintreePaymentFlow_UnitTests/BTLocalPayment_Tests.swift @@ -0,0 +1,454 @@ +import UIKit +import XCTest + +class BTLocalPayment_UnitTests: XCTestCase { + let tempClientToken = "eyJ2ZXJzaW9uIjoyLCJhdXRob3JpemF0aW9uRmluZ2VycHJpbnQiOiI3ODJhZmFlNDJlZTNiNTA4NWUxNmMzYjhkZTY3OGQxNTJhODFlYzk5MTBmZDNhY2YyYWU4MzA2OGI4NzE4YWZhfGNyZWF0ZWRfYXQ9MjAxNS0wOC0yMFQwMjoxMTo1Ni4yMTY1NDEwNjErMDAwMFx1MDAyNmN1c3RvbWVyX2lkPTM3OTU5QTE5LThCMjktNDVBNC1CNTA3LTRFQUNBM0VBOEM4Nlx1MDAyNm1lcmNoYW50X2lkPWRjcHNweTJicndkanIzcW5cdTAwMjZwdWJsaWNfa2V5PTl3d3J6cWszdnIzdDRuYzgiLCJjb25maWdVcmwiOiJodHRwczovL2FwaS5zYW5kYm94LmJyYWludHJlZWdhdGV3YXkuY29tOjQ0My9tZXJjaGFudHMvZGNwc3B5MmJyd2RqcjNxbi9jbGllbnRfYXBpL3YxL2NvbmZpZ3VyYXRpb24iLCJjaGFsbGVuZ2VzIjpbXSwiZW52aXJvbm1lbnQiOiJzYW5kYm94IiwiY2xpZW50QXBpVXJsIjoiaHR0cHM6Ly9hcGkuc2FuZGJveC5icmFpbnRyZWVnYXRld2F5LmNvbTo0NDMvbWVyY2hhbnRzL2RjcHNweTJicndkanIzcW4vY2xpZW50X2FwaSIsImFzc2V0c1VybCI6Imh0dHBzOi8vYXNzZXRzLmJyYWludHJlZWdhdGV3YXkuY29tIiwiYXV0aFVybCI6Imh0dHBzOi8vYXV0aC52ZW5tby5zYW5kYm94LmJyYWludHJlZWdhdGV3YXkuY29tIiwiYW5hbHl0aWNzIjp7InVybCI6Imh0dHBzOi8vY2xpZW50LWFuYWx5dGljcy5zYW5kYm94LmJyYWludHJlZWdhdGV3YXkuY29tIn0sInRocmVlRFNlY3VyZUVuYWJsZWQiOnRydWUsInRocmVlRFNlY3VyZSI6eyJsb29rdXBVcmwiOiJodHRwczovL2FwaS5zYW5kYm94LmJyYWludHJlZWdhdGV3YXkuY29tOjQ0My9tZXJjaGFudHMvZGNwc3B5MmJyd2RqcjNxbi90aHJlZV9kX3NlY3VyZS9sb29rdXAifSwicGF5cGFsRW5hYmxlZCI6dHJ1ZSwicGF5cGFsIjp7ImRpc3BsYXlOYW1lIjoiQWNtZSBXaWRnZXRzLCBMdGQuIChTYW5kYm94KSIsImNsaWVudElkIjpudWxsLCJwcml2YWN5VXJsIjoiaHR0cDovL2V4YW1wbGUuY29tL3BwIiwidXNlckFncmVlbWVudFVybCI6Imh0dHA6Ly9leGFtcGxlLmNvbS90b3MiLCJiYXNlVXJsIjoiaHR0cHM6Ly9hc3NldHMuYnJhaW50cmVlZ2F0ZXdheS5jb20iLCJhc3NldHNVcmwiOiJodHRwczovL2NoZWNrb3V0LnBheXBhbC5jb20iLCJkaXJlY3RCYXNlVXJsIjpudWxsLCJhbGxvd0h0dHAiOnRydWUsImVudmlyb25tZW50Tm9OZXR3b3JrIjp0cnVlLCJlbnZpcm9ubWVudCI6Im9mZmxpbmUiLCJ1bnZldHRlZE1lcmNoYW50IjpmYWxzZSwiYnJhaW50cmVlQ2xpZW50SWQiOiJtYXN0ZXJjbGllbnQzIiwiYmlsbGluZ0FncmVlbWVudHNFbmFibGVkIjpmYWxzZSwibWVyY2hhbnRBY2NvdW50SWQiOiJzdGNoMm5mZGZ3c3p5dHc1IiwiY3VycmVuY3lJc29Db2RlIjoiVVNEIn0sImNvaW5iYXNlRW5hYmxlZCI6dHJ1ZSwiY29pbmJhc2UiOnsiY2xpZW50SWQiOiIxMWQyNzIyOWJhNThiNTZkN2UzYzAxYTA1MjdmNGQ1YjQ0NmQ0ZjY4NDgxN2NiNjIzZDI1NWI1NzNhZGRjNTliIiwibWVyY2hhbnRBY2NvdW50IjoiY29pbmJhc2UtZGV2ZWxvcG1lbnQtbWVyY2hhbnRAZ2V0YnJhaW50cmVlLmNvbSIsInNjb3BlcyI6ImF1dGhvcml6YXRpb25zOmJyYWludHJlZSB1c2VyIiwicmVkaXJlY3RVcmwiOiJodHRwczovL2Fzc2V0cy5icmFpbnRyZWVnYXRld2F5LmNvbS9jb2luYmFzZS9vYXV0aC9yZWRpcmVjdC1sYW5kaW5nLmh0bWwiLCJlbnZpcm9ubWVudCI6Im1vY2sifSwibWVyY2hhbnRJZCI6ImRjcHNweTJicndkanIzcW4iLCJ2ZW5tbyI6Im9mZmxpbmUiLCJhcHBsZVBheSI6eyJzdGF0dXMiOiJtb2NrIiwiY291bnRyeUNvZGUiOiJVUyIsImN1cnJlbmN5Q29kZSI6IlVTRCIsIm1lcmNoYW50SWRlbnRpZmllciI6Im1lcmNoYW50LmNvbS5icmFpbnRyZWVwYXltZW50cy5zYW5kYm94LkJyYWludHJlZS1EZW1vIiwic3VwcG9ydGVkTmV0d29ya3MiOlsidmlzYSIsIm1hc3RlcmNhcmQiLCJhbWV4Il19fQ==" + var mockAPIClient : MockAPIClient! + var observers : [NSObjectProtocol] = [] + var localPaymentRequest : BTLocalPaymentRequest! + var mockLocalPaymentRequestDelegate = MockLocalPaymentRequestDelegate() + + override func setUp() { + super.setUp() + localPaymentRequest = BTLocalPaymentRequest() + localPaymentRequest.amount = "10" + localPaymentRequest.paymentType = "ideal" + mockAPIClient = MockAPIClient(authorization: tempClientToken)! + localPaymentRequest.localPaymentFlowDelegate = mockLocalPaymentRequestDelegate + } + + override func tearDown() { + for observer in observers { NotificationCenter.default.removeObserver(observer) } + super.tearDown() + } + + func testStartPayment_returnsErrorWhenLocalPaymentsNotEnabled() { + let viewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ "paypalEnabled": false ]) + let driver = BTPaymentFlowDriver(apiClient: mockAPIClient) + driver.viewControllerPresentingDelegate = viewControllerPresentingDelegate + let expectation = self.expectation(description: "Start payment fails with error") + + driver.startPaymentFlow(localPaymentRequest) { (result, error) in + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTPaymentFlowDriverErrorDomain) + XCTAssertEqual(error.code, BTPaymentFlowDriverErrorType.disabled.rawValue) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testStartPayment_returnsErrorWhenAmountIsNil() { + let viewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ "paypalEnabled": true ]) + let driver = BTPaymentFlowDriver(apiClient: mockAPIClient) + driver.viewControllerPresentingDelegate = viewControllerPresentingDelegate + let expectation = self.expectation(description: "Start payment fails with error") + + localPaymentRequest.amount = nil + + driver.startPaymentFlow(localPaymentRequest) { (result, error) in + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTPaymentFlowDriverErrorDomain) + XCTAssertEqual(error.code, BTPaymentFlowDriverErrorType.integration.rawValue) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testStartPayment_returnsErrorWhenPaymentTypeIsNil() { + let viewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ "paypalEnabled": true ]) + let driver = BTPaymentFlowDriver(apiClient: mockAPIClient) + driver.viewControllerPresentingDelegate = viewControllerPresentingDelegate + let expectation = self.expectation(description: "Start payment fails with error") + + localPaymentRequest.paymentType = nil + + driver.startPaymentFlow(localPaymentRequest) { (result, error) in + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTPaymentFlowDriverErrorDomain) + XCTAssertEqual(error.code, BTPaymentFlowDriverErrorType.integration.rawValue) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testStartPayment_returnsErrorWhenLocalPaymentDelegateIsNil() { + let viewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ "paypalEnabled": true ]) + let driver = BTPaymentFlowDriver(apiClient: mockAPIClient) + driver.viewControllerPresentingDelegate = viewControllerPresentingDelegate + let expectation = self.expectation(description: "Start payment fails with error") + + localPaymentRequest.localPaymentFlowDelegate = nil + + driver.startPaymentFlow(localPaymentRequest) { (result, error) in + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTPaymentFlowDriverErrorDomain) + XCTAssertEqual(error.code, BTPaymentFlowDriverErrorType.integration.rawValue) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testStartPayment_postsAllCreationParameters() { + let viewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + + viewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = self.expectation(description: "Delegate received requestsPresentationOfViewController") + + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ "paypalEnabled": true ]) + + let driver = BTPaymentFlowDriver(apiClient: mockAPIClient) + driver.viewControllerPresentingDelegate = viewControllerPresentingDelegate + mockAPIClient.cannedResponseBody = BTJSON(value: ["paymentResource": [ + "redirectUrl": "https://www.somebankurl.com", + "paymentToken": "123aaa-123-543-777", + ] ]) + + localPaymentRequest.merchantAccountId = "customer-nl-merchant-account" + localPaymentRequest.paymentType = "ideal" + localPaymentRequest.currencyCode = "EUR" + localPaymentRequest.amount = "1.01" + localPaymentRequest.givenName = "Linh" + localPaymentRequest.surname = "Ngo" + localPaymentRequest.phone = "639847934" + localPaymentRequest.address = BTPostalAddress() + localPaymentRequest.address!.countryCodeAlpha2 = "NL" + localPaymentRequest.address!.region = "CA" + localPaymentRequest.address!.postalCode = "2585 GJ" + localPaymentRequest.address!.streetAddress = "836486 of 22321 Park Lake" + localPaymentRequest.address!.extendedAddress = "#102" + localPaymentRequest.address!.locality = "Den Haag" + localPaymentRequest.email = "lingo-buyer@paypal.com" + localPaymentRequest.isShippingAddressRequired = true + driver.startPaymentFlow(localPaymentRequest) { (result, error) in + + } + + waitForExpectations(timeout: 4, handler: nil) + + XCTAssertEqual(self.mockAPIClient.lastPOSTParameters!["merchant_account_id"] as? String, "customer-nl-merchant-account") + XCTAssertEqual(self.mockAPIClient.lastPOSTParameters!["funding_source"] as? String, "ideal") + XCTAssertEqual(self.mockAPIClient.lastPOSTParameters!["currency_iso_code"] as? String, "EUR") + XCTAssertEqual(self.mockAPIClient.lastPOSTParameters!["amount"] as? String, "1.01") + XCTAssertEqual(self.mockAPIClient.lastPOSTParameters!["first_name"] as? String, "Linh") + XCTAssertEqual(self.mockAPIClient.lastPOSTParameters!["last_name"] as? String, "Ngo") + XCTAssertEqual(self.mockAPIClient.lastPOSTParameters!["phone"] as? String, "639847934") + XCTAssertEqual(self.mockAPIClient.lastPOSTParameters!["payer_email"] as? String, "lingo-buyer@paypal.com") + XCTAssertEqual(self.mockAPIClient.lastPOSTParameters!["line1"] as? String, "836486 of 22321 Park Lake") + XCTAssertEqual(self.mockAPIClient.lastPOSTParameters!["line2"] as? String, "#102") + XCTAssertEqual(self.mockAPIClient.lastPOSTParameters!["city"] as? String, "Den Haag") + XCTAssertEqual(self.mockAPIClient.lastPOSTParameters!["state"] as? String, "CA") + XCTAssertEqual(self.mockAPIClient.lastPOSTParameters!["postal_code"] as? String, "2585 GJ") + XCTAssertEqual(self.mockAPIClient.lastPOSTParameters!["country_code"] as? String, "NL") + + guard let experienceProfile = self.mockAPIClient.lastPOSTParameters!["experience_profile"] as? Dictionary else { + XCTFail() + return + } + XCTAssertFalse(experienceProfile["no_shipping"] as! Bool) + } + + func testStartPayment_displaysSafariViewControllerWhenAvailable() { + let viewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + + viewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = self.expectation(description: "Delegate received requestsPresentationOfViewController") + + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ "paypalEnabled": true ]) + + let driver = BTPaymentFlowDriver(apiClient: mockAPIClient) + driver.viewControllerPresentingDelegate = viewControllerPresentingDelegate + mockAPIClient.cannedResponseBody = BTJSON(value: ["paymentResource": [ + "redirectUrl": "https://www.somebankurl.com", + "paymentToken": "123aaa-123-543-777", + ] ]) + + driver.startPaymentFlow(localPaymentRequest) { (result, error) in + + } + + waitForExpectations(timeout: 4, handler: nil) + } + + func testStartPayment_returnsErrorWhenRedirectUrlIsMissing() { + let viewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ "paypalEnabled": true ]) + + let driver = BTPaymentFlowDriver(apiClient: mockAPIClient) + driver.viewControllerPresentingDelegate = viewControllerPresentingDelegate + mockAPIClient.cannedResponseBody = BTJSON(value: ["paymentResource": [ + "paymentToken": "123aaa-123-543-777", + ] ]) + let expectation = self.expectation(description: "Start payment fails with error") + + driver.startPaymentFlow(localPaymentRequest) { (result, error) in + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTPaymentFlowDriverErrorDomain) + XCTAssertEqual(error.code, BTPaymentFlowDriverErrorType.appSwitchFailed.rawValue) + expectation.fulfill() + } + + waitForExpectations(timeout: 4, handler: nil) + } + + func testStartPayment_returnsErrorWhenPaymentTokenIsMissing() { + let viewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ "paypalEnabled": true ]) + + let driver = BTPaymentFlowDriver(apiClient: mockAPIClient) + driver.viewControllerPresentingDelegate = viewControllerPresentingDelegate + mockAPIClient.cannedResponseBody = BTJSON(value: ["paymentResource": [ + "redirectUrl": "https://www.somebankurl.com", + ] ]) + let expectation = self.expectation(description: "Start payment fails with error") + + driver.startPaymentFlow(localPaymentRequest) { (result, error) in + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTPaymentFlowDriverErrorDomain) + XCTAssertEqual(error.code, BTPaymentFlowDriverErrorType.appSwitchFailed.rawValue) + expectation.fulfill() + } + + waitForExpectations(timeout: 4, handler: nil) + } + + func testStartPayment_returnsPaymentId_inDelegateCallback() { + mockLocalPaymentRequestDelegate.idExpectation = self.expectation(description: "Received payment ID") + + let viewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + + viewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = self.expectation(description: "Delegate received requestsPresentationOfViewController") + + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ "paypalEnabled": true ]) + + let driver = BTPaymentFlowDriver(apiClient: mockAPIClient) + driver.viewControllerPresentingDelegate = viewControllerPresentingDelegate + mockAPIClient.cannedResponseBody = BTJSON(value: ["paymentResource": [ + "redirectUrl": "https://www.somebankurl.com", + "paymentToken": "123aaa-123-543-abv", + ] ]) + + driver.startPaymentFlow(localPaymentRequest) { (result, error) in + + } + + waitForExpectations(timeout: 4, handler: nil) + + XCTAssertEqual(mockLocalPaymentRequestDelegate.paymentId, "123aaa-123-543-abv") + } + + func testStartPayment_success_sendsAnalyticsEvents() { + let viewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + + viewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = self.expectation(description: "Delegate received requestsPresentationOfViewController") + + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ "paypalEnabled": true ]) + + let driver = BTPaymentFlowDriver(apiClient: mockAPIClient) + driver.viewControllerPresentingDelegate = viewControllerPresentingDelegate + mockAPIClient.cannedResponseBody = BTJSON(value: ["paymentResource": [ + "redirectUrl": "https://www.somebankurl.com", + "paymentToken": "123aaa-123-543-777", + ] ]) + + driver.startPaymentFlow(localPaymentRequest) { (result, error) in + + } + + waitForExpectations(timeout: 4, handler: nil) + XCTAssertTrue(mockAPIClient.postedAnalyticsEvents.contains("ios.ideal.local-payment.start-payment.selected")) + XCTAssertTrue(mockAPIClient.postedAnalyticsEvents.contains("ios.ideal.local-payment.webswitch.initiate.succeeded")) + } + + func testStartPayment_failure_sendsAnalyticsEvents() { + let viewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ "paypalEnabled": true ]) + + let driver = BTPaymentFlowDriver(apiClient: mockAPIClient) + driver.viewControllerPresentingDelegate = viewControllerPresentingDelegate + mockAPIClient.cannedResponseError = NSError(domain:"BTError", code: 500, userInfo: nil) + + let expectation = self.expectation(description: "Start payment expectation") + driver.startPaymentFlow(localPaymentRequest) { (result, error) in + expectation.fulfill() + } + + waitForExpectations(timeout: 4, handler: nil) + XCTAssertTrue(mockAPIClient.postedAnalyticsEvents.contains("ios.ideal.local-payment.start-payment.selected")) + XCTAssertTrue(mockAPIClient.postedAnalyticsEvents.contains("ios.ideal.local-payment.start-payment.failed")) + } + + func testStartPayment_makesDelegateCallbacks_forContextSwitchEvents() { + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ "paypalEnabled": true ]) + + let viewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + viewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = self.expectation(description: "Delegate received requestsPresentationOfViewController") + + let driver = BTPaymentFlowDriver(apiClient: mockAPIClient) + driver.viewControllerPresentingDelegate = viewControllerPresentingDelegate + let appSwitchDelegate = MockAppSwitchDelegate() + driver.appSwitchDelegate = appSwitchDelegate + + mockAPIClient.cannedResponseBody = BTJSON(value: ["paymentResource": [ + "redirectUrl": "https://www.somebankurl.com", + "paymentToken": "123aaa-123-543-777", + ] ]) + + var paymentFinishedExpectation: XCTestExpectation? = nil + driver.startPaymentFlow(localPaymentRequest) { (result, error) in + paymentFinishedExpectation!.fulfill() + } + + paymentFinishedExpectation = self.expectation(description: "Payment finished expectation") + BTPaymentFlowDriver.handleAppSwitchReturn(URL(string: "http://unused.example.com")!) + + waitForExpectations(timeout: 2, handler: nil) + + XCTAssertTrue(appSwitchDelegate.appContextWillSwitchCalled) + XCTAssertTrue(appSwitchDelegate.appContextDidReturnCalled) + } + + func testStartPayment_successfulResult_callsCompletionBlock() { + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ "paypalEnabled": true ]) + + let viewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + viewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = self.expectation(description: "Delegate received requestsPresentationOfViewController") + + let driver = BTPaymentFlowDriver(apiClient: mockAPIClient) + driver.viewControllerPresentingDelegate = viewControllerPresentingDelegate + let appSwitchDelegate = MockAppSwitchDelegate() + driver.appSwitchDelegate = appSwitchDelegate + + mockAPIClient.cannedResponseBody = BTJSON(value: ["paymentResource": [ + "redirectUrl": "https://www.somebankurl.com", + "paymentToken": "123aaa-123-543-777", + ] ]) + + var paymentFinishedExpectation: XCTestExpectation? = nil + driver.startPaymentFlow(localPaymentRequest) { (result, error) in + XCTAssertNil(error) + XCTAssertNotNil(result) + guard let localPaymentResult = result as! BTLocalPaymentResult? else {return} + + XCTAssertEqual(localPaymentResult.clientMetadataId, "89d377ae78244447a3f78ada7d01b270") + XCTAssertEqual(localPaymentResult.type, "PayPalAccount") + XCTAssertEqual(localPaymentResult.payerId, "PCKXQCZ6J3YXU") + XCTAssertEqual(localPaymentResult.nonce, "f689056d-aee1-421e-9d10-f2c9b34d4d6f") + paymentFinishedExpectation!.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + + let responseBody = [ + "paypalAccounts": [[ + "consumed": false, + "description": "PayPal", + "details": [ + "correlationId": "89d377ae78244447a3f78ada7d01b270", + "payerInfo": [ + "countryCode": "NL", + "email": "lingo-buyer@paypal.com", + "firstName": "Linh", + "lastName": "Ngo", + "payerId": "PCKXQCZ6J3YXU", + "shippingAddress": [ + "city": "Den Haag", + "countryCode": "NL", + "line1": "836486 of 22321 Park Lake", + "postalCode": "2585 GJ", + "recipientName": "Linh Ngo", + "state": "", + ], + ], + ], + "nonce": "f689056d-aee1-421e-9d10-f2c9b34d4d6f", + "type": "PayPalAccount", + ]], + ] as [String : Any] + + mockAPIClient.cannedResponseBody = BTJSON(value: responseBody) + + paymentFinishedExpectation = self.expectation(description: "Payment finished expectation") + BTPaymentFlowDriver.handleAppSwitchReturn(URL(string: "com.braintreepayments.demo.payments://x-callback-url/braintree/local-payment/success?PayerID=PCKXQCZ6J3YXU&paymentId=PAY-79C90584AX7152104LNY4OCY&token=EC-0A351828G20802249")!) + + waitForExpectations(timeout: 2, handler: nil) + } + + func testStartPayment_cancelResult_callsCompletionBlock() { + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ "paypalEnabled": true ]) + + let viewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + viewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = self.expectation(description: "Delegate received requestsPresentationOfViewController") + + let driver = BTPaymentFlowDriver(apiClient: mockAPIClient) + driver.viewControllerPresentingDelegate = viewControllerPresentingDelegate + let appSwitchDelegate = MockAppSwitchDelegate() + driver.appSwitchDelegate = appSwitchDelegate + + mockAPIClient.cannedResponseBody = BTJSON(value: ["paymentResource": [ + "redirectUrl": "https://www.somebankurl.com", + "paymentToken": "123aaa-123-543-777", + ] ]) + + var paymentFinishedExpectation: XCTestExpectation? = nil + driver.startPaymentFlow(localPaymentRequest) { (result, error) in + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTPaymentFlowDriverErrorDomain) + XCTAssertEqual(error.code, BTPaymentFlowDriverErrorType.canceled.rawValue) + paymentFinishedExpectation!.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + + paymentFinishedExpectation = self.expectation(description: "Payment finished expectation") + BTPaymentFlowDriver.handleAppSwitchReturn(URL(string: "com.braintreepayments.demo.payments://x-callback-url/braintree/local-payment/cancel?paymentId=PAY-79C90584AX7152104LNY4OCY")!) + + waitForExpectations(timeout: 2, handler: nil) + } + + func testStartPayment_callsCompletionBlock_withError_tokenizationFailure() { + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ "paypalEnabled": true ]) + + let viewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + viewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = self.expectation(description: "Delegate received requestsPresentationOfViewController") + + let driver = BTPaymentFlowDriver(apiClient: mockAPIClient) + driver.viewControllerPresentingDelegate = viewControllerPresentingDelegate + let appSwitchDelegate = MockAppSwitchDelegate() + driver.appSwitchDelegate = appSwitchDelegate + + mockAPIClient.cannedResponseBody = BTJSON(value: ["paymentResource": [ + "redirectUrl": "https://www.somebankurl.com", + "paymentToken": "123aaa-123-543-777", + ] ]) + + var paymentFinishedExpectation: XCTestExpectation? = nil + driver.startPaymentFlow(localPaymentRequest) { (result, error) in + XCTAssertNotNil(error) + XCTAssertNil(result) + paymentFinishedExpectation!.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + + mockAPIClient.cannedResponseError = NSError(domain:"BTError", code: 500, userInfo: nil) + + paymentFinishedExpectation = self.expectation(description: "Payment finished expectation") + BTPaymentFlowDriver.handleAppSwitchReturn(URL(string: "com.braintreepayments.demo.payments://x-callback-url/braintree/local-payment/success?PayerID=PCKXQCZ6J3YXU&paymentId=PAY-79C90584AX7152104LNY4OCY&token=EC-0A351828G20802249")!) + + waitForExpectations(timeout: 2, handler: nil) + } +} + diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BraintreePaymentFlow_UnitTests/BTThreeDSecurePostalAddress_Tests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BraintreePaymentFlow_UnitTests/BTThreeDSecurePostalAddress_Tests.swift new file mode 100644 index 0000000..3a73119 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BraintreePaymentFlow_UnitTests/BTThreeDSecurePostalAddress_Tests.swift @@ -0,0 +1,89 @@ +import XCTest + +class BTThreeDSecurePostalAddress_Tests: XCTestCase { + + func testCopiesAllProperties() { + let originalAddress = BTThreeDSecurePostalAddress() + originalAddress.firstName = "Joe" + originalAddress.lastName = "Guy" + originalAddress.phoneNumber = "12345678" + originalAddress.streetAddress = "555 Smith St." + originalAddress.extendedAddress = "#5" + originalAddress.locality = "Oakland" + originalAddress.region = "CA" + originalAddress.countryCodeAlpha2 = "US" + originalAddress.postalCode = "54321" + + let addressCopy = originalAddress.copy() as! BTThreeDSecurePostalAddress + XCTAssertEqual(addressCopy.firstName, "Joe") + XCTAssertEqual(addressCopy.lastName, "Guy") + XCTAssertEqual(addressCopy.phoneNumber, "12345678") + XCTAssertEqual(addressCopy.streetAddress, "555 Smith St.") + XCTAssertEqual(addressCopy.extendedAddress, "#5") + XCTAssertEqual(addressCopy.locality, "Oakland") + XCTAssertEqual(addressCopy.region, "CA") + XCTAssertEqual(addressCopy.countryCodeAlpha2, "US") + XCTAssertEqual(addressCopy.postalCode, "54321") + } + + func testAsParameters_parameterizesAllProperties() { + let address = BTThreeDSecurePostalAddress() + address.firstName = "Joe" + address.lastName = "Guy" + address.phoneNumber = "12345678" + address.streetAddress = "555 Smith St." + address.extendedAddress = "#5" + address.locality = "Oakland" + address.region = "CA" + address.countryCodeAlpha2 = "US" + address.postalCode = "54321" + + let parameters = address.asParameters() + XCTAssertEqual(parameters["firstName"] as! String, "Joe") + XCTAssertEqual(parameters["lastName"] as! String, "Guy") + XCTAssertEqual(parameters["phoneNumber"] as! String, "12345678") + XCTAssertEqual(parameters["line1"] as! String, "555 Smith St.") + XCTAssertEqual(parameters["line2"] as! String, "#5") + XCTAssertEqual(parameters["city"] as! String, "Oakland") + XCTAssertEqual(parameters["state"] as! String, "CA") + XCTAssertEqual(parameters["countryCode"] as! String, "US") + XCTAssertEqual(parameters["postalCode"] as! String, "54321") + } + + func testAsParameters_parameterizesWithNilProperties() { + let address = BTThreeDSecurePostalAddress() + address.firstName = "Joe" + address.lastName = "Guy" + address.streetAddress = "555 Smith St." + address.locality = "Oakland" + address.region = "CA" + address.countryCodeAlpha2 = "US" + address.postalCode = "54321" + + let parameters = address.asParameters() + XCTAssertEqual(parameters["firstName"] as! String, "Joe") + XCTAssertEqual(parameters["lastName"] as! String, "Guy") + XCTAssertNil(parameters["phoneNumber"]) + XCTAssertEqual(parameters["line1"] as! String, "555 Smith St.") + XCTAssertNil(parameters["line2"]) + XCTAssertEqual(parameters["city"] as! String, "Oakland") + XCTAssertEqual(parameters["state"] as! String, "CA") + XCTAssertEqual(parameters["countryCode"] as! String, "US") + XCTAssertEqual(parameters["postalCode"] as! String, "54321") + } + + func testAsParameters_parameterizesWithOnlyNilProperties() { + let address = BTThreeDSecurePostalAddress() + + let parameters = address.asParameters() + XCTAssertNil(parameters["firstName"]) + XCTAssertNil(parameters["lastName"]) + XCTAssertNil(parameters["phoneNumber"]) + XCTAssertNil(parameters["line1"]) + XCTAssertNil(parameters["line2"]) + XCTAssertNil(parameters["city"]) + XCTAssertNil(parameters["state"]) + XCTAssertNil(parameters["countryCode"]) + XCTAssertNil(parameters["postalCode"]) + } +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BraintreePaymentFlow_UnitTests/BTThreeDSecure_Tests.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BraintreePaymentFlow_UnitTests/BTThreeDSecure_Tests.swift new file mode 100644 index 0000000..2a0c53b --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/BraintreePaymentFlow_UnitTests/BTThreeDSecure_Tests.swift @@ -0,0 +1,603 @@ +import UIKit +import XCTest + +class BTThreeDSecure_UnitTests: XCTestCase { + let tempClientToken = "eyJ2ZXJzaW9uIjoyLCJhdXRob3JpemF0aW9uRmluZ2VycHJpbnQiOiJmNTI0M2RkZGRmNzlkNGFiYmI5YjYwMDUzN2ZkZjQ0ZDViNDg0ODVkOWU0ZjJmYmI3YWM5ZTU2MGE3ZDVhZmM5fGNyZWF0ZWRfYXQ9MjAxNy0wNC0xM1QyMTozOTo0My40MjM4NzE4MTUrMDAwMFx1MDAyNmN1c3RvbWVyX2lkPTJENzJCNjQ4LUI0RkMtNDQ1My1BOURDLTI2QTYyMEVGNjQwNFx1MDAyNm1lcmNoYW50X2FjY291bnRfaWQ9aWRlYWxfZXVyXHUwMDI2bWVyY2hhbnRfaWQ9ZGNwc3B5MmJyd2RqcjNxblx1MDAyNnB1YmxpY19rZXk9OXd3cnpxazN2cjN0NG5jOCIsImNvbmZpZ1VybCI6Imh0dHBzOi8vYXBpLnNhbmRib3guYnJhaW50cmVlZ2F0ZXdheS5jb206NDQzL21lcmNoYW50cy9kY3BzcHkyYnJ3ZGpyM3FuL2NsaWVudF9hcGkvdjEvY29uZmlndXJhdGlvbiIsImNoYWxsZW5nZXMiOlsiY3Z2IiwicG9zdGFsX2NvZGUiXSwiZW52aXJvbm1lbnQiOiJzYW5kYm94IiwiY2xpZW50QXBpVXJsIjoiaHR0cHM6Ly9hcGkuc2FuZGJveC5icmFpbnRyZWVnYXRld2F5LmNvbTo0NDMvbWVyY2hhbnRzL2RjcHNweTJicndkanIzcW4vY2xpZW50X2FwaSIsImFzc2V0c1VybCI6Imh0dHBzOi8vYXNzZXRzLmJyYWludHJlZWdhdGV3YXkuY29tIiwiYXV0aFVybCI6Imh0dHBzOi8vYXV0aC52ZW5tby5zYW5kYm94LmJyYWludHJlZWdhdGV3YXkuY29tIiwiYW5hbHl0aWNzIjp7InVybCI6Imh0dHBzOi8vY2xpZW50LWFuYWx5dGljcy5zYW5kYm94LmJyYWludHJlZWdhdGV3YXkuY29tL2RjcHNweTJicndkanIzcW4ifSwidGhyZWVEU2VjdXJlRW5hYmxlZCI6ZmFsc2UsInBheXBhbEVuYWJsZWQiOmZhbHNlLCJjb2luYmFzZUVuYWJsZWQiOnRydWUsImNvaW5iYXNlIjp7ImNsaWVudElkIjoiN2U5NWUwZmRkYTE0ODQ2NjU4YjM4Zjc3MmJhMmQzMGNkNzhhOWYyMTQ0YzUzOTA4NmU1NzkwYmYzNzdmYmVlZCIsIm1lcmNoYW50QWNjb3VudCI6ImNvaW5iYXNlLXNhbmRib3gtc2hhcmVkLW1lcmNoYW50QGdldGJyYWludHJlZS5jb20iLCJzY29wZXMiOiJhdXRob3JpemF0aW9uczpicmFpbnRyZWUgdXNlciIsInJlZGlyZWN0VXJsIjoiaHR0cHM6Ly9hc3NldHMuYnJhaW50cmVlZ2F0ZXdheS5jb20vY29pbmJhc2Uvb2F1dGgvcmVkaXJlY3QtbGFuZGluZy5odG1sIiwiZW52aXJvbm1lbnQiOiJwcm9kdWN0aW9uIn0sImJyYWludHJlZV9hcGkiOnsiYWNjZXNzX3Rva2VuIjoic2FuZGJveF9mN2RyNWNfZHE2c3MyX2prczd4dF80aHNwc2hfcWI3IiwidXJsIjoiaHR0cHM6Ly9wYXltZW50cy5zYW5kYm94LmJyYWludHJlZS1hcGkuY29tIn0sIm1lcmNoYW50SWQiOiJkY3BzcHkyYnJ3ZGpyM3FuIiwidmVubW8iOiJvZmZsaW5lIiwiYXBwbGVQYXkiOnsic3RhdHVzIjoibW9jayIsImNvdW50cnlDb2RlIjoiVVMiLCJjdXJyZW5jeUNvZGUiOiJFVVIiLCJtZXJjaGFudElkZW50aWZpZXIiOiJtZXJjaGFudC5jb20uYnJhaW50cmVlcGF5bWVudHMuc2FuZGJveC5CcmFpbnRyZWUtRGVtbyIsInN1cHBvcnRlZE5ldHdvcmtzIjpbInZpc2EiLCJtYXN0ZXJjYXJkIiwiYW1leCIsImRpc2NvdmVyIl19LCJtZXJjaGFudEFjY291bnRJZCI6ImlkZWFsX2V1ciJ9" + var mockAPIClient : MockAPIClient! + var observers : [NSObjectProtocol] = [] + var threeDSecureRequest : BTThreeDSecureRequest! + + override func setUp() { + super.setUp() + + threeDSecureRequest = BTThreeDSecureRequest() + threeDSecureRequest.amount = 10.0 + threeDSecureRequest.nonce = "fake-card-nonce" + mockAPIClient = MockAPIClient(authorization: tempClientToken)! + } + + override func tearDown() { + for observer in observers { NotificationCenter.default.removeObserver(observer) } + super.tearDown() + } + + func testLookupThreeDSecure_whenRemoteConfigurationFetchFails_callsBackWithConfigurationError() { + mockAPIClient.cannedConfigurationResponseError = NSError(domain: "", code: 0, userInfo: nil) + let driver = BTPaymentFlowDriver(apiClient: mockAPIClient) + + let expectation = self.expectation(description: "lookup fails with errors") + + driver.performThreeDSecureLookup(threeDSecureRequest) { (lookup, error) in + XCTAssertEqual(error! as NSError, self.mockAPIClient.cannedConfigurationResponseError!) + expectation.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + } + + func testLookupThreeDSecure_sendsAllParameters() { + let responseBody = [ + "paymentMethod": [ + "consumed": false, + "description": "ending in 02", + "details": [ + "cardType": "Visa", + "lastTwo": "02", + ], + "nonce": "f689056d-aee1-421e-9d10-f2c9b34d4d6f", + "threeDSecureInfo": [ + "enrolled": "Y", + "liabilityShiftPossible": true, + "liabilityShifted": true, + "status": "authenticate_successful", + ], + "type": "CreditCard", + ], + "success": true, + "threeDSecureInfo": [ + "liabilityShiftPossible": true, + "liabilityShifted": true, + ] + ] as [String : Any] + mockAPIClient.cannedResponseBody = BTJSON(value: responseBody) + + let driver = BTPaymentFlowDriver(apiClient: mockAPIClient) + + let expectation = self.expectation(description: "willCallCompletion") + + threeDSecureRequest.amount = 9.97 + threeDSecureRequest.nonce = "fake-card-nonce" + threeDSecureRequest.mobilePhoneNumber = "5151234321" + threeDSecureRequest.email = "tester@example.com" + threeDSecureRequest.shippingMethod = "03" + + let billingAddress = BTThreeDSecurePostalAddress() + billingAddress.firstName = "Joe" + billingAddress.lastName = "Guy" + billingAddress.phoneNumber = "12345678" + billingAddress.streetAddress = "555 Smith St." + billingAddress.extendedAddress = "#5" + billingAddress.locality = "Oakland" + billingAddress.region = "CA" + billingAddress.countryCodeAlpha2 = "US" + billingAddress.postalCode = "54321" + threeDSecureRequest.billingAddress = billingAddress + + driver.performThreeDSecureLookup(threeDSecureRequest) { (lookup, error) in + XCTAssertEqual(self.mockAPIClient.lastPOSTParameters!["amount"] as? NSNumber, 9.97) + let customerParams = self.mockAPIClient.lastPOSTParameters!["customer"] as! [String : Any] + XCTAssertEqual(customerParams["mobilePhoneNumber"] as? String, "5151234321") + XCTAssertEqual(customerParams["email"] as? String, "tester@example.com") + XCTAssertEqual(customerParams["shippingMethod"] as? String, "03") + let billingAddressParams = customerParams["billingAddress"] as! [String : Any] + XCTAssertEqual(billingAddressParams["firstName"] as? String, "Joe") + XCTAssertEqual(billingAddressParams["lastName"] as? String, "Guy") + XCTAssertEqual(billingAddressParams["phoneNumber"] as? String, "12345678") + XCTAssertEqual(billingAddressParams["line1"] as? String, "555 Smith St.") + XCTAssertEqual(billingAddressParams["line2"] as? String, "#5") + XCTAssertEqual(billingAddressParams["city"] as? String, "Oakland") + XCTAssertEqual(billingAddressParams["state"] as? String, "CA") + XCTAssertEqual(billingAddressParams["countryCode"] as? String, "US") + XCTAssertEqual(billingAddressParams["postalCode"] as? String, "54321") + + expectation.fulfill() + } + + waitForExpectations(timeout: 3, handler: nil) + } + + func testLookupThreeDSecure_withCardThatDoesntRequireAuthentication_callsCompletionWithACard() { + let responseBody = [ + "paymentMethod": [ + "consumed": false, + "description": "ending in 02", + "details": [ + "cardType": "Visa", + "lastTwo": "02", + ], + "nonce": "f689056d-aee1-421e-9d10-f2c9b34d4d6f", + "threeDSecureInfo": [ + "enrolled": "Y", + "liabilityShiftPossible": true, + "liabilityShifted": true, + "status": "authenticate_successful", + ], + "type": "CreditCard", + ], + "success": true, + "threeDSecureInfo": [ + "liabilityShiftPossible": true, + "liabilityShifted": true, + ] + ] as [String : Any] + mockAPIClient.cannedResponseBody = BTJSON(value: responseBody) + + let driver = BTPaymentFlowDriver(apiClient: mockAPIClient) + + let expectation = self.expectation(description: "willCallCompletion") + + driver.performThreeDSecureLookup(threeDSecureRequest) { (lookup, error) in + XCTAssertFalse(lookup!.requiresUserAuthentication()) + let tokenizedCard = lookup?.threeDSecureResult.tokenizedCard + XCTAssert(isANonce(tokenizedCard!.nonce)) + XCTAssertEqual(tokenizedCard!.nonce, "f689056d-aee1-421e-9d10-f2c9b34d4d6f") + XCTAssertNil(error) + XCTAssertTrue(lookup!.threeDSecureResult.liabilityShifted) + XCTAssertTrue(lookup!.threeDSecureResult.liabilityShiftPossible) + XCTAssertTrue(lookup!.threeDSecureResult.tokenizedCard.threeDSecureInfo.liabilityShifted) + XCTAssertTrue(lookup!.threeDSecureResult.tokenizedCard.threeDSecureInfo.liabilityShiftPossible) + XCTAssertTrue(lookup!.threeDSecureResult.tokenizedCard.threeDSecureInfo.wasVerified) + expectation.fulfill() + } + + waitForExpectations(timeout: 3, handler: nil) + } + + func testLookupThreeDSecure_withCardThatRequiresAuthentication_lookupResultRequiresAuthentication() { + let responseBody = [ + "paymentMethod": [ + "consumed": false, + "description": "ending in 02", + "details": [ + "cardType": "Visa", + "lastTwo": "02", + ], + "nonce": "f689056d-aee1-421e-9d10-f2c9b34d4d6f", + "threeDSecureInfo": [ + "enrolled": "Y", + "liabilityShiftPossible": true, + "liabilityShifted": true, + "status": "authenticate_successful", + ], + "type": "CreditCard", + ], + "success": true, + "threeDSecureInfo": [ + "liabilityShiftPossible": true, + "liabilityShifted": true, + ], + "lookup": [ + "acsUrl": "http://example.com", + "pareq": "", + "md": "", + "termUrl": "http://example.com" + ] + ] as [String : Any] + mockAPIClient.cannedResponseBody = BTJSON(value: responseBody) + + let driver = BTPaymentFlowDriver(apiClient: mockAPIClient) + + let expectation = self.expectation(description: "willCallCompletion") + + driver.performThreeDSecureLookup(threeDSecureRequest) { (lookup, error) in + XCTAssertTrue(lookup!.requiresUserAuthentication()) + expectation.fulfill() + } + + waitForExpectations(timeout: 3, handler: nil) + } + + func testVerification_whenCardIsNotEnrolled_returnsCardWithNewNonceAndCorrectLiabilityShiftInformation() { + let responseBody = [ + "paymentMethod": [ + "consumed": false, + "description": "ending in 02", + "details": [ + "cardType": "Visa", + "lastTwo": "02", + ], + "nonce": "f689056d-aee1-421e-9d10-f2c9b34d4d6f", + "threeDSecureInfo": [ + "enrolled": "N", + "liabilityShiftPossible": false, + "liabilityShifted": false, + "status": "authenticate_successful_issuer_not_participating", + ], + "type": "CreditCard", + ], + "success": true, + "threeDSecureInfo": [ + "liabilityShiftPossible": false, + "liabilityShifted": false, + ] + ] as [String : Any] + + mockAPIClient.cannedResponseBody = BTJSON(value: responseBody) + + let driver = BTPaymentFlowDriver(apiClient: mockAPIClient) + + let expectation = self.expectation(description: "willCallCompletion") + + driver.performThreeDSecureLookup(threeDSecureRequest) { (lookup, error) in + guard let tokenizedCard = lookup?.threeDSecureResult.tokenizedCard else { + XCTFail() + return + } + XCTAssertTrue(isANonce(tokenizedCard.nonce)) + XCTAssertNotEqual(tokenizedCard.nonce, self.threeDSecureRequest.nonce); + XCTAssertNil(error) + XCTAssertFalse(lookup!.threeDSecureResult.liabilityShifted) + XCTAssertFalse(lookup!.threeDSecureResult.liabilityShiftPossible) + XCTAssertFalse(lookup!.threeDSecureResult.tokenizedCard.threeDSecureInfo.liabilityShifted) + XCTAssertFalse(lookup!.threeDSecureResult.tokenizedCard.threeDSecureInfo.liabilityShiftPossible) + XCTAssertTrue(lookup!.threeDSecureResult.tokenizedCard.threeDSecureInfo.wasVerified) + expectation.fulfill() + } + + waitForExpectations(timeout: 3, handler: nil) + } + + func testStartPayment_displaysSafariViewControllerWhenAvailable_andRequiresAuthentication() { + let viewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + + viewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = self.expectation(description: "Delegate received requestsPresentationOfViewController") + + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "assetsUrl": "http://assets.example.com" + ]) + let driver = BTPaymentFlowDriver(apiClient: mockAPIClient) + driver.viewControllerPresentingDelegate = viewControllerPresentingDelegate + let responseBody = [ + "paymentMethod": [ + "consumed": false, + "description": "ending in 02", + "details": [ + "cardType": "Visa", + "lastTwo": "02", + ], + "nonce": "f689056d-aee1-421e-9d10-f2c9b34d4d6f", + "threeDSecureInfo": [ + "enrolled": "Y", + "liabilityShiftPossible": true, + "liabilityShifted": true, + "status": "authenticate_successful", + ], + "type": "CreditCard", + ], + "success": true, + "threeDSecureInfo": [ + "liabilityShiftPossible": true, + "liabilityShifted": true, + ], + "lookup": [ + "acsUrl": "http://example.com", + "pareq": "", + "md": "", + "termUrl": "http://example.com" + ] + ] as [String : Any] + mockAPIClient.cannedResponseBody = BTJSON(value: responseBody) + + driver.startPaymentFlow(threeDSecureRequest) { (result, error) in + + } + + waitForExpectations(timeout: 4, handler: nil) + } + + func testStartPayment_doesNotDisplaySafariViewControllerWhenAuthenticationNotRequired() { + let viewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + + let expectation = self.expectation(description: "willCallCompletion") + + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "assetsUrl": "http://assets.example.com" + ]) + let driver = BTPaymentFlowDriver(apiClient: mockAPIClient) + driver.viewControllerPresentingDelegate = viewControllerPresentingDelegate + let responseBody = [ + "paymentMethod": [ + "consumed": false, + "description": "ending in 02", + "details": [ + "cardType": "Visa", + "lastTwo": "02", + ], + "nonce": "f689056d-aee1-421e-9d10-f2c9b34d4d6f", + "threeDSecureInfo": [ + "enrolled": "N", + "liabilityShiftPossible": false, + "liabilityShifted": false, + "status": "authenticate_successful_issuer_not_participating", + ], + "type": "CreditCard", + ], + "success": true, + "threeDSecureInfo": [ + "liabilityShiftPossible": false, + "liabilityShifted": false, + ] + ] as [String : Any] + mockAPIClient.cannedResponseBody = BTJSON(value: responseBody) + + driver.startPaymentFlow(threeDSecureRequest) { (result, error) in + guard let result = result as? BTThreeDSecureResult else { + XCTFail() + return + } + guard let tokenizedCard = result.tokenizedCard else { + XCTFail() + return + } + XCTAssertTrue(isANonce(tokenizedCard.nonce)) + XCTAssertNotEqual(tokenizedCard.nonce, self.threeDSecureRequest.nonce); + XCTAssertNil(error) + XCTAssertFalse(result.liabilityShifted) + XCTAssertFalse(result.liabilityShiftPossible) + XCTAssertFalse(result.tokenizedCard.threeDSecureInfo.liabilityShifted) + XCTAssertFalse(result.tokenizedCard.threeDSecureInfo.liabilityShiftPossible) + XCTAssertTrue(result.tokenizedCard.threeDSecureInfo.wasVerified) + expectation.fulfill() + } + + waitForExpectations(timeout: 4, handler: nil) + } + + func testStartPayment_success_sendsAnalyticsEvents() { + let viewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + + viewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = self.expectation(description: "Delegate received requestsPresentationOfViewController") + + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "assetsUrl": "http://assets.example.com", + ]) + let driver = BTPaymentFlowDriver(apiClient: mockAPIClient) + driver.viewControllerPresentingDelegate = viewControllerPresentingDelegate + let responseBody = [ + "paymentMethod": [ + "consumed": false, + "description": "ending in 02", + "details": [ + "cardType": "Visa", + "lastTwo": "02", + ], + "nonce": "f689056d-aee1-421e-9d10-f2c9b34d4d6f", + "threeDSecureInfo": [ + "enrolled": "Y", + "liabilityShiftPossible": true, + "liabilityShifted": true, + "status": "authenticate_successful", + ], + "type": "CreditCard", + ], + "success": true, + "threeDSecureInfo": [ + "liabilityShiftPossible": true, + "liabilityShifted": true, + ], + "lookup": [ + "acsUrl": "http://example.com", + "pareq": "", + "md": "", + "termUrl": "http://example.com" + ] + ] as [String : Any] + mockAPIClient.cannedResponseBody = BTJSON(value: responseBody) + + driver.startPaymentFlow(threeDSecureRequest) { (result, error) in + + } + + waitForExpectations(timeout: 4, handler: nil) + XCTAssertTrue(mockAPIClient.postedAnalyticsEvents.contains("ios.three-d-secure.start-payment.selected")) + XCTAssertTrue(mockAPIClient.postedAnalyticsEvents.contains("ios.three-d-secure.webswitch.initiate.succeeded")) + } + + func testStartPayment_failure_sendsAnalyticsEvents() { + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "assetsUrl": "http://assets.example.com", + ]) + let driver = BTPaymentFlowDriver(apiClient: mockAPIClient) + mockAPIClient.cannedResponseError = NSError(domain:"BTError", code: 500, userInfo: nil) + + let expectation = self.expectation(description: "Start payment expectation") + driver.startPaymentFlow(threeDSecureRequest) { (result, error) in + guard (error as NSError?) != nil else {return} + expectation.fulfill() + } + + waitForExpectations(timeout: 4, handler: nil) + XCTAssertTrue(mockAPIClient.postedAnalyticsEvents.contains("ios.three-d-secure.start-payment.selected")) + XCTAssertTrue(mockAPIClient.postedAnalyticsEvents.contains("ios.three-d-secure.start-payment.failed")) + } + + func testStartPayment_successfulResult_callsCompletionBlock() { + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "assetsUrl": "http://assets.example.com", + ]) + + let viewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + viewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = self.expectation(description: "Delegate received requestsPresentationOfViewController") + + let driver = BTPaymentFlowDriver(apiClient: mockAPIClient) + driver.viewControllerPresentingDelegate = viewControllerPresentingDelegate + + let responseBody = [ + "paymentMethod": [ + "consumed": false, + "description": "ending in 02", + "details": [ + "cardType": "Visa", + "lastTwo": "02", + ], + "nonce": "f689056d-aee1-421e-9d10-f2c9b34d4d6f", + "threeDSecureInfo": [ + "enrolled": "Y", + "liabilityShiftPossible": true, + "liabilityShifted": true, + "status": "authenticate_successful", + ], + "type": "CreditCard", + ], + "success": true, + "threeDSecureInfo": [ + "liabilityShiftPossible": true, + "liabilityShifted": true, + ], + "lookup": [ + "acsUrl": "http://example.com", + "pareq": "", + "md": "", + "termUrl": "http://example.com" + ] + ] as [String : Any] + + mockAPIClient.cannedResponseBody = BTJSON(value: responseBody) + + var paymentFinishedExpectation: XCTestExpectation? = nil + driver.startPaymentFlow(threeDSecureRequest) { (result, error) in + XCTAssertNil(error) + XCTAssertNotNil(result) + paymentFinishedExpectation!.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + + paymentFinishedExpectation = self.expectation(description: "Start payment expectation") + BTPaymentFlowDriver.handleAppSwitchReturn(URL(string: "com.braintreepayments.demo.payments://x-callback-url/braintree/threedsecure?auth_response=%7B%22paymentMethod%22:%7B%22type%22:%22CreditCard%22,%22nonce%22:%220d3e1cc8-50a4-0437-720b-c03c722f0d0a%22,%22description%22:%22ending+in+02%22,%22consumed%22:false,%22threeDSecureInfo%22:%7B%22liabilityShifted%22:true,%22liabilityShiftPossible%22:true,%22status%22:%22authenticate_successful%22,%22enrolled%22:%22Y%22%7D,%22details%22:%7B%22lastTwo%22:%2202%22,%22lastFour%22:%220002%22,%22cardType%22:%22Visa%22%7D,%22bin_data%22:%7B%22prepaid%22:%22Unknown%22,%22healthcare%22:%22Unknown%22,%22debit%22:%22Unknown%22,%22durbin_regulated%22:%22Unknown%22,%22commercial%22:%22Unknown%22,%22payroll%22:%22Unknown%22,%22issuing_bank%22:%22Unknown%22,%22country_of_issuance%22:%22Unknown%22,%22product_id%22:%22Unknown%22%7D%7D,%22threeDSecureInfo%22:%7B%22liabilityShifted%22:true,%22liabilityShiftPossible%22:true%7D,%22success%22:true%7D")!) + + waitForExpectations(timeout: 2, handler: nil) + } + + func testStartPayment_returnsFailedAuthenticationError_whenSuccessFalse() { + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "assetsUrl": "http://assets.example.com", + ]) + + let viewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + viewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = self.expectation(description: "Delegate received requestsPresentationOfViewController") + + let driver = BTPaymentFlowDriver(apiClient: mockAPIClient) + driver.viewControllerPresentingDelegate = viewControllerPresentingDelegate + + let responseBody = [ + "paymentMethod": [ + "consumed": false, + "description": "ending in 02", + "details": [ + "cardType": "Visa", + "lastTwo": "02", + ], + "nonce": "f689056d-aee1-421e-9d10-f2c9b34d4d6f", + "threeDSecureInfo": [ + "enrolled": "Y", + "liabilityShiftPossible": true, + "liabilityShifted": true, + "status": "authenticate_successful", + ], + "type": "CreditCard", + ], + "success": true, + "threeDSecureInfo": [ + "liabilityShiftPossible": true, + "liabilityShifted": true, + ], + "lookup": [ + "acsUrl": "http://example.com", + "pareq": "", + "md": "", + "termUrl": "http://example.com" + ] + ] as [String : Any] + + mockAPIClient.cannedResponseBody = BTJSON(value: responseBody) + + var paymentFinishedExpectation: XCTestExpectation? = nil + driver.startPaymentFlow(threeDSecureRequest) { (result, error) in + XCTAssertNotNil(error) + XCTAssertNil(result) + guard let error = error as NSError? else {return} + XCTAssertEqual(error.domain, BTThreeDSecureFlowErrorDomain) + XCTAssertEqual(error.code, BTThreeDSecureFlowErrorType.failedAuthentication.rawValue) + paymentFinishedExpectation!.fulfill() + } + + waitForExpectations(timeout: 2, handler: nil) + + paymentFinishedExpectation = self.expectation(description: "Start payment expectation") + BTPaymentFlowDriver.handleAppSwitchReturn(URL(string: "com.braintreepayments.demo.payments://x-callback-url/braintree/threedsecure?auth_response=%7B%22paymentMethod%22:%7B%22type%22:%22CreditCard%22,%22nonce%22:%220d3e1cc8-50a4-0437-720b-c03c722f0d0a%22,%22description%22:%22ending+in+02%22,%22consumed%22:false,%22threeDSecureInfo%22:%7B%22liabilityShifted%22:true,%22liabilityShiftPossible%22:true,%22status%22:%22authenticate_successful%22,%22enrolled%22:%22Y%22%7D,%22details%22:%7B%22lastTwo%22:%2202%22,%22lastFour%22:%220002%22,%22cardType%22:%22Visa%22%7D,%22bin_data%22:%7B%22prepaid%22:%22Unknown%22,%22healthcare%22:%22Unknown%22,%22debit%22:%22Unknown%22,%22durbin_regulated%22:%22Unknown%22,%22commercial%22:%22Unknown%22,%22payroll%22:%22Unknown%22,%22issuing_bank%22:%22Unknown%22,%22country_of_issuance%22:%22Unknown%22,%22product_id%22:%22Unknown%22%7D%7D,%22threeDSecureInfo%22:%7B%22liabilityShifted%22:true,%22liabilityShiftPossible%22:true%7D,%22success%22:false%7D")!) + + waitForExpectations(timeout: 2, handler: nil) + } + + func testStartPayment_makesDelegateCallbacks_forContextSwitchEvents() { + mockAPIClient.cannedConfigurationResponseBody = BTJSON(value: [ + "assetsUrl": "http://assets.example.com", + ]) + + let viewControllerPresentingDelegate = MockViewControllerPresentationDelegate() + viewControllerPresentingDelegate.requestsPresentationOfViewControllerExpectation = self.expectation(description: "Delegate received requestsPresentationOfViewController") + + let driver = BTPaymentFlowDriver(apiClient: mockAPIClient) + driver.viewControllerPresentingDelegate = viewControllerPresentingDelegate + let appSwitchDelegate = MockAppSwitchDelegate() + driver.appSwitchDelegate = appSwitchDelegate + + let responseBody = [ + "paymentMethod": [ + "consumed": false, + "description": "ending in 02", + "details": [ + "cardType": "Visa", + "lastTwo": "02", + ], + "nonce": "f689056d-aee1-421e-9d10-f2c9b34d4d6f", + "threeDSecureInfo": [ + "enrolled": "Y", + "liabilityShiftPossible": true, + "liabilityShifted": true, + "status": "authenticate_successful", + ], + "type": "CreditCard", + ], + "success": true, + "threeDSecureInfo": [ + "liabilityShiftPossible": true, + "liabilityShifted": true, + ], + "lookup": [ + "acsUrl": "http://example.com", + "pareq": "", + "md": "", + "termUrl": "http://example.com" + ] + ] as [String : Any] + + mockAPIClient.cannedResponseBody = BTJSON(value: responseBody) + + var paymentFinishedExpectation: XCTestExpectation? = nil + driver.startPaymentFlow(threeDSecureRequest) { (result, error) in + paymentFinishedExpectation!.fulfill() + } + + paymentFinishedExpectation = self.expectation(description: "Payment finished expectation") + BTPaymentFlowDriver.handleAppSwitchReturn(URL(string: "com.braintreepayments.demo.payments://x-callback-url/braintree/threedsecure?auth_response=%7B%22paymentMethod%22:%7B%22type%22:%22CreditCard%22,%22nonce%22:%220d3e1cc8-50a4-0437-720b-c03c722f0d0a%22,%22description%22:%22ending+in+02%22,%22consumed%22:false,%22threeDSecureInfo%22:%7B%22liabilityShifted%22:true,%22liabilityShiftPossible%22:true,%22status%22:%22authenticate_successful%22,%22enrolled%22:%22Y%22%7D,%22details%22:%7B%22lastTwo%22:%2202%22,%22lastFour%22:%220002%22,%22cardType%22:%22Visa%22%7D,%22bin_data%22:%7B%22prepaid%22:%22Unknown%22,%22healthcare%22:%22Unknown%22,%22debit%22:%22Unknown%22,%22durbin_regulated%22:%22Unknown%22,%22commercial%22:%22Unknown%22,%22payroll%22:%22Unknown%22,%22issuing_bank%22:%22Unknown%22,%22country_of_issuance%22:%22Unknown%22,%22product_id%22:%22Unknown%22%7D%7D,%22threeDSecureInfo%22:%7B%22liabilityShifted%22:true,%22liabilityShiftPossible%22:true%7D,%22success%22:true%7D")!) + + waitForExpectations(timeout: 3, handler: nil) + + XCTAssertTrue(appSwitchDelegate.appContextWillSwitchCalled) + XCTAssertTrue(appSwitchDelegate.appContextDidReturnCalled) + } +} + + diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/BTFakeHTTP.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/BTFakeHTTP.h new file mode 100644 index 0000000..671cfaf --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/BTFakeHTTP.h @@ -0,0 +1,47 @@ +#import +#import "BTAPIHTTP.h" +#import "BTGraphQLHTTP.h" +#import "BTHTTP.h" + +@interface BTFakeHTTP : BTHTTP + +@property (nonatomic, assign) NSUInteger GETRequestCount; +@property (nonatomic, assign) NSUInteger POSTRequestCount; +@property (nonatomic, copy, nullable) NSString *lastRequestEndpoint; +@property (nonatomic, copy, nullable) NSString *lastRequestMethod; +@property (nonatomic, strong, nullable) NSDictionary *lastRequestParameters; +@property (nonatomic, copy, nullable) NSString *stubMethod; +@property (nonatomic, copy, nullable) NSString *stubEndpoint; +@property (nonatomic, strong, nullable) BTJSON *cannedResponse; +@property (nonatomic, strong, nullable) BTJSON *cannedConfiguration; +@property (nonatomic, assign) NSUInteger cannedStatusCode; +@property (nonatomic, strong, nullable) NSError *cannedError; + +- (nullable instancetype)init; + ++ (nullable instancetype)fakeHTTP; + +- (void)stubRequest:(nonnull NSString *)httpMethod toEndpoint:(nonnull NSString *)endpoint respondWith:(nonnull id)value statusCode:(NSUInteger)statusCode; + +- (void)stubRequest:(nonnull NSString *)httpMethod toEndpoint:(nonnull NSString *)endpoint respondWithError:(nonnull NSError *)error; + +@end + +@interface BTFakeGraphQLHTTP : BTGraphQLHTTP + +@property (nonatomic, assign) NSUInteger POSTRequestCount; +@property (nonatomic, strong, nullable) NSDictionary *lastRequestParameters; + ++ (nullable instancetype)fakeHTTP; + +@end + +@interface BTFakeAPIHTTP : BTAPIHTTP + +@property (nonatomic, assign) NSUInteger POSTRequestCount; +@property (nonatomic, strong, nullable) NSDictionary *lastRequestParameters; + ++ (nullable instancetype)fakeHTTP; + +@end + diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/BTFakeHTTP.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/BTFakeHTTP.m new file mode 100644 index 0000000..6a76048 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/BTFakeHTTP.m @@ -0,0 +1,125 @@ +#import "BTFakeHTTP.h" + +@implementation BTFakeHTTP + +- (nullable instancetype)init { + return [self initWithBaseURL:[[NSURL alloc] init] authorizationFingerprint:@""]; +} + ++ (instancetype)fakeHTTP { + return [[self.class alloc] initWithBaseURL:[[NSURL alloc] init] authorizationFingerprint:@""]; +} + +- (id)copyWithZone:(NSZone *)zone { + BTFakeHTTP *copiedHTTP = [super copyWithZone:zone]; + + copiedHTTP.GETRequestCount = self.GETRequestCount; + copiedHTTP.POSTRequestCount = self.POSTRequestCount; + copiedHTTP.lastRequestEndpoint = self.lastRequestEndpoint; + copiedHTTP.lastRequestParameters = [self.lastRequestParameters copy]; + copiedHTTP.stubMethod = self.stubMethod; + copiedHTTP.stubEndpoint = self.stubEndpoint; + copiedHTTP.cannedResponse = self.cannedResponse; + copiedHTTP.cannedStatusCode = self.cannedStatusCode; + copiedHTTP.cannedError = self.cannedError; + + return copiedHTTP; +} + +- (void)stubRequest:(NSString *)httpMethod toEndpoint:(NSString *)endpoint respondWith:(id)value statusCode:(NSUInteger)statusCode { + self.stubMethod = httpMethod; + self.stubEndpoint = endpoint; + self.cannedResponse = [[BTJSON alloc] initWithValue:value]; + self.cannedStatusCode = statusCode; +} + +- (void)stubRequest:(NSString *)httpMethod toEndpoint:(NSString *)endpoint respondWithError:(NSError *)error { + self.stubMethod = httpMethod; + self.stubEndpoint = endpoint; + self.cannedError = error; +} + +- (void)GET:(NSString *)endpoint parameters:(NSDictionary *)parameters completion:(void(^)(BTJSON *, NSHTTPURLResponse *, NSError *))completionBlock { + self.GETRequestCount++; + self.lastRequestEndpoint = endpoint; + self.lastRequestParameters = parameters; + self.lastRequestMethod = @"GET"; + + if (self.cannedError) { + [self dispatchBlock:^{ + completionBlock(nil, nil, self.cannedError); + }]; + } else { + NSHTTPURLResponse *httpResponse = [[NSHTTPURLResponse alloc] initWithURL:[NSURL URLWithString:endpoint] + statusCode:self.cannedStatusCode + HTTPVersion:nil + headerFields:nil]; + [self dispatchBlock:^{ + BTJSON *jsonResponse = [endpoint rangeOfString:@"v1/configuration"].location != NSNotFound ? self.cannedConfiguration : self.cannedResponse; + completionBlock(jsonResponse, httpResponse, nil); + }]; + } +} + +- (void)POST:(NSString *)endpoint parameters:(NSDictionary *)parameters completion:(void (^)(BTJSON *, NSHTTPURLResponse *, NSError *))completionBlock { + self.POSTRequestCount++; + self.lastRequestEndpoint = endpoint; + self.lastRequestParameters = parameters; + self.lastRequestMethod = @"POST"; + + if (self.cannedError) { + [self dispatchBlock:^{ + completionBlock(nil, nil, self.cannedError); + }]; + } else { + NSHTTPURLResponse *httpResponse = [[NSHTTPURLResponse alloc] initWithURL:[NSURL URLWithString:endpoint] + statusCode:self.cannedStatusCode + HTTPVersion:nil + headerFields:nil]; + [self dispatchBlock:^{ + completionBlock(self.cannedResponse, httpResponse, nil); + }]; + } +} + +/// Helper method to dispatch callbacks to dispatchQueue +- (void)dispatchBlock:(void(^)(void))block { + if (self.dispatchQueue) { + dispatch_async(self.dispatchQueue, ^{ + block(); + }); + } else { + block(); + } +} + +@end + +@implementation BTFakeGraphQLHTTP + ++ (instancetype)fakeHTTP { + return [[self.class alloc] initWithBaseURL:[[NSURL alloc] init] authorizationFingerprint:@""]; +} + +- (void)POST:(__unused NSString *)endpoint parameters:(NSDictionary *)parameters completion:(void (^)(BTJSON *, NSHTTPURLResponse *, NSError *))completionBlock { + self.POSTRequestCount++; + self.lastRequestParameters = parameters; + completionBlock(nil, nil, nil); +} + +@end + +@implementation BTFakeAPIHTTP + ++ (instancetype)fakeHTTP { + return [[self.class alloc] initWithBaseURL:[[NSURL alloc] init] authorizationFingerprint:@""]; +} + +- (void)POST:(__unused NSString *)endpoint parameters:(NSDictionary *)parameters completion:(void (^)(BTJSON *, NSHTTPURLResponse *, NSError *))completionBlock { + self.POSTRequestCount++; + self.lastRequestParameters = parameters; + completionBlock(nil, nil, nil); +} + +@end + diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/BTHTTPTestProtocol.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/BTHTTPTestProtocol.h new file mode 100644 index 0000000..81603ed --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/BTHTTPTestProtocol.h @@ -0,0 +1,15 @@ +#import +@class BTJSON; + +#define kBTHTTPTestProtocolScheme @"bt-http-test" +#define kBTHTTPTestProtocolHost @"base.example.com" +#define kBTHTTPTestProtocolBasePath @"/base/path" +#define kBTHTTPTestProtocolPort @1234 + +@interface BTHTTPTestProtocol : NSURLProtocol + ++ (NSURLRequest *)parseRequestFromTestResponseBody:(BTJSON *)responseBody; ++ (NSString *)parseRequestBodyFromTestResponseBody:(BTJSON *)responseBody; ++ (NSURL *)testBaseURL; + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/BTHTTPTestProtocol.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/BTHTTPTestProtocol.m new file mode 100644 index 0000000..f143141 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/BTHTTPTestProtocol.m @@ -0,0 +1,73 @@ +#import "BTHTTPTestProtocol.h" +#import "BTHTTP.h" + +@implementation BTHTTPTestProtocol + ++ (BOOL)canInitWithRequest:(__unused NSURLRequest *)request { + return YES; +} + ++ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request { + return request; +} + +- (void)startLoading { + id client = self.client; + + NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:self.request.URL + statusCode:200 + HTTPVersion:@"HTTP/1.1" + headerFields:@{@"Content-Type": @"application/json"}]; + + NSData *archivedRequest = [NSKeyedArchiver archivedDataWithRootObject:self.request]; + NSString *base64ArchivedRequest = [archivedRequest base64EncodedStringWithOptions:0]; + + NSData *requestBodyData; + if (self.request.HTTPBodyStream) { + NSInputStream *inputStream = self.request.HTTPBodyStream; + [inputStream open]; + NSMutableData *mutableBodyData = [NSMutableData data]; + + while ([inputStream hasBytesAvailable]) { + uint8_t buffer[128]; + NSUInteger bytesRead = [inputStream read:buffer maxLength:128]; + [mutableBodyData appendBytes:buffer length:bytesRead]; + } + [inputStream close]; + requestBodyData = [mutableBodyData copy]; + } else { + requestBodyData = self.request.HTTPBody; + } + + NSDictionary *responseBody = @{ @"request": base64ArchivedRequest, + @"requestBody": [[NSString alloc] initWithData:requestBodyData encoding:NSUTF8StringEncoding] }; + + [client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed]; + + [client URLProtocol:self didLoadData:[NSJSONSerialization dataWithJSONObject:responseBody options:NSJSONWritingPrettyPrinted error:NULL]]; + + [client URLProtocolDidFinishLoading:self]; +} + +- (void)stopLoading { +} + ++ (NSURL *)testBaseURL { + NSURLComponents *components = [[NSURLComponents alloc] init]; + components.scheme = kBTHTTPTestProtocolScheme; + components.host = kBTHTTPTestProtocolHost; + components.path = kBTHTTPTestProtocolBasePath; + components.port = kBTHTTPTestProtocolPort; + return components.URL; +} + ++ (NSURLRequest *)parseRequestFromTestResponseBody:(BTJSON *)responseBody { + return [NSKeyedUnarchiver unarchiveObjectWithData:[[NSData alloc] initWithBase64EncodedString:[responseBody[@"request"] asString] options:0]]; +} + ++ (NSString *)parseRequestBodyFromTestResponseBody:(BTJSON *)responseBody { + return [responseBody[@"requestBody"] asString]; +} + +@end + diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/BTSpecDependencies.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/BTSpecDependencies.h new file mode 100644 index 0000000..393bbc3 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/BTSpecDependencies.h @@ -0,0 +1,3 @@ +#import +#import +#import diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/BTSpecHelper.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/BTSpecHelper.h new file mode 100644 index 0000000..a7c06a9 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/BTSpecHelper.h @@ -0,0 +1,22 @@ +#import +#import +#import + +typedef NS_ENUM(NSInteger, BTTestMode_t) { + BTTestModeDebug = 1, + BTTestModeRelease = 2 +}; + +extern BTTestMode_t BTTestMode; + +extern NSString * const BTValidTestClientToken; + +void wait_for_potential_async_exceptions(void (^done)(void)); + +BOOL isANonce(NSString *nonce); + +@interface BTOCMockHelper : NSObject + +- (void)stubApplicationCanOpenURL; + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/BTSpecHelper.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/BTSpecHelper.m new file mode 100644 index 0000000..0ba317d --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/BTSpecHelper.m @@ -0,0 +1,53 @@ +#import "BTSpecHelper.h" +#import + +#ifdef DEBUG +BTTestMode_t BTTestMode = BTTestModeDebug; +#else +BTTestMode_t BTTestMode = BTTestModeRelease; +#endif + +NSString * const BTValidTestClientToken = @"eyJ2ZXJzaW9uIjoyLCJhdXRob3JpemF0aW9uRmluZ2VycHJpbnQiOiI3ODJhZmFlNDJlZTNiNTA4NWUxNmMzYjhkZTY3OGQxNTJhODFlYzk5MTBmZDNhY2YyYWU4MzA2OGI4NzE4YWZhfGNyZWF0ZWRfYXQ9MjAxNS0wOC0yMFQwMjoxMTo1Ni4yMTY1NDEwNjErMDAwMFx1MDAyNmN1c3RvbWVyX2lkPTM3OTU5QTE5LThCMjktNDVBNC1CNTA3LTRFQUNBM0VBOEM4Nlx1MDAyNm1lcmNoYW50X2lkPWRjcHNweTJicndkanIzcW5cdTAwMjZwdWJsaWNfa2V5PTl3d3J6cWszdnIzdDRuYzgiLCJjb25maWdVcmwiOiJodHRwczovL2FwaS5zYW5kYm94LmJyYWludHJlZWdhdGV3YXkuY29tOjQ0My9tZXJjaGFudHMvZGNwc3B5MmJyd2RqcjNxbi9jbGllbnRfYXBpL3YxL2NvbmZpZ3VyYXRpb24iLCJjaGFsbGVuZ2VzIjpbXSwiZW52aXJvbm1lbnQiOiJzYW5kYm94IiwiY2xpZW50QXBpVXJsIjoiaHR0cHM6Ly9hcGkuc2FuZGJveC5icmFpbnRyZWVnYXRld2F5LmNvbTo0NDMvbWVyY2hhbnRzL2RjcHNweTJicndkanIzcW4vY2xpZW50X2FwaSIsImFzc2V0c1VybCI6Imh0dHBzOi8vYXNzZXRzLmJyYWludHJlZWdhdGV3YXkuY29tIiwiYXV0aFVybCI6Imh0dHBzOi8vYXV0aC52ZW5tby5zYW5kYm94LmJyYWludHJlZWdhdGV3YXkuY29tIiwiYW5hbHl0aWNzIjp7InVybCI6Imh0dHBzOi8vY2xpZW50LWFuYWx5dGljcy5zYW5kYm94LmJyYWludHJlZWdhdGV3YXkuY29tIn0sInRocmVlRFNlY3VyZUVuYWJsZWQiOnRydWUsInRocmVlRFNlY3VyZSI6eyJsb29rdXBVcmwiOiJodHRwczovL2FwaS5zYW5kYm94LmJyYWludHJlZWdhdGV3YXkuY29tOjQ0My9tZXJjaGFudHMvZGNwc3B5MmJyd2RqcjNxbi90aHJlZV9kX3NlY3VyZS9sb29rdXAifSwicGF5cGFsRW5hYmxlZCI6dHJ1ZSwicGF5cGFsIjp7ImRpc3BsYXlOYW1lIjoiQWNtZSBXaWRnZXRzLCBMdGQuIChTYW5kYm94KSIsImNsaWVudElkIjpudWxsLCJwcml2YWN5VXJsIjoiaHR0cDovL2V4YW1wbGUuY29tL3BwIiwidXNlckFncmVlbWVudFVybCI6Imh0dHA6Ly9leGFtcGxlLmNvbS90b3MiLCJiYXNlVXJsIjoiaHR0cHM6Ly9hc3NldHMuYnJhaW50cmVlZ2F0ZXdheS5jb20iLCJhc3NldHNVcmwiOiJodHRwczovL2NoZWNrb3V0LnBheXBhbC5jb20iLCJkaXJlY3RCYXNlVXJsIjpudWxsLCJhbGxvd0h0dHAiOnRydWUsImVudmlyb25tZW50Tm9OZXR3b3JrIjp0cnVlLCJlbnZpcm9ubWVudCI6Im9mZmxpbmUiLCJ1bnZldHRlZE1lcmNoYW50IjpmYWxzZSwiYnJhaW50cmVlQ2xpZW50SWQiOiJtYXN0ZXJjbGllbnQzIiwiYmlsbGluZ0FncmVlbWVudHNFbmFibGVkIjpmYWxzZSwibWVyY2hhbnRBY2NvdW50SWQiOiJzdGNoMm5mZGZ3c3p5dHc1IiwiY3VycmVuY3lJc29Db2RlIjoiVVNEIn0sImNvaW5iYXNlRW5hYmxlZCI6dHJ1ZSwiY29pbmJhc2UiOnsiY2xpZW50SWQiOiIxMWQyNzIyOWJhNThiNTZkN2UzYzAxYTA1MjdmNGQ1YjQ0NmQ0ZjY4NDgxN2NiNjIzZDI1NWI1NzNhZGRjNTliIiwibWVyY2hhbnRBY2NvdW50IjoiY29pbmJhc2UtZGV2ZWxvcG1lbnQtbWVyY2hhbnRAZ2V0YnJhaW50cmVlLmNvbSIsInNjb3BlcyI6ImF1dGhvcml6YXRpb25zOmJyYWludHJlZSB1c2VyIiwicmVkaXJlY3RVcmwiOiJodHRwczovL2Fzc2V0cy5icmFpbnRyZWVnYXRld2F5LmNvbS9jb2luYmFzZS9vYXV0aC9yZWRpcmVjdC1sYW5kaW5nLmh0bWwiLCJlbnZpcm9ubWVudCI6Im1vY2sifSwibWVyY2hhbnRJZCI6ImRjcHNweTJicndkanIzcW4iLCJ2ZW5tbyI6Im9mZmxpbmUiLCJhcHBsZVBheSI6eyJzdGF0dXMiOiJtb2NrIiwiY291bnRyeUNvZGUiOiJVUyIsImN1cnJlbmN5Q29kZSI6IlVTRCIsIm1lcmNoYW50SWRlbnRpZmllciI6Im1lcmNoYW50LmNvbS5icmFpbnRyZWVwYXltZW50cy5zYW5kYm94LkJyYWludHJlZS1EZW1vIiwic3VwcG9ydGVkTmV0d29ya3MiOlsidmlzYSIsIm1hc3RlcmNhcmQiLCJhbWV4Il19fQ=="; + +void wait_for_potential_async_exceptions(void (^done)(void)) { + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_MSEC)), dispatch_get_main_queue(), ^{ + done(); + }); +} + +BOOL isANonce(NSString *nonce) { + NSString *nonceRegularExpressionString = @"\\A[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\\Z"; + + NSError *error; + NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:nonceRegularExpressionString + options:0 + error:&error]; + if (error) { + NSLog(@"Error parsing regex: %@", error); + return NO; + } + + if ([regex numberOfMatchesInString:nonce options:0 range:NSMakeRange(0, [nonce length])] > 0) { + return YES; + } + + NSString *tokenizerNonceRegularExpressionString = @"\\Atokencc_[0-9a-z_]+\\Z"; + regex = [[NSRegularExpression alloc] initWithPattern:tokenizerNonceRegularExpressionString + options:0 + error:&error]; + if (error) { + NSLog(@"Error parsing regex: %@", error); + return NO; + } + + return [regex numberOfMatchesInString:nonce options:0 range:NSMakeRange(0, [nonce length])] > 0; +} + +@implementation BTOCMockHelper + +- (void)stubApplicationCanOpenURL { + id stubApplication = OCMPartialMock([UIApplication sharedApplication]); + OCMStub([stubApplication canOpenURL:[OCMArg any]]).andReturn(YES); +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/BTTestClientTokenFactory.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/BTTestClientTokenFactory.h new file mode 100644 index 0000000..15b5e71 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/BTTestClientTokenFactory.h @@ -0,0 +1,9 @@ +#import + +@interface BTTestClientTokenFactory : NSObject + ++ (NSString *)tokenWithVersion:(NSInteger)version; ++ (NSString *)tokenWithVersion:(NSInteger)version + overrides:(NSDictionary *)dictionary; + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/BTTestClientTokenFactory.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/BTTestClientTokenFactory.m new file mode 100644 index 0000000..06e2335 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/BTTestClientTokenFactory.m @@ -0,0 +1,174 @@ +#import "BTTestClientTokenFactory.h" + +@implementation BTTestClientTokenFactory + ++ (NSDictionary *)clientTokenWithVersion:(NSInteger)version configurationURL:(NSURL *)url { + if (version < 3) { + return @{ + @"version": @(version), + @"authorizationFingerprint": @"an_authorization_fingerprint", + @"configUrl": url.absoluteString, + @"challenges": @[ + @"cvv" + ], + @"clientApiUrl": @"https://api.example.com:443/merchants/a_merchant_id/client_api", + @"assetsUrl": @"https://assets.example.com", + @"authUrl": @"https://auth.venmo.example.com", + @"analytics": @{ + @"url": @"https://client-analytics.example.com" + }, + @"threeDSecureEnabled": @NO, + @"paypalEnabled": @YES, + @"paypal": @{ + @"displayName": @"Acme Widgets, Ltd. (Sandbox)", + @"clientId": @"a_paypal_client_id", + @"privacyUrl": @"http://example.com/pp", + @"userAgreementUrl": @"http://example.com/tos", + @"baseUrl": @"https://assets.example.com", + @"assetsUrl": @"https://checkout.paypal.example.com", + @"directBaseUrl": [NSNull null], + @"allowHttp": @YES, + @"environmentNoNetwork": @YES, + @"environment": @"offline", + @"merchantAccountId": @"a_merchant_account_id", + @"currencyIsoCode": @"USD" + }, + @"merchantId": @"a_merchant_id", + @"venmo": @"offline", + @"applePay": @{ + @"status": @"mock", + @"countryCode": @"US", + @"currencyCode": @"USD", + @"merchantIdentifier": @"apple-pay-merchant-id", + @"supportedNetworks": @[ @"visa", + @"mastercard", + @"amex" ] + }, + @"coinbaseEnabled": @YES, + @"coinbase": @{ + @"clientId": @"a_coinbase_client_id", + @"merchantAccount": @"coinbase-account@example.com", + @"scopes": @"authorizations:braintree user", + @"redirectUrl": @"https://assets.example.com/coinbase/oauth/redirect" + }, + @"merchantAccountId": @"some-merchant-account-id", + }; + } else { + return @{ + @"version": @(version), + @"authorizationFingerprint": @"an_authorization_fingerprint", + @"configUrl": url.absoluteString, + }; + } +} + ++ (NSDictionary *)configuration { + return @{ + @"challenges": @[ + @"cvv" + ], + @"clientApiUrl": @"https://api.example.com:443/merchants/a_merchant_id/client_api", + @"assetsUrl": @"https://assets.example.com", + @"authUrl": @"https://auth.venmo.example.com", + @"analytics": @{ + @"url": @"https://client-analytics.example.com" + }, + @"threeDSecureEnabled": @NO, + @"paypalEnabled": @YES, + @"paypal": @{ + @"displayName": @"Acme Widgets, Ltd. (Sandbox)", + @"clientId": @"a_paypal_client_id", + @"privacyUrl": @"http://example.com/pp", + @"userAgreementUrl": @"http://example.com/tos", + @"baseUrl": @"https://assets.example.com", + @"assetsUrl": @"https://checkout.paypal.example.com", + @"directBaseUrl": [NSNull null], + @"allowHttp": @YES, + @"environmentNoNetwork": @YES, + @"environment": @"offline", + @"merchantAccountId": @"a_merchant_account_id", + @"currencyIsoCode": @"USD" + }, + @"merchantId": @"a_merchant_id", + @"venmo": @"offline", + @"applePay": @{ + @"status": @"mock", + @"countryCode": @"US", + @"currencyCode": @"USD", + @"merchantIdentifier": @"apple-pay-merchant-id", + @"supportedNetworks": @[ @"visa", + @"mastercard", + @"amex" ] + + }, + @"coinbaseEnabled": @YES, + @"coinbase": @{ + @"clientId": @"a_coinbase_client_id", + @"merchantAccount": @"coinbase-account@example.com", + @"scopes": @"authorizations:braintree user", + @"redirectUrl": @"https://assets.example.com/coinbase/oauth/redirect" + }, + @"merchantAccountId": @"some-merchant-account-id", + }; +} + ++ (NSDictionary *)configurationWithOverrides:(NSDictionary *)overrides { + return [self extendDictionary:self.configuration withOverrides:overrides]; +} + ++ (NSString *)tokenWithVersion:(NSInteger)version { + return [self tokenWithVersion:version overrides:nil]; +} + ++ (NSString *)tokenWithVersion:(NSInteger)version + overrides:(NSDictionary *)overrides { + BOOL base64Encoded = version == 1 ? NO : YES; + + NSURL *configurationURL = [self dataURLWithJSONObject:[self configurationWithOverrides:overrides]]; + + NSDictionary *clientToken = [self extendDictionary:[self clientTokenWithVersion:version configurationURL:configurationURL] + withOverrides:overrides]; + + NSError *jsonSerializationError; + NSData *clientTokenData = [NSJSONSerialization dataWithJSONObject:clientToken + options:0 + error:&jsonSerializationError]; + NSAssert(jsonSerializationError == nil, @"Failed to generated test client token JSON: %@", jsonSerializationError); + + if (base64Encoded) { + return [clientTokenData base64EncodedStringWithOptions:0]; + } else { + return [[NSString alloc] initWithData:clientTokenData + encoding:NSUTF8StringEncoding]; + } +} + ++ (NSURL *)dataURLWithJSONObject:(id)object { + NSError *jsonSerializationError; + NSData *configurationData = [NSJSONSerialization dataWithJSONObject:object + options:0 + error:&jsonSerializationError]; + NSAssert(jsonSerializationError == nil, @"Failed to generated test client token JSON: %@", jsonSerializationError); + NSString *base64EncodedConfigurationData = [configurationData base64EncodedStringWithOptions:0]; + NSString *dataURLString = [NSString stringWithFormat:@"data:application/json;base64,%@", base64EncodedConfigurationData]; + return [NSURL URLWithString:dataURLString]; +} + ++ (NSDictionary *)extendDictionary:(NSDictionary *)dictionary withOverrides:(NSDictionary *)overrides { + NSMutableDictionary *extendedDictionary = [dictionary mutableCopy]; + + [overrides enumerateKeysAndObjectsUsingBlock:^(id key, id obj, __unused BOOL *stop){ + if ([obj isKindOfClass:[NSNull class]]) { + [extendedDictionary removeObjectForKey:key]; + } else if ([obj isKindOfClass:[NSDictionary class]] && [overrides[key] isKindOfClass:[NSDictionary class]]) { + // Overriding values nested inside a dictionary + extendedDictionary[key] = [self extendDictionary:obj withOverrides:overrides[key]]; + } else { + extendedDictionary[key] = obj; + } + }]; + + return extendedDictionary; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/FakePayPalClasses.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/FakePayPalClasses.h new file mode 100644 index 0000000..3e4a60a --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/FakePayPalClasses.h @@ -0,0 +1,62 @@ +#import "BTPayPalRequestFactory.h" +#import "PPOTCore.h" +#import "PPOTRequest.h" + +#pragma mark - FakePayPalOneTouchCoreResult + +@interface FakePayPalOneTouchCoreResult : PPOTResult +@property (nonatomic, strong, nullable) NSError *cannedError; +@property (nonatomic, assign) PPOTResultType cannedType; +@property (nonatomic, assign) PPOTRequestTarget cannedTarget; +@end + +#pragma mark - FakePayPalOneTouchCore + +@interface FakePayPalOneTouchCore : PPOTCore ++ (nullable FakePayPalOneTouchCoreResult *)cannedResult; ++ (void)setCannedResult:(nullable FakePayPalOneTouchCoreResult *)result; ++ (BOOL)cannedIsWalletAppAvailable; ++ (void)setCannedIsWalletAppAvailable:(BOOL)isWalletAppAvailable; +@end + +#pragma mark - FakePayPalCheckoutRequest + +@interface FakePayPalCheckoutRequest : PPOTCheckoutRequest +@property (nonatomic, strong, nullable) NSError *cannedError; +@property (nonatomic, assign) BOOL cannedSuccess; +@property (nonatomic, assign) PPOTRequestTarget cannedTarget; +@property (nonatomic, strong, nullable) NSString *cannedMetadataId; +@property (nonatomic, assign) BOOL appSwitchPerformed; +@end + +#pragma mark - FakePayPalAuthorizationRequest + +@interface FakePayPalAuthorizationRequest : PPOTAuthorizationRequest +@property (nonatomic, strong, nullable) NSError *cannedError; +@property (nonatomic, assign) BOOL cannedSuccess; +@property (nonatomic, assign) PPOTRequestTarget cannedTarget; +@property (nonatomic, strong, nullable) NSString *cannedMetadataId; +@property (nonatomic, assign) BOOL appSwitchPerformed; +@property (nonatomic, strong, nullable) NSURL *cannedURL; +@end + +#pragma mark - FakePayPalBillingAgreementRequest + +@interface FakePayPalBillingAgreementRequest : PPOTBillingAgreementRequest +@property (nonatomic, strong, nullable) NSError *cannedError; +@property (nonatomic, assign) BOOL cannedSuccess; +@property (nonatomic, assign) PPOTRequestTarget cannedTarget; +@property (nonatomic, strong, nullable) NSString *cannedMetadataId; +@property (nonatomic, assign) BOOL appSwitchPerformed; +@end + +#pragma mark - FakePayPalRequestFactory + +@interface FakePayPalRequestFactory : BTPayPalRequestFactory +@property (nonatomic, strong, nonnull) FakePayPalCheckoutRequest *checkoutRequest; +@property (nonatomic, strong, nonnull) FakePayPalAuthorizationRequest *authorizationRequest; +@property (nonatomic, strong, nonnull) FakePayPalBillingAgreementRequest *billingAgreementRequest; +@property (nonatomic, strong, nullable) NSSet *lastScopeValues; +@property (nonatomic, strong, nullable) NSURL *lastApprovalURL; + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/FakePayPalClasses.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/FakePayPalClasses.m new file mode 100644 index 0000000..351690a --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/FakePayPalClasses.m @@ -0,0 +1,193 @@ +#import "FakePayPalClasses.h" + +#pragma mark - FakePayPalOneTouchCoreResult + +@implementation FakePayPalOneTouchCoreResult + +- (instancetype)init { + if (self = [super init]) { + _cannedType = PPOTResultTypeSuccess; + _cannedTarget = PPOTRequestTargetUnknown; + } + return self; +} + +- (NSError *)error { + return self.cannedError; +} + +- (PPOTResultType)type { + return self.cannedType; +} + +- (PPOTRequestTarget)target { + return self.cannedTarget; +} + +- (NSDictionary *)response { + return @{ @"foo" : @"bar", @"correlation_id" : @"a-correlation-id" }; +} + +@end + +#pragma mark - FakePayPalOneTouchCore + +@implementation FakePayPalOneTouchCore + +static FakePayPalOneTouchCoreResult *cannedResult; +static BOOL cannedIsWalletAppAvailable = YES; + ++ (void)initialize { + cannedResult = [[FakePayPalOneTouchCoreResult alloc] init]; +} + ++ (BOOL)cannedIsWalletAppAvailable { + return cannedIsWalletAppAvailable; +} + ++ (void)setCannedIsWalletAppAvailable:(BOOL)isWalletAppAvailable { + cannedIsWalletAppAvailable = isWalletAppAvailable; +} + ++ (FakePayPalOneTouchCoreResult *)cannedResult { + return cannedResult; +} + ++ (void)setCannedResult:(FakePayPalOneTouchCoreResult *)result { + cannedResult = result; +} + + ++ (void)parseResponseURL:(__unused NSURL *)url completionBlock:(PPOTCompletionBlock)completionBlock { + completionBlock([self cannedResult]); +} + ++ (void)redirectURLsForCallbackURLScheme:(__unused NSString *)callbackURLScheme + withReturnURL:(NSString *__autoreleasing *)returnURL + withCancelURL:(NSString *__autoreleasing *)cancelURL { + *cancelURL = @"scheme://cancel"; + *returnURL = @"scheme://return"; +} + ++ (NSString *)clientMetadataID { + return @"fake-client-metadata-id"; +} + ++ (BOOL)doesApplicationSupportOneTouchCallbackURLScheme:(__unused NSString *)callbackURLScheme { + return YES; +} + ++ (BOOL)isWalletAppInstalled { + return [self cannedIsWalletAppAvailable]; +} + +@end + +#pragma mark - FakePayPalCheckoutRequest + +@implementation FakePayPalCheckoutRequest + +- (instancetype)init { + if (self = [super init]) { + _cannedError = nil; + _cannedTarget = PPOTRequestTargetBrowser; + _cannedSuccess = YES; + _cannedMetadataId = @"fake-canned-metadata-id"; + } + return self; +} + +- (void)performWithAdapterBlock:(PPOTRequestAdapterBlock)adapterBlock { + self.appSwitchPerformed = YES; + adapterBlock(self.cannedSuccess, [NSURL URLWithString:@"http://example.com"], self.cannedTarget, self.cannedMetadataId, self.cannedError); +} + +@end + +#pragma mark - FakePayPalAuthorizationRequest + +@implementation FakePayPalAuthorizationRequest + +- (instancetype)init { + if (self = [super init]) { + _cannedError = nil; + _cannedTarget = PPOTRequestTargetBrowser; + _cannedSuccess = YES; + _cannedMetadataId = @"fake-canned-metadata-id"; + } + return self; +} + +- (void)performWithAdapterBlock:(PPOTRequestAdapterBlock)adapterBlock { + self.appSwitchPerformed = YES; + adapterBlock(self.cannedSuccess, self.cannedURL ? self.cannedURL : [NSURL URLWithString:@"http://example.com"], self.cannedTarget, self.cannedMetadataId, self.cannedError); +} + +@end + +#pragma mark - FakePayPalBillingAgreementRequest + +@implementation FakePayPalBillingAgreementRequest + +- (instancetype)init { + if (self = [super init]) { + _cannedError = nil; + _cannedTarget = PPOTRequestTargetBrowser; + _cannedSuccess = YES; + _cannedMetadataId = @"fake-canned-metadata-id"; + } + return self; +} + +- (void)performWithAdapterBlock:(PPOTRequestAdapterBlock)adapterBlock { + self.appSwitchPerformed = YES; + adapterBlock(self.cannedSuccess, [NSURL URLWithString:@"http://example.com"], self.cannedTarget, self.cannedMetadataId, self.cannedError); +} + +@end + +#pragma mark - FakePayPalRequestFactory + +@implementation FakePayPalRequestFactory + +- (instancetype)init { + if (self = [super init]) { + _authorizationRequest = [[FakePayPalAuthorizationRequest alloc] init]; + _checkoutRequest = [[FakePayPalCheckoutRequest alloc] init]; + _billingAgreementRequest = [[FakePayPalBillingAgreementRequest alloc] init]; + } + return self; +} + +- (PPOTCheckoutRequest *)checkoutRequestWithApprovalURL:(__unused NSURL *)approvalURL + clientID:(__unused NSString *)clientID + environment:(__unused NSString *)environment + callbackURLScheme:(__unused NSString *)callbackURLScheme +{ + self.lastApprovalURL = [approvalURL copy]; + return self.checkoutRequest; +} + +- (PPOTBillingAgreementRequest *)billingAgreementRequestWithApprovalURL:(__unused NSURL *)approvalURL + clientID:(__unused NSString *)clientID + environment:(__unused NSString *)environment + callbackURLScheme:(__unused NSString *)callbackURLScheme +{ + self.lastApprovalURL = [approvalURL copy]; + return self.billingAgreementRequest; +} + +- (PPOTAuthorizationRequest *)requestWithScopeValues:(NSSet *)scopeValues + privacyURL:(__unused NSURL *)privacyURL + agreementURL:(__unused NSURL *)agreementURL + clientID:(__unused NSString *)clientID + environment:(__unused NSString *)environment + callbackURLScheme:(__unused NSString *)callbackURLScheme +{ + self.lastScopeValues = scopeValues; + return self.authorizationRequest; +} + +@end + + diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/MockAPIClient.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/MockAPIClient.swift new file mode 100644 index 0000000..29ef40c --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/MockAPIClient.swift @@ -0,0 +1,98 @@ +import BraintreeCore + +class MockAPIClient : BTAPIClient { + var lastPOSTPath = "" + var lastPOSTParameters = [:] as [AnyHashable: Any]? + var lastPOSTAPIClientHTTPType: BTAPIClientHTTPType? + var lastGETPath = "" + var lastGETParameters = [:] as [String : String]? + var lastGETAPIClientHTTPType: BTAPIClientHTTPType? + var postedAnalyticsEvents : [String] = [] + + @objc var cannedConfigurationResponseBody : BTJSON? = nil + @objc var cannedConfigurationResponseError : NSError? = nil + + var cannedResponseError : NSError? = nil + var cannedHTTPURLResponse : HTTPURLResponse? = nil + var cannedResponseBody : BTJSON? = nil + var cannedMetadata : BTClientMetadata? = nil + + var fetchedPaymentMethods = false + var fetchPaymentMethodsSorting = false + + override func get(_ path: String, parameters: [String : String]?, completion completionBlock: ((BTJSON?, HTTPURLResponse?, Error?) -> Void)? = nil) { + self.get(path, parameters: parameters, httpType:.gateway, completion: completionBlock) + } + + override func post(_ path: String, parameters: [AnyHashable : Any]?, completion completionBlock: ((BTJSON?, HTTPURLResponse?, Error?) -> Void)? = nil) { + self.post(path, parameters: parameters, httpType:.gateway, completion: completionBlock) + } + + override func get(_ path: String, parameters: [String : String]?, httpType: BTAPIClientHTTPType, completion completionBlock: ((BTJSON?, HTTPURLResponse?, Error?) -> Void)? = nil) { + lastGETPath = path + lastGETParameters = parameters + lastGETAPIClientHTTPType = httpType + + guard let completionBlock = completionBlock else { + return + } + completionBlock(cannedResponseBody, cannedHTTPURLResponse, cannedResponseError) + } + + override func post(_ path: String, parameters: [AnyHashable : Any]?, httpType: BTAPIClientHTTPType, completion completionBlock: ((BTJSON?, HTTPURLResponse?, Error?) -> Void)? = nil) { + lastPOSTPath = path + lastPOSTParameters = parameters + lastPOSTAPIClientHTTPType = httpType + + guard let completionBlock = completionBlock else { + return + } + completionBlock(cannedResponseBody, cannedHTTPURLResponse, cannedResponseError) + } + + override func fetchOrReturnRemoteConfiguration(_ completionBlock: @escaping (BTConfiguration?, Error?) -> Void) { + guard let responseBody = cannedConfigurationResponseBody else { + completionBlock(nil, cannedConfigurationResponseError) + return + } + completionBlock(BTConfiguration(json: responseBody), cannedConfigurationResponseError) + } + + override func fetchPaymentMethodNonces(_ completion: @escaping ([BTPaymentMethodNonce]?, Error?) -> Void) { + fetchedPaymentMethods = true + fetchPaymentMethodsSorting = false + completion([], nil) + } + + override func fetchPaymentMethodNonces(_ defaultFirst: Bool, completion: @escaping ([BTPaymentMethodNonce]?, Error?) -> Void) { + fetchedPaymentMethods = true + fetchPaymentMethodsSorting = false + completion([], nil) + } + + /// BTAPIClient gets copied by other classes like BTPayPalDriver, BTVenmoDriver, etc. + /// This copy causes MockAPIClient to lose its stubbed data (canned responses), so the + /// workaround for tests is to stub copyWithSource:integration: to *not* copy itself + override func copy(with source: BTClientMetadataSourceType, integration: BTClientMetadataIntegrationType) -> Self { + return self + } + + override func sendAnalyticsEvent(_ name: String) { + postedAnalyticsEvents.append(name) + } + + func didFetchPaymentMethods(sorted: Bool) -> Bool { + return fetchedPaymentMethods && fetchPaymentMethodsSorting == sorted + } + + override var metadata: BTClientMetadata { + get { + if let cannedMetadata = cannedMetadata { + return cannedMetadata + } else { + cannedMetadata = BTClientMetadata() + return cannedMetadata! + } + } + } +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/MockDelegates.swift b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/MockDelegates.swift new file mode 100644 index 0000000..85899d5 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Helpers/MockDelegates.swift @@ -0,0 +1,98 @@ +import XCTest + +@objc class MockAppSwitchDelegate : NSObject, BTAppSwitchDelegate { + var willPerformAppSwitchExpectation : XCTestExpectation? = nil + var didPerformAppSwitchExpectation : XCTestExpectation? = nil + var willProcessAppSwitchExpectation : XCTestExpectation? = nil + var appContextWillSwitchExpectation : XCTestExpectation? = nil + var appContextDidReturnExpectation : XCTestExpectation? = nil + // XCTestExpectations verify that delegates callbacks are made; the below bools verify that they are NOT made + var willPerformAppSwitchCalled = false + var didPerformAppSwitchCalled = false + var willProcessAppSwitchCalled = false + var appContextWillSwitchCalled = false + var appContextDidReturnCalled = false + var lastAppSwitcher : AnyObject? = nil + + override init() { } + + init(willPerform: XCTestExpectation?, didPerform: XCTestExpectation?) { + willPerformAppSwitchExpectation = willPerform + didPerformAppSwitchExpectation = didPerform + } + + @objc func appSwitcherWillPerformAppSwitch(_ appSwitcher: Any) { + lastAppSwitcher = appSwitcher as AnyObject? + willPerformAppSwitchExpectation?.fulfill() + willPerformAppSwitchCalled = true + } + + @objc func appSwitcher(_ appSwitcher: Any, didPerformSwitchTo target: BTAppSwitchTarget) { + lastAppSwitcher = appSwitcher as AnyObject? + didPerformAppSwitchExpectation?.fulfill() + didPerformAppSwitchCalled = true + } + + @objc func appSwitcherWillProcessPaymentInfo(_ appSwitcher: Any) { + lastAppSwitcher = appSwitcher as AnyObject? + willProcessAppSwitchExpectation?.fulfill() + willProcessAppSwitchCalled = true + } + + @objc func appContextWillSwitch(_ appSwitcher: Any) { + lastAppSwitcher = appSwitcher as AnyObject? + appContextWillSwitchExpectation?.fulfill() + appContextWillSwitchCalled = true + } + + @objc func appContextDidReturn(_ appSwitcher: Any) { + lastAppSwitcher = appSwitcher as AnyObject? + appContextDidReturnExpectation?.fulfill() + appContextDidReturnCalled = true + } +} + +@objc class MockViewControllerPresentationDelegate : NSObject, BTViewControllerPresentingDelegate { + var requestsPresentationOfViewControllerExpectation : XCTestExpectation? = nil + var requestsDismissalOfViewControllerExpectation : XCTestExpectation? = nil + var lastViewController : UIViewController? = nil + var lastPaymentDriver : AnyObject? = nil + + func paymentDriver(_ driver: Any, requestsDismissalOf viewController: UIViewController) { + lastPaymentDriver = driver as AnyObject? + lastViewController = viewController + requestsDismissalOfViewControllerExpectation?.fulfill() + } + + func paymentDriver(_ driver: Any, requestsPresentationOf viewController: UIViewController) { + lastPaymentDriver = driver as AnyObject? + lastViewController = viewController + requestsPresentationOfViewControllerExpectation?.fulfill() + } +} + +@objc class MockLocalPaymentRequestDelegate : NSObject, BTLocalPaymentRequestDelegate { + var paymentId: String? + var idExpectation : XCTestExpectation? + + func localPaymentStarted(_ request: BTLocalPaymentRequest, paymentId: String, start: @escaping () -> Void) { + self.paymentId = paymentId + idExpectation?.fulfill() + start() + } +} + +@objc class MockPayPalApprovalHandlerDelegate : NSObject, BTPayPalApprovalHandler { + var handleApprovalExpectation : XCTestExpectation? = nil + var url : NSURL? = nil + var cancel : Bool = false + + func handleApproval(_ request: PPOTRequest, paypalApprovalDelegate delegate: BTPayPalApprovalDelegate) { + if (cancel) { + delegate.onApprovalCancel() + } else { + delegate.onApprovalComplete(url! as URL) + } + handleApprovalExpectation?.fulfill() + } +} diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Info.plist b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/PayPalOneTouch/PPDataCollectorTest.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/PayPalOneTouch/PPDataCollectorTest.m new file mode 100644 index 0000000..fd94213 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/PayPalOneTouch/PPDataCollectorTest.m @@ -0,0 +1,54 @@ +// +// PPDataCollectorTest.m +// PayPalOneTouch +// +// Copyright © 2015 PayPal, Inc. All rights reserved. +// + +#import +#import "PPDataCollector_Internal.h" + +@interface PPDataCollectorTest : XCTestCase + +@end + +@implementation PPDataCollectorTest + +- (void)testDeviceData_containsCorrelationId { + // Collect client metadata ID with a canned pairing ID to guarantee that the pairing ID + // hasn't already been configured by another test. Also, we can then assert the value of + // the correlation_id in the JSON object because we know the client metadata ID will be + // equal to the pairing ID. + [PPDataCollector clientMetadataID:@"expected_correlation_id"]; + NSString *deviceData = [PPDataCollector collectPayPalDeviceData]; + NSData *data = [deviceData dataUsingEncoding:NSUTF8StringEncoding]; + NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:NULL]; + NSString *cmid = [dictionary objectForKey:@"correlation_id"]; + + XCTAssertEqualObjects(cmid, @"expected_correlation_id"); +} + +- (void)testClientMetadata_isNotJSON { + NSString *cmid = [PPDataCollector generateClientMetadataID]; + NSData *cmidJSONData = [cmid dataUsingEncoding:NSUTF8StringEncoding]; + NSError *error; + id json = [NSJSONSerialization JSONObjectWithData:cmidJSONData options:0 error:&error]; + + XCTAssertNil(json); + XCTAssertNotNil(error); +} + +- (void)testClientMetadataValue_whenUsingPairingID_isSameWhenSubsequentCallsDoNotSpecifyPairingID { + NSString *pairingID = @"random pairing id"; + XCTAssertEqualObjects(pairingID, [PPDataCollector clientMetadataID:pairingID]); + XCTAssertEqualObjects(pairingID, [PPDataCollector generateClientMetadataID]); + XCTAssertEqualObjects(pairingID, [PPDataCollector clientMetadataID:nil]); +} + +- (void)testClientMetadataValue_isRegeneratedOnNonNullPairingID { + NSString *cmid = [PPDataCollector generateClientMetadataID]; + NSString *cmid2 = [PPDataCollector clientMetadataID:@"some pairing id"]; + XCTAssertNotEqualObjects(cmid, cmid2); +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/PayPalOneTouch/PPFPTIDataTest.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/PayPalOneTouch/PPFPTIDataTest.m new file mode 100644 index 0000000..4784fda --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/PayPalOneTouch/PPFPTIDataTest.m @@ -0,0 +1,77 @@ +// +// PPFPTIDataTest.m +// PayPalOneTouch +// +// Copyright © 2015 PayPal, Inc. All rights reserved. +// + +#import + +#import "PPFPTIData.h" + +@interface PPFPTIDataTest : XCTestCase + +@property (nonatomic, copy, readwrite) NSString *deviceID; +@property (nonatomic, copy, readwrite) NSString *sessionID; +@property (nonatomic, copy, readwrite) NSDictionary *eventParams; +@property (nonatomic, copy, readwrite) NSString *userAgent; +@property (nonatomic, strong, readwrite) NSURL *trackerURL; + +@end + +@implementation PPFPTIDataTest + +- (void)setUp { + [super setUp]; + self.eventParams = @{ + @"abc" : @"xyz", + @"onetwothree": @"789" + }; + self.deviceID = @"myDeviceID"; + self.sessionID = @"mySessionID"; + self.userAgent = @"myUserAgent"; + self.trackerURL = [NSURL URLWithString:@"http://example.com/v1/analytics"]; +} + +- (void)testDataAsDictionary { + PPFPTIData *data = [[PPFPTIData alloc] initWithParams:self.eventParams + deviceID:self.deviceID + sessionID:self.sessionID + userAgent:self.userAgent + trackerURL:self.trackerURL]; + XCTAssertEqualObjects(data.userAgent, self.userAgent); + XCTAssertEqualObjects(data.trackerURL, self.trackerURL); + + NSDictionary *dataDictionary = [data dataAsDictionary]; + NSTimeInterval currentTime = [[NSDate date] timeIntervalSince1970]; + + NSDictionary *eventsDictionary = dataDictionary[@"events"]; + XCTAssertEqualObjects(eventsDictionary[@"actor"][@"tracking_visitor_id"], self.deviceID); + XCTAssertEqualObjects(eventsDictionary[@"actor"][@"tracking_visit_id"], self.sessionID); + XCTAssertEqualObjects(eventsDictionary[@"channel"], @"mobile"); + + NSString *trackingEventsString = eventsDictionary[@"tracking_event"]; + XCTAssertNotNil(trackingEventsString); + long long convertedTimeInterval = [trackingEventsString longLongValue]; + // Tests the generated interval is within 1 second of the expected value + XCTAssertEqualWithAccuracy(convertedTimeInterval, currentTime * 1000, 1000); + + NSDictionary *eventParamsDictionary = eventsDictionary[@"event_params"]; + XCTAssertEqualObjects(eventParamsDictionary[@"abc"], self.eventParams[@"abc"]); + XCTAssertEqualObjects(eventParamsDictionary[@"onetwothree"], self.eventParams[@"onetwothree"]); + + // These were other added values passed in the past + XCTAssertNotNil(eventParamsDictionary[@"g"]); + XCTAssertNotNil(eventParamsDictionary[@"t"]); + + long long gmtOffsetInMilliseconds = [eventParamsDictionary[@"g"] integerValue] * 60 * 1000; + XCTAssertEqualWithAccuracy( + convertedTimeInterval, + gmtOffsetInMilliseconds + [eventParamsDictionary[@"t"] longLongValue], + 1000 + ); + + XCTAssertEqualObjects(eventParamsDictionary[@"sv"], @"mobile"); +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/PayPalOneTouch/PPFPTITrackerTest.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/PayPalOneTouch/PPFPTITrackerTest.m new file mode 100644 index 0000000..2a4e5ee --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/PayPalOneTouch/PPFPTITrackerTest.m @@ -0,0 +1,71 @@ +// +// PPFPTITrackerTest.m +// PayPalOneTouch +// +// Copyright © 2015 PayPal, Inc. All rights reserved. +// + +#import + +#import "PPFPTITracker.h" +#import "PPFPTIData.h" +#import "PPOTVersion.h" + +@interface PPFPTITrackerTest : XCTestCase + +@property (nonatomic, copy, readwrite) NSString *deviceID; +@property (nonatomic, copy, readwrite) NSString *sessionID; +@property (nonatomic, strong, readwrite) XCTestExpectation *expectation; + +@end + + +@implementation PPFPTITrackerTest + +- (void)setUp { + [super setUp]; + self.deviceID = @"myDeviceID"; + self.sessionID = @"mySessionID"; + self.expectation = nil; +} + +- (void)tearDown { + self.expectation = nil; + [super tearDown]; +} + +- (void)testDelegateNotSetDoesNotCrash { + PPFPTITracker *tracker = [[PPFPTITracker alloc] initWithDeviceUDID:self.deviceID + sessionID:self.sessionID + networkAdapterDelegate:nil]; + [tracker submitEventWithParams:[NSDictionary dictionary]]; +} + +- (void)testDelegatePassedInformation { + PPFPTITracker *tracker = [[PPFPTITracker alloc] initWithDeviceUDID:self.deviceID + sessionID:self.sessionID + networkAdapterDelegate:self]; + self.expectation = [self expectationWithDescription:@"Expect sendRequestWithData to be called"]; + + [tracker submitEventWithParams:[NSDictionary dictionary]]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +#pragma mark PPFPTINetworkAdapterDelegate methods + +- (void)sendRequestWithData:(nonnull PPFPTIData*)fptiData { + NSString *userAgentPrefix = [NSString stringWithFormat:@"PayPalSDK/OneTouchCore-iOS %@", PayPalOTVersion()]; + XCTAssertTrue([fptiData.userAgent hasPrefix:userAgentPrefix], @"Expect PayPal to be in the prefix to help FPTI"); + XCTAssertEqualObjects(fptiData.trackerURL, [NSURL URLWithString:@"https://api-m.paypal.com/v1/tracking/events"]); + + NSDictionary *dataDictionary = [fptiData dataAsDictionary]; + + NSDictionary *eventsDictionary = dataDictionary[@"events"]; + XCTAssertEqualObjects(eventsDictionary[@"actor"][@"tracking_visitor_id"], self.deviceID); + XCTAssertEqualObjects(eventsDictionary[@"actor"][@"tracking_visit_id"], self.sessionID); + + [self.expectation fulfill]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/PayPalOneTouch/PPOTAppSwitchResponseTest.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/PayPalOneTouch/PPOTAppSwitchResponseTest.m new file mode 100644 index 0000000..47492c8 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/PayPalOneTouch/PPOTAppSwitchResponseTest.m @@ -0,0 +1,85 @@ +// +// PPAppSwitchResponse.m +// PayPalOneTouch +// +// Copyright © 2015 PayPal, Inc. All rights reserved. +// + +#import +#import +#import "PPOTAppSwitchResponse.h" +#import "PPOTEncryptionHelper.h" +#import "PPOTString.h" + +@interface PPOTAppSwitchResponseTest : XCTestCase + +@end + +@implementation PPOTAppSwitchResponseTest + +- (void)test1InvalidHermesResponse { + PPOTAppSwitchResponse *response = [[PPOTAppSwitchResponse alloc] initWithHermesURL:nil environment:nil]; + XCTAssertNil(response); + + + response = [[PPOTAppSwitchResponse alloc] initWithHermesURL:[NSURL URLWithString:@"http"] environment:nil]; + XCTAssertFalse(response.validResponse); + + response = [[PPOTAppSwitchResponse alloc] initWithHermesURL:[NSURL URLWithString:@"http://success"] environment:nil]; + XCTAssertTrue(response.validResponse); + response = [[PPOTAppSwitchResponse alloc] initWithHermesURL:[NSURL URLWithString:@"http://cancel"] environment:nil]; + XCTAssertTrue(response.validResponse); +} + +- (void)testInvalidEncodedURLResponse { + PPOTAppSwitchResponse *response = [[PPOTAppSwitchResponse alloc] initWithEncodedURL:nil encryptionKey:nil]; + XCTAssertNil(response); + NSURL *encodedURL = [NSURL URLWithString:@""]; + response = [[PPOTAppSwitchResponse alloc] initWithEncodedURL:encodedURL encryptionKey:nil]; + XCTAssertFalse(response.validResponse); + encodedURL = [NSURL URLWithString:@"http://success"]; + response = [[PPOTAppSwitchResponse alloc] initWithEncodedURL:encodedURL encryptionKey:nil]; + XCTAssertFalse(response.validResponse); + encodedURL = [NSURL URLWithString:@"http://cancel"]; + response = [[PPOTAppSwitchResponse alloc] initWithEncodedURL:encodedURL encryptionKey:nil]; + // cancel is a cancel + XCTAssertTrue(response.validResponse && response.action == PPAppSwitchResponseActionCancel); + + encodedURL = [NSURL URLWithString:@"http://success?payload=84032840274927rowueoruwohrwlrhwourowr&payloadEnc=8043729742964uoeruwohrkwjr20r82048"]; + response = [[PPOTAppSwitchResponse alloc] initWithEncodedURL:encodedURL encryptionKey:nil]; + XCTAssertFalse(response.validResponse); + // any cancel we don't care about result + encodedURL = [NSURL URLWithString:@"http://cancel?payload=84032840274927rowueoruwohrwlrhwourowr&payloadEnc=8043729742964uoeruwohrkwjr20r82048"]; + response = [[PPOTAppSwitchResponse alloc] initWithEncodedURL:encodedURL encryptionKey:nil]; + XCTAssertTrue(response.validResponse); +} + +- (void)testInvalidEncryptedURLResponse { + NSURL *encodedURL = [NSURL URLWithString:@"http://success?payload=eyJ0ZXN0IjoidGVzdCJ9&payloadEnc=eyJ0ZXN0IjoidGVzdCJ9"]; + PPOTAppSwitchResponse *response = [[PPOTAppSwitchResponse alloc] initWithEncodedURL:encodedURL encryptionKey:@"test"]; + XCTAssertFalse(response.validResponse); + NSData *key = [PPOTEncryptionHelper generate256BitKey]; + NSString *hexKey = [PPOTString hexStringFromData:key]; + response = [[PPOTAppSwitchResponse alloc] initWithEncodedURL:encodedURL encryptionKey:hexKey]; + XCTAssertFalse(response.validResponse); + + encodedURL = [NSURL URLWithString:@"http://success?payload=eyJ0ZXN0IjoidGVzdCJ9==&payloadEnc=eyJ0ZXN0IjoidGVzdCJ9+/80\n"]; + response = [[PPOTAppSwitchResponse alloc] initWithEncodedURL:encodedURL encryptionKey:hexKey]; + XCTAssertFalse(response.validResponse); +} + +- (void)testErrorWithDictionaryAlreadyInResponse { + NSURL *encodedURL = [NSURL URLWithString:@"http://shouldBeError?payload=eyJ2ZXJzaW9uIjozLCJtc2dfR1VJRCI6bnVsbCwicmVzcG9uc2VfdHlwZSI6bnVsbCwiZW52aXJvbm1lbnQiOiJtb2NrIiwiZXJyb3IiOnsiZGVidWdfaWQiOm51bGwsIm1lc3NhZ2UiOiJFbmNyeXB0ZWQgcGF5bG9hZCBoYXMgZXhwaXJlZCJ9LCJsYW5ndWFnZSI6bnVsbH0"]; + PPOTAppSwitchResponse *response = [[PPOTAppSwitchResponse alloc] initWithEncodedURL:encodedURL encryptionKey:nil]; + XCTAssertFalse(response.validResponse); + XCTAssertEqual(response.responseType, PPAppSwitchResponseActionUnknown); + XCTAssertEqual(response.version, 3); + XCTAssertEqual(response.action, PPAppSwitchResponseActionUnknown); + NSLog(@"%@", response.error); + NSDictionary* expectedError = @{ @"message": @"Encrypted payload has expired", @"debug_id": [NSNull null] }; + XCTAssertEqualObjects(response.error, expectedError); + XCTAssertNil(response.msgID); + XCTAssertEqualObjects(response.environment, @"mock"); +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/PayPalOneTouch/PPOTAppSwitchUtilTest.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/PayPalOneTouch/PPOTAppSwitchUtilTest.m new file mode 100644 index 0000000..33873b4 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/PayPalOneTouch/PPOTAppSwitchUtilTest.m @@ -0,0 +1,96 @@ +// +// PayPalTouchCoreTests.m +// PayPalOneTouch +// +// Copyright © 2015 PayPal, Inc. All rights reserved. +// + +#import +#import +#import "PPOTAppSwitchUtil.h" +#import "PPOTJSONHelper.h" + +@interface PPOTAppSwitchUtilTest : XCTestCase + +@end + +@implementation PPOTAppSwitchUtilTest + +- (void)testAppSwitchNotPossible { + BOOL possible = [PPOTAppSwitchUtil isCallbackURLSchemeValid:@"com.scheme.bla"]; + XCTAssertFalse(possible, @"app switch should not be possible when unit tests running"); +} + +- (void)testParseQueryTest { + NSString *quearyToTest = nil; + NSDictionary *parseQueryStringDict = [PPOTAppSwitchUtil parseQueryString:quearyToTest]; + XCTAssertFalse(parseQueryStringDict.count, @"count should be 0"); + + quearyToTest = @""; + parseQueryStringDict = [PPOTAppSwitchUtil parseQueryString:quearyToTest]; + XCTAssertFalse(parseQueryStringDict.count, @"count should be 0"); + + quearyToTest = @"&"; + parseQueryStringDict = [PPOTAppSwitchUtil parseQueryString:quearyToTest]; + XCTAssertFalse(parseQueryStringDict.count, @"count should be 0"); + + quearyToTest = @"?"; + parseQueryStringDict = [PPOTAppSwitchUtil parseQueryString:quearyToTest]; + XCTAssertFalse(parseQueryStringDict.count, @"count should be 0"); + + quearyToTest = @"hello&"; + parseQueryStringDict = [PPOTAppSwitchUtil parseQueryString:quearyToTest]; + XCTAssertFalse(parseQueryStringDict.count, @"count should be 0"); + + quearyToTest = @"hello&hello"; + parseQueryStringDict = [PPOTAppSwitchUtil parseQueryString:quearyToTest]; + XCTAssertFalse(parseQueryStringDict.count, @"count should be 0"); + + quearyToTest = @"&hello"; + parseQueryStringDict = [PPOTAppSwitchUtil parseQueryString:quearyToTest]; + XCTAssertFalse(parseQueryStringDict.count, @"count should be 0"); + + quearyToTest = @"&=hello"; + parseQueryStringDict = [PPOTAppSwitchUtil parseQueryString:quearyToTest]; + XCTAssertFalse(parseQueryStringDict.count, @"count should be 0"); + + quearyToTest = @"hello=hello"; + parseQueryStringDict = [PPOTAppSwitchUtil parseQueryString:quearyToTest]; + XCTAssertTrue(parseQueryStringDict.count == 1, @"count should be 0"); + + quearyToTest = @"&hello=hello"; + parseQueryStringDict = [PPOTAppSwitchUtil parseQueryString:quearyToTest]; + XCTAssertTrue(parseQueryStringDict.count == 1, @"count should be 0"); + + quearyToTest = @"&hello=hello"; + parseQueryStringDict = [PPOTAppSwitchUtil parseQueryString:quearyToTest]; + XCTAssertTrue(parseQueryStringDict.count == 1, @"count should be 0"); +} + +- (void)testJsonEncodingDecoding { + NSDictionary *dict1 = @{@"key1": @1, @"key2": @"some.strings", @"key2": @{@"dict1": @"value"}, @"key3": @[@"el1", @"el2"]}; + + NSString *encoded = [PPOTJSONHelper base64EncodedJSONStringWithDictionary:dict1]; + + NSDictionary *dict2 = [PPOTJSONHelper dictionaryWithBase64EncodedJSONString:encoded]; + + XCTAssertEqualObjects(dict1, dict2, @"dictionaries must be the same"); +} + +// TODO: Test fails with PayPal OneTouchCoreSDK: callback URL scheme must start with com.braintreepayments.demo +- (void)pendURLAction { + NSString *urlTest = @"com.test.mytest://test?payload=e30%3D&x-source=(null)&x-success=com.test.callback://success&x-cancel=com.test.callback://cancel"; + NSURL *urlAction = [PPOTAppSwitchUtil URLAction:@"test" targetAppURLScheme:@"com.test.mytest" callbackURLScheme:@"com.test.callback" payload:@{}]; + XCTAssertNotNil(urlAction, @"action should not be nil"); + XCTAssertEqualObjects([urlAction absoluteString], urlTest, @"links should be the same"); +} + +- (void)testInvalidURL { + XCTAssertFalse([PPOTAppSwitchUtil isValidURLAction:nil], @"should fail"); + + NSString *urlTest = @"com.test.mytest://test?payload=e30%3D&x-source=(null)&x-success=com.test.callback://success&x-cancel=com.test.callback://cancel"; + NSURL *url = [NSURL URLWithString:urlTest]; + XCTAssertFalse([PPOTAppSwitchUtil isValidURLAction:url], @"should fail"); +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/PayPalOneTouch/PPOTConfigurationTest.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/PayPalOneTouch/PPOTConfigurationTest.m new file mode 100644 index 0000000..ef4c784 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/PayPalOneTouch/PPOTConfigurationTest.m @@ -0,0 +1,296 @@ +// +// PPOTConfigurationTest.m +// PayPalOneTouch +// +// Copyright © 2015 PayPal, Inc. All rights reserved. +// + +#import +#import +#import "PPOTConfiguration.h" + +@interface PPOTConfigurationTest : XCTestCase + +@end + +@implementation PPOTConfigurationTest + +- (void)testPPOTConfiguration_whenBadOS_returnsNilConfig { + PPOTConfiguration *configuration = [PPOTConfiguration configurationWithDictionary: + @{@"os": @"Android", + @"file_timestamp": @"2014-12-19T16:39:57-08:00", + @"1.0": @{ + } + }]; + XCTAssertNil(configuration); +} + +- (void)testPPOTConfiguration_whenMissingExpectedVersion_returnsNilConfig { + PPOTConfiguration *configuration = [PPOTConfiguration configurationWithDictionary: + @{@"os": @"iOS", + @"file_timestamp": @"2014-12-19T16:39:57-08:00", + @"2.0": @{ + @"oauth2_recipes_in_decreasing_priority_order": @[ + ], + } + }]; + XCTAssertNil(configuration); +} + +- (void)testPPOTConfiguration_whenMultipleVersions_processesExpectedVersionCorrectly { + PPOTConfiguration *configuration = [PPOTConfiguration configurationWithDictionary: + @{@"os": @"iOS", + @"file_timestamp": @"2014-12-19T16:39:57-08:00", + @"1.0": @{ + @"oauth2_recipes_in_decreasing_priority_order": @[ + ], + }, + @"2.0": @{ + @"foo": @[ + ], + } + }]; + XCTAssertNotNil(configuration); + XCTAssertNotNil(configuration.prioritizedOAuthRecipes); + XCTAssertEqual([configuration.prioritizedOAuthRecipes count], (NSUInteger)0); +} + + +- (void)testPPOTConfiguration_whenNoOAuthConfigRecipe_loadsConfigWithZeroRecipes { + PPOTConfiguration *configuration = [PPOTConfiguration configurationWithDictionary: + @{@"os": @"iOS", + @"file_timestamp": @"2014-12-19T16:39:57-08:00", + @"1.0": @{ + @"oauth2_recipes_in_decreasing_priority_order": @[ + ], + } + }]; + XCTAssertNotNil(configuration); + XCTAssertNotNil(configuration.prioritizedOAuthRecipes); + XCTAssertEqual([configuration.prioritizedOAuthRecipes count], (NSUInteger)0); +} + +- (void)testPPOTConfiguration_whenGoodOAuthConfigRecipes_loadsMultipleRecipes { + PPOTConfiguration *configuration = [PPOTConfiguration configurationWithDictionary: + @{@"os": @"iOS", + @"file_timestamp": @"2014-12-19T16:39:57-08:00", + @"1.0": @{ + @"oauth2_recipes_in_decreasing_priority_order": @[ + @{ + @"protocol": @"2", + @"target": @"wallet", + @"scope": @[@"*"], + @"scheme": @"com.paypal.ppclient.touch.v2", + @"applications": @[@"com.paypal.ppclient", @"com.yourcompany.ppclient"], + }, + @{ + @"protocol": @"0", + @"target": @"browser", + @"scope": @[@"*"], + }, + ], + } + }]; + XCTAssertNotNil(configuration); + XCTAssertNotNil(configuration.prioritizedOAuthRecipes); + XCTAssertEqual([configuration.prioritizedOAuthRecipes count], (NSUInteger)2); + XCTAssert([configuration.prioritizedOAuthRecipes[0] isKindOfClass:[PPOTConfigurationOAuthRecipe class]]); + XCTAssert([configuration.prioritizedOAuthRecipes[1] isKindOfClass:[PPOTConfigurationOAuthRecipe class]]); +} + +- (void)testPPOTConfiguration_whenConfigRecipeWithUnknownTargetInList_onlyLoadsRecognizedRecipes { + PPOTConfiguration *configuration = [PPOTConfiguration configurationWithDictionary: + @{@"os": @"iOS", + @"file_timestamp": @"2014-12-19T16:39:57-08:00", + @"1.0": @{ + @"oauth2_recipes_in_decreasing_priority_order": @[ + @{ + @"target": @"UNKNOWN TARGET", + @"protocol": @"0", + @"scope": @[@"*"], + @"scheme": @"com.paypal.ppclient.touch.v2", + @"applications": @[@"com.paypal.ppclient", @"com.yourcompany.ppclient"], + }, + @{ + @"protocol": @"0", + @"target": @"browser", + @"scope": @[@"*"], + }, + ], + } + }]; + XCTAssertNotNil(configuration); + XCTAssertNotNil(configuration.prioritizedOAuthRecipes); + XCTAssertEqual([configuration.prioritizedOAuthRecipes count], (NSUInteger)1); + XCTAssert([configuration.prioritizedOAuthRecipes[0] isKindOfClass:[PPOTConfigurationOAuthRecipe class]]); + + PPOTConfigurationOAuthRecipe *oauthRecipe = (PPOTConfigurationOAuthRecipe *)configuration.prioritizedOAuthRecipes[0]; + XCTAssertEqual(oauthRecipe.target, PPOTRequestTargetBrowser); + XCTAssertEqualObjects(oauthRecipe.scope, [NSSet setWithObject:@"*"]); + XCTAssertEqualObjects(oauthRecipe.protocolVersion, @0); +} + +- (void)testPPOTConfiguration_whenConfigRecipeWithUnknownProtocolInList_onlyLoadsRecognizedRecipes { + PPOTConfiguration *configuration = [PPOTConfiguration configurationWithDictionary: + @{@"os": @"iOS", + @"file_timestamp": @"2014-12-19T16:39:57-08:00", + @"1.0": @{ + @"oauth2_recipes_in_decreasing_priority_order": @[ + @{ + @"target": @"UNKNOWN TARGET", + @"protocol": @"9999", + @"scope": @[@"*"], + @"scheme": @"com.paypal.ppclient.touch.v2", + @"applications": @[@"com.paypal.ppclient", @"com.yourcompany.ppclient"], + }, + @{ + @"protocol": @"0", + @"target": @"browser", + @"scope": @[@"*"], + }, + ], + } + }]; + XCTAssertNotNil(configuration); + XCTAssertNotNil(configuration.prioritizedOAuthRecipes); + XCTAssertEqual([configuration.prioritizedOAuthRecipes count], (NSUInteger)1); + XCTAssert([configuration.prioritizedOAuthRecipes[0] isKindOfClass:[PPOTConfigurationOAuthRecipe class]]); + + PPOTConfigurationOAuthRecipe *oauthRecipe = (PPOTConfigurationOAuthRecipe *)configuration.prioritizedOAuthRecipes[0]; + XCTAssertEqual(oauthRecipe.target, PPOTRequestTargetBrowser); + XCTAssertEqualObjects(oauthRecipe.scope, [NSSet setWithObject:@"*"]); + XCTAssertEqualObjects(oauthRecipe.protocolVersion, @0); +} + +- (void)testPPOTConfiguration_whenOAuthConfigRecipeWithMissingScopeInList_onlyLoadsRecognizedRecipes { + PPOTConfiguration *configuration = [PPOTConfiguration configurationWithDictionary: + @{@"os": @"iOS", + @"file_timestamp": @"2014-12-19T16:39:57-08:00", + @"1.0": @{ + @"oauth2_recipes_in_decreasing_priority_order": @[ + @{ + @"target": @"wallet", + @"scheme": @"com.paypal.ppclient.touch.v2", + @"applications": @[@"com.paypal.ppclient", @"com.yourcompany.ppclient"], + }, + @{ + @"target": @"browser", + @"protocol": @"0", + @"scope": @[@"*"], + } + ], + } + }]; + + XCTAssertNotNil(configuration); + XCTAssertNotNil(configuration.prioritizedOAuthRecipes); + XCTAssertEqual([configuration.prioritizedOAuthRecipes count], (NSUInteger)1); + XCTAssert([configuration.prioritizedOAuthRecipes[0] isKindOfClass:[PPOTConfigurationOAuthRecipe class]]); + + PPOTConfigurationOAuthRecipe *oauthRecipe = (PPOTConfigurationOAuthRecipe *)configuration.prioritizedOAuthRecipes[0]; + XCTAssertEqual(oauthRecipe.target, PPOTRequestTargetBrowser); + XCTAssertEqualObjects(oauthRecipe.scope, [NSSet setWithObject:@"*"]); + XCTAssertEqualObjects(oauthRecipe.protocolVersion, @0); +} + +- (void)testPPOTConfiguration_whenBrowserRecipeWithMissingURLInProtocol3List_onlyLoadsRecognizedRecipes { + PPOTConfiguration *configuration = [PPOTConfiguration configurationWithDictionary: + @{@"os": @"iOS", + @"file_timestamp": @"2014-12-19T16:39:57-08:00", + @"1.0": @{ + @"oauth2_recipes_in_decreasing_priority_order": @[ + @{ + @"target": @"wallet", + @"scope": @[@"*"], + @"protocol": @"1", + @"scheme": @"com.paypal.ppclient.touch.v9999", + @"applications": @[@"com.paypal.ppclient", @"com.yourcompany.ppclient"], + }, + @{ + @"target": @"browser", + @"protocol": @"3", + @"scope": @[@"*"], + }, + ], + } + }]; + + XCTAssertNotNil(configuration); + XCTAssertNotNil(configuration.prioritizedOAuthRecipes); + XCTAssertEqual([configuration.prioritizedOAuthRecipes count], (NSUInteger)1); + XCTAssert([configuration.prioritizedOAuthRecipes[0] isKindOfClass:[PPOTConfigurationOAuthRecipe class]]); + + PPOTConfigurationOAuthRecipe *oauthRecipe = (PPOTConfigurationOAuthRecipe *)configuration.prioritizedOAuthRecipes[0]; + XCTAssertEqual(oauthRecipe.target, PPOTRequestTargetOnDeviceApplication); + XCTAssertEqualObjects(oauthRecipe.scope, [NSSet setWithObject:@"*"]); + XCTAssertEqualObjects(oauthRecipe.protocolVersion, @1); + XCTAssertEqualObjects(oauthRecipe.targetAppURLScheme, @"com.paypal.ppclient.touch.v9999"); + NSArray *expectedTargetAppBundleIDs = @[@"com.paypal.ppclient", @"com.yourcompany.ppclient"]; + XCTAssertEqualObjects(oauthRecipe.targetAppBundleIDs, expectedTargetAppBundleIDs); +} + +- (void)testPPOTConfiguration_whenDifferentBadConfigRecipes_stillLoadsAllGoodRecipes { + // Expected 1 OAuth, 1 Checkout Recipe + PPOTConfiguration *configuration = [PPOTConfiguration configurationWithDictionary: + @{@"os": @"iOS", + @"file_timestamp": @"2014-12-19T16:39:57-08:00", + @"1.0": @{ + @"checkout_recipes_in_decreasing_priority_order": @[ + @{ + @"target": @"browser", + @"protocol": @"9999", + // Unrecognized Protocol Version + }, + @{ + @"target": @"wallet", + @"protocol": @"3", + @"scheme": @"com.paypal.ppclient.touch.v3", + @"applications": @[@"com.paypal.ppclient", @"com.yourcompany.ppclient"], + }, + ], + @"oauth2_recipes_in_decreasing_priority_order": @[ + @{ + @"protocol": @"1", + @"target": @"wallet", + @"scope": @[@"*"], + @"scheme": @"com.paypal.ppclient.touch.v2", + @"applications": @[@"com.paypal.ppclient", @"com.yourcompany.ppclient"], + }, + @{ + @"protocol": @"3", + @"target": @"browser", + @"scope": @[@"*"], + // Missing URL in scope for protocol version 3 + }, + ], + }, + }]; + + XCTAssertNotNil(configuration); + + XCTAssertNotNil(configuration.prioritizedOAuthRecipes); + XCTAssertEqual([configuration.prioritizedOAuthRecipes count], (NSUInteger)1); + XCTAssert([configuration.prioritizedOAuthRecipes[0] isKindOfClass:[PPOTConfigurationOAuthRecipe class]]); + + PPOTConfigurationOAuthRecipe *oauthRecipe = (PPOTConfigurationOAuthRecipe *)configuration.prioritizedOAuthRecipes[0]; + XCTAssertEqual(oauthRecipe.target, PPOTRequestTargetOnDeviceApplication); + XCTAssertEqualObjects(oauthRecipe.scope, [NSSet setWithObject:@"*"]); + XCTAssertEqualObjects(oauthRecipe.protocolVersion, @1); + XCTAssertEqualObjects(oauthRecipe.targetAppURLScheme, @"com.paypal.ppclient.touch.v2"); + NSArray *expectedTargetAppBundleIDs = @[@"com.paypal.ppclient", @"com.yourcompany.ppclient"]; + XCTAssertEqualObjects(oauthRecipe.targetAppBundleIDs, expectedTargetAppBundleIDs); + + XCTAssertNotNil(configuration.prioritizedCheckoutRecipes); + XCTAssertEqual([configuration.prioritizedCheckoutRecipes count], (NSUInteger)1); + XCTAssert([configuration.prioritizedCheckoutRecipes[0] isKindOfClass:[PPOTConfigurationCheckoutRecipe class]]); + + PPOTConfigurationCheckoutRecipe *checkoutRecipe = (PPOTConfigurationCheckoutRecipe *)configuration.prioritizedCheckoutRecipes[0]; + XCTAssertEqual(checkoutRecipe.target, PPOTRequestTargetOnDeviceApplication); + XCTAssertEqualObjects(checkoutRecipe.protocolVersion, @3); + XCTAssertEqualObjects(checkoutRecipe.targetAppURLScheme, @"com.paypal.ppclient.touch.v3"); + expectedTargetAppBundleIDs = @[@"com.paypal.ppclient", @"com.yourcompany.ppclient"]; + XCTAssertEqualObjects(checkoutRecipe.targetAppBundleIDs, expectedTargetAppBundleIDs); +} + + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/PayPalOneTouch/PPOTEncryptionTest.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/PayPalOneTouch/PPOTEncryptionTest.m new file mode 100644 index 0000000..3a390fa --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/PayPalOneTouch/PPOTEncryptionTest.m @@ -0,0 +1,149 @@ +// +// PPOTEncryptionTest.m +// PayPalOneTouch +// +// Copyright © 2015 PayPal, Inc. All rights reserved. +// + +#import +#import +#import "PPOTEncryptionHelper.h" +#import "PPOTJSONHelper.h" +#import "PPOTString.h" + +@interface PPOTEncryptionTest : XCTestCase + +@end + +@implementation PPOTEncryptionTest + +- (void)setUp { + [super setUp]; + // Put setup code here. This method is called before the invocation of each test method in the class. +} + +- (void)tearDown { + // Put teardown code here. This method is called after the invocation of each test method in the class. + [super tearDown]; +} + ++ (NSData *)randomData:(NSUInteger)length { + NSMutableData *randomKey = [NSMutableData dataWithLength:length]; + int error = SecRandomCopyBytes(kSecRandomDefault, length, [randomKey mutableBytes]); + return (error == 0) ? randomKey : nil; +} + +- (void)testEncryptionMultiple { + for (uint i=1; i<8*1024; i++) { + NSData *plainData = [[self class] randomData:i]; + NSData *key = [PPOTEncryptionHelper generate256BitKey]; + NSData *cipherData = [PPOTEncryptionHelper encryptAESCTRData:plainData encryptionKey:key]; + XCTAssertNotEqualObjects(plainData, cipherData); + + NSData *outData = [PPOTEncryptionHelper decryptAESCTRData:cipherData encryptionKey:key]; + XCTAssertEqualObjects(outData, plainData); + } +} + +- (void)testRandomKeyGenerator { + NSInteger numberOfKeys = 10; + NSMutableArray *array = [NSMutableArray arrayWithCapacity:numberOfKeys]; + for (NSInteger i = 0; i < numberOfKeys; i++) { + NSData *key = [PPOTEncryptionHelper generate256BitKey]; + XCTAssertTrue(key.length == 32); + XCTAssertNotNil(key); + XCTAssertFalse([array containsObject:key]); + [array addObject:key]; + } +} + +- (void)testHexFunction { + NSString *hexStringExpected = @"68656C6C6F"; + NSString *string = @"hello"; + NSString *hexString = [PPOTString hexStringFromData:[string dataUsingEncoding:NSUTF8StringEncoding]]; + XCTAssertEqualObjects(hexString, [hexStringExpected uppercaseString]); + + NSData *data = [PPOTString dataWithHexString:hexString]; + XCTAssertEqualObjects(data, [string dataUsingEncoding:NSUTF8StringEncoding]); +} + +- (void)testEncryption { + NSString *plainData = @"Trust me i am an Engineer !"; + NSData *key = [PPOTEncryptionHelper generate256BitKey]; + NSData *cipherData = [PPOTEncryptionHelper encryptAESCTRData:[plainData dataUsingEncoding:NSUTF8StringEncoding] encryptionKey:key]; + XCTAssertNotEqualObjects([plainData dataUsingEncoding:NSUTF8StringEncoding], cipherData); + + NSData *outData = [PPOTEncryptionHelper decryptAESCTRData:cipherData encryptionKey:key]; + NSString *expectedData = [[NSString alloc] initWithData:outData encoding:NSUTF8StringEncoding]; + XCTAssertEqualObjects(expectedData, plainData); +} + +- (void)testRealPayloadDecryption { + NSString *cipherText = @"WTn6Ww9s7KCwu3QUPVe05stH01hy4easqZeR71E7tXKIuEOMWxuara26u3VHACpRGHHxO3SSn+1WbCLRCwI6UCxbUkYl5eWN1TVpQ7a4FvDDkbhH7fSZz/DjENLo9Ap5w/EQ2PyrQt00fkxjf2HW/W2r/SI3GRL/KKu7rCRIjcEgr3RAsqTrDILOhx2ASo99YCSpzETlILqOF7p4bDGzwy5L8AeQcSgDIFqtvhzL6gbud2A90KpRIb5b+ftbf+RCRkW1NSEC/Vb+0MHyFNGJCnSOgz9t3cn/kuF+uQgozsAkTE+PmFSrBvtPag5AKQAgM44E"; + NSData *key = [PPOTString dataWithHexString:@"9b30e222b129c989547f1a6ab6022e2bd191a0217f2efcbf891f3eb07990582c"]; + NSString *message = @"{\"payment_code_type\":\"authcode\",\"payment_code\":\"XXXXX\",\"timestamp\":\"2015-01-16T19:20:30.45+01:00\",\"expires_in\":900,\"scope\":\"\",\"display_name\":\"mockDisplayName\",\"email\":\"mockemailaddress@mock.com\"}"; + + NSData *cipherData = [[NSData alloc] initWithBase64EncodedString:cipherText options:NSDataBase64DecodingIgnoreUnknownCharacters]; + NSData *plainData = [PPOTEncryptionHelper decryptAESCTRData:cipherData encryptionKey:key]; + // decode base64 + NSString *plainString = [[NSString alloc] initWithData:plainData encoding:NSUTF8StringEncoding]; + XCTAssertTrue(plainString); + XCTAssertEqualObjects(plainData, [message dataUsingEncoding:NSUTF8StringEncoding]); +} + + +- (void)testPublicKeyImport { + + // openssl req -x509 -out public_key2.crt -outform DER -new -newkey rsa:2048 -keyout private_key2.pem -keyform DER + + NSString *cert = @"MIIDOzCCAiOgAwIBAgIJAMlvCS4UtR7PMA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAlVTMREwDwYDVQQIDAhJbGxpbm9pczESMBAGA1UECgwJQnJhaW50cmVlMB4XDTE1MDMyMDAxMTcyMVoXDTE2MDMxOTAxMTcyMVowNDELMAkGA1UEBhMCVVMxETAPBgNVBAgMCElsbGlub2lzMRIwEAYDVQQKDAlCcmFpbnRyZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDfCRhOGeMj4ci5Bbbs/x0G+PkbeL7iGEsX5UWQeA8oCWU8jpipFTC271Q0f5BQzXCN8L4LnwGvtm2cgAEivSBODo7XHsmxrFjKdQx1S7FIuFRKO18Uf8rIGmZHiJfhCbUEGilpwMt7hUMjjv2XDufPCMrJ8Yn2y/yDi5nhs7UsFhROm9oI2PyiJX01yR2ag8cPBb5Ahlwmj1yMWmSuHVnUN8T0rjIXyrBhxTAk3omQkQdHKj2w8afdrAcNUGi4yU/a5/pmb8tZpAa73OZVdOEQepJAAIRWXeS2BdKTkhfRJc7WEIlbi+9a2OdtM3OkIs+rZE7+WVT8XQoiLxpUd/wNAgMBAAGjUDBOMB0GA1UdDgQWBBQhbJ8DtuKFhGTsrvZ41Vw5jYbmazAfBgNVHSMEGDAWgBQhbJ8DtuKFhGTsrvZ41Vw5jYbmazAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQARg2wjhJanhKu1bw63+Xfj25OUa02jK+i4vhkWeuCGd5/kxA1dZMjBfSMxh484xBpaqRIOHvZmRpKcxCgci8xRbbJiaXrb1vIePTTi4lfU6cpfsnjMFCHDk8E/0AxIfOpQ0BSJY35WqB45xaIWBAY8lQ2pNfiPyK4kzajSOg+kbEKLmA0udYy8tsydt+88+R88rYKt4qDBo+Z5zgJ2fZvbAp99cBASHqMCoUoPb96YWEhaWhjArVGzgevpopKA9aOAFdndPKLbe6y29bbfLfQqat0B1fVmutCIHGIXtsPHQDe/cXJtoJk7HmD08++C9YvjxlSi8jxLb5nIA0QGI0yj"; + + NSData *certData = [[NSData alloc] initWithBase64EncodedString:cert options:NSDataBase64DecodingIgnoreUnknownCharacters]; + + NSString *plainText = @"hello"; + NSData *cipherText = [PPOTEncryptionHelper encryptRSAData:[plainText dataUsingEncoding:NSUTF8StringEncoding] certificate:certData]; + XCTAssertTrue(cipherText); + NSString *base64 = [cipherText base64EncodedStringWithOptions:0]; + XCTAssertTrue(base64); +} + + +- (void)testPublicKeyEncryption { + + // openssl req -x509 -out public_key2.crt -outform DER -new -newkey rsa:2048 -keyout private_key2.pem -keyform DER + + NSString *cert = @"MIIDOzCCAiOgAwIBAgIJAMlvCS4UtR7PMA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAlVTMREwDwYDVQQIDAhJbGxpbm9pczESMBAGA1UECgwJQnJhaW50cmVlMB4XDTE1MDMyMDAxMTcyMVoXDTE2MDMxOTAxMTcyMVowNDELMAkGA1UEBhMCVVMxETAPBgNVBAgMCElsbGlub2lzMRIwEAYDVQQKDAlCcmFpbnRyZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDfCRhOGeMj4ci5Bbbs/x0G+PkbeL7iGEsX5UWQeA8oCWU8jpipFTC271Q0f5BQzXCN8L4LnwGvtm2cgAEivSBODo7XHsmxrFjKdQx1S7FIuFRKO18Uf8rIGmZHiJfhCbUEGilpwMt7hUMjjv2XDufPCMrJ8Yn2y/yDi5nhs7UsFhROm9oI2PyiJX01yR2ag8cPBb5Ahlwmj1yMWmSuHVnUN8T0rjIXyrBhxTAk3omQkQdHKj2w8afdrAcNUGi4yU/a5/pmb8tZpAa73OZVdOEQepJAAIRWXeS2BdKTkhfRJc7WEIlbi+9a2OdtM3OkIs+rZE7+WVT8XQoiLxpUd/wNAgMBAAGjUDBOMB0GA1UdDgQWBBQhbJ8DtuKFhGTsrvZ41Vw5jYbmazAfBgNVHSMEGDAWgBQhbJ8DtuKFhGTsrvZ41Vw5jYbmazAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQARg2wjhJanhKu1bw63+Xfj25OUa02jK+i4vhkWeuCGd5/kxA1dZMjBfSMxh484xBpaqRIOHvZmRpKcxCgci8xRbbJiaXrb1vIePTTi4lfU6cpfsnjMFCHDk8E/0AxIfOpQ0BSJY35WqB45xaIWBAY8lQ2pNfiPyK4kzajSOg+kbEKLmA0udYy8tsydt+88+R88rYKt4qDBo+Z5zgJ2fZvbAp99cBASHqMCoUoPb96YWEhaWhjArVGzgevpopKA9aOAFdndPKLbe6y29bbfLfQqat0B1fVmutCIHGIXtsPHQDe/cXJtoJk7HmD08++C9YvjxlSi8jxLb5nIA0QGI0yj"; + + NSData *certData = [[NSData alloc] initWithBase64EncodedString:cert options:NSDataBase64DecodingIgnoreUnknownCharacters]; + + NSString *expectedCipher = @"ZgzjmDx5iD6ogzpiIB9bl2C08pscYQ+8gV8VbRbo2kZiNYj4WBh4rmMWnsADVpXj1JS0xq9HmuQhomm5KUewfEZRTNdk09hI1hWtU+cPucd4gwI7mmqzNUFbfPSMPtWTB2yFSDIiJ1K7XN0C1d5NnfbsI0rxUSxCpgP7S+ckEaWH4uqzV9NFIsplmj+4yBQokngk7j5fn9QcsSylKCBq7rp3Z1Wg/qA5tVPj9osZYwr29kot6onDtajJkl/7ZYxuRrQkqXi5QY2CPvN8A8WpEaMwy0EwZUAB7RZjBAHlKxDZXNRjgfzT+vpnwF+gzebP+k4H44/1wGecSuGYrU+l9Q=="; + + NSString *plainText = @"{\"sym_key\": \"9a51aed0da8fb363933efc0f739df5dfbcba34b2e1ea8337f6d5dc1cbd61ced4\", \"some\": \"other_stuff\"}"; + NSData *cipherText = [PPOTEncryptionHelper encryptRSAData:[plainText dataUsingEncoding:NSUTF8StringEncoding] certificate:certData]; + XCTAssertTrue(cipherText); + NSString *base64 = [cipherText base64EncodedStringWithOptions:0]; + XCTAssertTrue(base64); + XCTAssertNotEqualObjects(base64, expectedCipher); +} + +- (void)testAESCTREncryptionDecryption { + NSString *plainData = @"Trust me i am an Engineer !"; + NSData *key = [[self class] randomData:32]; + NSData *cipherData = [PPOTEncryptionHelper encryptAESCTRData:[plainData dataUsingEncoding:NSUTF8StringEncoding] encryptionKey:key]; + XCTAssertNotEqualObjects([plainData dataUsingEncoding:NSUTF8StringEncoding], cipherData, @"data shouldn't match"); + + NSData *outData = [PPOTEncryptionHelper decryptAESCTRData:cipherData encryptionKey:key]; + NSString *expectedData = [[NSString alloc] initWithData:outData encoding:NSUTF8StringEncoding]; + XCTAssertEqualObjects(expectedData, plainData, @"data should match"); +} + + +- (void)testPythonCTRDecryption { + NSData *cipherText = [[NSData alloc] initWithBase64EncodedString:@"O4ibtOnGreHg1UGcJen7OFOlT/qdBo/3h8Gvc1Jibgj31UGbH+G3ottYCuwHeyJXYX5ubtr8O1SXAoy3X4IEq6o1oPFMJRP8/D5PI0qhexBTXsEEJvuRDlEV/Rcl" options:NSDataBase64DecodingIgnoreUnknownCharacters]; + NSData *key = [PPOTString dataWithHexString:@"dc6d0e61c0a3cd187dd0e41f455effdac77c23c95c2cfcb81993916ab19c0e09"]; + NSData *outData = [PPOTEncryptionHelper decryptAESCTRData:cipherText encryptionKey:key]; + NSString *message = @"A really secret message. Not for prying eyes."; + XCTAssertEqualObjects([message dataUsingEncoding:NSUTF8StringEncoding], outData, @"message should be the same"); +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/PayPalOneTouch/PPOTErrorTest.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/PayPalOneTouch/PPOTErrorTest.m new file mode 100644 index 0000000..1fb7ec8 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/PayPalOneTouch/PPOTErrorTest.m @@ -0,0 +1,34 @@ +// +// PPOTErrorTest.m +// PayPalOneTouch +// +// Copyright © 2015 PayPal, Inc. All rights reserved. +// + +#import +#import "PPOTError.h" + +@interface PPOTErrorTest : XCTestCase + +@end + +@implementation PPOTErrorTest + +- (void)testPPErrorWithErrorCode { + NSError *error = [PPOTError errorWithErrorCode:PPOTErrorCodeNoTargetAppFound]; + XCTAssertEqualObjects(error.domain, kPayPalOneTouchErrorDomain); + XCTAssertEqual(error.code, PPOTErrorCodeNoTargetAppFound); + XCTAssertEqualObjects(error.userInfo, [NSDictionary dictionary]); + +} + +- (void)testPPErrorWithErrorCodeAndUserInfo { + NSDictionary *dict = @{ @"k" : @"v"}; + NSError *error = [PPOTError errorWithErrorCode:PPOTErrorCodeNoTargetAppFound + userInfo:dict]; + XCTAssertEqualObjects(error.domain, kPayPalOneTouchErrorDomain); + XCTAssertEqual(error.code, PPOTErrorCodeNoTargetAppFound); + XCTAssertEqualObjects(error.userInfo, dict); +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/PayPalOneTouch/PPOTTimeTest.m b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/PayPalOneTouch/PPOTTimeTest.m new file mode 100644 index 0000000..2dc5ff8 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/PayPalOneTouch/PPOTTimeTest.m @@ -0,0 +1,43 @@ +// +// PPOTTimeTest.m +// PayPalOneTouch +// +// Copyright © 2015 PayPal, Inc. All rights reserved. +// + +#import +#import "PPOTTime.h" + +@interface PPOTTimeTest : XCTestCase + +@end + +@implementation PPOTTimeTest + +- (void)testRFC3339DateConversion { + NSDate *date = [NSDate date]; + NSString *dateAsString = [[PPOTTime rfc3339DateFormatter] stringFromDate:date]; + NSDate *dateFromRFC3339String = [PPOTTime dateFromRFC3339LikeString:dateAsString]; + // Within 1 millisecond + XCTAssertEqualWithAccuracy([date timeIntervalSince1970], [dateFromRFC3339String timeIntervalSince1970], 1); +} + +- (void)testRFC3339DateWithMillisecondConversion { + NSDate *date = [NSDate date]; + NSString *dateAsString = [[PPOTTime rfc3339DateFormatter] stringFromDate:date]; + NSString *dateAsStringWithMilliseconds = [NSString stringWithFormat:@"%@.123Z", + [dateAsString substringWithRange:NSMakeRange(0, [dateAsString length] - 1)]]; + NSDate *dateFromRFC3339LikeString = [PPOTTime dateFromRFC3339LikeString:dateAsStringWithMilliseconds]; + // Within 1 millisecond + XCTAssertEqualWithAccuracy([date timeIntervalSince1970], [dateFromRFC3339LikeString timeIntervalSince1970], 1); +} + +- (void)testRFC3339DateNil { + XCTAssertNil([PPOTTime dateFromRFC3339LikeString:nil]); +} + +- (void)testRFC3339DateIllegalString { + XCTAssertNil([PPOTTime dateFromRFC3339LikeString:@"random string"]); +} + +@end diff --git a/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/UnitTests-Bridging-Header.h b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/UnitTests-Bridging-Header.h new file mode 100644 index 0000000..eb614da --- /dev/null +++ b/code/iOS/ScriptorSprint3/Carthage/Checkouts/braintree_ios/UnitTests/UnitTests-Bridging-Header.h @@ -0,0 +1,50 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// + +#import "BraintreeAmericanExpress.h" +#import "BraintreeCore.h" +#import "BraintreeCard.h" +#import "BraintreeApplePay.h" +#import "BraintreePayPal.h" +#import "BraintreeVenmo.h" +#import "Braintree3DSecure.h" +#import "BraintreeDataCollector.h" +#import "BraintreeUI.h" +#import "PayPalOneTouch.h" +#import "BraintreePaymentFlow.h" + +// Internal headers for testing +#import "BTAmericanExpressClient_Internal.h" +#import "BTAPIClient_Internal.h" +#import "BTApplePayClient_Internal.h" +#import "BTCard_Internal.h" +#import "BTCardClient_Internal.h" +#import "BTCardClient+UnionPay.h" +#import "BTCardNonce_Internal.h" +#import "BTConfiguration.h" +#import "BTDataCollector_Internal.h" +#import "BTPayPalDriver_Internal.h" +#import "BTVenmoDriver_Internal.h" +#import "BTThreeDSecureDriver_Internal.h" +#import "BTThreeDSecurePostalAddress_Internal.h" +#import "BTThreeDSecureAuthenticationViewController.h" +#import "BTURLUtils.h" +#import "FakePayPalClasses.h" +#import "BTLogger_Internal.h" +#import "BTFakeHTTP.h" +#import "BTDropInViewController_Internal.h" +#import "BTPaymentButton_Internal.h" +#import "BTThreeDSecureLookupResult.h" +#import "Braintree-Version.h" +#import "PPDataCollector_Internal.h" +#import "BTPaymentFlowDriver_Internal.h" +#import "BTPaymentFlowDriver+LocalPayment_Internal.h" +#import "BTPaymentFlowDriver+ThreeDSecure_Internal.h" +#import "BTDropInUtil.h" +#import "BTAmericanExpressClient_Internal.h" + +#import "BTDropInUtil.h" +#import "BTSpecHelper.h" +#import +#import "BTTestClientTokenFactory.h" diff --git a/code/iOS/ScriptorSprint3/Podfile b/code/iOS/ScriptorSprint3/Podfile new file mode 100644 index 0000000..7c2d356 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Podfile @@ -0,0 +1,6 @@ +target 'ScriptorSprint2' do + +platform :ios, '12.1' +pod 'RestKit' +end + diff --git a/code/iOS/ScriptorSprint3/Podfile.lock b/code/iOS/ScriptorSprint3/Podfile.lock new file mode 100644 index 0000000..6cd39a9 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Podfile.lock @@ -0,0 +1,46 @@ +PODS: + - ISO8601DateFormatterValueTransformer (0.6.1): + - RKValueTransformers (~> 1.1.0) + - RestKit (0.27.3): + - RestKit/Core (= 0.27.3) + - RestKit/Core (0.27.3): + - RestKit/CoreData + - RestKit/Network + - RestKit/ObjectMapping + - RestKit/CoreData (0.27.3): + - RestKit/ObjectMapping + - RestKit/Network (0.27.3): + - RestKit/ObjectMapping + - RestKit/Support + - SOCKit + - RestKit/ObjectMapping (0.27.3): + - ISO8601DateFormatterValueTransformer (~> 0.6.1) + - RestKit/Support + - RKValueTransformers (~> 1.1.0) + - RestKit/Support (0.27.3): + - TransitionKit (~> 2.2) + - RKValueTransformers (1.1.3) + - SOCKit (1.1) + - TransitionKit (2.2.1) + +DEPENDENCIES: + - RestKit + +SPEC REPOS: + https://github.com/cocoapods/specs.git: + - ISO8601DateFormatterValueTransformer + - RestKit + - RKValueTransformers + - SOCKit + - TransitionKit + +SPEC CHECKSUMS: + ISO8601DateFormatterValueTransformer: 52da467d6ec899d6aedda8e48280ac92e8ee97e6 + RestKit: 0baa8b61899d1e00c24f4f2d8aea07ecef0c88bc + RKValueTransformers: e5ed67e3811229b616fe01bddeeafe3bb337b1b9 + SOCKit: c7376ac262bea9115b8f749358f762522a47d392 + TransitionKit: 9ceccda4cd0cdc0a05ef85eb235e5a3292c3c250 + +PODFILE CHECKSUM: 7c4416e6a658366b3f719a8972a0534f27e2dfa4 + +COCOAPODS: 1.6.1 diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/ISO8601DateFormatterValueTransformer/ISO8601DateFormatterValueTransformer.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/ISO8601DateFormatterValueTransformer/ISO8601DateFormatterValueTransformer.h new file mode 120000 index 0000000..932a9db --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/ISO8601DateFormatterValueTransformer/ISO8601DateFormatterValueTransformer.h @@ -0,0 +1 @@ +../../../ISO8601DateFormatterValueTransformer/Code/ISO8601DateFormatterValueTransformer.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/ISO8601DateFormatterValueTransformer/RKISO8601DateFormatter.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/ISO8601DateFormatterValueTransformer/RKISO8601DateFormatter.h new file mode 120000 index 0000000..79788f6 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/ISO8601DateFormatterValueTransformer/RKISO8601DateFormatter.h @@ -0,0 +1 @@ +../../../ISO8601DateFormatterValueTransformer/Code/RKISO8601DateFormatter.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RKValueTransformers/RKValueTransformers.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RKValueTransformers/RKValueTransformers.h new file mode 120000 index 0000000..7768a97 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RKValueTransformers/RKValueTransformers.h @@ -0,0 +1 @@ +../../../RKValueTransformers/Code/RKValueTransformers.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/AFRKHTTPClient.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/AFRKHTTPClient.h new file mode 120000 index 0000000..d0bd9a1 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/AFRKHTTPClient.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/AFNetworking/AFRKHTTPClient.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/AFRKHTTPRequestOperation.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/AFRKHTTPRequestOperation.h new file mode 120000 index 0000000..e45c784 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/AFRKHTTPRequestOperation.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/AFNetworking/AFRKHTTPRequestOperation.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/AFRKImageRequestOperation.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/AFRKImageRequestOperation.h new file mode 120000 index 0000000..2952509 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/AFRKImageRequestOperation.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/AFNetworking/AFRKImageRequestOperation.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/AFRKJSONRequestOperation.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/AFRKJSONRequestOperation.h new file mode 120000 index 0000000..059f3b0 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/AFRKJSONRequestOperation.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/AFNetworking/AFRKJSONRequestOperation.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/AFRKNetworkActivityIndicatorManager.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/AFRKNetworkActivityIndicatorManager.h new file mode 120000 index 0000000..7a603b7 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/AFRKNetworkActivityIndicatorManager.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/AFNetworking/AFRKNetworkActivityIndicatorManager.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/AFRKNetworking.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/AFRKNetworking.h new file mode 120000 index 0000000..3620159 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/AFRKNetworking.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/AFNetworking/AFRKNetworking.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/AFRKPropertyListRequestOperation.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/AFRKPropertyListRequestOperation.h new file mode 120000 index 0000000..d142d60 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/AFRKPropertyListRequestOperation.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/AFNetworking/AFRKPropertyListRequestOperation.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/AFRKURLConnectionOperation.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/AFRKURLConnectionOperation.h new file mode 120000 index 0000000..9e49d82 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/AFRKURLConnectionOperation.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/AFNetworking/AFRKURLConnectionOperation.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/AFRKXMLRequestOperation.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/AFRKXMLRequestOperation.h new file mode 120000 index 0000000..3698abe --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/AFRKXMLRequestOperation.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/AFNetworking/AFRKXMLRequestOperation.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/CoreData.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/CoreData.h new file mode 120000 index 0000000..938f887 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/CoreData.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/NSManagedObject+RKAdditions.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/NSManagedObject+RKAdditions.h new file mode 120000 index 0000000..edb473c --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/NSManagedObject+RKAdditions.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/NSManagedObject+RKAdditions.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/NSManagedObjectContext+RKAdditions.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/NSManagedObjectContext+RKAdditions.h new file mode 120000 index 0000000..94659a5 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/NSManagedObjectContext+RKAdditions.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/NSManagedObjectContext+RKAdditions.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/Network.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/Network.h new file mode 120000 index 0000000..5210a78 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/Network.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/ObjectMapping.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/ObjectMapping.h new file mode 120000 index 0000000..9ca1b53 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/ObjectMapping.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKAttributeMapping.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKAttributeMapping.h new file mode 120000 index 0000000..ae82466 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKAttributeMapping.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKAttributeMapping.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKBooleanClass.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKBooleanClass.h new file mode 120000 index 0000000..0e58b9d --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKBooleanClass.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKBooleanClass.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKConnectionDescription.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKConnectionDescription.h new file mode 120000 index 0000000..013f916 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKConnectionDescription.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/RKConnectionDescription.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKDictionaryUtilities.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKDictionaryUtilities.h new file mode 120000 index 0000000..9032168 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKDictionaryUtilities.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKDictionaryUtilities.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKDotNetDateFormatter.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKDotNetDateFormatter.h new file mode 120000 index 0000000..6159542 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKDotNetDateFormatter.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKDotNetDateFormatter.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKDynamicMapping.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKDynamicMapping.h new file mode 120000 index 0000000..90f004b --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKDynamicMapping.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKDynamicMapping.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKEntityByAttributeCache.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKEntityByAttributeCache.h new file mode 120000 index 0000000..366138b --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKEntityByAttributeCache.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/RKEntityByAttributeCache.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKEntityCache.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKEntityCache.h new file mode 120000 index 0000000..ff48a67 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKEntityCache.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/RKEntityCache.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKEntityMapping.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKEntityMapping.h new file mode 120000 index 0000000..ba2cbe8 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKEntityMapping.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/RKEntityMapping.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKErrorMessage.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKErrorMessage.h new file mode 120000 index 0000000..f43e716 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKErrorMessage.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKErrorMessage.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKErrors.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKErrors.h new file mode 120000 index 0000000..37e7dbd --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKErrors.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKErrors.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKFetchRequestManagedObjectCache.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKFetchRequestManagedObjectCache.h new file mode 120000 index 0000000..d8d9aa7 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKFetchRequestManagedObjectCache.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/RKFetchRequestManagedObjectCache.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKHTTPRequestOperation.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKHTTPRequestOperation.h new file mode 120000 index 0000000..00c2293 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKHTTPRequestOperation.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKHTTPRequestOperation.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKHTTPUtilities.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKHTTPUtilities.h new file mode 120000 index 0000000..3718467 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKHTTPUtilities.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKHTTPUtilities.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKInMemoryManagedObjectCache.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKInMemoryManagedObjectCache.h new file mode 120000 index 0000000..8dfed70 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKInMemoryManagedObjectCache.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/RKInMemoryManagedObjectCache.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKLog.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKLog.h new file mode 120000 index 0000000..c22acca --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKLog.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKLog.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMIMETypeSerialization.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMIMETypeSerialization.h new file mode 120000 index 0000000..421ca18 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMIMETypeSerialization.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKMIMETypeSerialization.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMIMETypes.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMIMETypes.h new file mode 120000 index 0000000..f45960b --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMIMETypes.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKMIMETypes.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMacros.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMacros.h new file mode 120000 index 0000000..454ae98 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMacros.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKMacros.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKManagedObjectCaching.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKManagedObjectCaching.h new file mode 120000 index 0000000..31523bc --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKManagedObjectCaching.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/RKManagedObjectCaching.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKManagedObjectImporter.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKManagedObjectImporter.h new file mode 120000 index 0000000..1393417 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKManagedObjectImporter.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/RKManagedObjectImporter.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKManagedObjectMappingOperationDataSource.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKManagedObjectMappingOperationDataSource.h new file mode 120000 index 0000000..788a3d0 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKManagedObjectMappingOperationDataSource.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/RKManagedObjectMappingOperationDataSource.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKManagedObjectRequestOperation.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKManagedObjectRequestOperation.h new file mode 120000 index 0000000..739dab3 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKManagedObjectRequestOperation.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKManagedObjectRequestOperation.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKManagedObjectStore.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKManagedObjectStore.h new file mode 120000 index 0000000..ba4dc0e --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKManagedObjectStore.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/RKManagedObjectStore.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKManagedObjectStore_Private.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKManagedObjectStore_Private.h new file mode 120000 index 0000000..20d8897 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKManagedObjectStore_Private.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/RKManagedObjectStore_Private.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMapperOperation.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMapperOperation.h new file mode 120000 index 0000000..1040562 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMapperOperation.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKMapperOperation.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMapperOperation_Private.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMapperOperation_Private.h new file mode 120000 index 0000000..6bcb0df --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMapperOperation_Private.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKMapperOperation_Private.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMapping.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMapping.h new file mode 120000 index 0000000..3b44aba --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMapping.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKMapping.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMappingErrors.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMappingErrors.h new file mode 120000 index 0000000..25f3daa --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMappingErrors.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKMappingErrors.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMappingOperation.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMappingOperation.h new file mode 120000 index 0000000..da02eed --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMappingOperation.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKMappingOperation.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMappingOperationDataSource.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMappingOperationDataSource.h new file mode 120000 index 0000000..c7ebdfc --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMappingOperationDataSource.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKMappingOperationDataSource.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMappingResult.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMappingResult.h new file mode 120000 index 0000000..7b57521 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKMappingResult.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKMappingResult.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKNSJSONSerialization.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKNSJSONSerialization.h new file mode 120000 index 0000000..7fe2ef6 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKNSJSONSerialization.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKNSJSONSerialization.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKObjectManager.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKObjectManager.h new file mode 120000 index 0000000..a73f83b --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKObjectManager.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKObjectManager.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKObjectMapping.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKObjectMapping.h new file mode 120000 index 0000000..c79be7e --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKObjectMapping.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKObjectMapping.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKObjectMappingMatcher.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKObjectMappingMatcher.h new file mode 120000 index 0000000..14b0889 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKObjectMappingMatcher.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKObjectMappingMatcher.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKObjectMappingOperationDataSource.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKObjectMappingOperationDataSource.h new file mode 120000 index 0000000..1a30434 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKObjectMappingOperationDataSource.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKObjectMappingOperationDataSource.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKObjectParameterization.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKObjectParameterization.h new file mode 120000 index 0000000..bf13acd --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKObjectParameterization.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKObjectParameterization.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKObjectRequestOperation.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKObjectRequestOperation.h new file mode 120000 index 0000000..7374bee --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKObjectRequestOperation.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKObjectRequestOperation.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKObjectRequestOperationSubclass.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKObjectRequestOperationSubclass.h new file mode 120000 index 0000000..de61fe2 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKObjectRequestOperationSubclass.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKObjectRequestOperationSubclass.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKObjectUtilities.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKObjectUtilities.h new file mode 120000 index 0000000..6c8e271 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKObjectUtilities.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKObjectUtilities.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKOperationStateMachine.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKOperationStateMachine.h new file mode 120000 index 0000000..c43edd2 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKOperationStateMachine.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKOperationStateMachine.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKPaginator.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKPaginator.h new file mode 120000 index 0000000..229e691 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKPaginator.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKPaginator.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKPathMatcher.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKPathMatcher.h new file mode 120000 index 0000000..48bd9c9 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKPathMatcher.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKPathMatcher.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKPathUtilities.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKPathUtilities.h new file mode 120000 index 0000000..c33ee0e --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKPathUtilities.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKPathUtilities.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKPropertyInspector+CoreData.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKPropertyInspector+CoreData.h new file mode 120000 index 0000000..736238d --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKPropertyInspector+CoreData.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/RKPropertyInspector+CoreData.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKPropertyInspector.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKPropertyInspector.h new file mode 120000 index 0000000..8457830 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKPropertyInspector.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKPropertyInspector.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKPropertyMapping.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKPropertyMapping.h new file mode 120000 index 0000000..c5a15ec --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKPropertyMapping.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKPropertyMapping.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKRelationshipConnectionOperation.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKRelationshipConnectionOperation.h new file mode 120000 index 0000000..ce16350 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKRelationshipConnectionOperation.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/RKRelationshipConnectionOperation.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKRelationshipMapping.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKRelationshipMapping.h new file mode 120000 index 0000000..105f533 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKRelationshipMapping.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKRelationshipMapping.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKRequestDescriptor.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKRequestDescriptor.h new file mode 120000 index 0000000..ff6a95a --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKRequestDescriptor.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKRequestDescriptor.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKResponseDescriptor.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKResponseDescriptor.h new file mode 120000 index 0000000..92ca21b --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKResponseDescriptor.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKResponseDescriptor.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKResponseMapperOperation.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKResponseMapperOperation.h new file mode 120000 index 0000000..e704794 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKResponseMapperOperation.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKResponseMapperOperation.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKRoute.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKRoute.h new file mode 120000 index 0000000..b0aefe2 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKRoute.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKRoute.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKRouteSet.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKRouteSet.h new file mode 120000 index 0000000..70ab516 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKRouteSet.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKRouteSet.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKRouter.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKRouter.h new file mode 120000 index 0000000..55deaa2 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKRouter.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKRouter.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKSerialization.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKSerialization.h new file mode 120000 index 0000000..4ad2d14 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKSerialization.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKSerialization.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKStringTokenizer.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKStringTokenizer.h new file mode 120000 index 0000000..8cfee26 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKStringTokenizer.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKStringTokenizer.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKURLEncodedSerialization.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKURLEncodedSerialization.h new file mode 120000 index 0000000..13f5e05 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RKURLEncodedSerialization.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKURLEncodedSerialization.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RestKit.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RestKit.h new file mode 120000 index 0000000..49e183c --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/RestKit.h @@ -0,0 +1 @@ +../../../RestKit/Code/RestKit.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/Support.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/Support.h new file mode 120000 index 0000000..06fa6db --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/Support.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/UIImageView+AFRKNetworking.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/UIImageView+AFRKNetworking.h new file mode 120000 index 0000000..99b4718 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/UIImageView+AFRKNetworking.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/AFNetworking/UIImageView+AFRKNetworking.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/lcl_RK.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/lcl_RK.h new file mode 120000 index 0000000..865aba4 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/lcl_RK.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/lcl_RK.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/lcl_config_components_RK.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/lcl_config_components_RK.h new file mode 120000 index 0000000..4395c13 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/lcl_config_components_RK.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/lcl_config_components_RK.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/lcl_config_extensions_RK.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/lcl_config_extensions_RK.h new file mode 120000 index 0000000..9ca75b2 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/lcl_config_extensions_RK.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/lcl_config_extensions_RK.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/lcl_config_logger_RK.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/lcl_config_logger_RK.h new file mode 120000 index 0000000..f3bb47d --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/RestKit/lcl_config_logger_RK.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/lcl_config_logger_RK.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/SOCKit/SOCKit.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/SOCKit/SOCKit.h new file mode 120000 index 0000000..72c5afc --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/SOCKit/SOCKit.h @@ -0,0 +1 @@ +../../../SOCKit/SOCKit.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/TransitionKit/TKEvent.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/TransitionKit/TKEvent.h new file mode 120000 index 0000000..e0febb8 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/TransitionKit/TKEvent.h @@ -0,0 +1 @@ +../../../TransitionKit/Code/TKEvent.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/TransitionKit/TKState.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/TransitionKit/TKState.h new file mode 120000 index 0000000..6dbd8d3 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/TransitionKit/TKState.h @@ -0,0 +1 @@ +../../../TransitionKit/Code/TKState.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/TransitionKit/TKStateMachine.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/TransitionKit/TKStateMachine.h new file mode 120000 index 0000000..cfbbd7f --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/TransitionKit/TKStateMachine.h @@ -0,0 +1 @@ +../../../TransitionKit/Code/TKStateMachine.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/TransitionKit/TKTransition.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/TransitionKit/TKTransition.h new file mode 120000 index 0000000..d83dc2c --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/TransitionKit/TKTransition.h @@ -0,0 +1 @@ +../../../TransitionKit/Code/TKTransition.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Private/TransitionKit/TransitionKit.h b/code/iOS/ScriptorSprint3/Pods/Headers/Private/TransitionKit/TransitionKit.h new file mode 120000 index 0000000..d5b6768 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Private/TransitionKit/TransitionKit.h @@ -0,0 +1 @@ +../../../TransitionKit/Code/TransitionKit.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/ISO8601DateFormatterValueTransformer/ISO8601DateFormatterValueTransformer.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/ISO8601DateFormatterValueTransformer/ISO8601DateFormatterValueTransformer.h new file mode 120000 index 0000000..932a9db --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/ISO8601DateFormatterValueTransformer/ISO8601DateFormatterValueTransformer.h @@ -0,0 +1 @@ +../../../ISO8601DateFormatterValueTransformer/Code/ISO8601DateFormatterValueTransformer.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/ISO8601DateFormatterValueTransformer/RKISO8601DateFormatter.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/ISO8601DateFormatterValueTransformer/RKISO8601DateFormatter.h new file mode 120000 index 0000000..79788f6 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/ISO8601DateFormatterValueTransformer/RKISO8601DateFormatter.h @@ -0,0 +1 @@ +../../../ISO8601DateFormatterValueTransformer/Code/RKISO8601DateFormatter.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RKValueTransformers/RKValueTransformers.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RKValueTransformers/RKValueTransformers.h new file mode 120000 index 0000000..7768a97 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RKValueTransformers/RKValueTransformers.h @@ -0,0 +1 @@ +../../../RKValueTransformers/Code/RKValueTransformers.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/AFRKHTTPClient.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/AFRKHTTPClient.h new file mode 120000 index 0000000..d0bd9a1 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/AFRKHTTPClient.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/AFNetworking/AFRKHTTPClient.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/AFRKHTTPRequestOperation.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/AFRKHTTPRequestOperation.h new file mode 120000 index 0000000..e45c784 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/AFRKHTTPRequestOperation.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/AFNetworking/AFRKHTTPRequestOperation.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/AFRKImageRequestOperation.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/AFRKImageRequestOperation.h new file mode 120000 index 0000000..2952509 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/AFRKImageRequestOperation.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/AFNetworking/AFRKImageRequestOperation.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/AFRKJSONRequestOperation.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/AFRKJSONRequestOperation.h new file mode 120000 index 0000000..059f3b0 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/AFRKJSONRequestOperation.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/AFNetworking/AFRKJSONRequestOperation.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/AFRKNetworkActivityIndicatorManager.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/AFRKNetworkActivityIndicatorManager.h new file mode 120000 index 0000000..7a603b7 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/AFRKNetworkActivityIndicatorManager.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/AFNetworking/AFRKNetworkActivityIndicatorManager.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/AFRKNetworking.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/AFRKNetworking.h new file mode 120000 index 0000000..3620159 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/AFRKNetworking.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/AFNetworking/AFRKNetworking.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/AFRKPropertyListRequestOperation.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/AFRKPropertyListRequestOperation.h new file mode 120000 index 0000000..d142d60 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/AFRKPropertyListRequestOperation.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/AFNetworking/AFRKPropertyListRequestOperation.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/AFRKURLConnectionOperation.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/AFRKURLConnectionOperation.h new file mode 120000 index 0000000..9e49d82 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/AFRKURLConnectionOperation.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/AFNetworking/AFRKURLConnectionOperation.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/AFRKXMLRequestOperation.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/AFRKXMLRequestOperation.h new file mode 120000 index 0000000..3698abe --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/AFRKXMLRequestOperation.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/AFNetworking/AFRKXMLRequestOperation.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/CoreData.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/CoreData.h new file mode 120000 index 0000000..938f887 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/CoreData.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/NSManagedObject+RKAdditions.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/NSManagedObject+RKAdditions.h new file mode 120000 index 0000000..edb473c --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/NSManagedObject+RKAdditions.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/NSManagedObject+RKAdditions.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/NSManagedObjectContext+RKAdditions.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/NSManagedObjectContext+RKAdditions.h new file mode 120000 index 0000000..94659a5 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/NSManagedObjectContext+RKAdditions.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/NSManagedObjectContext+RKAdditions.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/Network.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/Network.h new file mode 120000 index 0000000..5210a78 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/Network.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/ObjectMapping.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/ObjectMapping.h new file mode 120000 index 0000000..9ca1b53 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/ObjectMapping.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKAttributeMapping.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKAttributeMapping.h new file mode 120000 index 0000000..ae82466 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKAttributeMapping.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKAttributeMapping.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKBooleanClass.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKBooleanClass.h new file mode 120000 index 0000000..0e58b9d --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKBooleanClass.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKBooleanClass.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKConnectionDescription.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKConnectionDescription.h new file mode 120000 index 0000000..013f916 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKConnectionDescription.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/RKConnectionDescription.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKDictionaryUtilities.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKDictionaryUtilities.h new file mode 120000 index 0000000..9032168 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKDictionaryUtilities.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKDictionaryUtilities.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKDotNetDateFormatter.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKDotNetDateFormatter.h new file mode 120000 index 0000000..6159542 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKDotNetDateFormatter.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKDotNetDateFormatter.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKDynamicMapping.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKDynamicMapping.h new file mode 120000 index 0000000..90f004b --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKDynamicMapping.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKDynamicMapping.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKEntityByAttributeCache.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKEntityByAttributeCache.h new file mode 120000 index 0000000..366138b --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKEntityByAttributeCache.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/RKEntityByAttributeCache.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKEntityCache.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKEntityCache.h new file mode 120000 index 0000000..ff48a67 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKEntityCache.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/RKEntityCache.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKEntityMapping.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKEntityMapping.h new file mode 120000 index 0000000..ba2cbe8 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKEntityMapping.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/RKEntityMapping.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKErrorMessage.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKErrorMessage.h new file mode 120000 index 0000000..f43e716 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKErrorMessage.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKErrorMessage.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKErrors.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKErrors.h new file mode 120000 index 0000000..37e7dbd --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKErrors.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKErrors.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKFetchRequestManagedObjectCache.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKFetchRequestManagedObjectCache.h new file mode 120000 index 0000000..d8d9aa7 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKFetchRequestManagedObjectCache.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/RKFetchRequestManagedObjectCache.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKHTTPRequestOperation.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKHTTPRequestOperation.h new file mode 120000 index 0000000..00c2293 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKHTTPRequestOperation.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKHTTPRequestOperation.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKHTTPUtilities.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKHTTPUtilities.h new file mode 120000 index 0000000..3718467 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKHTTPUtilities.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKHTTPUtilities.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKInMemoryManagedObjectCache.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKInMemoryManagedObjectCache.h new file mode 120000 index 0000000..8dfed70 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKInMemoryManagedObjectCache.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/RKInMemoryManagedObjectCache.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKLog.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKLog.h new file mode 120000 index 0000000..c22acca --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKLog.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKLog.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKMIMETypeSerialization.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKMIMETypeSerialization.h new file mode 120000 index 0000000..421ca18 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKMIMETypeSerialization.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKMIMETypeSerialization.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKMIMETypes.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKMIMETypes.h new file mode 120000 index 0000000..f45960b --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKMIMETypes.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKMIMETypes.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKMacros.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKMacros.h new file mode 120000 index 0000000..454ae98 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKMacros.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKMacros.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKManagedObjectCaching.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKManagedObjectCaching.h new file mode 120000 index 0000000..31523bc --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKManagedObjectCaching.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/RKManagedObjectCaching.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKManagedObjectImporter.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKManagedObjectImporter.h new file mode 120000 index 0000000..1393417 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKManagedObjectImporter.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/RKManagedObjectImporter.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKManagedObjectMappingOperationDataSource.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKManagedObjectMappingOperationDataSource.h new file mode 120000 index 0000000..788a3d0 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKManagedObjectMappingOperationDataSource.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/RKManagedObjectMappingOperationDataSource.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKManagedObjectRequestOperation.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKManagedObjectRequestOperation.h new file mode 120000 index 0000000..739dab3 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKManagedObjectRequestOperation.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKManagedObjectRequestOperation.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKManagedObjectStore.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKManagedObjectStore.h new file mode 120000 index 0000000..ba4dc0e --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKManagedObjectStore.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/RKManagedObjectStore.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKMapperOperation.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKMapperOperation.h new file mode 120000 index 0000000..1040562 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKMapperOperation.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKMapperOperation.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKMapping.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKMapping.h new file mode 120000 index 0000000..3b44aba --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKMapping.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKMapping.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKMappingErrors.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKMappingErrors.h new file mode 120000 index 0000000..25f3daa --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKMappingErrors.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKMappingErrors.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKMappingOperation.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKMappingOperation.h new file mode 120000 index 0000000..da02eed --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKMappingOperation.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKMappingOperation.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKMappingOperationDataSource.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKMappingOperationDataSource.h new file mode 120000 index 0000000..c7ebdfc --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKMappingOperationDataSource.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKMappingOperationDataSource.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKMappingResult.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKMappingResult.h new file mode 120000 index 0000000..7b57521 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKMappingResult.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKMappingResult.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKNSJSONSerialization.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKNSJSONSerialization.h new file mode 120000 index 0000000..7fe2ef6 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKNSJSONSerialization.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKNSJSONSerialization.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKObjectManager.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKObjectManager.h new file mode 120000 index 0000000..a73f83b --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKObjectManager.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKObjectManager.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKObjectMapping.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKObjectMapping.h new file mode 120000 index 0000000..c79be7e --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKObjectMapping.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKObjectMapping.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKObjectMappingMatcher.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKObjectMappingMatcher.h new file mode 120000 index 0000000..14b0889 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKObjectMappingMatcher.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKObjectMappingMatcher.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKObjectMappingOperationDataSource.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKObjectMappingOperationDataSource.h new file mode 120000 index 0000000..1a30434 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKObjectMappingOperationDataSource.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKObjectMappingOperationDataSource.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKObjectParameterization.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKObjectParameterization.h new file mode 120000 index 0000000..bf13acd --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKObjectParameterization.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKObjectParameterization.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKObjectRequestOperation.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKObjectRequestOperation.h new file mode 120000 index 0000000..7374bee --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKObjectRequestOperation.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKObjectRequestOperation.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKObjectRequestOperationSubclass.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKObjectRequestOperationSubclass.h new file mode 120000 index 0000000..de61fe2 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKObjectRequestOperationSubclass.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKObjectRequestOperationSubclass.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKObjectUtilities.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKObjectUtilities.h new file mode 120000 index 0000000..6c8e271 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKObjectUtilities.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKObjectUtilities.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKOperationStateMachine.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKOperationStateMachine.h new file mode 120000 index 0000000..c43edd2 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKOperationStateMachine.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKOperationStateMachine.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKPaginator.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKPaginator.h new file mode 120000 index 0000000..229e691 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKPaginator.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKPaginator.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKPathMatcher.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKPathMatcher.h new file mode 120000 index 0000000..48bd9c9 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKPathMatcher.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKPathMatcher.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKPathUtilities.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKPathUtilities.h new file mode 120000 index 0000000..c33ee0e --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKPathUtilities.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKPathUtilities.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKPropertyInspector+CoreData.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKPropertyInspector+CoreData.h new file mode 120000 index 0000000..736238d --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKPropertyInspector+CoreData.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/RKPropertyInspector+CoreData.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKPropertyInspector.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKPropertyInspector.h new file mode 120000 index 0000000..8457830 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKPropertyInspector.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKPropertyInspector.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKPropertyMapping.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKPropertyMapping.h new file mode 120000 index 0000000..c5a15ec --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKPropertyMapping.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKPropertyMapping.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKRelationshipConnectionOperation.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKRelationshipConnectionOperation.h new file mode 120000 index 0000000..ce16350 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKRelationshipConnectionOperation.h @@ -0,0 +1 @@ +../../../RestKit/Code/CoreData/RKRelationshipConnectionOperation.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKRelationshipMapping.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKRelationshipMapping.h new file mode 120000 index 0000000..105f533 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKRelationshipMapping.h @@ -0,0 +1 @@ +../../../RestKit/Code/ObjectMapping/RKRelationshipMapping.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKRequestDescriptor.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKRequestDescriptor.h new file mode 120000 index 0000000..ff6a95a --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKRequestDescriptor.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKRequestDescriptor.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKResponseDescriptor.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKResponseDescriptor.h new file mode 120000 index 0000000..92ca21b --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKResponseDescriptor.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKResponseDescriptor.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKResponseMapperOperation.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKResponseMapperOperation.h new file mode 120000 index 0000000..e704794 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKResponseMapperOperation.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKResponseMapperOperation.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKRoute.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKRoute.h new file mode 120000 index 0000000..b0aefe2 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKRoute.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKRoute.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKRouteSet.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKRouteSet.h new file mode 120000 index 0000000..70ab516 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKRouteSet.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKRouteSet.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKRouter.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKRouter.h new file mode 120000 index 0000000..55deaa2 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKRouter.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/RKRouter.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKSerialization.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKSerialization.h new file mode 120000 index 0000000..4ad2d14 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKSerialization.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKSerialization.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKStringTokenizer.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKStringTokenizer.h new file mode 120000 index 0000000..8cfee26 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKStringTokenizer.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKStringTokenizer.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKURLEncodedSerialization.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKURLEncodedSerialization.h new file mode 120000 index 0000000..13f5e05 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RKURLEncodedSerialization.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/RKURLEncodedSerialization.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RestKit.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RestKit.h new file mode 120000 index 0000000..49e183c --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/RestKit.h @@ -0,0 +1 @@ +../../../RestKit/Code/RestKit.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/Support.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/Support.h new file mode 120000 index 0000000..06fa6db --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/Support.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/UIImageView+AFRKNetworking.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/UIImageView+AFRKNetworking.h new file mode 120000 index 0000000..99b4718 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/UIImageView+AFRKNetworking.h @@ -0,0 +1 @@ +../../../RestKit/Code/Network/AFNetworking/UIImageView+AFRKNetworking.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/lcl_RK.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/lcl_RK.h new file mode 120000 index 0000000..865aba4 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/lcl_RK.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/lcl_RK.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/lcl_config_components_RK.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/lcl_config_components_RK.h new file mode 120000 index 0000000..4395c13 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/lcl_config_components_RK.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/lcl_config_components_RK.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/lcl_config_extensions_RK.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/lcl_config_extensions_RK.h new file mode 120000 index 0000000..9ca75b2 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/lcl_config_extensions_RK.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/lcl_config_extensions_RK.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/lcl_config_logger_RK.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/lcl_config_logger_RK.h new file mode 120000 index 0000000..f3bb47d --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/RestKit/lcl_config_logger_RK.h @@ -0,0 +1 @@ +../../../RestKit/Code/Support/lcl_config_logger_RK.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/SOCKit/SOCKit.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/SOCKit/SOCKit.h new file mode 120000 index 0000000..72c5afc --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/SOCKit/SOCKit.h @@ -0,0 +1 @@ +../../../SOCKit/SOCKit.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/TransitionKit/TKEvent.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/TransitionKit/TKEvent.h new file mode 120000 index 0000000..e0febb8 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/TransitionKit/TKEvent.h @@ -0,0 +1 @@ +../../../TransitionKit/Code/TKEvent.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/TransitionKit/TKState.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/TransitionKit/TKState.h new file mode 120000 index 0000000..6dbd8d3 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/TransitionKit/TKState.h @@ -0,0 +1 @@ +../../../TransitionKit/Code/TKState.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/TransitionKit/TKStateMachine.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/TransitionKit/TKStateMachine.h new file mode 120000 index 0000000..cfbbd7f --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/TransitionKit/TKStateMachine.h @@ -0,0 +1 @@ +../../../TransitionKit/Code/TKStateMachine.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/TransitionKit/TKTransition.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/TransitionKit/TKTransition.h new file mode 120000 index 0000000..d83dc2c --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/TransitionKit/TKTransition.h @@ -0,0 +1 @@ +../../../TransitionKit/Code/TKTransition.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/Headers/Public/TransitionKit/TransitionKit.h b/code/iOS/ScriptorSprint3/Pods/Headers/Public/TransitionKit/TransitionKit.h new file mode 120000 index 0000000..d5b6768 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Headers/Public/TransitionKit/TransitionKit.h @@ -0,0 +1 @@ +../../../TransitionKit/Code/TransitionKit.h \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/ISO8601DateFormatterValueTransformer/Code/ISO8601DateFormatterValueTransformer.h b/code/iOS/ScriptorSprint3/Pods/ISO8601DateFormatterValueTransformer/Code/ISO8601DateFormatterValueTransformer.h new file mode 100644 index 0000000..7a758e4 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/ISO8601DateFormatterValueTransformer/Code/ISO8601DateFormatterValueTransformer.h @@ -0,0 +1,34 @@ +// +// ISO8601DateFormatterValueTransformer.h +// RestKit +// +// Created by Blake Watters on 9/11/13. +// Copyright (c) 2013 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKValueTransformers.h" +#import "RKISO8601DateFormatter.h" + +/** + The `RKValueTransformers` category extends ISO8601DateFormatter to support the `RKValueTransforming` interface, making it usable with the RestKit value transformation architecture. + */ +@interface RKISO8601DateFormatter (RKValueTransformers) + +/** + Returns an ISO 8601 date formatter configured to strictly parse times into `NSDate` instances with the UTC time zone and `en_US_POSIX` locale. + */ ++ (instancetype)defaultISO8601DateFormatter; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/ISO8601DateFormatterValueTransformer/Code/ISO8601DateFormatterValueTransformer.m b/code/iOS/ScriptorSprint3/Pods/ISO8601DateFormatterValueTransformer/Code/ISO8601DateFormatterValueTransformer.m new file mode 100644 index 0000000..fd42686 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/ISO8601DateFormatterValueTransformer/Code/ISO8601DateFormatterValueTransformer.m @@ -0,0 +1,55 @@ +// +// ISO8601DateFormatterValueTransformer.m +// RestKit +// +// Created by Blake Watters on 9/11/13. +// Copyright (c) 2013 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "ISO8601DateFormatterValueTransformer.h" + +@implementation RKISO8601DateFormatter (RKValueTransformers) + ++ (instancetype)defaultISO8601DateFormatter +{ + RKISO8601DateFormatter *iso8601DateFormatter = [RKISO8601DateFormatter new]; + iso8601DateFormatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; + iso8601DateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; + iso8601DateFormatter.includeTime = YES; + iso8601DateFormatter.parsesStrictly = YES; + return iso8601DateFormatter; +} + +- (BOOL)validateTransformationFromClass:(Class)inputValueClass toClass:(Class)outputValueClass +{ + return (([inputValueClass isSubclassOfClass:[NSDate class]] && [outputValueClass isSubclassOfClass:[NSString class]]) || + ([inputValueClass isSubclassOfClass:[NSString class]] && [outputValueClass isSubclassOfClass:[NSDate class]])); +} + +- (BOOL)transformValue:(id)inputValue toValue:(id *)outputValue ofClass:(Class)outputValueClass error:(NSError **)error +{ + RKValueTransformerTestInputValueIsKindOfClass(inputValue, (@[ [NSString class], [NSDate class] ]), error); + RKValueTransformerTestOutputValueClassIsSubclassOfClass(outputValueClass, (@[ [NSString class], [NSDate class] ]), error); + if ([inputValue isKindOfClass:[NSString class]]) { + NSString *errorDescription = nil; + BOOL success = [self getObjectValue:outputValue forString:inputValue errorDescription:&errorDescription]; + RKValueTransformerTestTransformation(success, error, @"%@", errorDescription); + } else if ([inputValue isKindOfClass:[NSDate class]]) { + *outputValue = [self stringFromDate:inputValue]; + } + return YES; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/ISO8601DateFormatterValueTransformer/Code/RKISO8601DateFormatter.h b/code/iOS/ScriptorSprint3/Pods/ISO8601DateFormatterValueTransformer/Code/RKISO8601DateFormatter.h new file mode 100644 index 0000000..f4cc12a --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/ISO8601DateFormatterValueTransformer/Code/RKISO8601DateFormatter.h @@ -0,0 +1,93 @@ +// This is a forked copy of the ISO8601DateFormatter + +/*ISO8601DateFormatter.h + * + *Created by Peter Hosey on 2009-04-11. + *Copyright 2009 Peter Hosey. All rights reserved. + */ + +#import + +/*This class converts dates to and from ISO 8601 strings. A good introduction to ISO 8601: + * + *Parsing can be done strictly, or not. When you parse loosely, leading whitespace is ignored, as is anything after the date. + *The loose parser will return an NSDate for this string: @" \t\r\n\f\t 2006-03-02!!!" + *Leading non-whitespace will not be ignored; the string will be rejected, and nil returned. See the README that came with this addition. + * + *The strict parser will only accept a string if the date is the entire string. The above string would be rejected immediately, solely on these grounds. + *Also, the loose parser provides some extensions that the strict parser doesn't. + *For example, the standard says for "-DDD" (an ordinal date in the implied year) that the logical representation (meaning, hierarchically) would be "--DDD", but because that extra hyphen is "superfluous", it was omitted. + *The loose parser will accept the extra hyphen; the strict parser will not. + *A full list of these extensions is in the README file. + */ + +/*The format to either expect or produce. + *Calendar format is YYYY-MM-DD. + *Ordinal format is YYYY-DDD, where DDD ranges from 1 to 366; for example, 2009-32 is 2009-02-01. + *Week format is YYYY-Www-D, where ww ranges from 1 to 53 (the 'W' is literal) and D ranges from 1 to 7; for example, 2009-W05-07. + */ +enum { + RKISO8601DateFormatCalendar, + RKISO8601DateFormatOrdinal, + RKISO8601DateFormatWeek, +}; +typedef NSUInteger RKISO8601DateFormat; + +@interface RKISO8601DateFormatter: NSFormatter + +/** + The time zone for tge formatter. + + **Default:** `[NSTimeZone defaultTimeZone]` + */ +@property (nonatomic, strong) NSTimeZone *timeZone; + +/** + The locale for the formatter. + + **Default:** `[NSLocale currentLocale]` + */ +@property (nonatomic, strong) NSLocale *locale; + +#pragma mark Parsing + +/** + A Boolean value that determines if the receiver parses strictly. + + **Default**: `NO` + */ +@property (nonatomic, assign) BOOL parsesStrictly; + +- (NSDateComponents *)dateComponentsFromString:(NSString *)string; +- (NSDate *)dateFromString:(NSString *)string; + +#pragma mark Unparsing + +/** + **Default**: `RKISO8601DateFormatCalendar` + */ +@property (nonatomic, assign) RKISO8601DateFormat format; + +/** + A Boolean value that specifies if time should be included in the formatted strings. + + **Default**: `NO` + */ +@property (nonatomic, assign) BOOL includeTime; + +/** + The separator character to use between time components. + + **Default**: `':'` + */ +@property (nonatomic, assign) unichar timeSeparator; + +/** + Returns an ISO-8601 string representation of the given date. + + @param date The date to be formatted into a string. + @return An ISO-8601 formatted string representation of the date. + */ +- (NSString *)stringFromDate:(NSDate *)date; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/ISO8601DateFormatterValueTransformer/Code/RKISO8601DateFormatter.m b/code/iOS/ScriptorSprint3/Pods/ISO8601DateFormatterValueTransformer/Code/RKISO8601DateFormatter.m new file mode 100644 index 0000000..2079593 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/ISO8601DateFormatterValueTransformer/Code/RKISO8601DateFormatter.m @@ -0,0 +1,912 @@ +// This is a forked copy of the ISO8601DateFormatter + +/*ISO8601DateFormatter.m + * + *Created by Peter Hosey on 2009-04-11. + *Copyright 2009 Peter Hosey. All rights reserved. + */ + +#import +#import "RKISO8601DateFormatter.h" + +// Set Logging Component +#undef RKLogComponent +#define RKLogComponent RKlcl_cRestKitSupport + +unichar RKISO8601DefaultTimeSeparatorCharacter = ':'; + +// Unicode date formats. +#define RK_ISOCALENDAR_DATE_FORMAT @"yyyy-MM-dd" +#define RK_ISOORDINAL_DATE_FORMAT @"yyyy-DDD" +#define RK_ISOTIME_FORMAT @"HH:mm:ss" +#define RK_ISOTIME_WITH_TIMEZONE_FORMAT RK_ISOTIME_FORMAT @"Z" + +// printf formats. +#define RK_ISOTIMEZONE_UTC_FORMAT @"Z" +#define RK_ISOTIMEZONE_OFFSET_FORMAT @"%+.2ld%.2ld" + +#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && (__IPHONE_OS_VERSION_MAX_ALLOWED < 70000)) || \ + (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_9)) +#define NSCalendarUnitYear NSYearCalendarUnit +#define NSCalendarUnitMonth NSMonthCalendarUnit +#define NSCalendarUnitDay NSDayCalendarUnit +#define NSCalendarUnitWeekday NSWeekdayCalendarUnit +#define NSCalendarIdentifierGregorian NSGregorianCalendar +#endif + +#define RK_CALENDAR_UNIT_YEAR NSCalendarUnitYear +#define RK_CALENDAR_UNIT_MONTH NSCalendarUnitMonth +#define RK_CALENDAR_UNIT_DAY NSCalendarUnitDay +#define RK_CALENDAR_UNIT_WEEKDAY NSCalendarUnitWeekday +#define RK_CALENDAR_IDENTIFIER_GREGORIAN NSCalendarIdentifierGregorian + +// Parsing Helpers +static NSUInteger read_segment(const unsigned char *str, const unsigned char **next, NSUInteger *out_num_digits); +static NSUInteger read_segment_4digits(const unsigned char *str, const unsigned char **next, NSUInteger *out_num_digits); +static NSUInteger read_segment_2digits(const unsigned char *str, const unsigned char **next); +static double read_double(const unsigned char *str, const unsigned char **next); +static BOOL is_leap_year(NSUInteger year); + +@interface RKISO8601DateFormatter(UnparsingPrivate) + +- (NSString *)replaceColonsInString:(NSString *)timeFormat withTimeSeparator:(unichar)timeSep; +- (NSString *)stringFromDate:(NSDate *)date formatString:(NSString *)dateFormat timeZone:(NSTimeZone *)timeZone; +- (NSString *)weekDateStringForDate:(NSDate *)date timeZone:(NSTimeZone *)timeZone; + +@end + +static NSMutableDictionary *timeZonesByOffset; + +@interface RKISO8601DateFormatter () +@property (nonatomic, strong) NSCalendar *parsingCalendar; +@property (nonatomic, strong) NSCalendar *unparsingCalendar; +@property (nonatomic, strong) NSDateFormatter *unparsingFormatter; +@property (nonatomic, copy) NSString *lastUsedFormatString; +@end + +@implementation RKISO8601DateFormatter + ++ (void)initialize +{ + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + timeZonesByOffset = [[NSMutableDictionary alloc] init]; + }); +} + +- (id)init +{ + self = [super init]; + if (self) { + self.timeZone = [NSTimeZone defaultTimeZone]; + self.locale = [NSLocale currentLocale]; + + self.parsingCalendar = [self newCalendar]; + self.unparsingCalendar = [self newCalendar]; + + self.format = RKISO8601DateFormatCalendar; + self.timeSeparator = RKISO8601DefaultTimeSeparatorCharacter; + self.includeTime = NO; + self.parsesStrictly = NO; + } + return self; +} + +- (NSCalendar *)newCalendar +{ + NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:RK_CALENDAR_IDENTIFIER_GREGORIAN]; + calendar.firstWeekday = 2; //Monday + calendar.timeZone = self.timeZone; + calendar.locale = self.locale; + return calendar; +} + +- (void)setTimeZone:(NSTimeZone *)timeZone +{ + if (_timeZone != timeZone) { + _timeZone = timeZone; + _unparsingCalendar.timeZone = timeZone; + _unparsingFormatter.timeZone = timeZone; + } +} + +- (void)setLocale:(NSLocale *)locale +{ + if (_locale != locale) { + _locale = locale; + _unparsingCalendar.locale = locale; + _unparsingFormatter.locale = locale; + } +} + +#pragma mark Parsing + +/*Valid ISO 8601 date formats: + * + *YYYYMMDD + *YYYY-MM-DD + *YYYY-MM + *YYYY + *YY //century + * //Implied century: YY is 00-99 + * YYMMDD + * YY-MM-DD + * -YYMM + * -YY-MM + * -YY + * //Implied year + * --MMDD + * --MM-DD + * --MM + * //Implied year and month + * ---DD + * //Ordinal dates: DDD is the number of the day in the year (1-366) + *YYYYDDD + *YYYY-DDD + * YYDDD + * YY-DDD + * -DDD + * //Week-based dates: ww is the number of the week, and d is the number (1-7) of the day in the week + *yyyyWwwd + *yyyy-Www-d + *yyyyWww + *yyyy-Www + *yyWwwd + *yy-Www-d + *yyWww + *yy-Www + * //Year of the implied decade + *-yWwwd + *-y-Www-d + *-yWww + *-y-Www + * //Week and day of implied year + * -Wwwd + * -Www-d + * //Week only of implied year + * -Www + * //Day only of implied week + * -W-d + */ + +- (NSDateComponents *) dateComponentsFromString:(NSString *)string +{ + return [self dateComponentsFromString:string timeZone:NULL]; +} + +- (NSDateComponents *) dateComponentsFromString:(NSString *)string timeZone:(out NSTimeZone **)outTimeZone +{ + return [self dateComponentsFromString:string timeZone:outTimeZone range:NULL]; +} + +- (NSDateComponents *) dateComponentsFromString:(NSString *)string timeZone:(out NSTimeZone **)outTimeZone range:(out NSRange *)outRange +{ + // We don't support ISO-8601 intervals so bail if the string contains a slash delimiter + if ([string rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@"/"]].location != NSNotFound) return nil; + + NSDate *now = [NSDate date]; + + NSDateComponents *components = [[NSDateComponents alloc] init]; + NSDateComponents *nowComponents = [self.parsingCalendar components:(RK_CALENDAR_UNIT_YEAR | RK_CALENDAR_UNIT_MONTH | RK_CALENDAR_UNIT_DAY) fromDate:now]; + + NSUInteger + //Date + year, + month_or_week = 0U, + day = 0U, + //Time + hour = 0U; + NSTimeInterval + minute = 0.0, + second = 0.0; + //Time zone + NSInteger tz_hour = 0; + NSInteger tz_minute = 0; + + enum { + monthAndDate, + week, + dateOnly + } dateSpecification = monthAndDate; + + BOOL strict = self.parsesStrictly; + unichar timeSep = self.timeSeparator; + + if (strict) timeSep = RKISO8601DefaultTimeSeparatorCharacter; + NSAssert(timeSep != '\0', @"Time separator must not be NUL."); + + BOOL isValidDate = ([string length] > 0U); + NSTimeZone *timeZone = nil; + + const unsigned char *ch = (const unsigned char *)[string UTF8String]; + + NSRange range = { 0U, 0U }; + const unsigned char *start_of_date = NULL; + if (strict && isspace(*ch)) { + range.location = NSNotFound; + isValidDate = NO; + } else { + //Skip leading whitespace. + NSUInteger i = 0U; + for(NSUInteger len = strlen((const char *)ch); i < len; ++i) { + if (!isspace(ch[i])) + break; + } + + range.location = i; + ch += i; + start_of_date = ch; + + NSUInteger segment; + NSUInteger num_leading_hyphens = 0U, num_digits = 0U; + + if (*ch == 'T') { + //There is no date here, only a time. Set the date to now; then we'll parse the time. + isValidDate = isdigit(*++ch); + + year = nowComponents.year; + month_or_week = nowComponents.month; + day = nowComponents.day; + } else { + while(*ch == '-') { + ++num_leading_hyphens; + ++ch; + } + + segment = read_segment(ch, &ch, &num_digits); + switch(num_digits) { + case 0: + if (*ch == 'W') { + if ((ch[1] == '-') && isdigit(ch[2]) && ((num_leading_hyphens == 1U) || ((num_leading_hyphens == 2U) && !strict))) { + year = nowComponents.year; + month_or_week = 1U; + ch += 2; + goto parseDayAfterWeek; + } else if (num_leading_hyphens == 1U) { + year = nowComponents.year; + goto parseWeekAndDay; + } else + isValidDate = NO; + } else + isValidDate = NO; + break; + + case 8: //YYYY MM DD + if (num_leading_hyphens > 0U) + isValidDate = NO; + else { + day = segment % 100U; + segment /= 100U; + month_or_week = segment % 100U; + year = segment / 100U; + } + break; + + case 6: //YYMMDD (implicit century) + if (num_leading_hyphens > 0U) + isValidDate = NO; + else { + day = segment % 100U; + segment /= 100U; + month_or_week = segment % 100U; + year = nowComponents.year; + year -= (year % 100U); + year += segment / 100U; + } + break; + + case 4: + switch(num_leading_hyphens) { + case 0: //YYYY + year = segment; + + if (*ch == '-') ++ch; + + if (!isdigit(*ch)) { + if (*ch == 'W') + goto parseWeekAndDay; + else + month_or_week = day = 1U; + } else { + segment = read_segment(ch, &ch, &num_digits); + switch(num_digits) { + case 4: //MMDD + day = segment % 100U; + month_or_week = segment / 100U; + break; + + case 2: //MM + month_or_week = segment; + + if (*ch == '-') ++ch; + if (!isdigit(*ch)) + day = 1U; + else + day = read_segment(ch, &ch, NULL); + break; + + case 3: //DDD + day = segment % 1000U; + dateSpecification = dateOnly; + if (strict && (day > (365U + is_leap_year(year)))) + isValidDate = NO; + break; + + default: + isValidDate = NO; + } + } + break; + + case 1: //YYMM + month_or_week = segment % 100U; + year = segment / 100U; + + if (*ch == '-') ++ch; + if (!isdigit(*ch)) + day = 1U; + else + day = read_segment(ch, &ch, NULL); + + break; + + case 2: //MMDD + day = segment % 100U; + month_or_week = segment / 100U; + year = nowComponents.year; + + break; + + default: + isValidDate = NO; + } //switch(num_leading_hyphens) (4 digits) + break; + + case 1: + if (strict) { + //Two digits only - never just one. + if (num_leading_hyphens == 1U) { + if (*ch == '-') ++ch; + if (*++ch == 'W') { + year = nowComponents.year; + year -= (year % 10U); + year += segment; + goto parseWeekAndDay; + } else + isValidDate = NO; + } else + isValidDate = NO; + break; + } + case 2: + switch(num_leading_hyphens) { + case 0: + if (*ch == '-') { + //Implicit century + year = nowComponents.year; + year -= (year % 100U); + year += segment; + + if (*++ch == 'W') + goto parseWeekAndDay; + else if (!isdigit(*ch)) { + goto centuryOnly; + } else { + //Get month and/or date. + segment = read_segment_4digits(ch, &ch, &num_digits); + switch(num_digits) { + case 4: //YY-MMDD + day = segment % 100U; + month_or_week = segment / 100U; + break; + + case 1: //YY-M; YY-M-DD (extension) + if (strict) { + isValidDate = NO; + break; + } + case 2: //YY-MM; YY-MM-DD + month_or_week = segment; + if (*ch == '-') { + if (isdigit(*++ch)) + day = read_segment_2digits(ch, &ch); + else + day = 1U; + } else + day = 1U; + break; + + case 3: //Ordinal date. + day = segment; + dateSpecification = dateOnly; + break; + } + } + } else if (*ch == 'W') { + year = nowComponents.year; + year -= (year % 100U); + year += segment; + + parseWeekAndDay: //*ch should be 'W' here. + if (!isdigit(*++ch)) { + //Not really a week-based date; just a year followed by '-W'. + if (strict) + isValidDate = NO; + else + month_or_week = day = 1U; + } else { + month_or_week = read_segment_2digits(ch, &ch); + if (*ch == '-') ++ch; + parseDayAfterWeek: + day = isdigit(*ch) ? read_segment_2digits(ch, &ch) : 1U; + dateSpecification = week; + } + } else { + //Century only. Assume current year. + centuryOnly: + year = segment * 100U + nowComponents.year % 100U; + month_or_week = day = 1U; + } + break; + + case 1:; //-YY; -YY-MM (implicit century) + NSUInteger current_year = nowComponents.year; + NSUInteger current_century = (current_year % 100U); + year = segment + (current_year - current_century); + if (num_digits == 1U) //implied decade + year += current_century - (current_year % 10U); + + if (*ch == '-') { + ++ch; + month_or_week = read_segment_2digits(ch, &ch); + } + + day = 1U; + break; + + case 2: //--MM; --MM-DD + year = nowComponents.year; + month_or_week = segment; + if (*ch == '-') { + ++ch; + day = read_segment_2digits(ch, &ch); + } + break; + + case 3: //---DD + year = nowComponents.year; + month_or_week = nowComponents.month; + day = segment; + break; + + default: + isValidDate = NO; + } //switch(num_leading_hyphens) (2 digits) + break; + + case 7: //YYYY DDD (ordinal date) + if (num_leading_hyphens > 0U) + isValidDate = NO; + else { + day = segment % 1000U; + year = segment / 1000U; + dateSpecification = dateOnly; + if (strict && (day > (365U + is_leap_year(year)))) + isValidDate = NO; + } + break; + + case 3: //--DDD (ordinal date, implicit year) + //Technically, the standard only allows one hyphen. But it says that two hyphens is the logical implementation, and one was dropped for brevity. So I have chosen to allow the missing hyphen. + if ((num_leading_hyphens < 1U) || ((num_leading_hyphens > 2U) && !strict)) + isValidDate = NO; + else { + day = segment; + year = nowComponents.year; + dateSpecification = dateOnly; + if (strict && (day > (365U + is_leap_year(year)))) + isValidDate = NO; + } + break; + + default: + isValidDate = NO; + } + } + + if (isValidDate) { + if (isspace(*ch) || (*ch == 'T')) ++ch; + + if (isdigit(*ch)) { + hour = read_segment_2digits(ch, &ch); + if (*ch == timeSep) { + ++ch; + if ((timeSep == ',') || (timeSep == '.')) { + //We can't do fractional minutes when '.' is the segment separator. + //Only allow whole minutes and whole seconds. + minute = read_segment_2digits(ch, &ch); + if (*ch == timeSep) { + ++ch; + second = read_segment_2digits(ch, &ch); + } + } else { + //Allow a fractional minute. + //If we don't get a fraction, look for a seconds segment. + //Otherwise, the fraction of a minute is the seconds. + minute = read_double(ch, &ch); + second = modf(minute, &minute); + if (second > DBL_EPSILON) + second *= 60.0; //Convert fraction (e.g. .5) into seconds (e.g. 30). + else if (*ch == timeSep) { + ++ch; + second = read_double(ch, &ch); + } + } + } + + if (!strict) { + if (isspace(*ch)) ++ch; + } + + switch(*ch) { + case 'Z': + timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; + break; + + case '+': + case '-':; + BOOL negative = (*ch == '-'); + if (isdigit(*++ch)) { + //Read hour offset. + segment = *ch - '0'; + if (isdigit(*++ch)) { + segment *= 10U; + segment += *(ch++) - '0'; + } + tz_hour = (NSInteger)segment; + if (negative) tz_hour = -tz_hour; + + //Optional separator. + if (*ch == timeSep) ++ch; + + if (isdigit(*ch)) { + //Read minute offset. + segment = *ch - '0'; + if (isdigit(*++ch)) { + segment *= 10U; + segment += *ch - '0'; + } + tz_minute = segment; + if (negative) tz_minute = -tz_minute; + } + + NSTimeInterval timeZoneOffset = (tz_hour * 3600) + (tz_minute * 60); + NSNumber *offsetNum = [NSNumber numberWithDouble:timeZoneOffset]; + timeZone = [timeZonesByOffset objectForKey:offsetNum]; + if (!timeZone) { + timeZone = [NSTimeZone timeZoneForSecondsFromGMT:timeZoneOffset]; + if (timeZone) + [timeZonesByOffset setObject:timeZone forKey:offsetNum]; + } + } + } + } + } + + if (isValidDate) { + components.year = year; + components.day = day; + components.hour = hour; + components.minute = (NSInteger)minute; + components.second = (NSInteger)second; + + switch(dateSpecification) { + case monthAndDate: + components.month = month_or_week; + break; + + case week:; + //Adapted from . + //This works by converting the week date into an ordinal date, then letting the next case handle it. + NSUInteger prevYear = year - 1U; + NSUInteger YY = prevYear % 100U; + NSUInteger C = prevYear - YY; + NSUInteger G = YY + YY / 4U; + NSUInteger isLeapYear = (((C / 100U) % 4U) * 5U); + NSUInteger Jan1Weekday = (isLeapYear + G) % 7U; + enum { monday, tuesday, wednesday, thursday/*, friday, saturday, sunday*/ }; + components.day = ((8U - Jan1Weekday) + (7U * (Jan1Weekday > thursday))) + (day - 1U) + (7U * (month_or_week - 2)); + + case dateOnly: //An "ordinal date". + break; + } + } + } //if (!(strict && isdigit(ch[0]))) + + if (outRange) { + if (isValidDate) + range.length = ch - start_of_date; + else + range.location = NSNotFound; + + *outRange = range; + } + if (outTimeZone) { + *outTimeZone = timeZone; + } + + return isValidDate ? components : nil; +} + +- (NSDate *)dateFromString:(NSString *)string +{ + return [self dateFromString:string timeZone:NULL]; +} + +- (NSDate *)dateFromString:(NSString *)string timeZone:(out NSTimeZone **)outTimeZone +{ + return [self dateFromString:string timeZone:outTimeZone range:NULL]; +} + +- (NSDate *)dateFromString:(NSString *)string timeZone:(out NSTimeZone **)outTimeZone range:(out NSRange *)outRange { + NSTimeZone *timeZone = nil; + NSDateComponents *components = [self dateComponentsFromString:string timeZone:&timeZone range:outRange]; + if (! components) return nil; + if (outTimeZone) + *outTimeZone = timeZone; + self.parsingCalendar.timeZone = timeZone ?: self.timeZone; + return [self.parsingCalendar dateFromComponents:components]; +} + +- (BOOL)getObjectValue:(id *)outValue forString:(NSString *)string errorDescription:(NSString **)error +{ + NSDate *date = [self dateFromString:string]; + if (outValue) + *outValue = date; + return (date != nil); +} + +#pragma mark Unparsing + +- (NSString *) replaceColonsInString:(NSString *)timeFormat withTimeSeparator:(unichar)timeSep +{ + if (timeSep != ':') { + NSMutableString *timeFormatMutable = [timeFormat mutableCopy]; + [timeFormatMutable replaceOccurrencesOfString:@":" + withString:[NSString stringWithCharacters:&timeSep length:1U] + options:NSBackwardsSearch | NSLiteralSearch + range:(NSRange){ 0UL, [timeFormat length] }]; + timeFormat = timeFormatMutable; + } + return timeFormat; +} + +- (NSString *)stringFromDate:(NSDate *)date +{ + switch (self.format) { + case RKISO8601DateFormatCalendar: + return [self stringFromDate:date formatString:RK_ISOCALENDAR_DATE_FORMAT]; + case RKISO8601DateFormatWeek: + return [self weekDateStringForDate:date timeZone:self.timeZone]; + case RKISO8601DateFormatOrdinal: + return [self stringFromDate:date formatString:RK_ISOORDINAL_DATE_FORMAT]; + default: + [NSException raise:NSInternalInconsistencyException format:@"self.format was %ld, not calendar (%d), week (%d), or ordinal (%d)", (unsigned long) self.format, RKISO8601DateFormatCalendar, RKISO8601DateFormatWeek, RKISO8601DateFormatOrdinal]; + return nil; + } +} + +- (NSString *)stringFromDate:(NSDate *)date formatString:(NSString *)dateFormat +{ + if (self.includeTime) dateFormat = [dateFormat stringByAppendingFormat:@"'T'%@", [self replaceColonsInString:RK_ISOTIME_FORMAT withTimeSeparator:self.timeSeparator]]; + + if (! [dateFormat isEqualToString:self.lastUsedFormatString]) { + self.unparsingFormatter = nil; + self.lastUsedFormatString = dateFormat; + } + + if (!self.unparsingFormatter) { + self.unparsingFormatter = [[NSDateFormatter alloc] init]; + self.unparsingFormatter.formatterBehavior = NSDateFormatterBehavior10_4; + self.unparsingFormatter.dateFormat = dateFormat; + self.unparsingFormatter.calendar = self.unparsingCalendar; + self.unparsingFormatter.timeZone = self.timeZone; + self.unparsingFormatter.locale = self.locale; + } + + NSString *str = [self.unparsingFormatter stringForObjectValue:date]; + if (self.includeTime) { + NSInteger offset = [self.timeZone secondsFromGMT]; + offset /= 60; //bring down to minutes + if (offset == 0) + str = [str stringByAppendingString:RK_ISOTIMEZONE_UTC_FORMAT]; + else + str = [str stringByAppendingFormat:RK_ISOTIMEZONE_OFFSET_FORMAT, (long) (offset / 60), (long) (offset % 60)]; + } + + return str; +} + +- (NSString *)stringForObjectValue:(id)value +{ + NSParameterAssert([value isKindOfClass:[NSDate class]]); + return [self stringFromDate:(NSDate *)value]; +} + +/*Adapted from: + * Algorithm for Converting Gregorian Dates to ISO 8601 Week Date + * Rick McCarty, 1999 + * http://personal.ecu.edu/mccartyr/ISOwdALG.txt + */ +- (NSString *)weekDateStringForDate:(NSDate *)date +{ + self.unparsingCalendar.timeZone = self.timeZone; + self.unparsingCalendar.locale = self.locale; + NSDateComponents *components = [self.unparsingCalendar components:RK_CALENDAR_UNIT_YEAR | RK_CALENDAR_UNIT_WEEKDAY | RK_CALENDAR_UNIT_DAY fromDate:date]; + + //Determine the ordinal date. + NSDateComponents *startOfYearComponents = [self.unparsingCalendar components:RK_CALENDAR_UNIT_YEAR fromDate:date]; + startOfYearComponents.month = 1; + startOfYearComponents.day = 1; + NSDateComponents *ordinalComponents = [self.unparsingCalendar components:RK_CALENDAR_UNIT_DAY fromDate:[self.unparsingCalendar dateFromComponents:startOfYearComponents] toDate:date options:0]; + ordinalComponents.day += 1; + + enum { + monday, tuesday, wednesday, thursday, friday, saturday, sunday + }; + enum { + january = 1, february, march, + april, may, june, + july, august, september, + october, november, december + }; + + NSInteger year = components.year; + NSInteger week = 0; + //The old unparser added 6 to [calendarDate dayOfWeek], which was zero-based; components.weekday is one-based, so we now add only 5. + NSInteger dayOfWeek = (components.weekday + 5) % 7; + NSInteger dayOfYear = ordinalComponents.day; + + NSInteger prevYear = year - 1; + + BOOL yearIsLeapYear = is_leap_year(year); + BOOL prevYearIsLeapYear = is_leap_year(prevYear); + + NSInteger YY = prevYear % 100; + NSInteger C = prevYear - YY; + NSInteger G = YY + YY / 4; + NSInteger Jan1Weekday = (((((C / 100) % 4) * 5) + G) % 7); + + NSInteger weekday = ((dayOfYear + Jan1Weekday) - 1) % 7; + + if ((dayOfYear <= (7 - Jan1Weekday)) && (Jan1Weekday > thursday)) { + week = 52 + ((Jan1Weekday == friday) || ((Jan1Weekday == saturday) && prevYearIsLeapYear)); + --year; + } else { + NSInteger lengthOfYear = 365 + yearIsLeapYear; + if ((lengthOfYear - dayOfYear) < (thursday - weekday)) { + ++year; + week = 1; + } else { + NSInteger J = dayOfYear + (sunday - weekday) + Jan1Weekday; + week = J / 7 - (Jan1Weekday > thursday); + } + } + + NSString *timeString; + if (self.includeTime) { + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; + unichar timeSep = self.timeSeparator; + if (!timeSep) timeSep = RKISO8601DefaultTimeSeparatorCharacter; + formatter.dateFormat = [self replaceColonsInString:RK_ISOTIME_WITH_TIMEZONE_FORMAT withTimeSeparator:timeSep]; + + timeString = [formatter stringForObjectValue:date]; + } else + timeString = @""; + + return [NSString stringWithFormat:@"%lu-W%02lu-%02lu%@", (unsigned long)year, (unsigned long)week, ((unsigned long)dayOfWeek) + 1U, timeString]; +} + +@end + +static NSUInteger read_segment(const unsigned char *str, const unsigned char **next, NSUInteger *out_num_digits) { + NSUInteger num_digits = 0U; + NSUInteger value = 0U; + + while(isdigit(*str)) { + value *= 10U; + value += *str - '0'; + ++num_digits; + ++str; + } + + if (next) *next = str; + if (out_num_digits) *out_num_digits = num_digits; + + return value; +} +static NSUInteger read_segment_4digits(const unsigned char *str, const unsigned char **next, NSUInteger *out_num_digits) { + NSUInteger num_digits = 0U; + NSUInteger value = 0U; + + if (isdigit(*str)) { + value += *(str++) - '0'; + ++num_digits; + } + + if (isdigit(*str)) { + value *= 10U; + value += *(str++) - '0'; + ++num_digits; + } + + if (isdigit(*str)) { + value *= 10U; + value += *(str++) - '0'; + ++num_digits; + } + + if (isdigit(*str)) { + value *= 10U; + value += *(str++) - '0'; + ++num_digits; + } + + if (next) *next = str; + if (out_num_digits) *out_num_digits = num_digits; + + return value; +} +static NSUInteger read_segment_2digits(const unsigned char *str, const unsigned char **next) { + NSUInteger value = 0U; + + if (isdigit(*str)) + value += *str - '0'; + + if (isdigit(*++str)) { + value *= 10U; + value += *(str++) - '0'; + } + + if (next) *next = str; + + return value; +} + +//strtod doesn't support ',' as a separator. This does. +static double read_double(const unsigned char *str, const unsigned char **next) { + double value = 0.0; + + if (str) { + NSUInteger int_value = 0; + + while(isdigit(*str)) { + int_value *= 10U; + int_value += (*(str++) - '0'); + } + value = int_value; + + if (((*str == ',') || (*str == '.'))) { + ++str; + + register double multiplier, multiplier_multiplier; + multiplier = multiplier_multiplier = 0.1; + + while(isdigit(*str)) { + value += (*(str++) - '0') * multiplier; + multiplier *= multiplier_multiplier; + } + } + } + + if (next) *next = str; + + return value; +} + +static BOOL is_leap_year(NSUInteger year) { + return \ + ((year % 4U) == 0U) + && (((year % 100U) != 0U) + || ((year % 400U) == 0U)); +} diff --git a/code/iOS/ScriptorSprint3/Pods/ISO8601DateFormatterValueTransformer/LICENSE b/code/iOS/ScriptorSprint3/Pods/ISO8601DateFormatterValueTransformer/LICENSE new file mode 100644 index 0000000..37ec93a --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/ISO8601DateFormatterValueTransformer/LICENSE @@ -0,0 +1,191 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +2. Grant of Copyright License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +3. Grant of Patent License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. + +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source form +of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. + +5. Submission of Contributions. + +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. + +6. Trademarks. + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. + +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +8. Limitation of Liability. + +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same "printed page" as the copyright notice for easier identification within +third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/code/iOS/ScriptorSprint3/Pods/ISO8601DateFormatterValueTransformer/README.md b/code/iOS/ScriptorSprint3/Pods/ISO8601DateFormatterValueTransformer/README.md new file mode 100644 index 0000000..c08cf6d --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/ISO8601DateFormatterValueTransformer/README.md @@ -0,0 +1,51 @@ +ISO8601DateFormatterValueTransformer +==================================== + +A small Objective-C library that integrates Peter Hosey's [ISO8601DateFormatter](https://github.com/boredzo/iso-8601-date-formatter) +with [RKValueTransformers](https://github.com/RestKit/RKValueTransformers). + +The implementation is done by adding `RKValueTransforming` conformance to the `ISO8601DateFormatter` via a category. + +## Examples + +### Usage + +Basic usage is identical to all other `RKValueTransforming` classes. + +```objc +#import "ISO8601DateValueTransformer.h" + +RKISO8601DateFormatter *dateFormatter = [RKISO8601DateFormatter defaultISO8601DateFormatter]; + +// Transforming NSDate -> String +NSString *dateString = nil; +NSError *error = nil; +BOOL success = [dateFormatter transformValue:[NSDate date] toValue:&dateString ofClass:[NSDate class] error:&error]; + +// Transforming NSString -> NSDate +NSDate *date = nil; +success = [dateFormatter transformValue:@"2013-09-12T07:24:56-04:00" toValue:&dateString ofClass:[NSDate class] error:&error]; +``` + +### Configuration as Default Date Transformer + +Adding the date formatter to the default value transformer at position 0 ensures that it is used ahead of all other `NSString` <-> `NSDate` value transformers. + +```objc +#import "ISO8601DateValueTransformer.h" + +RKISO8601DateFormatter *dateFormatter = [RKISO8601DateFormatter defaultISO8601DateFormatter]; +[[RKValueTransformer defaultValueTransformer] insertValueTransformer:dateFormatter atIndex:0]; +``` + +## Credits + +Blake Watters + +- http://github.com/blakewatters +- http://twitter.com/blakewatters +- blakewatters@gmail.com + +## License + +ISO8601DateFormatterValueTransformer is available under the Apache 2 License. See the LICENSE file for more info. diff --git a/code/iOS/ScriptorSprint3/Pods/Manifest.lock b/code/iOS/ScriptorSprint3/Pods/Manifest.lock new file mode 100644 index 0000000..6cd39a9 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Manifest.lock @@ -0,0 +1,46 @@ +PODS: + - ISO8601DateFormatterValueTransformer (0.6.1): + - RKValueTransformers (~> 1.1.0) + - RestKit (0.27.3): + - RestKit/Core (= 0.27.3) + - RestKit/Core (0.27.3): + - RestKit/CoreData + - RestKit/Network + - RestKit/ObjectMapping + - RestKit/CoreData (0.27.3): + - RestKit/ObjectMapping + - RestKit/Network (0.27.3): + - RestKit/ObjectMapping + - RestKit/Support + - SOCKit + - RestKit/ObjectMapping (0.27.3): + - ISO8601DateFormatterValueTransformer (~> 0.6.1) + - RestKit/Support + - RKValueTransformers (~> 1.1.0) + - RestKit/Support (0.27.3): + - TransitionKit (~> 2.2) + - RKValueTransformers (1.1.3) + - SOCKit (1.1) + - TransitionKit (2.2.1) + +DEPENDENCIES: + - RestKit + +SPEC REPOS: + https://github.com/cocoapods/specs.git: + - ISO8601DateFormatterValueTransformer + - RestKit + - RKValueTransformers + - SOCKit + - TransitionKit + +SPEC CHECKSUMS: + ISO8601DateFormatterValueTransformer: 52da467d6ec899d6aedda8e48280ac92e8ee97e6 + RestKit: 0baa8b61899d1e00c24f4f2d8aea07ecef0c88bc + RKValueTransformers: e5ed67e3811229b616fe01bddeeafe3bb337b1b9 + SOCKit: c7376ac262bea9115b8f749358f762522a47d392 + TransitionKit: 9ceccda4cd0cdc0a05ef85eb235e5a3292c3c250 + +PODFILE CHECKSUM: 7c4416e6a658366b3f719a8972a0534f27e2dfa4 + +COCOAPODS: 1.6.1 diff --git a/code/iOS/ScriptorSprint3/Pods/Pods.xcodeproj/project.pbxproj b/code/iOS/ScriptorSprint3/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 0000000..81ce4e1 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,1780 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 01363F3D25A1765888191BEC1852B291 /* TKEvent.m in Sources */ = {isa = PBXBuildFile; fileRef = 97057CFDBF9E7435C45AC9FF96EC0A22 /* TKEvent.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 047EB6DA48533EE90EE1B2AEB21D8CBE /* RKURLEncodedSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 584A2768583312016678DC2C9BBBAE22 /* RKURLEncodedSerialization.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 04FFF6F212A2C54E92D6D38FB7B756F7 /* RKManagedObjectRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = C8BE68EAA7B45AAEF03DF71CDD6F9B55 /* RKManagedObjectRequestOperation.m */; }; + 05157B83ABC54D68A3461B4B9108FD71 /* ISO8601DateFormatterValueTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F63093292674A527DC2DCD5E25BE0B8 /* ISO8601DateFormatterValueTransformer.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 056713E45D8E0B04FAD2B37DE6D14991 /* RKMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 943828BAB3D76C9F5E5FABA6088BDACE /* RKMacros.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 05A8A23272EAD867AB95BF88B30FAF08 /* RKMapperOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 69E4E9A1C480270C2CC7E41445C98A63 /* RKMapperOperation.m */; }; + 07228DD33F6D12B4E2C9675F46BB3733 /* RKObjectRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 30B6BDB20441823741C1C2856C340026 /* RKObjectRequestOperation.m */; }; + 095E23397C44B44EA17FB2F22A8AFD59 /* RKPropertyInspector+CoreData.m in Sources */ = {isa = PBXBuildFile; fileRef = 2229F03403C3726C4D67FC4EEB1B8E89 /* RKPropertyInspector+CoreData.m */; }; + 0D87C3AED9F7C31018535F9DFA7B63F8 /* RKMapping.m in Sources */ = {isa = PBXBuildFile; fileRef = 836EEB3262670C44A87485144FB45C0D /* RKMapping.m */; }; + 0E0BC4B41C342962130F25A721F79582 /* RKPropertyInspector+CoreData.h in Headers */ = {isa = PBXBuildFile; fileRef = E8639F5B4E3F15747B9ED5661AEB7FC2 /* RKPropertyInspector+CoreData.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 0E83CFB69FB5FAE6CEAD0CC525CF2EA0 /* RKMIMETypeSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 39E3ABD4B23BC79DC65CF5726F64CDFA /* RKMIMETypeSerialization.m */; }; + 0F20E7E8D5380B67134D9ECC3A1B2AD9 /* RKPropertyInspector.h in Headers */ = {isa = PBXBuildFile; fileRef = 639CED6AF3926976D85C15588E91106F /* RKPropertyInspector.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 0F6769A1AF10F40B9E0431ED6D360FE4 /* RKOperationStateMachine.h in Headers */ = {isa = PBXBuildFile; fileRef = 9F81AC59A09A6182135D51C095287BA6 /* RKOperationStateMachine.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 0FE2900C3D9852BCE6D315C8B5955C1D /* RKRequestDescriptor.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E3269918F75BAEC8FCD231FA5827D3A /* RKRequestDescriptor.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 130D68BA8817DD6BD62D3DBED631FA83 /* TKState.h in Headers */ = {isa = PBXBuildFile; fileRef = 07045F5A3465039AA002659668B27018 /* TKState.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 146E7049CC6F70F6FABCA97705A89E5A /* RKConnectionDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C866D920FCDF4B7889047C0B195799A /* RKConnectionDescription.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 14FCD35FEDA03DFBB1FA0F51F8923823 /* Network.h in Headers */ = {isa = PBXBuildFile; fileRef = 617D5C9BBC85A2CA6298A66BF3C1EB0F /* Network.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 17EAA8E53862372294869F2FD9484B4E /* RKValueTransformers-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 80326CF9A29E8F03A47B760A7D93E7EE /* RKValueTransformers-dummy.m */; }; + 1B0E964D9D3A76452B29C9A37DE752B7 /* RKObjectParameterization.h in Headers */ = {isa = PBXBuildFile; fileRef = 469D6CB2B78B5317FDC3CDE9E0CB371A /* RKObjectParameterization.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 1BA115952B2429F55E4D73D45972E92F /* CoreData.h in Headers */ = {isa = PBXBuildFile; fileRef = 8CCFA847A5A85B6E42344DDB8D1C024C /* CoreData.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 1BB700A949658114DB190AB0025E6CEC /* RKMapperOperation_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 6928FB36B401C471D9BB0E3918619E7A /* RKMapperOperation_Private.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 1BDFB73811BAFBB33DF07A4339151077 /* RKSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = BFB9717BE82F2CFFA71185D31F38BC00 /* RKSerialization.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 1C656D5498238D593F3194F316BAC36F /* NSManagedObject+RKAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 471FCA526EB98ECDC4138749DC541CDB /* NSManagedObject+RKAdditions.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 1CAB46D2AD7550E73D53F4CA6D8D2635 /* RKFetchRequestManagedObjectCache.m in Sources */ = {isa = PBXBuildFile; fileRef = A13C2091C69F40F77759955E55A893E3 /* RKFetchRequestManagedObjectCache.m */; }; + 1D6C962344ABCEF7E7006E48961B079B /* RKPathUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = CCF4E7D4FBE1C574F748A7B8C448D8D9 /* RKPathUtilities.m */; }; + 1F0A42E5BDAD82ACDE94DD1FA9E865C5 /* AFRKNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = D40C60FBE47BCA71E2DD3B7D9BE841A0 /* AFRKNetworking.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 1FE391DF92F7A32CDF98441BEC0B9EE4 /* RKEntityCache.m in Sources */ = {isa = PBXBuildFile; fileRef = F9DFCD53E05189C5FF1B38F246ACFA00 /* RKEntityCache.m */; }; + 22167E087BE65C2AAE26924754D85448 /* RKDictionaryUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 818ABB0194001EC9CBCAB57DF9EF5954 /* RKDictionaryUtilities.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 244FB31EBE472B4C0EAA347BD7997156 /* RKPathMatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A75DB73F51AD7E529E9D24ECB4E79D4 /* RKPathMatcher.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 25C1B821DD00C0BE67900CBB025F3767 /* RKStringTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 386EA28A5B0B4AF52641265558E237BD /* RKStringTokenizer.m */; }; + 2783065A61CCA2A4CCFEDA710CDF5AB9 /* RKAttributeMapping.h in Headers */ = {isa = PBXBuildFile; fileRef = BDB8D98946B23EF227FADEFC0012730E /* RKAttributeMapping.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 2797905E589952440714225C41E302A2 /* RKObjectParameterization.m in Sources */ = {isa = PBXBuildFile; fileRef = BB4D6177B6CB5365D56F6020D90245AB /* RKObjectParameterization.m */; }; + 2967A38924953C676028615939735929 /* RKObjectMappingMatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 9599240A89AA0C327E3A19F1B8E986EB /* RKObjectMappingMatcher.m */; }; + 2D13F6F3CA2393D088C725F1E93D5C2D /* RKMappingOperationDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = EF386B4114C2FB19BAC43050F0F7284C /* RKMappingOperationDataSource.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 2D579D5202D0A695D31D4A49132E71A1 /* RKDotNetDateFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = 12B67CEF980B1F6A5D635604D11C5254 /* RKDotNetDateFormatter.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 2EB088E920160B4A9DBB5AD643E77F5B /* RKURLEncodedSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = D1BE1BB47B33CF706182E58244A377AE /* RKURLEncodedSerialization.m */; }; + 30028C8F1578A4C70E2B16588099B902 /* RKHTTPRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 03D467D6E47F50CD14CAC792E847B107 /* RKHTTPRequestOperation.m */; }; + 30D6D0DE0BC145381E3A3FF5AD49AECF /* RKRelationshipConnectionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93CA009A22A43C23A6A6A7F88C186080 /* RKRelationshipConnectionOperation.m */; }; + 335A775DB7412931332C8F0EE9F4329C /* ObjectMapping.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C0249A332A98CF8B7B3B49AE552A58E /* ObjectMapping.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 35141B9A7A5050761229560956C82F77 /* RKEntityMapping.h in Headers */ = {isa = PBXBuildFile; fileRef = 06A7610F6B531EF0E84132A0E5D28BB3 /* RKEntityMapping.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 356412E6F3E5DF91DCD3C2E7CFA22669 /* AFRKPropertyListRequestOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = A2AAA6CA12BB0EFFFCC7C6C677562A42 /* AFRKPropertyListRequestOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 35922EB4C376E4895979E3AF08DD6C43 /* RKErrorMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 30ADE26D1A909180EF0609EB609D2354 /* RKErrorMessage.m */; }; + 39EDEB464B8220EE8C61F44F621E25FC /* RKValueTransformers.h in Headers */ = {isa = PBXBuildFile; fileRef = A789AF4D82C0A1869E620AB43478C835 /* RKValueTransformers.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 3B5076EE99E9ACFFA8B7E746539C5CE7 /* RKConnectionDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = F91FB742E6BE786B5C0E6F271893186D /* RKConnectionDescription.m */; }; + 3CDE2498E308DAC906956216CCFF54E1 /* TKTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = DBB5BBDFF8EF5B47581FEB48E82A5901 /* TKTransition.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 3F20DA9A7D4392D2DC7FFC59AC699B74 /* lcl_config_components_RK.h in Headers */ = {isa = PBXBuildFile; fileRef = CF65796F06806CEF36F68F72654DF8C1 /* lcl_config_components_RK.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 3F9FD34405BF669B0AC18240D473214B /* RKPaginator.h in Headers */ = {isa = PBXBuildFile; fileRef = 4FB6FD2D1B19716383B8B9EB1C503558 /* RKPaginator.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 42243A71B4E2DF770EA0F30FC8292F6E /* lcl_RK.h in Headers */ = {isa = PBXBuildFile; fileRef = 7DC7CBD9B588A88401673148863CA586 /* lcl_RK.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 42632B14CC1E08EEB5F78CE0768F0780 /* RKHTTPUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 32608CAEA3BEABAA620C5584479989EA /* RKHTTPUtilities.m */; }; + 42B32D66A8CDA89F8B11B6CAA1CD5D5F /* TransitionKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E83411E63F39A9A126D4B50B570E260 /* TransitionKit-dummy.m */; }; + 42D8EBAFBB26C5D36FC700AADC976130 /* RKPaginator.m in Sources */ = {isa = PBXBuildFile; fileRef = 8249BCE32E7768E3DA83D4755000D749 /* RKPaginator.m */; }; + 44C046B4F0113CDD6541DE14AAA8D560 /* NSManagedObject+RKAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = F9A9DFE137B2B47ED74D6143D86B3CAF /* NSManagedObject+RKAdditions.m */; }; + 4588FD53B929201FECE9F92C182551BF /* NSManagedObjectContext+RKAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 7CF4DDC99C858D47EBAED3ABCB102D8B /* NSManagedObjectContext+RKAdditions.m */; }; + 4688A5261715D865975268A9981A2E24 /* RKRouteSet.h in Headers */ = {isa = PBXBuildFile; fileRef = CE7E7583CF5D298612B27EF9580A6E62 /* RKRouteSet.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 491762AE6B20FA9820C4C8883E7CA4A3 /* TKStateMachine.m in Sources */ = {isa = PBXBuildFile; fileRef = EC7C79295069C679AC61DDF2BF22EF71 /* TKStateMachine.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 4B3D838D3B8DEB044CF78177E1F785CF /* RKObjectRequestOperationSubclass.h in Headers */ = {isa = PBXBuildFile; fileRef = EFB029ED5CD0BDCA976660290B818B1B /* RKObjectRequestOperationSubclass.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 4D9BB9375F26E29455A3BD543A5B4526 /* AFRKURLConnectionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E63BF89CC4198695857B9FE3AB137BC /* AFRKURLConnectionOperation.m */; }; + 4E2564A9716FC13BFDDCAD11C1608DB4 /* UIImageView+AFRKNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = E3561264E8767681B3099CF747EBD08A /* UIImageView+AFRKNetworking.m */; }; + 4E4CE2A9638C2F226A04A832E2F022CF /* TKTransition.h in Headers */ = {isa = PBXBuildFile; fileRef = 696C74BC9F7D33F2B4F9B89405C8AF1D /* TKTransition.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 5234EC410317BF7BE3D8A5E9C7EC6DC4 /* RestKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 99CFD17E31EA21B6CD9EFA6B1FD602DA /* RestKit.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 52BD7639FEAEB10AAD8E4AB75630D8C5 /* AFRKNetworkActivityIndicatorManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DA9F3F317C02DED3BD9A5AFCB612729 /* AFRKNetworkActivityIndicatorManager.m */; }; + 52FFA4EC4B1AD6B56BD87A9204A2DE3C /* AFRKImageRequestOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 5BCAF23EF25EAB9D27C1B4BBA4A89F24 /* AFRKImageRequestOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 53AE74966263CACC115FF4B73D245CC1 /* RKMIMETypes.h in Headers */ = {isa = PBXBuildFile; fileRef = FE4D5F8E8BFA5C4D0C6275677E22CA24 /* RKMIMETypes.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 554D46939CCCE39E3F120525FC639198 /* RKMIMETypeSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = E5EAAD314BD23BB1F03363DCDAC931DB /* RKMIMETypeSerialization.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 59B390CA2378D0F6FA92C2910C56788F /* RKRouter.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B9F74FED781476D0085E16F03B8ADC2 /* RKRouter.m */; }; + 5C18BA1520EC93E771A75045097F1065 /* AFRKXMLRequestOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E426F6FE922AE09AD95F468181401EB /* AFRKXMLRequestOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 5F356E49B3AC333F2C05464B32926113 /* TKState.m in Sources */ = {isa = PBXBuildFile; fileRef = 65A0692FB7DC29935F73426D7A7D8365 /* TKState.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 5F41F1B9F74342AC561A144FA9E1AD13 /* RKFetchRequestManagedObjectCache.h in Headers */ = {isa = PBXBuildFile; fileRef = A31370201E305F885AC57DC43FFF716D /* RKFetchRequestManagedObjectCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 625FAAD78145DDF2F75D6B198BFB0ACF /* RKRelationshipConnectionOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E1B4AB50FA075B87E7188C74FA19394 /* RKRelationshipConnectionOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 6376F8BBB5CEF3D6B69771F9B76DA22E /* TKStateMachine.h in Headers */ = {isa = PBXBuildFile; fileRef = D5C9FFACDFBAFE975CA173389B31A30F /* TKStateMachine.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 66D41E937A17018CF718531CF173B6A1 /* RKPropertyMapping.m in Sources */ = {isa = PBXBuildFile; fileRef = 4DEBFE81A6EE81790436E723B36353D9 /* RKPropertyMapping.m */; }; + 670AD0B5E4842C6A6A115378EAB67021 /* RKStringTokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = D1DB92CFDA321BB35EB1C452D2C3019F /* RKStringTokenizer.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 6744E3E1DCC24F0873CDAA08476DDC1C /* RKISO8601DateFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = C09EA4EC4FB50C2D916A6653D5FE1B6C /* RKISO8601DateFormatter.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 682DC537BF45303E566E64C690CEDF22 /* SOCKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 83D55A9270D9A12859A6CD964589F4A8 /* SOCKit.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 68A89B6C709165D14E6AB062F12C63EE /* RKManagedObjectCaching.h in Headers */ = {isa = PBXBuildFile; fileRef = F17B4818053CC77B353174D37B10EEA3 /* RKManagedObjectCaching.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 69176E416985C76453DFE7536316CF90 /* RKManagedObjectImporter.m in Sources */ = {isa = PBXBuildFile; fileRef = B3652229E20484494A45B74A9E830220 /* RKManagedObjectImporter.m */; }; + 6A01B359408D32DE4C27813809317841 /* RKRoute.m in Sources */ = {isa = PBXBuildFile; fileRef = 942DB56BD3C7784F4C911CC8048E7F15 /* RKRoute.m */; }; + 6A7FD0AE32FC5C8CB168DD63485DDB76 /* AFRKImageRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 058DE072D427CC03F5C162C03D23695D /* AFRKImageRequestOperation.m */; }; + 6BF56BFB1C723EAB9D3C3ED22CDE3536 /* RKISO8601DateFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0387A8B9A0133430AB05EA75ED4BF392 /* RKISO8601DateFormatter.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 6C73C460F072E8F3F842813B81FB540F /* ISO8601DateFormatterValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = AEAECEF245F26F95F098DC910CED7757 /* ISO8601DateFormatterValueTransformer.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 6FD1E430303FA40E5F83D06735748F97 /* RKErrorMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = FA5F023A545AF1DF72816E9220C4419C /* RKErrorMessage.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 701BF9B02109C03DAFD2AC84B708FD33 /* ISO8601DateFormatterValueTransformer-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F3982655691F193BBCE88B142E87572 /* ISO8601DateFormatterValueTransformer-dummy.m */; }; + 74557AF9096AA6BC994FE4A2CB78739C /* RKObjectMapping.h in Headers */ = {isa = PBXBuildFile; fileRef = 5A16931B0ECA0EA687331B9F5805BADC /* RKObjectMapping.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 745EAAB3D58E5DCA16C5D181DA0DC96D /* RKRouter.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C78F9FF9EF26DC9CF31363E49E20083 /* RKRouter.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 74C395A7B1867C8CAFDCA6DBEAA36E9E /* AFRKHTTPRequestOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 8CFBFA8F8FB475214898130D9EEDFDB1 /* AFRKHTTPRequestOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 74FFF3C449612C3A189294ADBC9A12E1 /* SOCKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 643DA933BBD088021A8E9B85877EEF83 /* SOCKit.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 76CE28F79C2A56F121543B5164336863 /* lcl_config_logger_RK.h in Headers */ = {isa = PBXBuildFile; fileRef = 4463A03A792B44D093C38D243B68C906 /* lcl_config_logger_RK.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 76D13C18130EB6BD9FF69A165B913314 /* lcl_RK.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F1C903698BCB3B0A70E8AD8F5416F40 /* lcl_RK.m */; }; + 7864E9512B78370A58E8B525DB8EA7B6 /* RKLog.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B941232DFDD0E08FA8600307AD6589D /* RKLog.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 7A57939FE8B8B752D3B985B4F1B0C4CE /* RKManagedObjectMappingOperationDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 804174339EA13EB7CCF28EE8E1C1F028 /* RKManagedObjectMappingOperationDataSource.m */; }; + 7E4D6315DE997B07C5F208470BBB5D58 /* RKErrors.h in Headers */ = {isa = PBXBuildFile; fileRef = 08AFB3C6E0D9A7472BC49AD06CE0EDF3 /* RKErrors.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 806417D3C85813DE9D5E546649FE6FCB /* Support.h in Headers */ = {isa = PBXBuildFile; fileRef = E79A02BB7A0DDB9A5C285B6691380AF8 /* Support.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 8080C001B26DAE0F278144894512DA04 /* RKResponseDescriptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 3EF382EB33031814D3BE13D4AB3252FF /* RKResponseDescriptor.m */; }; + 81BCBC302CCC180E08D7FA9BB19DF757 /* RKRelationshipMapping.m in Sources */ = {isa = PBXBuildFile; fileRef = 866A9F7A49509ED5CD51FD4FB2549225 /* RKRelationshipMapping.m */; }; + 831772F10A4CD4D6439E4AD6FCE06BA1 /* RKObjectManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 49DAE54A61D31381ADEC0383FB6BA0B4 /* RKObjectManager.m */; }; + 858A94A1606D743ABA2F9FBDE0A0984D /* RKResponseMapperOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 34FD3AFD7337855EEAF47049147C72E7 /* RKResponseMapperOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 858D1703DB9AC7AF5150E3088BFDCA23 /* RKMapping.h in Headers */ = {isa = PBXBuildFile; fileRef = B372D98F24054EFF0BFE74F4522C6971 /* RKMapping.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 85EA2B4E82A5A0271FABF921803451E6 /* RKManagedObjectStore.h in Headers */ = {isa = PBXBuildFile; fileRef = E1BEBBF772BDD639E7A55A785969BDD0 /* RKManagedObjectStore.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 86A708C78BAF4D630A071EA6BD277C02 /* RKManagedObjectStore.m in Sources */ = {isa = PBXBuildFile; fileRef = CFCF51FF183C632D5B9ED4B831974743 /* RKManagedObjectStore.m */; }; + 879D84F48A62B5233B8C3BA8F19822F3 /* RKDynamicMapping.m in Sources */ = {isa = PBXBuildFile; fileRef = 57CF177DFF07D87700EDA9282B95E671 /* RKDynamicMapping.m */; }; + 8804E2C3B7C14696BCF481E8FE521E9C /* AFRKPropertyListRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = BD3425E2A4B2770E18E1835C3C17AC3B /* AFRKPropertyListRequestOperation.m */; }; + 8CFA2E2C49309077D72E8C4605996F6C /* RestKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A1E85472070D4151DC8AC2CFA2193508 /* RestKit-dummy.m */; }; + 8D1A26144E5E0BB74B07E80A4EB84ACF /* RKManagedObjectStore_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 688F62464EADAEBF5B8866012CC85FB7 /* RKManagedObjectStore_Private.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 8D4391D48813B432B7EC53F7DB233F41 /* RKHTTPRequestOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 2312327301D0033AED860EAF5C633F1F /* RKHTTPRequestOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 8D5D26E97BEDFFC491BCE5E99F4F7418 /* RKObjectRequestOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 29DFA4C768DC64FCECF87C953C78EC6F /* RKObjectRequestOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 8E35CB31B8B5E6C3A3EA9D1BB25C42F7 /* TransitionKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA0799BBF1BB8636058B29F88685AD8 /* TransitionKit.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 917DF75FF9C068C04B7D916C0898A2BF /* RKPropertyInspector.m in Sources */ = {isa = PBXBuildFile; fileRef = A969B3045A987B8C1674A9A7F49A622F /* RKPropertyInspector.m */; }; + 928F27D3A53F9BA9014807C54A15B12D /* RKLog.m in Sources */ = {isa = PBXBuildFile; fileRef = C3297E038746A54695B877FAD306F86A /* RKLog.m */; }; + 93969EE16740DD947E249F0832E58ABD /* AFRKHTTPClient.m in Sources */ = {isa = PBXBuildFile; fileRef = 16B27CFDD38ACC9B60046715E6110AC0 /* AFRKHTTPClient.m */; }; + 96B466EAF2969EE61E3719A068B7121A /* RKRouteSet.m in Sources */ = {isa = PBXBuildFile; fileRef = B075230AA67A231D6FC0CC2CE9D42F23 /* RKRouteSet.m */; }; + 973322320D9BAF3A93A7A8CB57503BFD /* AFRKURLConnectionOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C48F9663C5F2AAEC2B22A09BD22DCED /* AFRKURLConnectionOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 9B307C376A5D1401C5D53B17003AD769 /* lcl_config_extensions_RK.h in Headers */ = {isa = PBXBuildFile; fileRef = E704BD136883E9CD4D213A72F20AF7A2 /* lcl_config_extensions_RK.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 9CE3422A558B68C181BC1FD301A0BD23 /* Pods-ScriptorSprint2-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D33CFD30E99E150B87392D6FFD437F44 /* Pods-ScriptorSprint2-dummy.m */; }; + 9E7EFED07EC1169A03F36A9C1D5E65DF /* RKMappingErrors.h in Headers */ = {isa = PBXBuildFile; fileRef = 8AC938F96E0D3DDB85FB5BF87045AF75 /* RKMappingErrors.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A328C11F465638DF627B41BAD7A9E895 /* AFRKHTTPRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = DE54136E775BC20DD400ED9F39FF4B67 /* AFRKHTTPRequestOperation.m */; }; + A707CC681FD91D2CB490C698FB5909FD /* RKResponseMapperOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D55E978B029BFE476EDB1C7686BE7C83 /* RKResponseMapperOperation.m */; }; + A82FA43C39F2A6B50D5F2F0C3BEF5624 /* RKNSJSONSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 263ECB09B91C1F9C09FE45E495C59EA6 /* RKNSJSONSerialization.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A864C45E7DD1866E00B9D574612F5BA2 /* RKInMemoryManagedObjectCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D0BECC11A171CC5D00BAB840DFC9FED /* RKInMemoryManagedObjectCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A8AE3A31FEA4543382FB0D22732A641C /* RKDictionaryUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 618CD82AABF1C3B46AE34482441EDB6A /* RKDictionaryUtilities.m */; }; + A9910C94489B3B991436A66018DB58EB /* RKEntityByAttributeCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 94A2EE9A6E881688BD87AB9998795298 /* RKEntityByAttributeCache.m */; }; + A9E3E0CC06C14C5C2ADF0D89CEA61110 /* RKValueTransformers.m in Sources */ = {isa = PBXBuildFile; fileRef = A81E91ED05C9F582515498FA171C649A /* RKValueTransformers.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + ACD4ACD558C472F88D5DBAE133056352 /* RKResponseDescriptor.h in Headers */ = {isa = PBXBuildFile; fileRef = B714797D2353F73D508616BDAECBA49B /* RKResponseDescriptor.h */; settings = {ATTRIBUTES = (Project, ); }; }; + AEDF81AD88A6B7E502BFA213A149230D /* RKMapperOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = EDCD7AE3D83890197E917B81BDF86961 /* RKMapperOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + B05DA782B2554C783FEF661327E1CA5B /* RKObjectUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 142ACB9D7BC81DFE57B0783CE1D3DBD1 /* RKObjectUtilities.m */; }; + B2BD845529E28D2D0EA88D8A843E6F31 /* RKMappingOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 07A99F8C42BCF5029B7CBA0FA8AB84FB /* RKMappingOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + B330276FC3AEAE130B97B6DE2BC9DB35 /* RKPathMatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = C73FD16B810CA36AF185DC4F715A2DF8 /* RKPathMatcher.m */; }; + B452D23740D59993B70ABD33BC487943 /* RKObjectMapping.m in Sources */ = {isa = PBXBuildFile; fileRef = C51515F8F202F1DFC9FC508ADE93E5D0 /* RKObjectMapping.m */; }; + B60111AC64D32BF2D6ED66D29651E700 /* RKEntityByAttributeCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 0CF716D9386CEFD87AE32B673F2D3C2F /* RKEntityByAttributeCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; + B6C202EB94CF408F87F5F6A25F7F97DD /* RKHTTPUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A4C881B6A0F82EE1905E0B4AA379611 /* RKHTTPUtilities.h */; settings = {ATTRIBUTES = (Project, ); }; }; + B8D01D4843F42CFA084017E04285FC47 /* RKDynamicMapping.h in Headers */ = {isa = PBXBuildFile; fileRef = 885EEBFF7748EA379DDEDE7B26FB87AA /* RKDynamicMapping.h */; settings = {ATTRIBUTES = (Project, ); }; }; + BC6CAD1DFFAE68982706F6F9AAF3DAAB /* RKPathUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 91C4D5B08E162BF684858F6651A12D26 /* RKPathUtilities.h */; settings = {ATTRIBUTES = (Project, ); }; }; + BE3B10895CAC6A68C2D6CEA59D1F6A34 /* RKErrors.m in Sources */ = {isa = PBXBuildFile; fileRef = 98F6CA3EC95666663499C52C0079FAB2 /* RKErrors.m */; }; + BE42247228B63D45326CF77A6C7156B2 /* RKObjectUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = DC78C3DF18BDAFB4F7F82A0FC59B9414 /* RKObjectUtilities.h */; settings = {ATTRIBUTES = (Project, ); }; }; + BE631F103F67B2F7D1ABDCE0E4CA1102 /* RKManagedObjectRequestOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 3553E7BAA2248B94AB5466D4F335B995 /* RKManagedObjectRequestOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + BF3E2EE13B3CFA0142A818C8EA0B2324 /* TKEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 878AF4F20F669A4133F176A24BC221D4 /* TKEvent.h */; settings = {ATTRIBUTES = (Project, ); }; }; + C0A1BEB7A70CFBF6605C7C64DD7BBDB2 /* RKObjectMappingOperationDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = DD745940219005A7CDD9965BE0D999B3 /* RKObjectMappingOperationDataSource.h */; settings = {ATTRIBUTES = (Project, ); }; }; + C38FB46772E1808BC852BE2B866D0183 /* RKObjectMappingOperationDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = A25FF489311F0D136B509038755AE289 /* RKObjectMappingOperationDataSource.m */; }; + C9B5F07B480F1DFB847F54EAC6C359AD /* RKRelationshipMapping.h in Headers */ = {isa = PBXBuildFile; fileRef = C4DCFB96C5949117D8D9D46FA2776DD0 /* RKRelationshipMapping.h */; settings = {ATTRIBUTES = (Project, ); }; }; + CA48697A291FF9CEDEF605E8C2F04541 /* RKMappingResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 9438CA279940F2FB2B2DBD21FF5FFD4B /* RKMappingResult.h */; settings = {ATTRIBUTES = (Project, ); }; }; + CA5A1F051083D1DF564185BFFF75F271 /* SOCKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E83F3FF04024D50C0AE498A2D144C9DA /* SOCKit-dummy.m */; }; + CA9F385271103C63FD7EF0EC0CCC6956 /* RKEntityCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 356D8AD55A7FD5E679616A43F1C2D6B3 /* RKEntityCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; + CB4D7C20050585B6B17D0B088FAF2C90 /* RKOperationStateMachine.m in Sources */ = {isa = PBXBuildFile; fileRef = C96EA8DFDF7C0E11B453A3A111A98140 /* RKOperationStateMachine.m */; }; + CC4BCD2211F64A14D4C9E0A715B9AF30 /* RKMIMETypes.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DB35A94A2E1FCDCA4260AE79502ED80 /* RKMIMETypes.m */; }; + CCB248258FC0824CDBA0719315F99B6C /* RKEntityMapping.m in Sources */ = {isa = PBXBuildFile; fileRef = 60FDC525652C23283629E075D28AA438 /* RKEntityMapping.m */; }; + CDED7BCDDC1517532ED238A1B6B760A9 /* RKObjectMappingMatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D208AA1125D4AAE8FC6165B30D9C4D /* RKObjectMappingMatcher.h */; settings = {ATTRIBUTES = (Project, ); }; }; + D245DCF688C7A8D280D465070B106A33 /* UIImageView+AFRKNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = D07D7255EE1274BF1633C68368239E9E /* UIImageView+AFRKNetworking.h */; settings = {ATTRIBUTES = (Project, ); }; }; + D4DC43DC6F92062E29BB296E18F94AD9 /* AFRKXMLRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 73C894F545133872D2AC15B581702678 /* AFRKXMLRequestOperation.m */; }; + D8FCBC482A660C1A4A72AAEA6D04A26A /* RKAttributeMapping.m in Sources */ = {isa = PBXBuildFile; fileRef = AF421C8C5B4CDA5E323B401E01E5BE00 /* RKAttributeMapping.m */; }; + DA710CDA6D28FA90FC6635D0C2E2A4FB /* AFRKJSONRequestOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 1DE0CE9F77795809F5AF7566B5114B49 /* AFRKJSONRequestOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + DB03B0E86C16611EF6F798A1D77D9893 /* RKBooleanClass.h in Headers */ = {isa = PBXBuildFile; fileRef = AEEA437802F328829CB43775E98E6C41 /* RKBooleanClass.h */; settings = {ATTRIBUTES = (Project, ); }; }; + DDF16BF8D16518A3C9CADE9C3F653A25 /* RKPropertyMapping.h in Headers */ = {isa = PBXBuildFile; fileRef = BB23BDB9B90F0C57FB2E9AF8608A050E /* RKPropertyMapping.h */; settings = {ATTRIBUTES = (Project, ); }; }; + DF41CF20CF4444F22D7B571A24DA74E9 /* RKMappingOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 30DD8C8E13647B25F166696B5DCD0A9E /* RKMappingOperation.m */; }; + DF9C45863FFF5D743EA443CDDDCB632C /* RKObjectManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F9481C279FCAC6CEF1511C278EA53DA /* RKObjectManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E03ED7F34369CFF89464ADC173A45848 /* RKRequestDescriptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 70C9E00B7448BD41926E7AE8B677BFE4 /* RKRequestDescriptor.m */; }; + E3DA26CDE36340883C84226F69DFB129 /* RKDotNetDateFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = FA3702658CE396EA106BDC6E2E4BE0D3 /* RKDotNetDateFormatter.m */; }; + E41214F69207E92D0EB209D9D13FD099 /* RKManagedObjectImporter.h in Headers */ = {isa = PBXBuildFile; fileRef = E67C5DDE80B43E44B2809B3B00EFD99C /* RKManagedObjectImporter.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E5F7E0B56E716CBF9AED18D095D3D730 /* NSManagedObjectContext+RKAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = A98876F44C30B8BBBEA21008F995F42E /* NSManagedObjectContext+RKAdditions.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E975248891618278524EE102116A5C99 /* AFRKHTTPClient.h in Headers */ = {isa = PBXBuildFile; fileRef = A417A7D2BAF0EE17F3213D11F4545600 /* AFRKHTTPClient.h */; settings = {ATTRIBUTES = (Project, ); }; }; + EAF31DEE757E4BF8FA303B70C2C66793 /* AFRKJSONRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 8DEF7D6269AE63B53A32E46160D424AD /* AFRKJSONRequestOperation.m */; }; + EC6B629E14B188EE7F3A75AADA43F524 /* AFRKNetworkActivityIndicatorManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 85CC6EC409BF9CFD8ACF6E2A42176F0C /* AFRKNetworkActivityIndicatorManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F2BA4DD531C348C68B8BC2DE4914F451 /* RKMappingResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 20CDD9FFCC685DF5B2FC52239F9FEE45 /* RKMappingResult.m */; }; + F3491D6F69AB709AE4E768CE4A2A2192 /* RKNSJSONSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = C3925AD6D014D968183D40C4FE26D442 /* RKNSJSONSerialization.m */; }; + F456FD3815F055BA59D107A9EB095516 /* RKRoute.h in Headers */ = {isa = PBXBuildFile; fileRef = CDEAF9EFCD4894B553AF7FD803712C3B /* RKRoute.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F492646F68BA67A7F4ADE59DE166FD79 /* RKManagedObjectMappingOperationDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 429689E3002FF28D25591D36660914EE /* RKManagedObjectMappingOperationDataSource.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F7E3A8E85DFADB16B56C7134EC0C9BB9 /* RKInMemoryManagedObjectCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 176DA137912A556C3154A6F50AE4D16D /* RKInMemoryManagedObjectCache.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 1DB760A1868C4496E987C4D53FADA9DC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 61742F6C8117ACED091A59781FB2876E; + remoteInfo = RestKit; + }; + 2A8156D5D3C9124463025F03E330D577 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 0A5519211D07DF0CD5FF3A8A325F5E98; + remoteInfo = ISO8601DateFormatterValueTransformer; + }; + 33B9AC7896E5A58138DD8236769B8D3C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 86258348052A0B1D4958DFD6F90B3100; + remoteInfo = RKValueTransformers; + }; + 3A88E643E8B069C3576DBD9686314588 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = E050CC203E99B56C44AF99297F358444; + remoteInfo = TransitionKit; + }; + 4B34AB32E0853CC5A7B61B4DB49FF5A2 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 86258348052A0B1D4958DFD6F90B3100; + remoteInfo = RKValueTransformers; + }; + 6E332AF2151EFA9915FA9FD7EC7E03D7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = E050CC203E99B56C44AF99297F358444; + remoteInfo = TransitionKit; + }; + 9BAE05D1396FC3BF8964CCAB9AE1D609 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 86258348052A0B1D4958DFD6F90B3100; + remoteInfo = RKValueTransformers; + }; + AA483DA1125DB918413DB4870F068DE1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8950AEC0D55833E414BCD3DE1160FC62; + remoteInfo = SOCKit; + }; + B081FDAB999B944D38CFA806B3ADCE3F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 0A5519211D07DF0CD5FF3A8A325F5E98; + remoteInfo = ISO8601DateFormatterValueTransformer; + }; + D7399EF585783D4A6C1639F287204D23 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8950AEC0D55833E414BCD3DE1160FC62; + remoteInfo = SOCKit; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 035AACAD473816D74C957FE9338AF0CF /* Pods-ScriptorSprint2.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ScriptorSprint2.debug.xcconfig"; sourceTree = ""; }; + 0387A8B9A0133430AB05EA75ED4BF392 /* RKISO8601DateFormatter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKISO8601DateFormatter.m; path = Code/RKISO8601DateFormatter.m; sourceTree = ""; }; + 03D467D6E47F50CD14CAC792E847B107 /* RKHTTPRequestOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKHTTPRequestOperation.m; path = Code/Network/RKHTTPRequestOperation.m; sourceTree = ""; }; + 052953B17A28ED28EFE2D7A97A0CF758 /* Pods-ScriptorSprint2-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ScriptorSprint2-acknowledgements.plist"; sourceTree = ""; }; + 058DE072D427CC03F5C162C03D23695D /* AFRKImageRequestOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFRKImageRequestOperation.m; path = Code/Network/AFNetworking/AFRKImageRequestOperation.m; sourceTree = ""; }; + 06A7610F6B531EF0E84132A0E5D28BB3 /* RKEntityMapping.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKEntityMapping.h; path = Code/CoreData/RKEntityMapping.h; sourceTree = ""; }; + 07045F5A3465039AA002659668B27018 /* TKState.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = TKState.h; path = Code/TKState.h; sourceTree = ""; }; + 07A99F8C42BCF5029B7CBA0FA8AB84FB /* RKMappingOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKMappingOperation.h; path = Code/ObjectMapping/RKMappingOperation.h; sourceTree = ""; }; + 08AFB3C6E0D9A7472BC49AD06CE0EDF3 /* RKErrors.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKErrors.h; path = Code/Support/RKErrors.h; sourceTree = ""; }; + 0CBBB81065DD67FF410D82F05C5766CC /* RKValueTransformers-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RKValueTransformers-prefix.pch"; sourceTree = ""; }; + 0CF716D9386CEFD87AE32B673F2D3C2F /* RKEntityByAttributeCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKEntityByAttributeCache.h; path = Code/CoreData/RKEntityByAttributeCache.h; sourceTree = ""; }; + 12B67CEF980B1F6A5D635604D11C5254 /* RKDotNetDateFormatter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKDotNetDateFormatter.h; path = Code/Support/RKDotNetDateFormatter.h; sourceTree = ""; }; + 142ACB9D7BC81DFE57B0783CE1D3DBD1 /* RKObjectUtilities.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKObjectUtilities.m; path = Code/ObjectMapping/RKObjectUtilities.m; sourceTree = ""; }; + 16B27CFDD38ACC9B60046715E6110AC0 /* AFRKHTTPClient.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFRKHTTPClient.m; path = Code/Network/AFNetworking/AFRKHTTPClient.m; sourceTree = ""; }; + 176DA137912A556C3154A6F50AE4D16D /* RKInMemoryManagedObjectCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKInMemoryManagedObjectCache.m; path = Code/CoreData/RKInMemoryManagedObjectCache.m; sourceTree = ""; }; + 17DDE9F70BE84AF0482A7909D2BE28DC /* libISO8601DateFormatterValueTransformer.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libISO8601DateFormatterValueTransformer.a; path = libISO8601DateFormatterValueTransformer.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 1C0249A332A98CF8B7B3B49AE552A58E /* ObjectMapping.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ObjectMapping.h; path = Code/ObjectMapping.h; sourceTree = ""; }; + 1DA9F3F317C02DED3BD9A5AFCB612729 /* AFRKNetworkActivityIndicatorManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFRKNetworkActivityIndicatorManager.m; path = Code/Network/AFNetworking/AFRKNetworkActivityIndicatorManager.m; sourceTree = ""; }; + 1DB35A94A2E1FCDCA4260AE79502ED80 /* RKMIMETypes.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKMIMETypes.m; path = Code/Support/RKMIMETypes.m; sourceTree = ""; }; + 1DE0CE9F77795809F5AF7566B5114B49 /* AFRKJSONRequestOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFRKJSONRequestOperation.h; path = Code/Network/AFNetworking/AFRKJSONRequestOperation.h; sourceTree = ""; }; + 1E83411E63F39A9A126D4B50B570E260 /* TransitionKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "TransitionKit-dummy.m"; sourceTree = ""; }; + 20CDD9FFCC685DF5B2FC52239F9FEE45 /* RKMappingResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKMappingResult.m; path = Code/ObjectMapping/RKMappingResult.m; sourceTree = ""; }; + 2229F03403C3726C4D67FC4EEB1B8E89 /* RKPropertyInspector+CoreData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "RKPropertyInspector+CoreData.m"; path = "Code/CoreData/RKPropertyInspector+CoreData.m"; sourceTree = ""; }; + 2312327301D0033AED860EAF5C633F1F /* RKHTTPRequestOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKHTTPRequestOperation.h; path = Code/Network/RKHTTPRequestOperation.h; sourceTree = ""; }; + 260B094F516EEBA28EB9897E2438E35E /* ISO8601DateFormatterValueTransformer.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ISO8601DateFormatterValueTransformer.xcconfig; sourceTree = ""; }; + 263ECB09B91C1F9C09FE45E495C59EA6 /* RKNSJSONSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKNSJSONSerialization.h; path = Code/Support/RKNSJSONSerialization.h; sourceTree = ""; }; + 29DFA4C768DC64FCECF87C953C78EC6F /* RKObjectRequestOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKObjectRequestOperation.h; path = Code/Network/RKObjectRequestOperation.h; sourceTree = ""; }; + 30ADE26D1A909180EF0609EB609D2354 /* RKErrorMessage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKErrorMessage.m; path = Code/ObjectMapping/RKErrorMessage.m; sourceTree = ""; }; + 30B6BDB20441823741C1C2856C340026 /* RKObjectRequestOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKObjectRequestOperation.m; path = Code/Network/RKObjectRequestOperation.m; sourceTree = ""; }; + 30DD8C8E13647B25F166696B5DCD0A9E /* RKMappingOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKMappingOperation.m; path = Code/ObjectMapping/RKMappingOperation.m; sourceTree = ""; }; + 32608CAEA3BEABAA620C5584479989EA /* RKHTTPUtilities.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKHTTPUtilities.m; path = Code/Network/RKHTTPUtilities.m; sourceTree = ""; }; + 34FD3AFD7337855EEAF47049147C72E7 /* RKResponseMapperOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKResponseMapperOperation.h; path = Code/Network/RKResponseMapperOperation.h; sourceTree = ""; }; + 3553E7BAA2248B94AB5466D4F335B995 /* RKManagedObjectRequestOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKManagedObjectRequestOperation.h; path = Code/Network/RKManagedObjectRequestOperation.h; sourceTree = ""; }; + 356D8AD55A7FD5E679616A43F1C2D6B3 /* RKEntityCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKEntityCache.h; path = Code/CoreData/RKEntityCache.h; sourceTree = ""; }; + 386EA28A5B0B4AF52641265558E237BD /* RKStringTokenizer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKStringTokenizer.m; path = Code/Support/RKStringTokenizer.m; sourceTree = ""; }; + 39E3ABD4B23BC79DC65CF5726F64CDFA /* RKMIMETypeSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKMIMETypeSerialization.m; path = Code/Support/RKMIMETypeSerialization.m; sourceTree = ""; }; + 3B3880C5754F17F87D2E9152E033BC2D /* Pods-ScriptorSprint2-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ScriptorSprint2-acknowledgements.markdown"; sourceTree = ""; }; + 3C0241AD8BF23D0F522C110BBE3094A8 /* RKValueTransformers.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RKValueTransformers.xcconfig; sourceTree = ""; }; + 3C78F9FF9EF26DC9CF31363E49E20083 /* RKRouter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKRouter.h; path = Code/Network/RKRouter.h; sourceTree = ""; }; + 3EF382EB33031814D3BE13D4AB3252FF /* RKResponseDescriptor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKResponseDescriptor.m; path = Code/Network/RKResponseDescriptor.m; sourceTree = ""; }; + 429689E3002FF28D25591D36660914EE /* RKManagedObjectMappingOperationDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKManagedObjectMappingOperationDataSource.h; path = Code/CoreData/RKManagedObjectMappingOperationDataSource.h; sourceTree = ""; }; + 4463A03A792B44D093C38D243B68C906 /* lcl_config_logger_RK.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = lcl_config_logger_RK.h; path = Code/Support/lcl_config_logger_RK.h; sourceTree = ""; }; + 469D6CB2B78B5317FDC3CDE9E0CB371A /* RKObjectParameterization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKObjectParameterization.h; path = Code/Network/RKObjectParameterization.h; sourceTree = ""; }; + 471FCA526EB98ECDC4138749DC541CDB /* NSManagedObject+RKAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSManagedObject+RKAdditions.h"; path = "Code/CoreData/NSManagedObject+RKAdditions.h"; sourceTree = ""; }; + 49DAE54A61D31381ADEC0383FB6BA0B4 /* RKObjectManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKObjectManager.m; path = Code/Network/RKObjectManager.m; sourceTree = ""; }; + 4A9078415D4C8B7092521070E17D7D94 /* RestKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RestKit.xcconfig; sourceTree = ""; }; + 4B65915EEE8B65C62B915F682EAD1659 /* libSOCKit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libSOCKit.a; path = libSOCKit.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 4C866D920FCDF4B7889047C0B195799A /* RKConnectionDescription.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKConnectionDescription.h; path = Code/CoreData/RKConnectionDescription.h; sourceTree = ""; }; + 4DEBFE81A6EE81790436E723B36353D9 /* RKPropertyMapping.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKPropertyMapping.m; path = Code/ObjectMapping/RKPropertyMapping.m; sourceTree = ""; }; + 4FB6FD2D1B19716383B8B9EB1C503558 /* RKPaginator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKPaginator.h; path = Code/Network/RKPaginator.h; sourceTree = ""; }; + 57CF177DFF07D87700EDA9282B95E671 /* RKDynamicMapping.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKDynamicMapping.m; path = Code/ObjectMapping/RKDynamicMapping.m; sourceTree = ""; }; + 584A2768583312016678DC2C9BBBAE22 /* RKURLEncodedSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKURLEncodedSerialization.h; path = Code/Support/RKURLEncodedSerialization.h; sourceTree = ""; }; + 5A16931B0ECA0EA687331B9F5805BADC /* RKObjectMapping.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKObjectMapping.h; path = Code/ObjectMapping/RKObjectMapping.h; sourceTree = ""; }; + 5BCAF23EF25EAB9D27C1B4BBA4A89F24 /* AFRKImageRequestOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFRKImageRequestOperation.h; path = Code/Network/AFNetworking/AFRKImageRequestOperation.h; sourceTree = ""; }; + 5E1B4AB50FA075B87E7188C74FA19394 /* RKRelationshipConnectionOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKRelationshipConnectionOperation.h; path = Code/CoreData/RKRelationshipConnectionOperation.h; sourceTree = ""; }; + 5E3269918F75BAEC8FCD231FA5827D3A /* RKRequestDescriptor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKRequestDescriptor.h; path = Code/Network/RKRequestDescriptor.h; sourceTree = ""; }; + 5E426F6FE922AE09AD95F468181401EB /* AFRKXMLRequestOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFRKXMLRequestOperation.h; path = Code/Network/AFNetworking/AFRKXMLRequestOperation.h; sourceTree = ""; }; + 5F9481C279FCAC6CEF1511C278EA53DA /* RKObjectManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKObjectManager.h; path = Code/Network/RKObjectManager.h; sourceTree = ""; }; + 5FE066877CCBE04B2E804A3A5F8A937D /* ISO8601DateFormatterValueTransformer-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ISO8601DateFormatterValueTransformer-prefix.pch"; sourceTree = ""; }; + 60FDC525652C23283629E075D28AA438 /* RKEntityMapping.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKEntityMapping.m; path = Code/CoreData/RKEntityMapping.m; sourceTree = ""; }; + 617D5C9BBC85A2CA6298A66BF3C1EB0F /* Network.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Network.h; path = Code/Network.h; sourceTree = ""; }; + 618CD82AABF1C3B46AE34482441EDB6A /* RKDictionaryUtilities.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKDictionaryUtilities.m; path = Code/Support/RKDictionaryUtilities.m; sourceTree = ""; }; + 639CED6AF3926976D85C15588E91106F /* RKPropertyInspector.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKPropertyInspector.h; path = Code/ObjectMapping/RKPropertyInspector.h; sourceTree = ""; }; + 643DA933BBD088021A8E9B85877EEF83 /* SOCKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = SOCKit.m; sourceTree = ""; }; + 65A0692FB7DC29935F73426D7A7D8365 /* TKState.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = TKState.m; path = Code/TKState.m; sourceTree = ""; }; + 688F62464EADAEBF5B8866012CC85FB7 /* RKManagedObjectStore_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKManagedObjectStore_Private.h; path = Code/CoreData/RKManagedObjectStore_Private.h; sourceTree = ""; }; + 6928FB36B401C471D9BB0E3918619E7A /* RKMapperOperation_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKMapperOperation_Private.h; path = Code/ObjectMapping/RKMapperOperation_Private.h; sourceTree = ""; }; + 696C74BC9F7D33F2B4F9B89405C8AF1D /* TKTransition.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = TKTransition.h; path = Code/TKTransition.h; sourceTree = ""; }; + 69E4E9A1C480270C2CC7E41445C98A63 /* RKMapperOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKMapperOperation.m; path = Code/ObjectMapping/RKMapperOperation.m; sourceTree = ""; }; + 6BE7B5B2EF66268C54B7D350A9DA65B1 /* libTransitionKit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libTransitionKit.a; path = libTransitionKit.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 6C48F9663C5F2AAEC2B22A09BD22DCED /* AFRKURLConnectionOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFRKURLConnectionOperation.h; path = Code/Network/AFNetworking/AFRKURLConnectionOperation.h; sourceTree = ""; }; + 6D0BECC11A171CC5D00BAB840DFC9FED /* RKInMemoryManagedObjectCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKInMemoryManagedObjectCache.h; path = Code/CoreData/RKInMemoryManagedObjectCache.h; sourceTree = ""; }; + 6F1C903698BCB3B0A70E8AD8F5416F40 /* lcl_RK.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = lcl_RK.m; path = Code/Support/lcl_RK.m; sourceTree = ""; }; + 6F3982655691F193BBCE88B142E87572 /* ISO8601DateFormatterValueTransformer-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ISO8601DateFormatterValueTransformer-dummy.m"; sourceTree = ""; }; + 70C9E00B7448BD41926E7AE8B677BFE4 /* RKRequestDescriptor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKRequestDescriptor.m; path = Code/Network/RKRequestDescriptor.m; sourceTree = ""; }; + 73C894F545133872D2AC15B581702678 /* AFRKXMLRequestOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFRKXMLRequestOperation.m; path = Code/Network/AFNetworking/AFRKXMLRequestOperation.m; sourceTree = ""; }; + 7B941232DFDD0E08FA8600307AD6589D /* RKLog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKLog.h; path = Code/Support/RKLog.h; sourceTree = ""; }; + 7CF4DDC99C858D47EBAED3ABCB102D8B /* NSManagedObjectContext+RKAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSManagedObjectContext+RKAdditions.m"; path = "Code/CoreData/NSManagedObjectContext+RKAdditions.m"; sourceTree = ""; }; + 7DC7CBD9B588A88401673148863CA586 /* lcl_RK.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = lcl_RK.h; path = Code/Support/lcl_RK.h; sourceTree = ""; }; + 7E63BF89CC4198695857B9FE3AB137BC /* AFRKURLConnectionOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFRKURLConnectionOperation.m; path = Code/Network/AFNetworking/AFRKURLConnectionOperation.m; sourceTree = ""; }; + 80326CF9A29E8F03A47B760A7D93E7EE /* RKValueTransformers-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RKValueTransformers-dummy.m"; sourceTree = ""; }; + 804174339EA13EB7CCF28EE8E1C1F028 /* RKManagedObjectMappingOperationDataSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKManagedObjectMappingOperationDataSource.m; path = Code/CoreData/RKManagedObjectMappingOperationDataSource.m; sourceTree = ""; }; + 818ABB0194001EC9CBCAB57DF9EF5954 /* RKDictionaryUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKDictionaryUtilities.h; path = Code/Support/RKDictionaryUtilities.h; sourceTree = ""; }; + 8249BCE32E7768E3DA83D4755000D749 /* RKPaginator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKPaginator.m; path = Code/Network/RKPaginator.m; sourceTree = ""; }; + 836EEB3262670C44A87485144FB45C0D /* RKMapping.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKMapping.m; path = Code/ObjectMapping/RKMapping.m; sourceTree = ""; }; + 83D55A9270D9A12859A6CD964589F4A8 /* SOCKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = SOCKit.h; sourceTree = ""; }; + 84715DA291EFCA81C4CB6DC5AA4B4195 /* libPods-ScriptorSprint2.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = "libPods-ScriptorSprint2.a"; path = "libPods-ScriptorSprint2.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 85CC6EC409BF9CFD8ACF6E2A42176F0C /* AFRKNetworkActivityIndicatorManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFRKNetworkActivityIndicatorManager.h; path = Code/Network/AFNetworking/AFRKNetworkActivityIndicatorManager.h; sourceTree = ""; }; + 866A9F7A49509ED5CD51FD4FB2549225 /* RKRelationshipMapping.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKRelationshipMapping.m; path = Code/ObjectMapping/RKRelationshipMapping.m; sourceTree = ""; }; + 878AF4F20F669A4133F176A24BC221D4 /* TKEvent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = TKEvent.h; path = Code/TKEvent.h; sourceTree = ""; }; + 885EEBFF7748EA379DDEDE7B26FB87AA /* RKDynamicMapping.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKDynamicMapping.h; path = Code/ObjectMapping/RKDynamicMapping.h; sourceTree = ""; }; + 8A4C881B6A0F82EE1905E0B4AA379611 /* RKHTTPUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKHTTPUtilities.h; path = Code/Network/RKHTTPUtilities.h; sourceTree = ""; }; + 8A75DB73F51AD7E529E9D24ECB4E79D4 /* RKPathMatcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKPathMatcher.h; path = Code/Network/RKPathMatcher.h; sourceTree = ""; }; + 8AC938F96E0D3DDB85FB5BF87045AF75 /* RKMappingErrors.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKMappingErrors.h; path = Code/ObjectMapping/RKMappingErrors.h; sourceTree = ""; }; + 8B9F74FED781476D0085E16F03B8ADC2 /* RKRouter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKRouter.m; path = Code/Network/RKRouter.m; sourceTree = ""; }; + 8BA0799BBF1BB8636058B29F88685AD8 /* TransitionKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = TransitionKit.h; path = Code/TransitionKit.h; sourceTree = ""; }; + 8CCFA847A5A85B6E42344DDB8D1C024C /* CoreData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CoreData.h; path = Code/CoreData.h; sourceTree = ""; }; + 8CFBFA8F8FB475214898130D9EEDFDB1 /* AFRKHTTPRequestOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFRKHTTPRequestOperation.h; path = Code/Network/AFNetworking/AFRKHTTPRequestOperation.h; sourceTree = ""; }; + 8DEF7D6269AE63B53A32E46160D424AD /* AFRKJSONRequestOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFRKJSONRequestOperation.m; path = Code/Network/AFNetworking/AFRKJSONRequestOperation.m; sourceTree = ""; }; + 8F63093292674A527DC2DCD5E25BE0B8 /* ISO8601DateFormatterValueTransformer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ISO8601DateFormatterValueTransformer.h; path = Code/ISO8601DateFormatterValueTransformer.h; sourceTree = ""; }; + 8FD54C546F41FB61C72F745B7137440D /* SOCKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SOCKit-prefix.pch"; sourceTree = ""; }; + 91C4D5B08E162BF684858F6651A12D26 /* RKPathUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKPathUtilities.h; path = Code/Support/RKPathUtilities.h; sourceTree = ""; }; + 93CA009A22A43C23A6A6A7F88C186080 /* RKRelationshipConnectionOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKRelationshipConnectionOperation.m; path = Code/CoreData/RKRelationshipConnectionOperation.m; sourceTree = ""; }; + 942DB56BD3C7784F4C911CC8048E7F15 /* RKRoute.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKRoute.m; path = Code/Network/RKRoute.m; sourceTree = ""; }; + 943828BAB3D76C9F5E5FABA6088BDACE /* RKMacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKMacros.h; path = Code/Support/RKMacros.h; sourceTree = ""; }; + 9438CA279940F2FB2B2DBD21FF5FFD4B /* RKMappingResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKMappingResult.h; path = Code/ObjectMapping/RKMappingResult.h; sourceTree = ""; }; + 94A2EE9A6E881688BD87AB9998795298 /* RKEntityByAttributeCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKEntityByAttributeCache.m; path = Code/CoreData/RKEntityByAttributeCache.m; sourceTree = ""; }; + 9599240A89AA0C327E3A19F1B8E986EB /* RKObjectMappingMatcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKObjectMappingMatcher.m; path = Code/ObjectMapping/RKObjectMappingMatcher.m; sourceTree = ""; }; + 97057CFDBF9E7435C45AC9FF96EC0A22 /* TKEvent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = TKEvent.m; path = Code/TKEvent.m; sourceTree = ""; }; + 98981E9E86643C80A510C687EC20DAB7 /* Pods-ScriptorSprint2.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ScriptorSprint2.release.xcconfig"; sourceTree = ""; }; + 98F6CA3EC95666663499C52C0079FAB2 /* RKErrors.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKErrors.m; path = Code/Support/RKErrors.m; sourceTree = ""; }; + 99CFD17E31EA21B6CD9EFA6B1FD602DA /* RestKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RestKit.h; path = Code/RestKit.h; sourceTree = ""; }; + 9D8F3B98FD0F72045487B99469488789 /* RestKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RestKit-prefix.pch"; sourceTree = ""; }; + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 9F81AC59A09A6182135D51C095287BA6 /* RKOperationStateMachine.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKOperationStateMachine.h; path = Code/Support/RKOperationStateMachine.h; sourceTree = ""; }; + A13C2091C69F40F77759955E55A893E3 /* RKFetchRequestManagedObjectCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKFetchRequestManagedObjectCache.m; path = Code/CoreData/RKFetchRequestManagedObjectCache.m; sourceTree = ""; }; + A1E85472070D4151DC8AC2CFA2193508 /* RestKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RestKit-dummy.m"; sourceTree = ""; }; + A25FF489311F0D136B509038755AE289 /* RKObjectMappingOperationDataSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKObjectMappingOperationDataSource.m; path = Code/ObjectMapping/RKObjectMappingOperationDataSource.m; sourceTree = ""; }; + A2AAA6CA12BB0EFFFCC7C6C677562A42 /* AFRKPropertyListRequestOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFRKPropertyListRequestOperation.h; path = Code/Network/AFNetworking/AFRKPropertyListRequestOperation.h; sourceTree = ""; }; + A31370201E305F885AC57DC43FFF716D /* RKFetchRequestManagedObjectCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKFetchRequestManagedObjectCache.h; path = Code/CoreData/RKFetchRequestManagedObjectCache.h; sourceTree = ""; }; + A417A7D2BAF0EE17F3213D11F4545600 /* AFRKHTTPClient.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFRKHTTPClient.h; path = Code/Network/AFNetworking/AFRKHTTPClient.h; sourceTree = ""; }; + A4D4C475D91798B81FF459E35386E02A /* libRKValueTransformers.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libRKValueTransformers.a; path = libRKValueTransformers.a; sourceTree = BUILT_PRODUCTS_DIR; }; + A789AF4D82C0A1869E620AB43478C835 /* RKValueTransformers.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKValueTransformers.h; path = Code/RKValueTransformers.h; sourceTree = ""; }; + A81E91ED05C9F582515498FA171C649A /* RKValueTransformers.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKValueTransformers.m; path = Code/RKValueTransformers.m; sourceTree = ""; }; + A969B3045A987B8C1674A9A7F49A622F /* RKPropertyInspector.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKPropertyInspector.m; path = Code/ObjectMapping/RKPropertyInspector.m; sourceTree = ""; }; + A98876F44C30B8BBBEA21008F995F42E /* NSManagedObjectContext+RKAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSManagedObjectContext+RKAdditions.h"; path = "Code/CoreData/NSManagedObjectContext+RKAdditions.h"; sourceTree = ""; }; + AEAECEF245F26F95F098DC910CED7757 /* ISO8601DateFormatterValueTransformer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ISO8601DateFormatterValueTransformer.m; path = Code/ISO8601DateFormatterValueTransformer.m; sourceTree = ""; }; + AEEA437802F328829CB43775E98E6C41 /* RKBooleanClass.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKBooleanClass.h; path = Code/Support/RKBooleanClass.h; sourceTree = ""; }; + AF421C8C5B4CDA5E323B401E01E5BE00 /* RKAttributeMapping.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKAttributeMapping.m; path = Code/ObjectMapping/RKAttributeMapping.m; sourceTree = ""; }; + B05892906186E0328A66DB5BE38448F8 /* TransitionKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TransitionKit.xcconfig; sourceTree = ""; }; + B075230AA67A231D6FC0CC2CE9D42F23 /* RKRouteSet.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKRouteSet.m; path = Code/Network/RKRouteSet.m; sourceTree = ""; }; + B3652229E20484494A45B74A9E830220 /* RKManagedObjectImporter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKManagedObjectImporter.m; path = Code/CoreData/RKManagedObjectImporter.m; sourceTree = ""; }; + B372D98F24054EFF0BFE74F4522C6971 /* RKMapping.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKMapping.h; path = Code/ObjectMapping/RKMapping.h; sourceTree = ""; }; + B714797D2353F73D508616BDAECBA49B /* RKResponseDescriptor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKResponseDescriptor.h; path = Code/Network/RKResponseDescriptor.h; sourceTree = ""; }; + BB23BDB9B90F0C57FB2E9AF8608A050E /* RKPropertyMapping.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKPropertyMapping.h; path = Code/ObjectMapping/RKPropertyMapping.h; sourceTree = ""; }; + BB4D6177B6CB5365D56F6020D90245AB /* RKObjectParameterization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKObjectParameterization.m; path = Code/Network/RKObjectParameterization.m; sourceTree = ""; }; + BD3425E2A4B2770E18E1835C3C17AC3B /* AFRKPropertyListRequestOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFRKPropertyListRequestOperation.m; path = Code/Network/AFNetworking/AFRKPropertyListRequestOperation.m; sourceTree = ""; }; + BDB8D98946B23EF227FADEFC0012730E /* RKAttributeMapping.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKAttributeMapping.h; path = Code/ObjectMapping/RKAttributeMapping.h; sourceTree = ""; }; + BFB9717BE82F2CFFA71185D31F38BC00 /* RKSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKSerialization.h; path = Code/Support/RKSerialization.h; sourceTree = ""; }; + C09EA4EC4FB50C2D916A6653D5FE1B6C /* RKISO8601DateFormatter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKISO8601DateFormatter.h; path = Code/RKISO8601DateFormatter.h; sourceTree = ""; }; + C3297E038746A54695B877FAD306F86A /* RKLog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKLog.m; path = Code/Support/RKLog.m; sourceTree = ""; }; + C3925AD6D014D968183D40C4FE26D442 /* RKNSJSONSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKNSJSONSerialization.m; path = Code/Support/RKNSJSONSerialization.m; sourceTree = ""; }; + C4DCFB96C5949117D8D9D46FA2776DD0 /* RKRelationshipMapping.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKRelationshipMapping.h; path = Code/ObjectMapping/RKRelationshipMapping.h; sourceTree = ""; }; + C51515F8F202F1DFC9FC508ADE93E5D0 /* RKObjectMapping.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKObjectMapping.m; path = Code/ObjectMapping/RKObjectMapping.m; sourceTree = ""; }; + C73FD16B810CA36AF185DC4F715A2DF8 /* RKPathMatcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKPathMatcher.m; path = Code/Network/RKPathMatcher.m; sourceTree = ""; }; + C8BE68EAA7B45AAEF03DF71CDD6F9B55 /* RKManagedObjectRequestOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKManagedObjectRequestOperation.m; path = Code/Network/RKManagedObjectRequestOperation.m; sourceTree = ""; }; + C96EA8DFDF7C0E11B453A3A111A98140 /* RKOperationStateMachine.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKOperationStateMachine.m; path = Code/Support/RKOperationStateMachine.m; sourceTree = ""; }; + CAF00E6F6766A8D3DBE4F74C265AA90E /* libRestKit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libRestKit.a; path = libRestKit.a; sourceTree = BUILT_PRODUCTS_DIR; }; + CCF4E7D4FBE1C574F748A7B8C448D8D9 /* RKPathUtilities.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKPathUtilities.m; path = Code/Support/RKPathUtilities.m; sourceTree = ""; }; + CDEAF9EFCD4894B553AF7FD803712C3B /* RKRoute.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKRoute.h; path = Code/Network/RKRoute.h; sourceTree = ""; }; + CE7E7583CF5D298612B27EF9580A6E62 /* RKRouteSet.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKRouteSet.h; path = Code/Network/RKRouteSet.h; sourceTree = ""; }; + CF65796F06806CEF36F68F72654DF8C1 /* lcl_config_components_RK.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = lcl_config_components_RK.h; path = Code/Support/lcl_config_components_RK.h; sourceTree = ""; }; + CFCF51FF183C632D5B9ED4B831974743 /* RKManagedObjectStore.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKManagedObjectStore.m; path = Code/CoreData/RKManagedObjectStore.m; sourceTree = ""; }; + D07D7255EE1274BF1633C68368239E9E /* UIImageView+AFRKNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+AFRKNetworking.h"; path = "Code/Network/AFNetworking/UIImageView+AFRKNetworking.h"; sourceTree = ""; }; + D1BE1BB47B33CF706182E58244A377AE /* RKURLEncodedSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKURLEncodedSerialization.m; path = Code/Support/RKURLEncodedSerialization.m; sourceTree = ""; }; + D1DB92CFDA321BB35EB1C452D2C3019F /* RKStringTokenizer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKStringTokenizer.h; path = Code/Support/RKStringTokenizer.h; sourceTree = ""; }; + D33CFD30E99E150B87392D6FFD437F44 /* Pods-ScriptorSprint2-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ScriptorSprint2-dummy.m"; sourceTree = ""; }; + D40C60FBE47BCA71E2DD3B7D9BE841A0 /* AFRKNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFRKNetworking.h; path = Code/Network/AFNetworking/AFRKNetworking.h; sourceTree = ""; }; + D55E978B029BFE476EDB1C7686BE7C83 /* RKResponseMapperOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKResponseMapperOperation.m; path = Code/Network/RKResponseMapperOperation.m; sourceTree = ""; }; + D5C9FFACDFBAFE975CA173389B31A30F /* TKStateMachine.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = TKStateMachine.h; path = Code/TKStateMachine.h; sourceTree = ""; }; + DBB5BBDFF8EF5B47581FEB48E82A5901 /* TKTransition.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = TKTransition.m; path = Code/TKTransition.m; sourceTree = ""; }; + DC78C3DF18BDAFB4F7F82A0FC59B9414 /* RKObjectUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKObjectUtilities.h; path = Code/ObjectMapping/RKObjectUtilities.h; sourceTree = ""; }; + DD745940219005A7CDD9965BE0D999B3 /* RKObjectMappingOperationDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKObjectMappingOperationDataSource.h; path = Code/ObjectMapping/RKObjectMappingOperationDataSource.h; sourceTree = ""; }; + DE54136E775BC20DD400ED9F39FF4B67 /* AFRKHTTPRequestOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFRKHTTPRequestOperation.m; path = Code/Network/AFNetworking/AFRKHTTPRequestOperation.m; sourceTree = ""; }; + E0FBEB4E276BEB250901C60805415901 /* TransitionKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TransitionKit-prefix.pch"; sourceTree = ""; }; + E1BEBBF772BDD639E7A55A785969BDD0 /* RKManagedObjectStore.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKManagedObjectStore.h; path = Code/CoreData/RKManagedObjectStore.h; sourceTree = ""; }; + E3561264E8767681B3099CF747EBD08A /* UIImageView+AFRKNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+AFRKNetworking.m"; path = "Code/Network/AFNetworking/UIImageView+AFRKNetworking.m"; sourceTree = ""; }; + E5EAAD314BD23BB1F03363DCDAC931DB /* RKMIMETypeSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKMIMETypeSerialization.h; path = Code/Support/RKMIMETypeSerialization.h; sourceTree = ""; }; + E67C5DDE80B43E44B2809B3B00EFD99C /* RKManagedObjectImporter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKManagedObjectImporter.h; path = Code/CoreData/RKManagedObjectImporter.h; sourceTree = ""; }; + E704BD136883E9CD4D213A72F20AF7A2 /* lcl_config_extensions_RK.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = lcl_config_extensions_RK.h; path = Code/Support/lcl_config_extensions_RK.h; sourceTree = ""; }; + E79A02BB7A0DDB9A5C285B6691380AF8 /* Support.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Support.h; path = Code/Support.h; sourceTree = ""; }; + E83F3FF04024D50C0AE498A2D144C9DA /* SOCKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SOCKit-dummy.m"; sourceTree = ""; }; + E8639F5B4E3F15747B9ED5661AEB7FC2 /* RKPropertyInspector+CoreData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "RKPropertyInspector+CoreData.h"; path = "Code/CoreData/RKPropertyInspector+CoreData.h"; sourceTree = ""; }; + EC7C79295069C679AC61DDF2BF22EF71 /* TKStateMachine.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = TKStateMachine.m; path = Code/TKStateMachine.m; sourceTree = ""; }; + EDCD7AE3D83890197E917B81BDF86961 /* RKMapperOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKMapperOperation.h; path = Code/ObjectMapping/RKMapperOperation.h; sourceTree = ""; }; + EF386B4114C2FB19BAC43050F0F7284C /* RKMappingOperationDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKMappingOperationDataSource.h; path = Code/ObjectMapping/RKMappingOperationDataSource.h; sourceTree = ""; }; + EFB029ED5CD0BDCA976660290B818B1B /* RKObjectRequestOperationSubclass.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKObjectRequestOperationSubclass.h; path = Code/Network/RKObjectRequestOperationSubclass.h; sourceTree = ""; }; + F17B4818053CC77B353174D37B10EEA3 /* RKManagedObjectCaching.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKManagedObjectCaching.h; path = Code/CoreData/RKManagedObjectCaching.h; sourceTree = ""; }; + F3D208AA1125D4AAE8FC6165B30D9C4D /* RKObjectMappingMatcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKObjectMappingMatcher.h; path = Code/ObjectMapping/RKObjectMappingMatcher.h; sourceTree = ""; }; + F6E900BB0E56DE1B29C73FF326653869 /* SOCKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SOCKit.xcconfig; sourceTree = ""; }; + F91FB742E6BE786B5C0E6F271893186D /* RKConnectionDescription.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKConnectionDescription.m; path = Code/CoreData/RKConnectionDescription.m; sourceTree = ""; }; + F9A9DFE137B2B47ED74D6143D86B3CAF /* NSManagedObject+RKAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSManagedObject+RKAdditions.m"; path = "Code/CoreData/NSManagedObject+RKAdditions.m"; sourceTree = ""; }; + F9DFCD53E05189C5FF1B38F246ACFA00 /* RKEntityCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKEntityCache.m; path = Code/CoreData/RKEntityCache.m; sourceTree = ""; }; + FA3702658CE396EA106BDC6E2E4BE0D3 /* RKDotNetDateFormatter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RKDotNetDateFormatter.m; path = Code/Support/RKDotNetDateFormatter.m; sourceTree = ""; }; + FA5F023A545AF1DF72816E9220C4419C /* RKErrorMessage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKErrorMessage.h; path = Code/ObjectMapping/RKErrorMessage.h; sourceTree = ""; }; + FE4D5F8E8BFA5C4D0C6275677E22CA24 /* RKMIMETypes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RKMIMETypes.h; path = Code/Support/RKMIMETypes.h; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 096DCC1B8D60F23BAE4C24978191ACF1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 42836BD54DF7C6D53C8D029563B2096E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4D27B41CBB45BDDD4A7BB20F6647EB43 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 653A9446F4EE7C77DE6FD28349FED82E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 69633BDE1AFF00042262FB717D676DF8 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 902F88DB88302FC60FAF0C361F96BF4A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 162A1584631E78249F74C31D958FA11B /* Support Files */ = { + isa = PBXGroup; + children = ( + 4A9078415D4C8B7092521070E17D7D94 /* RestKit.xcconfig */, + A1E85472070D4151DC8AC2CFA2193508 /* RestKit-dummy.m */, + 9D8F3B98FD0F72045487B99469488789 /* RestKit-prefix.pch */, + ); + name = "Support Files"; + path = "../Target Support Files/RestKit"; + sourceTree = ""; + }; + 467F5F3CB433F68B22614E8B60201A8A /* CoreData */ = { + isa = PBXGroup; + children = ( + 8CCFA847A5A85B6E42344DDB8D1C024C /* CoreData.h */, + 471FCA526EB98ECDC4138749DC541CDB /* NSManagedObject+RKAdditions.h */, + F9A9DFE137B2B47ED74D6143D86B3CAF /* NSManagedObject+RKAdditions.m */, + A98876F44C30B8BBBEA21008F995F42E /* NSManagedObjectContext+RKAdditions.h */, + 7CF4DDC99C858D47EBAED3ABCB102D8B /* NSManagedObjectContext+RKAdditions.m */, + 4C866D920FCDF4B7889047C0B195799A /* RKConnectionDescription.h */, + F91FB742E6BE786B5C0E6F271893186D /* RKConnectionDescription.m */, + 0CF716D9386CEFD87AE32B673F2D3C2F /* RKEntityByAttributeCache.h */, + 94A2EE9A6E881688BD87AB9998795298 /* RKEntityByAttributeCache.m */, + 356D8AD55A7FD5E679616A43F1C2D6B3 /* RKEntityCache.h */, + F9DFCD53E05189C5FF1B38F246ACFA00 /* RKEntityCache.m */, + 06A7610F6B531EF0E84132A0E5D28BB3 /* RKEntityMapping.h */, + 60FDC525652C23283629E075D28AA438 /* RKEntityMapping.m */, + A31370201E305F885AC57DC43FFF716D /* RKFetchRequestManagedObjectCache.h */, + A13C2091C69F40F77759955E55A893E3 /* RKFetchRequestManagedObjectCache.m */, + 6D0BECC11A171CC5D00BAB840DFC9FED /* RKInMemoryManagedObjectCache.h */, + 176DA137912A556C3154A6F50AE4D16D /* RKInMemoryManagedObjectCache.m */, + F17B4818053CC77B353174D37B10EEA3 /* RKManagedObjectCaching.h */, + E67C5DDE80B43E44B2809B3B00EFD99C /* RKManagedObjectImporter.h */, + B3652229E20484494A45B74A9E830220 /* RKManagedObjectImporter.m */, + 429689E3002FF28D25591D36660914EE /* RKManagedObjectMappingOperationDataSource.h */, + 804174339EA13EB7CCF28EE8E1C1F028 /* RKManagedObjectMappingOperationDataSource.m */, + E1BEBBF772BDD639E7A55A785969BDD0 /* RKManagedObjectStore.h */, + CFCF51FF183C632D5B9ED4B831974743 /* RKManagedObjectStore.m */, + 688F62464EADAEBF5B8866012CC85FB7 /* RKManagedObjectStore_Private.h */, + E8639F5B4E3F15747B9ED5661AEB7FC2 /* RKPropertyInspector+CoreData.h */, + 2229F03403C3726C4D67FC4EEB1B8E89 /* RKPropertyInspector+CoreData.m */, + 5E1B4AB50FA075B87E7188C74FA19394 /* RKRelationshipConnectionOperation.h */, + 93CA009A22A43C23A6A6A7F88C186080 /* RKRelationshipConnectionOperation.m */, + ); + name = CoreData; + sourceTree = ""; + }; + 6343E0190E685A4D516B8BB7A0F756B6 /* SOCKit */ = { + isa = PBXGroup; + children = ( + 83D55A9270D9A12859A6CD964589F4A8 /* SOCKit.h */, + 643DA933BBD088021A8E9B85877EEF83 /* SOCKit.m */, + 9D1672A4E3CDA1EB82480D17C0EA84C2 /* Support Files */, + ); + name = SOCKit; + path = SOCKit; + sourceTree = ""; + }; + 6ABE0BDEBDC69F330BEF6FE19C83CFBB /* RestKit */ = { + isa = PBXGroup; + children = ( + 467F5F3CB433F68B22614E8B60201A8A /* CoreData */, + C970F1E07D0A8ADD02CDA0A8BC738B17 /* Network */, + D94C98B9B911FD263F6D6AB448CB4FEB /* ObjectMapping */, + EB93FC4D13EA791E92A957F7C9016430 /* Support */, + 162A1584631E78249F74C31D958FA11B /* Support Files */, + ); + name = RestKit; + path = RestKit; + sourceTree = ""; + }; + 6F4EEA9F6A20A0D07F065EB6C345EA3D /* RKValueTransformers */ = { + isa = PBXGroup; + children = ( + A789AF4D82C0A1869E620AB43478C835 /* RKValueTransformers.h */, + A81E91ED05C9F582515498FA171C649A /* RKValueTransformers.m */, + 721840B4F76B7DD733D4A01BF702E0EF /* Support Files */, + ); + name = RKValueTransformers; + path = RKValueTransformers; + sourceTree = ""; + }; + 721840B4F76B7DD733D4A01BF702E0EF /* Support Files */ = { + isa = PBXGroup; + children = ( + 3C0241AD8BF23D0F522C110BBE3094A8 /* RKValueTransformers.xcconfig */, + 80326CF9A29E8F03A47B760A7D93E7EE /* RKValueTransformers-dummy.m */, + 0CBBB81065DD67FF410D82F05C5766CC /* RKValueTransformers-prefix.pch */, + ); + name = "Support Files"; + path = "../Target Support Files/RKValueTransformers"; + sourceTree = ""; + }; + 9D1672A4E3CDA1EB82480D17C0EA84C2 /* Support Files */ = { + isa = PBXGroup; + children = ( + F6E900BB0E56DE1B29C73FF326653869 /* SOCKit.xcconfig */, + E83F3FF04024D50C0AE498A2D144C9DA /* SOCKit-dummy.m */, + 8FD54C546F41FB61C72F745B7137440D /* SOCKit-prefix.pch */, + ); + name = "Support Files"; + path = "../Target Support Files/SOCKit"; + sourceTree = ""; + }; + 9D81D0B529E61937A03EFB9667DC8F10 /* Products */ = { + isa = PBXGroup; + children = ( + 17DDE9F70BE84AF0482A7909D2BE28DC /* libISO8601DateFormatterValueTransformer.a */, + 84715DA291EFCA81C4CB6DC5AA4B4195 /* libPods-ScriptorSprint2.a */, + CAF00E6F6766A8D3DBE4F74C265AA90E /* libRestKit.a */, + A4D4C475D91798B81FF459E35386E02A /* libRKValueTransformers.a */, + 4B65915EEE8B65C62B915F682EAD1659 /* libSOCKit.a */, + 6BE7B5B2EF66268C54B7D350A9DA65B1 /* libTransitionKit.a */, + ); + name = Products; + sourceTree = ""; + }; + A6215B241ED387F250AC8B1118AE2D04 /* Support Files */ = { + isa = PBXGroup; + children = ( + B05892906186E0328A66DB5BE38448F8 /* TransitionKit.xcconfig */, + 1E83411E63F39A9A126D4B50B570E260 /* TransitionKit-dummy.m */, + E0FBEB4E276BEB250901C60805415901 /* TransitionKit-prefix.pch */, + ); + name = "Support Files"; + path = "../Target Support Files/TransitionKit"; + sourceTree = ""; + }; + C1EF19A522B3E60E05649FA4B7E20F72 /* Pods-ScriptorSprint2 */ = { + isa = PBXGroup; + children = ( + 3B3880C5754F17F87D2E9152E033BC2D /* Pods-ScriptorSprint2-acknowledgements.markdown */, + 052953B17A28ED28EFE2D7A97A0CF758 /* Pods-ScriptorSprint2-acknowledgements.plist */, + D33CFD30E99E150B87392D6FFD437F44 /* Pods-ScriptorSprint2-dummy.m */, + 035AACAD473816D74C957FE9338AF0CF /* Pods-ScriptorSprint2.debug.xcconfig */, + 98981E9E86643C80A510C687EC20DAB7 /* Pods-ScriptorSprint2.release.xcconfig */, + ); + name = "Pods-ScriptorSprint2"; + path = "Target Support Files/Pods-ScriptorSprint2"; + sourceTree = ""; + }; + C3400685AB7660BEBFC3326EDD5794D1 /* ISO8601DateFormatterValueTransformer */ = { + isa = PBXGroup; + children = ( + 8F63093292674A527DC2DCD5E25BE0B8 /* ISO8601DateFormatterValueTransformer.h */, + AEAECEF245F26F95F098DC910CED7757 /* ISO8601DateFormatterValueTransformer.m */, + C09EA4EC4FB50C2D916A6653D5FE1B6C /* RKISO8601DateFormatter.h */, + 0387A8B9A0133430AB05EA75ED4BF392 /* RKISO8601DateFormatter.m */, + FB16B63DA830C557C0F968688D82385D /* Support Files */, + ); + name = ISO8601DateFormatterValueTransformer; + path = ISO8601DateFormatterValueTransformer; + sourceTree = ""; + }; + C54DD895E6880019264C8C916F6C6731 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + C1EF19A522B3E60E05649FA4B7E20F72 /* Pods-ScriptorSprint2 */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + C970F1E07D0A8ADD02CDA0A8BC738B17 /* Network */ = { + isa = PBXGroup; + children = ( + A417A7D2BAF0EE17F3213D11F4545600 /* AFRKHTTPClient.h */, + 16B27CFDD38ACC9B60046715E6110AC0 /* AFRKHTTPClient.m */, + 8CFBFA8F8FB475214898130D9EEDFDB1 /* AFRKHTTPRequestOperation.h */, + DE54136E775BC20DD400ED9F39FF4B67 /* AFRKHTTPRequestOperation.m */, + 5BCAF23EF25EAB9D27C1B4BBA4A89F24 /* AFRKImageRequestOperation.h */, + 058DE072D427CC03F5C162C03D23695D /* AFRKImageRequestOperation.m */, + 1DE0CE9F77795809F5AF7566B5114B49 /* AFRKJSONRequestOperation.h */, + 8DEF7D6269AE63B53A32E46160D424AD /* AFRKJSONRequestOperation.m */, + 85CC6EC409BF9CFD8ACF6E2A42176F0C /* AFRKNetworkActivityIndicatorManager.h */, + 1DA9F3F317C02DED3BD9A5AFCB612729 /* AFRKNetworkActivityIndicatorManager.m */, + D40C60FBE47BCA71E2DD3B7D9BE841A0 /* AFRKNetworking.h */, + A2AAA6CA12BB0EFFFCC7C6C677562A42 /* AFRKPropertyListRequestOperation.h */, + BD3425E2A4B2770E18E1835C3C17AC3B /* AFRKPropertyListRequestOperation.m */, + 6C48F9663C5F2AAEC2B22A09BD22DCED /* AFRKURLConnectionOperation.h */, + 7E63BF89CC4198695857B9FE3AB137BC /* AFRKURLConnectionOperation.m */, + 5E426F6FE922AE09AD95F468181401EB /* AFRKXMLRequestOperation.h */, + 73C894F545133872D2AC15B581702678 /* AFRKXMLRequestOperation.m */, + 617D5C9BBC85A2CA6298A66BF3C1EB0F /* Network.h */, + 2312327301D0033AED860EAF5C633F1F /* RKHTTPRequestOperation.h */, + 03D467D6E47F50CD14CAC792E847B107 /* RKHTTPRequestOperation.m */, + 8A4C881B6A0F82EE1905E0B4AA379611 /* RKHTTPUtilities.h */, + 32608CAEA3BEABAA620C5584479989EA /* RKHTTPUtilities.m */, + 3553E7BAA2248B94AB5466D4F335B995 /* RKManagedObjectRequestOperation.h */, + C8BE68EAA7B45AAEF03DF71CDD6F9B55 /* RKManagedObjectRequestOperation.m */, + 5F9481C279FCAC6CEF1511C278EA53DA /* RKObjectManager.h */, + 49DAE54A61D31381ADEC0383FB6BA0B4 /* RKObjectManager.m */, + 469D6CB2B78B5317FDC3CDE9E0CB371A /* RKObjectParameterization.h */, + BB4D6177B6CB5365D56F6020D90245AB /* RKObjectParameterization.m */, + 29DFA4C768DC64FCECF87C953C78EC6F /* RKObjectRequestOperation.h */, + 30B6BDB20441823741C1C2856C340026 /* RKObjectRequestOperation.m */, + EFB029ED5CD0BDCA976660290B818B1B /* RKObjectRequestOperationSubclass.h */, + 4FB6FD2D1B19716383B8B9EB1C503558 /* RKPaginator.h */, + 8249BCE32E7768E3DA83D4755000D749 /* RKPaginator.m */, + 8A75DB73F51AD7E529E9D24ECB4E79D4 /* RKPathMatcher.h */, + C73FD16B810CA36AF185DC4F715A2DF8 /* RKPathMatcher.m */, + 5E3269918F75BAEC8FCD231FA5827D3A /* RKRequestDescriptor.h */, + 70C9E00B7448BD41926E7AE8B677BFE4 /* RKRequestDescriptor.m */, + B714797D2353F73D508616BDAECBA49B /* RKResponseDescriptor.h */, + 3EF382EB33031814D3BE13D4AB3252FF /* RKResponseDescriptor.m */, + 34FD3AFD7337855EEAF47049147C72E7 /* RKResponseMapperOperation.h */, + D55E978B029BFE476EDB1C7686BE7C83 /* RKResponseMapperOperation.m */, + CDEAF9EFCD4894B553AF7FD803712C3B /* RKRoute.h */, + 942DB56BD3C7784F4C911CC8048E7F15 /* RKRoute.m */, + 3C78F9FF9EF26DC9CF31363E49E20083 /* RKRouter.h */, + 8B9F74FED781476D0085E16F03B8ADC2 /* RKRouter.m */, + CE7E7583CF5D298612B27EF9580A6E62 /* RKRouteSet.h */, + B075230AA67A231D6FC0CC2CE9D42F23 /* RKRouteSet.m */, + D07D7255EE1274BF1633C68368239E9E /* UIImageView+AFRKNetworking.h */, + E3561264E8767681B3099CF747EBD08A /* UIImageView+AFRKNetworking.m */, + ); + name = Network; + sourceTree = ""; + }; + CD01E457B1B934EDC2D8A0FFB57AC6F3 /* Pods */ = { + isa = PBXGroup; + children = ( + C3400685AB7660BEBFC3326EDD5794D1 /* ISO8601DateFormatterValueTransformer */, + 6ABE0BDEBDC69F330BEF6FE19C83CFBB /* RestKit */, + 6F4EEA9F6A20A0D07F065EB6C345EA3D /* RKValueTransformers */, + 6343E0190E685A4D516B8BB7A0F756B6 /* SOCKit */, + DF44C40018775EF894F43A8881C96B04 /* TransitionKit */, + ); + name = Pods; + sourceTree = ""; + }; + CF1408CF629C7361332E53B88F7BD30C = { + isa = PBXGroup; + children = ( + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, + D89477F20FB1DE18A04690586D7808C4 /* Frameworks */, + CD01E457B1B934EDC2D8A0FFB57AC6F3 /* Pods */, + 9D81D0B529E61937A03EFB9667DC8F10 /* Products */, + C54DD895E6880019264C8C916F6C6731 /* Targets Support Files */, + ); + sourceTree = ""; + }; + D89477F20FB1DE18A04690586D7808C4 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; + D94C98B9B911FD263F6D6AB448CB4FEB /* ObjectMapping */ = { + isa = PBXGroup; + children = ( + 1C0249A332A98CF8B7B3B49AE552A58E /* ObjectMapping.h */, + BDB8D98946B23EF227FADEFC0012730E /* RKAttributeMapping.h */, + AF421C8C5B4CDA5E323B401E01E5BE00 /* RKAttributeMapping.m */, + 885EEBFF7748EA379DDEDE7B26FB87AA /* RKDynamicMapping.h */, + 57CF177DFF07D87700EDA9282B95E671 /* RKDynamicMapping.m */, + FA5F023A545AF1DF72816E9220C4419C /* RKErrorMessage.h */, + 30ADE26D1A909180EF0609EB609D2354 /* RKErrorMessage.m */, + EDCD7AE3D83890197E917B81BDF86961 /* RKMapperOperation.h */, + 69E4E9A1C480270C2CC7E41445C98A63 /* RKMapperOperation.m */, + 6928FB36B401C471D9BB0E3918619E7A /* RKMapperOperation_Private.h */, + B372D98F24054EFF0BFE74F4522C6971 /* RKMapping.h */, + 836EEB3262670C44A87485144FB45C0D /* RKMapping.m */, + 8AC938F96E0D3DDB85FB5BF87045AF75 /* RKMappingErrors.h */, + 07A99F8C42BCF5029B7CBA0FA8AB84FB /* RKMappingOperation.h */, + 30DD8C8E13647B25F166696B5DCD0A9E /* RKMappingOperation.m */, + EF386B4114C2FB19BAC43050F0F7284C /* RKMappingOperationDataSource.h */, + 9438CA279940F2FB2B2DBD21FF5FFD4B /* RKMappingResult.h */, + 20CDD9FFCC685DF5B2FC52239F9FEE45 /* RKMappingResult.m */, + 5A16931B0ECA0EA687331B9F5805BADC /* RKObjectMapping.h */, + C51515F8F202F1DFC9FC508ADE93E5D0 /* RKObjectMapping.m */, + F3D208AA1125D4AAE8FC6165B30D9C4D /* RKObjectMappingMatcher.h */, + 9599240A89AA0C327E3A19F1B8E986EB /* RKObjectMappingMatcher.m */, + DD745940219005A7CDD9965BE0D999B3 /* RKObjectMappingOperationDataSource.h */, + A25FF489311F0D136B509038755AE289 /* RKObjectMappingOperationDataSource.m */, + DC78C3DF18BDAFB4F7F82A0FC59B9414 /* RKObjectUtilities.h */, + 142ACB9D7BC81DFE57B0783CE1D3DBD1 /* RKObjectUtilities.m */, + 639CED6AF3926976D85C15588E91106F /* RKPropertyInspector.h */, + A969B3045A987B8C1674A9A7F49A622F /* RKPropertyInspector.m */, + BB23BDB9B90F0C57FB2E9AF8608A050E /* RKPropertyMapping.h */, + 4DEBFE81A6EE81790436E723B36353D9 /* RKPropertyMapping.m */, + C4DCFB96C5949117D8D9D46FA2776DD0 /* RKRelationshipMapping.h */, + 866A9F7A49509ED5CD51FD4FB2549225 /* RKRelationshipMapping.m */, + ); + name = ObjectMapping; + sourceTree = ""; + }; + DF44C40018775EF894F43A8881C96B04 /* TransitionKit */ = { + isa = PBXGroup; + children = ( + 878AF4F20F669A4133F176A24BC221D4 /* TKEvent.h */, + 97057CFDBF9E7435C45AC9FF96EC0A22 /* TKEvent.m */, + 07045F5A3465039AA002659668B27018 /* TKState.h */, + 65A0692FB7DC29935F73426D7A7D8365 /* TKState.m */, + D5C9FFACDFBAFE975CA173389B31A30F /* TKStateMachine.h */, + EC7C79295069C679AC61DDF2BF22EF71 /* TKStateMachine.m */, + 696C74BC9F7D33F2B4F9B89405C8AF1D /* TKTransition.h */, + DBB5BBDFF8EF5B47581FEB48E82A5901 /* TKTransition.m */, + 8BA0799BBF1BB8636058B29F88685AD8 /* TransitionKit.h */, + A6215B241ED387F250AC8B1118AE2D04 /* Support Files */, + ); + name = TransitionKit; + path = TransitionKit; + sourceTree = ""; + }; + EB93FC4D13EA791E92A957F7C9016430 /* Support */ = { + isa = PBXGroup; + children = ( + CF65796F06806CEF36F68F72654DF8C1 /* lcl_config_components_RK.h */, + E704BD136883E9CD4D213A72F20AF7A2 /* lcl_config_extensions_RK.h */, + 4463A03A792B44D093C38D243B68C906 /* lcl_config_logger_RK.h */, + 7DC7CBD9B588A88401673148863CA586 /* lcl_RK.h */, + 6F1C903698BCB3B0A70E8AD8F5416F40 /* lcl_RK.m */, + 99CFD17E31EA21B6CD9EFA6B1FD602DA /* RestKit.h */, + AEEA437802F328829CB43775E98E6C41 /* RKBooleanClass.h */, + 818ABB0194001EC9CBCAB57DF9EF5954 /* RKDictionaryUtilities.h */, + 618CD82AABF1C3B46AE34482441EDB6A /* RKDictionaryUtilities.m */, + 12B67CEF980B1F6A5D635604D11C5254 /* RKDotNetDateFormatter.h */, + FA3702658CE396EA106BDC6E2E4BE0D3 /* RKDotNetDateFormatter.m */, + 08AFB3C6E0D9A7472BC49AD06CE0EDF3 /* RKErrors.h */, + 98F6CA3EC95666663499C52C0079FAB2 /* RKErrors.m */, + 7B941232DFDD0E08FA8600307AD6589D /* RKLog.h */, + C3297E038746A54695B877FAD306F86A /* RKLog.m */, + 943828BAB3D76C9F5E5FABA6088BDACE /* RKMacros.h */, + FE4D5F8E8BFA5C4D0C6275677E22CA24 /* RKMIMETypes.h */, + 1DB35A94A2E1FCDCA4260AE79502ED80 /* RKMIMETypes.m */, + E5EAAD314BD23BB1F03363DCDAC931DB /* RKMIMETypeSerialization.h */, + 39E3ABD4B23BC79DC65CF5726F64CDFA /* RKMIMETypeSerialization.m */, + 263ECB09B91C1F9C09FE45E495C59EA6 /* RKNSJSONSerialization.h */, + C3925AD6D014D968183D40C4FE26D442 /* RKNSJSONSerialization.m */, + 9F81AC59A09A6182135D51C095287BA6 /* RKOperationStateMachine.h */, + C96EA8DFDF7C0E11B453A3A111A98140 /* RKOperationStateMachine.m */, + 91C4D5B08E162BF684858F6651A12D26 /* RKPathUtilities.h */, + CCF4E7D4FBE1C574F748A7B8C448D8D9 /* RKPathUtilities.m */, + BFB9717BE82F2CFFA71185D31F38BC00 /* RKSerialization.h */, + D1DB92CFDA321BB35EB1C452D2C3019F /* RKStringTokenizer.h */, + 386EA28A5B0B4AF52641265558E237BD /* RKStringTokenizer.m */, + 584A2768583312016678DC2C9BBBAE22 /* RKURLEncodedSerialization.h */, + D1BE1BB47B33CF706182E58244A377AE /* RKURLEncodedSerialization.m */, + E79A02BB7A0DDB9A5C285B6691380AF8 /* Support.h */, + ); + name = Support; + sourceTree = ""; + }; + FB16B63DA830C557C0F968688D82385D /* Support Files */ = { + isa = PBXGroup; + children = ( + 260B094F516EEBA28EB9897E2438E35E /* ISO8601DateFormatterValueTransformer.xcconfig */, + 6F3982655691F193BBCE88B142E87572 /* ISO8601DateFormatterValueTransformer-dummy.m */, + 5FE066877CCBE04B2E804A3A5F8A937D /* ISO8601DateFormatterValueTransformer-prefix.pch */, + ); + name = "Support Files"; + path = "../Target Support Files/ISO8601DateFormatterValueTransformer"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 37ECA279BCA1C3D2A64F43C65382BAE8 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + BF3E2EE13B3CFA0142A818C8EA0B2324 /* TKEvent.h in Headers */, + 130D68BA8817DD6BD62D3DBED631FA83 /* TKState.h in Headers */, + 6376F8BBB5CEF3D6B69771F9B76DA22E /* TKStateMachine.h in Headers */, + 4E4CE2A9638C2F226A04A832E2F022CF /* TKTransition.h in Headers */, + 8E35CB31B8B5E6C3A3EA9D1BB25C42F7 /* TransitionKit.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 68FAACE7BC1F8B1DD3A11FEB7C2E690C /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 39EDEB464B8220EE8C61F44F621E25FC /* RKValueTransformers.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 70310E5123E555FCD7A2677C6A797A8F /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + E975248891618278524EE102116A5C99 /* AFRKHTTPClient.h in Headers */, + 74C395A7B1867C8CAFDCA6DBEAA36E9E /* AFRKHTTPRequestOperation.h in Headers */, + 52FFA4EC4B1AD6B56BD87A9204A2DE3C /* AFRKImageRequestOperation.h in Headers */, + DA710CDA6D28FA90FC6635D0C2E2A4FB /* AFRKJSONRequestOperation.h in Headers */, + EC6B629E14B188EE7F3A75AADA43F524 /* AFRKNetworkActivityIndicatorManager.h in Headers */, + 1F0A42E5BDAD82ACDE94DD1FA9E865C5 /* AFRKNetworking.h in Headers */, + 356412E6F3E5DF91DCD3C2E7CFA22669 /* AFRKPropertyListRequestOperation.h in Headers */, + 973322320D9BAF3A93A7A8CB57503BFD /* AFRKURLConnectionOperation.h in Headers */, + 5C18BA1520EC93E771A75045097F1065 /* AFRKXMLRequestOperation.h in Headers */, + 1BA115952B2429F55E4D73D45972E92F /* CoreData.h in Headers */, + 3F20DA9A7D4392D2DC7FFC59AC699B74 /* lcl_config_components_RK.h in Headers */, + 9B307C376A5D1401C5D53B17003AD769 /* lcl_config_extensions_RK.h in Headers */, + 76CE28F79C2A56F121543B5164336863 /* lcl_config_logger_RK.h in Headers */, + 42243A71B4E2DF770EA0F30FC8292F6E /* lcl_RK.h in Headers */, + 14FCD35FEDA03DFBB1FA0F51F8923823 /* Network.h in Headers */, + 1C656D5498238D593F3194F316BAC36F /* NSManagedObject+RKAdditions.h in Headers */, + E5F7E0B56E716CBF9AED18D095D3D730 /* NSManagedObjectContext+RKAdditions.h in Headers */, + 335A775DB7412931332C8F0EE9F4329C /* ObjectMapping.h in Headers */, + 5234EC410317BF7BE3D8A5E9C7EC6DC4 /* RestKit.h in Headers */, + 2783065A61CCA2A4CCFEDA710CDF5AB9 /* RKAttributeMapping.h in Headers */, + DB03B0E86C16611EF6F798A1D77D9893 /* RKBooleanClass.h in Headers */, + 146E7049CC6F70F6FABCA97705A89E5A /* RKConnectionDescription.h in Headers */, + 22167E087BE65C2AAE26924754D85448 /* RKDictionaryUtilities.h in Headers */, + 2D579D5202D0A695D31D4A49132E71A1 /* RKDotNetDateFormatter.h in Headers */, + B8D01D4843F42CFA084017E04285FC47 /* RKDynamicMapping.h in Headers */, + B60111AC64D32BF2D6ED66D29651E700 /* RKEntityByAttributeCache.h in Headers */, + CA9F385271103C63FD7EF0EC0CCC6956 /* RKEntityCache.h in Headers */, + 35141B9A7A5050761229560956C82F77 /* RKEntityMapping.h in Headers */, + 6FD1E430303FA40E5F83D06735748F97 /* RKErrorMessage.h in Headers */, + 7E4D6315DE997B07C5F208470BBB5D58 /* RKErrors.h in Headers */, + 5F41F1B9F74342AC561A144FA9E1AD13 /* RKFetchRequestManagedObjectCache.h in Headers */, + 8D4391D48813B432B7EC53F7DB233F41 /* RKHTTPRequestOperation.h in Headers */, + B6C202EB94CF408F87F5F6A25F7F97DD /* RKHTTPUtilities.h in Headers */, + A864C45E7DD1866E00B9D574612F5BA2 /* RKInMemoryManagedObjectCache.h in Headers */, + 7864E9512B78370A58E8B525DB8EA7B6 /* RKLog.h in Headers */, + 056713E45D8E0B04FAD2B37DE6D14991 /* RKMacros.h in Headers */, + 68A89B6C709165D14E6AB062F12C63EE /* RKManagedObjectCaching.h in Headers */, + E41214F69207E92D0EB209D9D13FD099 /* RKManagedObjectImporter.h in Headers */, + F492646F68BA67A7F4ADE59DE166FD79 /* RKManagedObjectMappingOperationDataSource.h in Headers */, + BE631F103F67B2F7D1ABDCE0E4CA1102 /* RKManagedObjectRequestOperation.h in Headers */, + 85EA2B4E82A5A0271FABF921803451E6 /* RKManagedObjectStore.h in Headers */, + 8D1A26144E5E0BB74B07E80A4EB84ACF /* RKManagedObjectStore_Private.h in Headers */, + AEDF81AD88A6B7E502BFA213A149230D /* RKMapperOperation.h in Headers */, + 1BB700A949658114DB190AB0025E6CEC /* RKMapperOperation_Private.h in Headers */, + 858D1703DB9AC7AF5150E3088BFDCA23 /* RKMapping.h in Headers */, + 9E7EFED07EC1169A03F36A9C1D5E65DF /* RKMappingErrors.h in Headers */, + B2BD845529E28D2D0EA88D8A843E6F31 /* RKMappingOperation.h in Headers */, + 2D13F6F3CA2393D088C725F1E93D5C2D /* RKMappingOperationDataSource.h in Headers */, + CA48697A291FF9CEDEF605E8C2F04541 /* RKMappingResult.h in Headers */, + 53AE74966263CACC115FF4B73D245CC1 /* RKMIMETypes.h in Headers */, + 554D46939CCCE39E3F120525FC639198 /* RKMIMETypeSerialization.h in Headers */, + A82FA43C39F2A6B50D5F2F0C3BEF5624 /* RKNSJSONSerialization.h in Headers */, + DF9C45863FFF5D743EA443CDDDCB632C /* RKObjectManager.h in Headers */, + 74557AF9096AA6BC994FE4A2CB78739C /* RKObjectMapping.h in Headers */, + CDED7BCDDC1517532ED238A1B6B760A9 /* RKObjectMappingMatcher.h in Headers */, + C0A1BEB7A70CFBF6605C7C64DD7BBDB2 /* RKObjectMappingOperationDataSource.h in Headers */, + 1B0E964D9D3A76452B29C9A37DE752B7 /* RKObjectParameterization.h in Headers */, + 8D5D26E97BEDFFC491BCE5E99F4F7418 /* RKObjectRequestOperation.h in Headers */, + 4B3D838D3B8DEB044CF78177E1F785CF /* RKObjectRequestOperationSubclass.h in Headers */, + BE42247228B63D45326CF77A6C7156B2 /* RKObjectUtilities.h in Headers */, + 0F6769A1AF10F40B9E0431ED6D360FE4 /* RKOperationStateMachine.h in Headers */, + 3F9FD34405BF669B0AC18240D473214B /* RKPaginator.h in Headers */, + 244FB31EBE472B4C0EAA347BD7997156 /* RKPathMatcher.h in Headers */, + BC6CAD1DFFAE68982706F6F9AAF3DAAB /* RKPathUtilities.h in Headers */, + 0E0BC4B41C342962130F25A721F79582 /* RKPropertyInspector+CoreData.h in Headers */, + 0F20E7E8D5380B67134D9ECC3A1B2AD9 /* RKPropertyInspector.h in Headers */, + DDF16BF8D16518A3C9CADE9C3F653A25 /* RKPropertyMapping.h in Headers */, + 625FAAD78145DDF2F75D6B198BFB0ACF /* RKRelationshipConnectionOperation.h in Headers */, + C9B5F07B480F1DFB847F54EAC6C359AD /* RKRelationshipMapping.h in Headers */, + 0FE2900C3D9852BCE6D315C8B5955C1D /* RKRequestDescriptor.h in Headers */, + ACD4ACD558C472F88D5DBAE133056352 /* RKResponseDescriptor.h in Headers */, + 858A94A1606D743ABA2F9FBDE0A0984D /* RKResponseMapperOperation.h in Headers */, + F456FD3815F055BA59D107A9EB095516 /* RKRoute.h in Headers */, + 745EAAB3D58E5DCA16C5D181DA0DC96D /* RKRouter.h in Headers */, + 4688A5261715D865975268A9981A2E24 /* RKRouteSet.h in Headers */, + 1BDFB73811BAFBB33DF07A4339151077 /* RKSerialization.h in Headers */, + 670AD0B5E4842C6A6A115378EAB67021 /* RKStringTokenizer.h in Headers */, + 047EB6DA48533EE90EE1B2AEB21D8CBE /* RKURLEncodedSerialization.h in Headers */, + 806417D3C85813DE9D5E546649FE6FCB /* Support.h in Headers */, + D245DCF688C7A8D280D465070B106A33 /* UIImageView+AFRKNetworking.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7A3510BE60967A64DB7ED04616649194 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 05157B83ABC54D68A3461B4B9108FD71 /* ISO8601DateFormatterValueTransformer.h in Headers */, + 6744E3E1DCC24F0873CDAA08476DDC1C /* RKISO8601DateFormatter.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9883E9110D49201680A86BF109812351 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FE96D554F5310E43D63CFDDE4C12FFA0 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 682DC537BF45303E566E64C690CEDF22 /* SOCKit.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 02CEB236B4E2D65541CCCE630D648EB3 /* Pods-ScriptorSprint2 */ = { + isa = PBXNativeTarget; + buildConfigurationList = B9481F306809A0F4FA10F3F99EFF8932 /* Build configuration list for PBXNativeTarget "Pods-ScriptorSprint2" */; + buildPhases = ( + 9883E9110D49201680A86BF109812351 /* Headers */, + 0783A6E0E7CB31697C83D13D0C713972 /* Sources */, + 4D27B41CBB45BDDD4A7BB20F6647EB43 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + CCCC8C2C8AAD7C3F9E8FB6DCF7C1F989 /* PBXTargetDependency */, + 9FA57A385A2CE4CCEF9C33BB94EF0A55 /* PBXTargetDependency */, + 442A32D82256E084EEEF2D9E128EE5FC /* PBXTargetDependency */, + 965B7F5F2FF3F204701EAC336E18D06F /* PBXTargetDependency */, + D7D3204EB9DF509C3B3FF4EEE266770D /* PBXTargetDependency */, + ); + name = "Pods-ScriptorSprint2"; + productName = "Pods-ScriptorSprint2"; + productReference = 84715DA291EFCA81C4CB6DC5AA4B4195 /* libPods-ScriptorSprint2.a */; + productType = "com.apple.product-type.library.static"; + }; + 0A5519211D07DF0CD5FF3A8A325F5E98 /* ISO8601DateFormatterValueTransformer */ = { + isa = PBXNativeTarget; + buildConfigurationList = A5F443EA28A1CD45A43CDA570CF9D64C /* Build configuration list for PBXNativeTarget "ISO8601DateFormatterValueTransformer" */; + buildPhases = ( + 7A3510BE60967A64DB7ED04616649194 /* Headers */, + A34276BA1CCF7D08E82072B649365CCE /* Sources */, + 42836BD54DF7C6D53C8D029563B2096E /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 65B9B917FBF3140F4D4714EAF7B288DD /* PBXTargetDependency */, + ); + name = ISO8601DateFormatterValueTransformer; + productName = ISO8601DateFormatterValueTransformer; + productReference = 17DDE9F70BE84AF0482A7909D2BE28DC /* libISO8601DateFormatterValueTransformer.a */; + productType = "com.apple.product-type.library.static"; + }; + 61742F6C8117ACED091A59781FB2876E /* RestKit */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63187B8D4FB3D11EC0E170E0E0C8EDAD /* Build configuration list for PBXNativeTarget "RestKit" */; + buildPhases = ( + 70310E5123E555FCD7A2677C6A797A8F /* Headers */, + EC620722C891DA551A5F084673B66621 /* Sources */, + 096DCC1B8D60F23BAE4C24978191ACF1 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 3FCC194CA983BD5E4C8CC52A7384E457 /* PBXTargetDependency */, + E9A0AD0029762AC8F28F7ECA9D68FE4D /* PBXTargetDependency */, + 39AA15A349FD4B23D5131A6C86F1202D /* PBXTargetDependency */, + 66BB5D7A9554EB8D80DEFCDAFA46CEB6 /* PBXTargetDependency */, + ); + name = RestKit; + productName = RestKit; + productReference = CAF00E6F6766A8D3DBE4F74C265AA90E /* libRestKit.a */; + productType = "com.apple.product-type.library.static"; + }; + 86258348052A0B1D4958DFD6F90B3100 /* RKValueTransformers */ = { + isa = PBXNativeTarget; + buildConfigurationList = 8ABB67C36CE2056DC4AE0EAF5B327C7A /* Build configuration list for PBXNativeTarget "RKValueTransformers" */; + buildPhases = ( + 68FAACE7BC1F8B1DD3A11FEB7C2E690C /* Headers */, + 9F74829C5D038A6A529B3C2942D5EE8C /* Sources */, + 902F88DB88302FC60FAF0C361F96BF4A /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = RKValueTransformers; + productName = RKValueTransformers; + productReference = A4D4C475D91798B81FF459E35386E02A /* libRKValueTransformers.a */; + productType = "com.apple.product-type.library.static"; + }; + 8950AEC0D55833E414BCD3DE1160FC62 /* SOCKit */ = { + isa = PBXNativeTarget; + buildConfigurationList = 31B32A451B8B0BF67B43B583348F07D4 /* Build configuration list for PBXNativeTarget "SOCKit" */; + buildPhases = ( + FE96D554F5310E43D63CFDDE4C12FFA0 /* Headers */, + 2514CF3602B9BE2C4E328E45BBF3BFF1 /* Sources */, + 69633BDE1AFF00042262FB717D676DF8 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SOCKit; + productName = SOCKit; + productReference = 4B65915EEE8B65C62B915F682EAD1659 /* libSOCKit.a */; + productType = "com.apple.product-type.library.static"; + }; + E050CC203E99B56C44AF99297F358444 /* TransitionKit */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2BF35394D1F35FA00DE091BB5DD5E778 /* Build configuration list for PBXNativeTarget "TransitionKit" */; + buildPhases = ( + 37ECA279BCA1C3D2A64F43C65382BAE8 /* Headers */, + B38DEF37C1EC093CEF23BF0DB9F590A7 /* Sources */, + 653A9446F4EE7C77DE6FD28349FED82E /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TransitionKit; + productName = TransitionKit; + productReference = 6BE7B5B2EF66268C54B7D350A9DA65B1 /* libTransitionKit.a */; + productType = "com.apple.product-type.library.static"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + BFDFE7DC352907FC980B868725387E98 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0930; + LastUpgradeCheck = 0930; + }; + buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = CF1408CF629C7361332E53B88F7BD30C; + productRefGroup = 9D81D0B529E61937A03EFB9667DC8F10 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 0A5519211D07DF0CD5FF3A8A325F5E98 /* ISO8601DateFormatterValueTransformer */, + 02CEB236B4E2D65541CCCE630D648EB3 /* Pods-ScriptorSprint2 */, + 61742F6C8117ACED091A59781FB2876E /* RestKit */, + 86258348052A0B1D4958DFD6F90B3100 /* RKValueTransformers */, + 8950AEC0D55833E414BCD3DE1160FC62 /* SOCKit */, + E050CC203E99B56C44AF99297F358444 /* TransitionKit */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 0783A6E0E7CB31697C83D13D0C713972 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9CE3422A558B68C181BC1FD301A0BD23 /* Pods-ScriptorSprint2-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2514CF3602B9BE2C4E328E45BBF3BFF1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CA5A1F051083D1DF564185BFFF75F271 /* SOCKit-dummy.m in Sources */, + 74FFF3C449612C3A189294ADBC9A12E1 /* SOCKit.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9F74829C5D038A6A529B3C2942D5EE8C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 17EAA8E53862372294869F2FD9484B4E /* RKValueTransformers-dummy.m in Sources */, + A9E3E0CC06C14C5C2ADF0D89CEA61110 /* RKValueTransformers.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A34276BA1CCF7D08E82072B649365CCE /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 701BF9B02109C03DAFD2AC84B708FD33 /* ISO8601DateFormatterValueTransformer-dummy.m in Sources */, + 6C73C460F072E8F3F842813B81FB540F /* ISO8601DateFormatterValueTransformer.m in Sources */, + 6BF56BFB1C723EAB9D3C3ED22CDE3536 /* RKISO8601DateFormatter.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B38DEF37C1EC093CEF23BF0DB9F590A7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 01363F3D25A1765888191BEC1852B291 /* TKEvent.m in Sources */, + 5F356E49B3AC333F2C05464B32926113 /* TKState.m in Sources */, + 491762AE6B20FA9820C4C8883E7CA4A3 /* TKStateMachine.m in Sources */, + 3CDE2498E308DAC906956216CCFF54E1 /* TKTransition.m in Sources */, + 42B32D66A8CDA89F8B11B6CAA1CD5D5F /* TransitionKit-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EC620722C891DA551A5F084673B66621 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 93969EE16740DD947E249F0832E58ABD /* AFRKHTTPClient.m in Sources */, + A328C11F465638DF627B41BAD7A9E895 /* AFRKHTTPRequestOperation.m in Sources */, + 6A7FD0AE32FC5C8CB168DD63485DDB76 /* AFRKImageRequestOperation.m in Sources */, + EAF31DEE757E4BF8FA303B70C2C66793 /* AFRKJSONRequestOperation.m in Sources */, + 52BD7639FEAEB10AAD8E4AB75630D8C5 /* AFRKNetworkActivityIndicatorManager.m in Sources */, + 8804E2C3B7C14696BCF481E8FE521E9C /* AFRKPropertyListRequestOperation.m in Sources */, + 4D9BB9375F26E29455A3BD543A5B4526 /* AFRKURLConnectionOperation.m in Sources */, + D4DC43DC6F92062E29BB296E18F94AD9 /* AFRKXMLRequestOperation.m in Sources */, + 76D13C18130EB6BD9FF69A165B913314 /* lcl_RK.m in Sources */, + 44C046B4F0113CDD6541DE14AAA8D560 /* NSManagedObject+RKAdditions.m in Sources */, + 4588FD53B929201FECE9F92C182551BF /* NSManagedObjectContext+RKAdditions.m in Sources */, + 8CFA2E2C49309077D72E8C4605996F6C /* RestKit-dummy.m in Sources */, + D8FCBC482A660C1A4A72AAEA6D04A26A /* RKAttributeMapping.m in Sources */, + 3B5076EE99E9ACFFA8B7E746539C5CE7 /* RKConnectionDescription.m in Sources */, + A8AE3A31FEA4543382FB0D22732A641C /* RKDictionaryUtilities.m in Sources */, + E3DA26CDE36340883C84226F69DFB129 /* RKDotNetDateFormatter.m in Sources */, + 879D84F48A62B5233B8C3BA8F19822F3 /* RKDynamicMapping.m in Sources */, + A9910C94489B3B991436A66018DB58EB /* RKEntityByAttributeCache.m in Sources */, + 1FE391DF92F7A32CDF98441BEC0B9EE4 /* RKEntityCache.m in Sources */, + CCB248258FC0824CDBA0719315F99B6C /* RKEntityMapping.m in Sources */, + 35922EB4C376E4895979E3AF08DD6C43 /* RKErrorMessage.m in Sources */, + BE3B10895CAC6A68C2D6CEA59D1F6A34 /* RKErrors.m in Sources */, + 1CAB46D2AD7550E73D53F4CA6D8D2635 /* RKFetchRequestManagedObjectCache.m in Sources */, + 30028C8F1578A4C70E2B16588099B902 /* RKHTTPRequestOperation.m in Sources */, + 42632B14CC1E08EEB5F78CE0768F0780 /* RKHTTPUtilities.m in Sources */, + F7E3A8E85DFADB16B56C7134EC0C9BB9 /* RKInMemoryManagedObjectCache.m in Sources */, + 928F27D3A53F9BA9014807C54A15B12D /* RKLog.m in Sources */, + 69176E416985C76453DFE7536316CF90 /* RKManagedObjectImporter.m in Sources */, + 7A57939FE8B8B752D3B985B4F1B0C4CE /* RKManagedObjectMappingOperationDataSource.m in Sources */, + 04FFF6F212A2C54E92D6D38FB7B756F7 /* RKManagedObjectRequestOperation.m in Sources */, + 86A708C78BAF4D630A071EA6BD277C02 /* RKManagedObjectStore.m in Sources */, + 05A8A23272EAD867AB95BF88B30FAF08 /* RKMapperOperation.m in Sources */, + 0D87C3AED9F7C31018535F9DFA7B63F8 /* RKMapping.m in Sources */, + DF41CF20CF4444F22D7B571A24DA74E9 /* RKMappingOperation.m in Sources */, + F2BA4DD531C348C68B8BC2DE4914F451 /* RKMappingResult.m in Sources */, + CC4BCD2211F64A14D4C9E0A715B9AF30 /* RKMIMETypes.m in Sources */, + 0E83CFB69FB5FAE6CEAD0CC525CF2EA0 /* RKMIMETypeSerialization.m in Sources */, + F3491D6F69AB709AE4E768CE4A2A2192 /* RKNSJSONSerialization.m in Sources */, + 831772F10A4CD4D6439E4AD6FCE06BA1 /* RKObjectManager.m in Sources */, + B452D23740D59993B70ABD33BC487943 /* RKObjectMapping.m in Sources */, + 2967A38924953C676028615939735929 /* RKObjectMappingMatcher.m in Sources */, + C38FB46772E1808BC852BE2B866D0183 /* RKObjectMappingOperationDataSource.m in Sources */, + 2797905E589952440714225C41E302A2 /* RKObjectParameterization.m in Sources */, + 07228DD33F6D12B4E2C9675F46BB3733 /* RKObjectRequestOperation.m in Sources */, + B05DA782B2554C783FEF661327E1CA5B /* RKObjectUtilities.m in Sources */, + CB4D7C20050585B6B17D0B088FAF2C90 /* RKOperationStateMachine.m in Sources */, + 42D8EBAFBB26C5D36FC700AADC976130 /* RKPaginator.m in Sources */, + B330276FC3AEAE130B97B6DE2BC9DB35 /* RKPathMatcher.m in Sources */, + 1D6C962344ABCEF7E7006E48961B079B /* RKPathUtilities.m in Sources */, + 095E23397C44B44EA17FB2F22A8AFD59 /* RKPropertyInspector+CoreData.m in Sources */, + 917DF75FF9C068C04B7D916C0898A2BF /* RKPropertyInspector.m in Sources */, + 66D41E937A17018CF718531CF173B6A1 /* RKPropertyMapping.m in Sources */, + 30D6D0DE0BC145381E3A3FF5AD49AECF /* RKRelationshipConnectionOperation.m in Sources */, + 81BCBC302CCC180E08D7FA9BB19DF757 /* RKRelationshipMapping.m in Sources */, + E03ED7F34369CFF89464ADC173A45848 /* RKRequestDescriptor.m in Sources */, + 8080C001B26DAE0F278144894512DA04 /* RKResponseDescriptor.m in Sources */, + A707CC681FD91D2CB490C698FB5909FD /* RKResponseMapperOperation.m in Sources */, + 6A01B359408D32DE4C27813809317841 /* RKRoute.m in Sources */, + 59B390CA2378D0F6FA92C2910C56788F /* RKRouter.m in Sources */, + 96B466EAF2969EE61E3719A068B7121A /* RKRouteSet.m in Sources */, + 25C1B821DD00C0BE67900CBB025F3767 /* RKStringTokenizer.m in Sources */, + 2EB088E920160B4A9DBB5AD643E77F5B /* RKURLEncodedSerialization.m in Sources */, + 4E2564A9716FC13BFDDCAD11C1608DB4 /* UIImageView+AFRKNetworking.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 39AA15A349FD4B23D5131A6C86F1202D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SOCKit; + target = 8950AEC0D55833E414BCD3DE1160FC62 /* SOCKit */; + targetProxy = D7399EF585783D4A6C1639F287204D23 /* PBXContainerItemProxy */; + }; + 3FCC194CA983BD5E4C8CC52A7384E457 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = ISO8601DateFormatterValueTransformer; + target = 0A5519211D07DF0CD5FF3A8A325F5E98 /* ISO8601DateFormatterValueTransformer */; + targetProxy = 2A8156D5D3C9124463025F03E330D577 /* PBXContainerItemProxy */; + }; + 442A32D82256E084EEEF2D9E128EE5FC /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = RestKit; + target = 61742F6C8117ACED091A59781FB2876E /* RestKit */; + targetProxy = 1DB760A1868C4496E987C4D53FADA9DC /* PBXContainerItemProxy */; + }; + 65B9B917FBF3140F4D4714EAF7B288DD /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = RKValueTransformers; + target = 86258348052A0B1D4958DFD6F90B3100 /* RKValueTransformers */; + targetProxy = 4B34AB32E0853CC5A7B61B4DB49FF5A2 /* PBXContainerItemProxy */; + }; + 66BB5D7A9554EB8D80DEFCDAFA46CEB6 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = TransitionKit; + target = E050CC203E99B56C44AF99297F358444 /* TransitionKit */; + targetProxy = 3A88E643E8B069C3576DBD9686314588 /* PBXContainerItemProxy */; + }; + 965B7F5F2FF3F204701EAC336E18D06F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SOCKit; + target = 8950AEC0D55833E414BCD3DE1160FC62 /* SOCKit */; + targetProxy = AA483DA1125DB918413DB4870F068DE1 /* PBXContainerItemProxy */; + }; + 9FA57A385A2CE4CCEF9C33BB94EF0A55 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = RKValueTransformers; + target = 86258348052A0B1D4958DFD6F90B3100 /* RKValueTransformers */; + targetProxy = 33B9AC7896E5A58138DD8236769B8D3C /* PBXContainerItemProxy */; + }; + CCCC8C2C8AAD7C3F9E8FB6DCF7C1F989 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = ISO8601DateFormatterValueTransformer; + target = 0A5519211D07DF0CD5FF3A8A325F5E98 /* ISO8601DateFormatterValueTransformer */; + targetProxy = B081FDAB999B944D38CFA806B3ADCE3F /* PBXContainerItemProxy */; + }; + D7D3204EB9DF509C3B3FF4EEE266770D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = TransitionKit; + target = E050CC203E99B56C44AF99297F358444 /* TransitionKit */; + targetProxy = 6E332AF2151EFA9915FA9FD7EC7E03D7 /* PBXContainerItemProxy */; + }; + E9A0AD0029762AC8F28F7ECA9D68FE4D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = RKValueTransformers; + target = 86258348052A0B1D4958DFD6F90B3100 /* RKValueTransformers */; + targetProxy = 9BAE05D1396FC3BF8964CCAB9AE1D609 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 01B21BC7A14D6EF1F86EFF5149AC23E7 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 98981E9E86643C80A510C687EC20DAB7 /* Pods-ScriptorSprint2.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; + MACH_O_TYPE = staticlib; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 30F007769AEBE1D3A58C1C3434E55642 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 260B094F516EEBA28EB9897E2438E35E /* ISO8601DateFormatterValueTransformer.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + GCC_PREFIX_HEADER = "Target Support Files/ISO8601DateFormatterValueTransformer/ISO8601DateFormatterValueTransformer-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 5.0; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_MODULE_NAME = ISO8601DateFormatterValueTransformer; + PRODUCT_NAME = ISO8601DateFormatterValueTransformer; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 36E4F6D800C07D4360A8F4A06042FBA8 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B05892906186E0328A66DB5BE38448F8 /* TransitionKit.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + GCC_PREFIX_HEADER = "Target Support Files/TransitionKit/TransitionKit-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 5.0; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_MODULE_NAME = TransitionKit; + PRODUCT_NAME = TransitionKit; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 41F7967362463FD2D780A6171BA1DCD7 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F6E900BB0E56DE1B29C73FF326653869 /* SOCKit.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + GCC_PREFIX_HEADER = "Target Support Files/SOCKit/SOCKit-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 4.3; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_MODULE_NAME = SOCKit; + PRODUCT_NAME = SOCKit; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 8112AE339D6C46F149F2DBEEE9735972 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4A9078415D4C8B7092521070E17D7D94 /* RestKit.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + GCC_PREFIX_HEADER = "Target Support Files/RestKit/RestKit-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_MODULE_NAME = RestKit; + PRODUCT_NAME = RestKit; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 934C0F04EB8A32510715ED5A5A7E0C66 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B05892906186E0328A66DB5BE38448F8 /* TransitionKit.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + GCC_PREFIX_HEADER = "Target Support Files/TransitionKit/TransitionKit-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 5.0; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_MODULE_NAME = TransitionKit; + PRODUCT_NAME = TransitionKit; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 9C014498722E564A61C168DB4E6FF7DD /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3C0241AD8BF23D0F522C110BBE3094A8 /* RKValueTransformers.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + GCC_PREFIX_HEADER = "Target Support Files/RKValueTransformers/RKValueTransformers-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 5.1.1; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_MODULE_NAME = RKValueTransformers; + PRODUCT_NAME = RKValueTransformers; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + A105C1752A0A49B30ED621B71E226CDB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_RELEASE=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 4.2; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Release; + }; + BAB646E135E5CEF0EB20F200DD3DDF2A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 035AACAD473816D74C957FE9338AF0CF /* Pods-ScriptorSprint2.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; + MACH_O_TYPE = staticlib; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + C1391485F05B41BD35738A433056B7FA /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_DEBUG=1", + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + CE555CFEF94F7D658360589278DA12DA /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 260B094F516EEBA28EB9897E2438E35E /* ISO8601DateFormatterValueTransformer.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + GCC_PREFIX_HEADER = "Target Support Files/ISO8601DateFormatterValueTransformer/ISO8601DateFormatterValueTransformer-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 5.0; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_MODULE_NAME = ISO8601DateFormatterValueTransformer; + PRODUCT_NAME = ISO8601DateFormatterValueTransformer; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + D132BAA755F87CFBC9B5339A874D834B /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F6E900BB0E56DE1B29C73FF326653869 /* SOCKit.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + GCC_PREFIX_HEADER = "Target Support Files/SOCKit/SOCKit-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 4.3; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_MODULE_NAME = SOCKit; + PRODUCT_NAME = SOCKit; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + DD392A08F1869C188A71A55642D2F9DA /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4A9078415D4C8B7092521070E17D7D94 /* RestKit.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + GCC_PREFIX_HEADER = "Target Support Files/RestKit/RestKit-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_MODULE_NAME = RestKit; + PRODUCT_NAME = RestKit; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + F6FBBC137E6C316DBD278A14ADE3C0D5 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3C0241AD8BF23D0F522C110BBE3094A8 /* RKValueTransformers.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + GCC_PREFIX_HEADER = "Target Support Files/RKValueTransformers/RKValueTransformers-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 5.1.1; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_MODULE_NAME = RKValueTransformers; + PRODUCT_NAME = RKValueTransformers; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2BF35394D1F35FA00DE091BB5DD5E778 /* Build configuration list for PBXNativeTarget "TransitionKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 934C0F04EB8A32510715ED5A5A7E0C66 /* Debug */, + 36E4F6D800C07D4360A8F4A06042FBA8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 31B32A451B8B0BF67B43B583348F07D4 /* Build configuration list for PBXNativeTarget "SOCKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D132BAA755F87CFBC9B5339A874D834B /* Debug */, + 41F7967362463FD2D780A6171BA1DCD7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C1391485F05B41BD35738A433056B7FA /* Debug */, + A105C1752A0A49B30ED621B71E226CDB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63187B8D4FB3D11EC0E170E0E0C8EDAD /* Build configuration list for PBXNativeTarget "RestKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8112AE339D6C46F149F2DBEEE9735972 /* Debug */, + DD392A08F1869C188A71A55642D2F9DA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 8ABB67C36CE2056DC4AE0EAF5B327C7A /* Build configuration list for PBXNativeTarget "RKValueTransformers" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9C014498722E564A61C168DB4E6FF7DD /* Debug */, + F6FBBC137E6C316DBD278A14ADE3C0D5 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A5F443EA28A1CD45A43CDA570CF9D64C /* Build configuration list for PBXNativeTarget "ISO8601DateFormatterValueTransformer" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 30F007769AEBE1D3A58C1C3434E55642 /* Debug */, + CE555CFEF94F7D658360589278DA12DA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B9481F306809A0F4FA10F3F99EFF8932 /* Build configuration list for PBXNativeTarget "Pods-ScriptorSprint2" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BAB646E135E5CEF0EB20F200DD3DDF2A /* Debug */, + 01B21BC7A14D6EF1F86EFF5149AC23E7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; +} diff --git a/code/iOS/ScriptorSprint3/Pods/Pods.xcodeproj/xcuserdata/adriangarcia.xcuserdatad/xcschemes/ISO8601DateFormatterValueTransformer.xcscheme b/code/iOS/ScriptorSprint3/Pods/Pods.xcodeproj/xcuserdata/adriangarcia.xcuserdatad/xcschemes/ISO8601DateFormatterValueTransformer.xcscheme new file mode 100644 index 0000000..a9ab976 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Pods.xcodeproj/xcuserdata/adriangarcia.xcuserdatad/xcschemes/ISO8601DateFormatterValueTransformer.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/iOS/ScriptorSprint3/Pods/Pods.xcodeproj/xcuserdata/adriangarcia.xcuserdatad/xcschemes/Pods-ScriptorSprint2.xcscheme b/code/iOS/ScriptorSprint3/Pods/Pods.xcodeproj/xcuserdata/adriangarcia.xcuserdatad/xcschemes/Pods-ScriptorSprint2.xcscheme new file mode 100644 index 0000000..d5fa565 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Pods.xcodeproj/xcuserdata/adriangarcia.xcuserdatad/xcschemes/Pods-ScriptorSprint2.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/iOS/ScriptorSprint3/Pods/Pods.xcodeproj/xcuserdata/adriangarcia.xcuserdatad/xcschemes/RKValueTransformers.xcscheme b/code/iOS/ScriptorSprint3/Pods/Pods.xcodeproj/xcuserdata/adriangarcia.xcuserdatad/xcschemes/RKValueTransformers.xcscheme new file mode 100644 index 0000000..803d6ff --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Pods.xcodeproj/xcuserdata/adriangarcia.xcuserdatad/xcschemes/RKValueTransformers.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/iOS/ScriptorSprint3/Pods/Pods.xcodeproj/xcuserdata/adriangarcia.xcuserdatad/xcschemes/RestKit.xcscheme b/code/iOS/ScriptorSprint3/Pods/Pods.xcodeproj/xcuserdata/adriangarcia.xcuserdatad/xcschemes/RestKit.xcscheme new file mode 100644 index 0000000..6d078c0 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Pods.xcodeproj/xcuserdata/adriangarcia.xcuserdatad/xcschemes/RestKit.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/iOS/ScriptorSprint3/Pods/Pods.xcodeproj/xcuserdata/adriangarcia.xcuserdatad/xcschemes/SOCKit.xcscheme b/code/iOS/ScriptorSprint3/Pods/Pods.xcodeproj/xcuserdata/adriangarcia.xcuserdatad/xcschemes/SOCKit.xcscheme new file mode 100644 index 0000000..6a882a3 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Pods.xcodeproj/xcuserdata/adriangarcia.xcuserdatad/xcschemes/SOCKit.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/iOS/ScriptorSprint3/Pods/Pods.xcodeproj/xcuserdata/adriangarcia.xcuserdatad/xcschemes/TransitionKit.xcscheme b/code/iOS/ScriptorSprint3/Pods/Pods.xcodeproj/xcuserdata/adriangarcia.xcuserdatad/xcschemes/TransitionKit.xcscheme new file mode 100644 index 0000000..238c282 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Pods.xcodeproj/xcuserdata/adriangarcia.xcuserdatad/xcschemes/TransitionKit.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/iOS/ScriptorSprint3/Pods/Pods.xcodeproj/xcuserdata/adriangarcia.xcuserdatad/xcschemes/xcschememanagement.plist b/code/iOS/ScriptorSprint3/Pods/Pods.xcodeproj/xcuserdata/adriangarcia.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..7c5dceb --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Pods.xcodeproj/xcuserdata/adriangarcia.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,53 @@ + + + + + SchemeUserState + + ISO8601DateFormatterValueTransformer.xcscheme + + isShown + + orderHint + 0 + + Pods-ScriptorSprint2.xcscheme + + isShown + + orderHint + 1 + + RKValueTransformers.xcscheme + + isShown + + orderHint + 3 + + RestKit.xcscheme + + isShown + + orderHint + 2 + + SOCKit.xcscheme + + isShown + + orderHint + 4 + + TransitionKit.xcscheme + + isShown + + orderHint + 5 + + + SuppressBuildableAutocreation + + + diff --git a/code/iOS/ScriptorSprint3/Pods/Pods.xcodeproj/xcuserdata/jgarcia.xcuserdatad/xcschemes/xcschememanagement.plist b/code/iOS/ScriptorSprint3/Pods/Pods.xcodeproj/xcuserdata/jgarcia.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..0afe147 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Pods.xcodeproj/xcuserdata/jgarcia.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,39 @@ + + + + + SchemeUserState + + ISO8601DateFormatterValueTransformer.xcscheme_^#shared#^_ + + orderHint + 1 + + Pods-ScriptorSprint2.xcscheme_^#shared#^_ + + orderHint + 2 + + RKValueTransformers.xcscheme_^#shared#^_ + + orderHint + 4 + + RestKit.xcscheme_^#shared#^_ + + orderHint + 3 + + SOCKit.xcscheme_^#shared#^_ + + orderHint + 5 + + TransitionKit.xcscheme_^#shared#^_ + + orderHint + 6 + + + + diff --git a/code/iOS/ScriptorSprint3/Pods/RKValueTransformers/Code/RKValueTransformers.h b/code/iOS/ScriptorSprint3/Pods/RKValueTransformers/Code/RKValueTransformers.h new file mode 100644 index 0000000..0aa6cee --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RKValueTransformers/Code/RKValueTransformers.h @@ -0,0 +1,373 @@ +// +// RKValueTransformers.h +// RestKit +// +// Created by Blake Watters on 8/18/13. +// Copyright (c) 2013 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import + +/** + Objects wish to perform transformation on values as part of a RestKit object mapping operation much adopt the `RKValueTransforming` protocol. Value transformers must introspect a given input value to determine if they are capable of performing a transformation and if so, perform the transformation and assign the new value to the given pointer to an output value and return `YES` or else construct an error describing the failure and return `NO`. Value transformers may also optionally implement a validation method that enables callers to determine if a given value transformer object is capable of performing a transformation on an input value. + */ +@protocol RKValueTransforming + +@required + +/** + Transforms a given value into a new representation. + + Attempts to perform a transformation of a given value into a new representation and returns a Boolean value indicating if the transformation was successful. Transformers are responsible for introspecting their input values before attempting to perform the transformation. If the transformation cannot be performed, then the transformer must construct an `NSError` object describing the nature of the failure else a warning will be emitted. + + @param inputValue The value to be transformed. + @param outputValue A pointer to an `id` object that will be assigned to the transformed representation. May be assigned to `nil` if that is the result of the transformation. + @param outputValueClass The class of the `outputValue` variable. Specifies the expected type of a successful transformation. May be `nil` to indicate that the type is unknown or unimportant. + @param error A pointer to an `NSError` object that must be assigned to a newly constructed `NSError` object if the transformation cannot be performed. + @return A Boolean value indicating if the transformation was successful. This is used to determine whether another transformer should be given an opportunity to attempt a transformation. + */ +- (BOOL)transformValue:(id)inputValue toValue:(id *)outputValue ofClass:(Class)outputValueClass error:(NSError **)error; + +@optional + +/** + Asks the transformer if it is capable of performing a transformation from a given class into a new representation of another given class. + + This is an optional method that need only be implemented by transformers that are tightly bound to values with specific types. + + @param inputValueClass The `Class` of an input value being inspected. + @param outputValueClass The `Class` of an output value being inspected. + @return `YES` if the receiver can perform a transformation between the given source and destination classes. + */ +- (BOOL)validateTransformationFromClass:(Class)inputValueClass toClass:(Class)outputValueClass; + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + The domain for errors emitted by RKValueTransformers + */ +extern NSString *const RKValueTransformersErrorDomain; + +/** + If multiple errors occur in one operation, they are collected in an array and added with this key to the "top-level error" of the operation + */ +extern NSString *const RKValueTransformersDetailedErrorsKey; + +typedef NS_ENUM(NSUInteger, RKValueTransformationError) { + RKValueTransformationErrorUntransformableInputValue = 3000, // The input value was determined to be unacceptable and no transformation was performed. + RKValueTransformationErrorUnsupportedOutputClass = 3001, // The specified class type for the output value is unsupported and no transformation was performed. + RKValueTransformationErrorTransformationFailed = 3002 // A transformation was attempted, but failed. +}; + +/** + Tests if a given input value is of an expected class and returns a failure if it is not. + + This macro is useful for quickly verifying that a transformer can work with a given input value by checking if the value is an instance of an expected class. On failure, the macro constructs an error describing the class mismatch. + + @param inputValue The input value to test. + @param expectedClass The expected class or array of classes of the input value. + @param error A pointer to an `NSError` object in which to assign a newly constructed error if the test fails. Cannot be `nil`. + */ +#define RKValueTransformerTestInputValueIsKindOfClass(inputValue, expectedClass, error) ({ \ + id expectedArgument = (expectedClass); \ + BOOL success = NO; \ + if ([expectedArgument isKindOfClass:[NSArray class]]) { \ + for (Class supportedClass in expectedArgument) {\ + if ([inputValue isKindOfClass:supportedClass]) { \ + success = YES; \ + break; \ + } \ + } \ + } else { \ + success = [inputValue isKindOfClass:expectedArgument]; \ + } \ + if (! success) { \ + if (error) { \ + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: [NSString stringWithFormat:@"Expected an `inputValue` of type `%@`, but got a `%@`.", expectedArgument, [inputValue class]] };\ + *error = [NSError errorWithDomain:RKValueTransformersErrorDomain code:RKValueTransformationErrorUntransformableInputValue userInfo:userInfo]; \ + } \ + return NO; \ + } \ +}) + +/** + Tests if a given output value class is of an expected class and returns a failure if it is not. + + This macro is useful for quickly verifying that a transformer can work with a given input value by checking if the value is an instance of an expected class. On failure, the macro constructs an error describing the class mismatch. + + @param outputValueClass The input value to test. + @param expectedClass The expected class or array of classes of the input value. + @param error A pointer to an `NSError` object in which to assign a newly constructed error if the test fails. Cannot be `nil`. + */ +#define RKValueTransformerTestOutputValueClassIsSubclassOfClass(outputValueClass, expectedClass, error) ({ \ + BOOL success = NO; \ + id expectedArgument = (expectedClass); \ + if ([expectedArgument isKindOfClass:[NSArray class]]) { \ + for (Class supportedClass in expectedArgument) {\ + if ([outputValueClass isSubclassOfClass:supportedClass]) { \ + success = YES; \ + break; \ + } \ + } \ + } else { \ + success = [outputValueClass isSubclassOfClass:expectedArgument]; \ + } \ + if (! success) { \ + if (error) { \ + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: [NSString stringWithFormat:@"Expected an `outputValueClass` of type `%@`, but got a `%@`.", expectedArgument, outputValueClass] };\ + *error = [NSError errorWithDomain:RKValueTransformersErrorDomain code:RKValueTransformationErrorUnsupportedOutputClass userInfo:userInfo]; \ + } \ + return NO; \ + } \ +}) + +/** + Tests a condition to evaluate the success of an attempted value transformation and returns a failure if it is not true. + + This macro is useful for quickly verifying that an attempted transformation was successful. If the condition is not true, than an error is constructed describing the failure. + + @param condition The condition to test. + @param expectedClass The expected class of the input value. + @param error A pointer to an `NSError` object in which to assign a newly constructed error if the test fails. Cannot be `nil`. + @param ... A string describing what the failure was that occurred. This may be a format string with additional arguments. + */ +#define RKValueTransformerTestTransformation(condition, error, ...) ({ \ +if (! (condition)) { \ + if (error) { \ + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: [NSString stringWithFormat:__VA_ARGS__] };\ + *error = [NSError errorWithDomain:RKValueTransformersErrorDomain code:RKValueTransformationErrorTransformationFailed userInfo:userInfo]; \ + } \ + return NO; \ + } \ +}) + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +@class RKCompoundValueTransformer; + +/** + The `RKValueTransformer` class is an abstract base class for implementing a value transformer that conforms to the `RKValueTransforming` protocol. The class is provided to enable third-party extensions of the value transformer to be implemented through subclassing. The default implementation contains no behavior and will raise an exception if an implementation of `transformValue:toValue:ofClass:error:` is not provided by the subclass. `RKValueTransformer` also exposes accessors for the default value transformer implementations that are provided with the library. + */ +@interface RKValueTransformer : NSObject + +///-------------------------------------- +/// @name Retrieving Default Transformers +///-------------------------------------- + +/** + Returns a transformer that will return the input value if it is already of the desired output class. + */ ++ (instancetype)identityValueTransformer; + +/** + Returns a transformer capable of transforming between `NSString` and `NSURL` representations. + */ ++ (instancetype)stringToURLValueTransformer; + +/** + Returns a transformer capable of transforming between `NSNumber` and `NSString` representations. + */ ++ (instancetype)numberToStringValueTransformer; + +/** + Returns a transformer capable of transforming between `NSArray` and `NSOrderedSet` representations. + */ ++ (instancetype)arrayToOrderedSetValueTransformer; + +/** + Returns a transformer capable of transforming between `NSArray` and `NSSet` representations. + */ ++ (instancetype)arrayToSetValueTransformer; + +/** + Returns a transformer capable of transforming between `NSDecimalNumber` and `NSNumber` representations. + */ ++ (instancetype)decimalNumberToNumberValueTransformer; + +/** + Returns a transformer capable of transforming between `NSDecimalNumber` and `NSString` representations. + */ ++ (instancetype)decimalNumberToStringValueTransformer; + +/** + Returns a transformer capable of transforming from `[NSNull null]` to `nil` representations. + */ ++ (instancetype)nullValueTransformer; + +/** + Returns a transformer capable of transforming between objects that conform to the `NSCoding` protocol and `NSData` representations by using an `NSKeyedArchiver`/`NSKeyedUnarchiver` to serialize as a property list. + */ ++ (instancetype)keyedArchivingValueTransformer; + +/** + Returns a transformer capable of transforming between `NSNumber` or `NSString` and `NSDate` representations by evaluating the input value as a time interval since the UNIX epoch (1 January 1970, GMT). + + The transformation treats numeric values as a `double` in order to provide sub-second accuracy. + */ ++ (instancetype)timeIntervalSince1970ToDateValueTransformer; + +/** + Returns a transformer capable of transforming between `NSDate` and `NSString` representations in which the string encodes date and time information in the ISO 8601 timestamp format. + + Note that this transformer is only capable of handling a fully qualified timestamp string rather than the complete ISO 8601 format. For a more complete implementation of the ISO 8601 standard, see the []() project. + */ ++ (instancetype)iso8601TimestampToDateValueTransformer; + +/** + Returns a transformer capable of transforming any `NSObject` that implements the `stringValue` method into an `NSString` representation. + */ ++ (instancetype)stringValueTransformer; + +/** + Returns a transformer capable of enclosing any singular `NSObject` into a collection type such as `NSArray`, `NSSet`, or `NSOrderedSet` (and its mutable descendents). + */ ++ (instancetype)objectToCollectionValueTransformer; + +/** + Returns a transformer capable of transforming any object that conforms to the `NSCopying` protocol into a dictionary representation keyed by the transformed object. + */ ++ (instancetype)keyOfDictionaryValueTransformer; + +/** + Returns a transformer capable of transforming any object conforming to the `NSMutableCopying` protocol into a mutable representation of itself. + */ ++ (instancetype)mutableValueTransformer; + +/** + Returns the singleton instance of the default value transformer. The default transformer is a compound transformer that includes all the individual value transformers implemented on the `RKValueTransformer` base class as well as `NSDateFormatter` instances for the following date format strings: + + * MM/dd/yyyy + * yyyy-MM-dd + + All date formatters are configured to the use `en_US_POSIX` locale and the UTC time zone. + */ ++ (RKCompoundValueTransformer *)defaultValueTransformer; + +/** + Sets the default value transformer to a new instance. Setting the default transformer to `nil` will result in a new singleton instance with the default configuration being rebuilt. + + @param compoundValueTransformer The new default compound transformer. Passing `nil` will reset the transformer to the default configuration. + */ ++ (void)setDefaultValueTransformer:(RKCompoundValueTransformer *)compoundValueTransformer; + +@end + +/** + The `RKBlockValueTransformer` class provides a concrete implementation of the `RKValueTransforming` protocol using blocks to provide the implementation of the transformer. + */ +@interface RKBlockValueTransformer : RKValueTransformer + +///----------------------------------- +/// @name Creating a Block Transformer +///----------------------------------- + +/** + Creates and returns a new value transformer with the given validation and transformation blocks. The blocks are used to provide the implementation of the corresponding methods from the `RKValueTransforming` protocol. + + @param validationBlock A block that evaluates whether the transformer can perform a transformation between a given pair of input and output classes. + */ ++ (instancetype)valueTransformerWithValidationBlock:(BOOL (^)(Class inputValueClass, Class outputValueClass))validationBlock + transformationBlock:(BOOL (^)(id inputValue, id *outputValue, Class outputClass, NSError **error))transformationBlock; + +/** + An optional name for the transformer. + */ +@property (nonatomic, copy) NSString *name; + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + The `RKCompoundValueTransformer` class provides an implementation of the `RKValueTransforming` protocol in which a collection of underlying value transformers are assembled into a composite value transformer. Compound values transformers are ordered collections in which each underlying transformer is given the opportunity to transform a value in the order in which it appears within the receiver. Compound transformers are copyable, enumerable and support subscripted access to the underlying value transformers. + */ +@interface RKCompoundValueTransformer : NSObject + +///-------------------------------------- +/// @name Creating a Compound Transformer +///-------------------------------------- + +/** + Creates and returns a new compound transformer from an array of individual value transformers. + + @param valueTransformers An array containining an arbitrary number of objects that conform to the `RKValueTransforming` protocol. Cannot be `nil`. + @return A new compound transformer initialized with the given collection of underlying transformers. + @raises NSInvalidArgumentException Raised if `valueTransformers` is `nil` or any objects in the given collection do not conform to the `RKValueTransforming` protocol. + */ ++ (instancetype)compoundValueTransformerWithValueTransformers:(NSArray *)valueTransformers; + +///---------------------------------------------------- +/// @name Manipulating the Value Transformer Collection +///---------------------------------------------------- + +/** + Adds the given value transformer to the end of the receiver's transformer collection. + + Adding a transformer appends it to the end of the collection meaning that it will be consulted after all other transformers. + + @param valueTransformer The transformer to add to the receiver. + */ +- (void)addValueTransformer:(id)valueTransformer; + +/** + Removes the given value transformer from the receiver. + + @param valueTransformer The transformer to remove from the receiver. + */ +- (void)removeValueTransformer:(id)valueTransformer; + +/** + Inserts the given value transformer into the receiver at a specific position. If the transformer already exists within the receiver then it is moved to the specified position. + + @param valueTransformer The value transformer to be added to (or moved within) the receiver. + @param index The position at which the transformer should be consulted within the collection. An index of 0 would mean that the transformer is consulted before all other transformers. + */ +- (void)insertValueTransformer:(id)valueTransformer atIndex:(NSUInteger)index; + +/** + Returns a count of the number of value transformers in the receiver. + + @return An integer specifying the number of transformers within the receiver. + */ +- (NSUInteger)numberOfValueTransformers; + +///------------------------------------------ +/// @name Retrieving Constituent Transformers +///------------------------------------------ + +/** + Returns a new array containing a subset of the value transformers contained within the receiver that are valid for a transformation between a representation with a given input class and a given output class. + + Whether or not a given transformer is returned is determined by the invocation of the optional `RKValueTransforming` method `validateTransformationFromClass:toClass:`. Any transformer that does not respond to `validateTransformationFromClass:toClass:` will be included within the returned array. The sequencing of the transformers within the returned array is determined by their position within the receiver. + + If you wish to obtain an array containing all of the transformers contained within the receiver then pass `Nil` for both the `inputValueClass` and `outputValueClass` arguments. + + @param inputValueClass The class of input values that you wish to retrieve the transformers for. Can only be `Nil` if `outputValueClass` is also `Nil`. + @param outputValueClass The class of output values that you wish to retrieve the transformers for. Can only be `Nil` if `inputValueClass` is also `Nil`. + @raises NSInvalidArgumentException Raised if `Nil` is given exclusively for `inputValueClass` or `outputValueClass`. + */ +- (NSArray *)valueTransformersForTransformingFromClass:(Class)inputValueClass toClass:(Class)outputValueClass; + +@end + +// Adopts `RKValueTransforming` to provide transformation from `NSString` <-> `NSNumber` +@interface NSNumberFormatter (RKValueTransformers) +@end + +// Adopts `RKValueTransforming` to provide transformation from `NSString` <-> `NSDate` +@interface NSDateFormatter (RKValueTransformers) +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RKValueTransformers/Code/RKValueTransformers.m b/code/iOS/ScriptorSprint3/Pods/RKValueTransformers/Code/RKValueTransformers.m new file mode 100644 index 0000000..3dcb0de --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RKValueTransformers/Code/RKValueTransformers.m @@ -0,0 +1,912 @@ +// +// RKValueTransformers.m +// RestKit +// +// Created by Blake Watters on 8/18/13. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include +#include +#import "RKValueTransformers.h" + +NSString *const RKValueTransformersErrorDomain = @"org.restkit.RKValueTransformers.ErrorDomain"; +NSString *const RKValueTransformersDetailedErrorsKey = @"detailedErrors"; + +static BOOL RKVTClassIsCollection(Class aClass) +{ + return (aClass && ([aClass isSubclassOfClass:[NSSet class]] || + [aClass isSubclassOfClass:[NSArray class]] || + [aClass isSubclassOfClass:[NSOrderedSet class]])); +} + +@implementation RKValueTransformer + +- (id)init +{ + if ([self class] == [RKValueTransformer class]) { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"`%@` is abstract and cannot be directly instantiated. " + @"Instantiate a subclass implementation instead.", + NSStringFromClass([self class])] + userInfo:nil]; + } + return [super init]; +} + +#pragma mark RKValueTransforming + +- (BOOL)transformValue:(id)inputValue toValue:(__autoreleasing id *)outputValue ofClass:(Class)outputValueClass error:(NSError *__autoreleasing *)error +{ + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"`RKValueTransformer` subclasses must provide a concrete implementation of `%@`.", + NSStringFromSelector(_cmd)] + userInfo:nil]; +} + +#pragma mark Default Transformers + ++ (instancetype)singletonValueTransformer:(RKBlockValueTransformer * __strong *)valueTransformer + name:(NSString *)name + onceToken:(dispatch_once_t *)onceToken + validationBlock:(BOOL (^)(Class sourceClass, Class destinationClass))validationBlock + transformationBlock:(BOOL (^)(id inputValue, id *outputValue, Class outputValueClass, NSError **error))transformationBlock +{ + dispatch_once(onceToken, ^{ + RKBlockValueTransformer *transformer = [RKBlockValueTransformer valueTransformerWithValidationBlock:validationBlock transformationBlock:transformationBlock]; + transformer.name = name; + *valueTransformer = transformer; + }); + return *valueTransformer; +} + ++ (instancetype)identityValueTransformer +{ + static dispatch_once_t onceToken; + static RKBlockValueTransformer *valueTransformer; + return [self singletonValueTransformer:&valueTransformer name:NSStringFromSelector(_cmd) onceToken:&onceToken validationBlock:nil transformationBlock:^BOOL(id inputValue, __autoreleasing id *outputValue, __unsafe_unretained Class outputValueClass, NSError *__autoreleasing *error) { + RKValueTransformerTestTransformation([inputValue isKindOfClass:outputValueClass], error, @"The given value is not already an instance of '%@'", outputValueClass); + *outputValue = inputValue; + return YES; + }]; +} + ++ (instancetype)stringToURLValueTransformer +{ + static dispatch_once_t onceToken; + static RKBlockValueTransformer *valueTransformer; + return [self singletonValueTransformer:&valueTransformer name:NSStringFromSelector(_cmd) onceToken:&onceToken validationBlock:^BOOL(__unsafe_unretained Class sourceClass, __unsafe_unretained Class destinationClass) { + return (([sourceClass isSubclassOfClass:[NSString class]] && [destinationClass isSubclassOfClass:[NSURL class]]) || + ([sourceClass isSubclassOfClass:[NSURL class]] && [destinationClass isSubclassOfClass:[NSString class]])); + } transformationBlock:^BOOL(id inputValue, __autoreleasing id *outputValue, Class outputValueClass, NSError *__autoreleasing *error) { + static dispatch_once_t onceToken; + static NSArray *validClasses; + dispatch_once(&onceToken, ^{ + validClasses = @[ [NSString class], [NSURL class]]; + }); + RKValueTransformerTestInputValueIsKindOfClass(inputValue, validClasses, error); + RKValueTransformerTestOutputValueClassIsSubclassOfClass(outputValueClass, validClasses, error); + if ([inputValue isKindOfClass:[NSString class]]) { + NSURL *URL = [NSURL URLWithString:inputValue]; + RKValueTransformerTestTransformation(URL != nil, error, @"Failed transformation of '%@' to URL: the string is malformed and cannot be transformed to an `NSURL` representation.", inputValue); + *outputValue = URL; + } else if ([inputValue isKindOfClass:[NSURL class]]) { + *outputValue = [(NSURL *)inputValue absoluteString]; + } + return YES; + }]; +} + ++ (instancetype)numberToStringValueTransformer +{ + static dispatch_once_t onceToken; + static RKBlockValueTransformer *valueTransformer; + + return [self singletonValueTransformer:&valueTransformer name:NSStringFromSelector(_cmd) onceToken:&onceToken validationBlock:^BOOL(__unsafe_unretained Class sourceClass, __unsafe_unretained Class destinationClass) { + return (([sourceClass isSubclassOfClass:[NSNumber class]] && [destinationClass isSubclassOfClass:[NSString class]]) || + ([sourceClass isSubclassOfClass:[NSString class]] && [destinationClass isSubclassOfClass:[NSNumber class]])); + } transformationBlock:^BOOL(id inputValue, __autoreleasing id *outputValue, Class outputValueClass, NSError *__autoreleasing *error) { + static dispatch_once_t onceToken; + static NSArray *validClasses; + static NSSet *trueStrings; + static NSSet *booleanStrings; + static Class cfBooleanClass1; + static Class cfBooleanClass2; + dispatch_once(&onceToken, ^{ + validClasses = @[ [NSNumber class], [NSString class] ]; + trueStrings = [NSSet setWithObjects:@"true", @"t", @"yes", @"y", nil]; + booleanStrings = [trueStrings setByAddingObjectsFromSet:[NSSet setWithObjects:@"false", @"f", @"no", @"n", nil]]; + cfBooleanClass1 = NSClassFromString(@"__NSCFBoolean"); + cfBooleanClass2 = NSClassFromString(@"NSCFBoolean"); + }); + + RKValueTransformerTestInputValueIsKindOfClass(inputValue, validClasses, error); + RKValueTransformerTestOutputValueClassIsSubclassOfClass(outputValueClass, validClasses, error); + if ([inputValue isKindOfClass:[NSString class]]) { + NSString *lowercasedString = [inputValue lowercaseString]; + if ([booleanStrings containsObject:lowercasedString]) { + // Handle booleans encoded as Strings + *outputValue = [NSNumber numberWithBool:[trueStrings containsObject:lowercasedString]]; + } else if ([lowercasedString rangeOfString:@"." options:NSLiteralSearch].location != NSNotFound) { + // String -> Floating Point Number + // Only use floating point if needed to avoid losing precision on large integers + *outputValue = [NSNumber numberWithDouble:[lowercasedString doubleValue]]; + } else { + // String -> Signed Integer + *outputValue = [NSNumber numberWithLongLong:[lowercasedString longLongValue]]; + } + } else if ([inputValue isKindOfClass:[NSNumber class]]) { + if (cfBooleanClass1 && [inputValue isKindOfClass:cfBooleanClass1]) { + *outputValue = [inputValue boolValue] ? @"true" : @"false"; + } else if (cfBooleanClass2 && [inputValue isKindOfClass:cfBooleanClass2]) { + *outputValue = [inputValue boolValue] ? @"true" : @"false"; + } else { + *outputValue = [inputValue stringValue]; + } + } + return YES; + }]; +} + ++ (instancetype)numberToBooleanValueTransformer { + static dispatch_once_t onceToken; + static RKBlockValueTransformer *valueTransformer; + + static dispatch_once_t booleanClassOnceToken; + static Class cfBooleanClass1; + static Class cfBooleanClass2; + + dispatch_once(&booleanClassOnceToken, ^{ + cfBooleanClass1 = NSClassFromString(@"__NSCFBoolean"); + cfBooleanClass2 = NSClassFromString(@"NSCFBoolean"); + }); + + return [self singletonValueTransformer:&valueTransformer name:NSStringFromSelector(_cmd) onceToken:&onceToken validationBlock:^BOOL(__unsafe_unretained Class sourceClass, __unsafe_unretained Class destinationClass) { + return (([sourceClass isSubclassOfClass:[NSNumber class]] && [destinationClass isSubclassOfClass:[cfBooleanClass1 class]]) || + ([sourceClass isSubclassOfClass:[NSNumber class]] && [destinationClass isSubclassOfClass:[cfBooleanClass2 class]])); + } transformationBlock:^BOOL(id inputValue, __autoreleasing id *outputValue, Class outputValueClass, NSError *__autoreleasing *error) { + + RKValueTransformerTestInputValueIsKindOfClass(inputValue, @[[NSNumber class]], error); + RKValueTransformerTestOutputValueClassIsSubclassOfClass(outputValueClass, @[[NSNumber class]], error); + + *outputValue = inputValue; + + return YES; + }]; +} + ++ (instancetype)arrayToOrderedSetValueTransformer +{ + static dispatch_once_t onceToken; + static RKBlockValueTransformer *valueTransformer; + + return [self singletonValueTransformer:&valueTransformer name:NSStringFromSelector(_cmd) onceToken:&onceToken validationBlock:^BOOL(__unsafe_unretained Class sourceClass, __unsafe_unretained Class destinationClass) { + return (([sourceClass isSubclassOfClass:[NSArray class]] && [destinationClass isSubclassOfClass:[NSOrderedSet class]]) || + ([sourceClass isSubclassOfClass:[NSOrderedSet class]] && [destinationClass isSubclassOfClass:[NSArray class]])); + } transformationBlock:^BOOL(id inputValue, __autoreleasing id *outputValue, Class outputValueClass, NSError *__autoreleasing *error) { + static dispatch_once_t onceToken; + static NSArray *validClasses; + dispatch_once(&onceToken, ^{ + validClasses = @[ [NSArray class], [NSOrderedSet class]]; + }); + RKValueTransformerTestInputValueIsKindOfClass(inputValue, validClasses, error); + RKValueTransformerTestOutputValueClassIsSubclassOfClass(outputValueClass, validClasses, error); + if ([inputValue isKindOfClass:[NSArray class]]) { + *outputValue = [NSOrderedSet orderedSetWithArray:inputValue]; + } else if ([inputValue isKindOfClass:[NSOrderedSet class]]) { + *outputValue = [inputValue array]; + } + return YES; + }]; +} + ++ (instancetype)arrayToSetValueTransformer +{ + static dispatch_once_t onceToken; + static RKBlockValueTransformer *valueTransformer; + + return [self singletonValueTransformer:&valueTransformer name:NSStringFromSelector(_cmd) onceToken:&onceToken validationBlock:^BOOL(__unsafe_unretained Class sourceClass, __unsafe_unretained Class destinationClass) { + return (([sourceClass isSubclassOfClass:[NSArray class]] && [destinationClass isSubclassOfClass:[NSSet class]]) || + ([sourceClass isSubclassOfClass:[NSSet class]] && [destinationClass isSubclassOfClass:[NSArray class]])); + } transformationBlock:^BOOL(id inputValue, __autoreleasing id *outputValue, Class outputValueClass, NSError *__autoreleasing *error) { + static dispatch_once_t onceToken; + static NSArray *validClasses; + dispatch_once(&onceToken, ^{ + validClasses = @[ [NSSet class], [NSArray class]]; + }); + RKValueTransformerTestInputValueIsKindOfClass(inputValue, validClasses, error); + RKValueTransformerTestOutputValueClassIsSubclassOfClass(outputValueClass, validClasses, error); + if ([inputValue isKindOfClass:[NSArray class]]) { + if ([outputValueClass isSubclassOfClass:[NSMutableSet class]]) *outputValue = [NSMutableSet setWithArray:inputValue]; + else *outputValue = [NSSet setWithArray:inputValue]; + } else if ([inputValue isKindOfClass:[NSSet class]]) { + if ([outputValueClass isSubclassOfClass:[NSMutableArray class]]) *outputValue = [[inputValue allObjects] mutableCopy]; + else *outputValue = [inputValue allObjects]; + } + return YES; + }]; +} + ++ (instancetype)decimalNumberToStringValueTransformer +{ + static dispatch_once_t onceToken; + static RKBlockValueTransformer *valueTransformer; + return [self singletonValueTransformer:&valueTransformer name:NSStringFromSelector(_cmd) onceToken:&onceToken validationBlock:^BOOL(__unsafe_unretained Class sourceClass, __unsafe_unretained Class destinationClass) { + return (([sourceClass isSubclassOfClass:[NSDecimalNumber class]] && [destinationClass isSubclassOfClass:[NSString class]]) || + ([sourceClass isSubclassOfClass:[NSString class]] && [destinationClass isSubclassOfClass:[NSDecimalNumber class]])); + } transformationBlock:^BOOL(id inputValue, __autoreleasing id *outputValue, Class outputValueClass, NSError *__autoreleasing *error) { + static dispatch_once_t onceToken; + static NSArray *validClasses; + dispatch_once(&onceToken, ^{ + validClasses = @[ [NSString class], [NSDecimalNumber class]]; + }); + RKValueTransformerTestInputValueIsKindOfClass(inputValue, validClasses, error); + RKValueTransformerTestOutputValueClassIsSubclassOfClass(outputValueClass, validClasses, error); + if ([inputValue isKindOfClass:[NSString class]]) { + NSDecimalNumber *decimalNumber = [NSDecimalNumber decimalNumberWithString:inputValue]; + RKValueTransformerTestTransformation(! [decimalNumber isEqual:[NSDecimalNumber notANumber]], error, @"Failed transformation of '%@' to `NSDecimalNumber`: the input string was transformed into Not a Number (NaN) value.", inputValue); + *outputValue = decimalNumber; + } else if ([inputValue isKindOfClass:[NSDecimalNumber class]]) { + *outputValue = [inputValue stringValue]; + } + return YES; + }]; +} + ++ (instancetype)decimalNumberToNumberValueTransformer +{ + static dispatch_once_t onceToken; + static RKBlockValueTransformer *valueTransformer; + return [self singletonValueTransformer:&valueTransformer name:NSStringFromSelector(_cmd) onceToken:&onceToken validationBlock:^BOOL(__unsafe_unretained Class sourceClass, __unsafe_unretained Class destinationClass) { + return (([sourceClass isSubclassOfClass:[NSDecimalNumber class]] && [destinationClass isSubclassOfClass:[NSNumber class]]) || + ([sourceClass isSubclassOfClass:[NSNumber class]] && [destinationClass isSubclassOfClass:[NSDecimalNumber class]])); + } transformationBlock:^BOOL(id inputValue, __autoreleasing id *outputValue, Class outputValueClass, NSError *__autoreleasing *error) { + static dispatch_once_t onceToken; + static NSArray *validClasses; + dispatch_once(&onceToken, ^{ + validClasses = @[ [NSNumber class], [NSDecimalNumber class]]; + }); + RKValueTransformerTestInputValueIsKindOfClass(inputValue, validClasses, error); + RKValueTransformerTestOutputValueClassIsSubclassOfClass(outputValueClass, validClasses, error); + if ([inputValue isKindOfClass:[NSNumber class]]) { + *outputValue = [NSDecimalNumber decimalNumberWithDecimal:[inputValue decimalValue]]; + } else if ([inputValue isKindOfClass:[NSDecimalNumber class]]) { + *outputValue = inputValue; + } + return YES; + }]; +} + ++ (instancetype)nullValueTransformer +{ + static dispatch_once_t onceToken; + static RKBlockValueTransformer *valueTransformer; + return [self singletonValueTransformer:&valueTransformer name:NSStringFromSelector(_cmd) onceToken:&onceToken validationBlock:nil transformationBlock:^BOOL(id inputValue, __autoreleasing id *outputValue, Class outputValueClass, NSError *__autoreleasing *error) { + RKValueTransformerTestInputValueIsKindOfClass(inputValue, [NSNull class], error); + *outputValue = nil; + return YES; + }]; +} + ++ (instancetype)keyedArchivingValueTransformer +{ + static dispatch_once_t onceToken; + static RKBlockValueTransformer *valueTransformer; + return [self singletonValueTransformer:&valueTransformer name:NSStringFromSelector(_cmd) onceToken:&onceToken validationBlock:^BOOL(__unsafe_unretained Class sourceClass, __unsafe_unretained Class destinationClass) { + return (([destinationClass isSubclassOfClass:[NSData class]] && [sourceClass conformsToProtocol:@protocol(NSCoding)]) || + ([sourceClass isSubclassOfClass:[NSData class]] && [destinationClass conformsToProtocol:@protocol(NSCoding)])); + } transformationBlock:^BOOL(id inputValue, __autoreleasing id *outputValue, Class outputValueClass, NSError *__autoreleasing *error) { + if ([inputValue isKindOfClass:[NSData class]]) { + id unarchivedValue = nil; + @try { + unarchivedValue = [NSKeyedUnarchiver unarchiveObjectWithData:inputValue]; + } + @catch (NSException *exception) { + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: [NSString stringWithFormat:@"An `%@` exception was encountered while attempting to unarchive the given inputValue.", [exception name]], @"exception": exception }; + if (error) *error = [NSError errorWithDomain:RKValueTransformersErrorDomain code:RKValueTransformationErrorTransformationFailed userInfo:userInfo]; + return NO; + } + if (! [unarchivedValue isKindOfClass:outputValueClass]) { + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: [NSString stringWithFormat:@"Expected an `outputValueClass` of type `%@`, but the unarchived object is a `%@`.", outputValueClass, [unarchivedValue class]] }; + if (error) *error = [NSError errorWithDomain:RKValueTransformersErrorDomain code:RKValueTransformationErrorTransformationFailed userInfo:userInfo]; + return NO; + } + *outputValue = unarchivedValue; + } else if ([inputValue conformsToProtocol:@protocol(NSCoding)]) { + RKValueTransformerTestOutputValueClassIsSubclassOfClass(outputValueClass, [NSData class], error); + *outputValue = [NSKeyedArchiver archivedDataWithRootObject:inputValue]; + } else { + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: [NSString stringWithFormat:@"Expected an `inputValue` of type `NSData` or conforming to `NSCoding`, but got a `%@` which does not satisfy these expectation.", [inputValue class]] }; + if (error) *error = [NSError errorWithDomain:RKValueTransformersErrorDomain code:RKValueTransformationErrorUntransformableInputValue userInfo:userInfo]; + return NO; + } + return YES; + }]; +} + ++ (instancetype)timeIntervalSince1970ToDateValueTransformer +{ + static dispatch_once_t onceToken; + static RKBlockValueTransformer *valueTransformer; + return [self singletonValueTransformer:&valueTransformer name:NSStringFromSelector(_cmd) onceToken:&onceToken validationBlock:^BOOL(__unsafe_unretained Class sourceClass, __unsafe_unretained Class destinationClass) { + return ((([sourceClass isSubclassOfClass:[NSString class]] || [sourceClass isSubclassOfClass:[NSNumber class]]) && [destinationClass isSubclassOfClass:[NSDate class]]) || + ([sourceClass isSubclassOfClass:[NSDate class]] && ([destinationClass isSubclassOfClass:[NSNumber class]] || [destinationClass isSubclassOfClass:[NSString class]]))); + } transformationBlock:^BOOL(id inputValue, __autoreleasing id *outputValue, __unsafe_unretained Class outputValueClass, NSError *__autoreleasing *error) { + static dispatch_once_t onceToken; + static NSArray *validClasses; + static NSNumberFormatter *numberFormatter; + dispatch_once(&onceToken, ^{ + validClasses = @[ [NSNumber class], [NSString class], [NSDate class] ]; + numberFormatter = [NSNumberFormatter new]; + numberFormatter.numberStyle = NSNumberFormatterDecimalStyle; + }); + RKValueTransformerTestInputValueIsKindOfClass(inputValue, validClasses, error); + RKValueTransformerTestOutputValueClassIsSubclassOfClass(outputValueClass, validClasses, error); + if ([outputValueClass isSubclassOfClass:[NSDate class]]) { + if ([inputValue isKindOfClass:[NSNumber class]]) { + *outputValue = [NSDate dateWithTimeIntervalSince1970:[inputValue doubleValue]]; + } else if ([inputValue isKindOfClass:[NSString class]]) { + if ([[inputValue stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0) { + *outputValue = nil; + return YES; + } + NSString *errorDescription = nil; + NSNumber *formattedNumber; + BOOL success = [numberFormatter getObjectValue:&formattedNumber forString:inputValue errorDescription:&errorDescription]; + RKValueTransformerTestTransformation(success, error, @"%@", errorDescription); + *outputValue = [NSDate dateWithTimeIntervalSince1970:[formattedNumber doubleValue]]; + } + } else if ([outputValueClass isSubclassOfClass:[NSNumber class]]) { + *outputValue = @([inputValue timeIntervalSince1970]); + } else if ([outputValueClass isSubclassOfClass:[NSString class]]) { + *outputValue = [numberFormatter stringForObjectValue:@([inputValue timeIntervalSince1970])]; + } + return YES; + }]; +} + ++ (instancetype)iso8601TimestampToDateValueTransformer +{ + static dispatch_once_t onceToken; + static RKBlockValueTransformer *valueTransformer; + return [self singletonValueTransformer:&valueTransformer name:NSStringFromSelector(_cmd) onceToken:&onceToken validationBlock:^BOOL(__unsafe_unretained Class sourceClass, __unsafe_unretained Class destinationClass) { + return (([sourceClass isSubclassOfClass:[NSString class]] && [destinationClass isSubclassOfClass:[NSDate class]]) || + ([sourceClass isSubclassOfClass:[NSDate class]] && [destinationClass isSubclassOfClass:[NSString class]])); + } transformationBlock:^BOOL(id inputValue, __autoreleasing id *outputValue, __unsafe_unretained Class outputValueClass, NSError *__autoreleasing *error) { + static dispatch_once_t onceToken; + static NSArray *validClasses; + dispatch_once(&onceToken, ^{ + validClasses = @[ [NSString class], [NSDate class] ]; + }); + RKValueTransformerTestInputValueIsKindOfClass(inputValue, validClasses, error); + RKValueTransformerTestOutputValueClassIsSubclassOfClass(outputValueClass, validClasses, error); + if ([outputValueClass isSubclassOfClass:[NSDate class]]) { + static unsigned int const ISO_8601_MAX_LENGTH = 29; + + if ([(NSString *)inputValue length] == 0) { + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: [NSString stringWithFormat:@"Cannot transform a zero length string"] }; + if (error) *error = [NSError errorWithDomain:RKValueTransformersErrorDomain code:RKValueTransformationErrorUntransformableInputValue userInfo:userInfo]; + return NO; + } + + static NSRegularExpression *validISO8601RegularExpression = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSError *error = nil; + static const char * REGEX_ISO8601_TIMESTAMP = + "\\A(\\d{4})-(\\d{2})-(\\d{2})[T\\s](\\d{2}):(\\d{2}):(\\d{2})" // Mandatory - YYYY-MM-DD(T|\s)hh:mm:ss + "(?:" + "[.](\\d{1,6})" // Optional - .nnnnnn + ")?" + "(?:" + "([+-])(\\d{2}):?(\\d{2})|Z" // Optional -[+-]hh:?mm or Z + ")?\\z"; + NSString *regexString = [[NSString alloc] initWithUTF8String:REGEX_ISO8601_TIMESTAMP]; + validISO8601RegularExpression = [NSRegularExpression regularExpressionWithPattern:regexString + options:NSRegularExpressionCaseInsensitive + error:&error]; + + if (! validISO8601RegularExpression) [NSException raise:NSInternalInconsistencyException format:@"The ISO 8601 validation regex failed to parse: %@", error]; + }); + + if (! [validISO8601RegularExpression numberOfMatchesInString:(NSString *)inputValue options:0 range:NSMakeRange(0, [inputValue length])]) { + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: [NSString stringWithFormat:@"Input value is not a valid ISO 8601 string: '%@'", inputValue] }; + if (error) *error = [NSError errorWithDomain:RKValueTransformersErrorDomain code:RKValueTransformationErrorUntransformableInputValue userInfo:userInfo]; + return NO; + } + + /* Strip milliseconds prior to parsing */ + double milliseconds = 0.f; + if (19 < [inputValue length] && ([inputValue characterAtIndex:19] == '.' || [inputValue characterAtIndex:19] == ':')) { + NSMutableString *newInputString = [NSMutableString stringWithString:[inputValue substringToIndex:19]]; + NSMutableString *millisecondsString = [NSMutableString new]; + + NSUInteger index = 20; + for (; index < [inputValue length]; index++) + { + unichar digit = [inputValue characterAtIndex:index]; + if(digit >= '0' && digit <= '9') + [millisecondsString appendString:[NSString stringWithFormat:@"%C", digit]]; + else + break; + } + + if (index != 20 && index < [inputValue length]) + [newInputString appendString:[inputValue substringFromIndex:index]]; + + inputValue = [NSString stringWithString:newInputString]; + milliseconds = [millisecondsString doubleValue] / pow(10, millisecondsString.length); + } + + const char *constSource = [(NSString *)inputValue cStringUsingEncoding:NSUTF8StringEncoding]; + size_t length = strlen(constSource); + + char source[ISO_8601_MAX_LENGTH]; + memcpy(source, constSource, sizeof (source)); + if (constSource[10] != 'T') + source[10] = 'T'; + + char destination[ISO_8601_MAX_LENGTH]; + if (length == 19) { + memcpy(destination, source, length); + strncpy(destination + length, "+0000\0", 6); + }else if (length == 20 && source[length - 1] == 'Z') { + memcpy(destination, source, length - 1); + strncpy(destination + length - 1, "+0000\0", 6); + } else { + memcpy(destination, source, sizeof (destination)); + if (length == 25 && source[22] == ':') { + destination[22] = destination[23]; + destination[23] = destination[24]; + destination[24] = '\0'; + } + } + + struct tm time = { + .tm_isdst = -1, + }; + + strptime_l(destination, "%FT%T%z", &time, NULL); + + time_t timeIntervalSince1970 = mktime(&time); + RKValueTransformerTestTransformation(timeIntervalSince1970 != -1, error, @"Failed transformation to date representation: time range is beyond the bounds supported by mktime"); + *outputValue = [NSDate dateWithTimeIntervalSince1970:((double)timeIntervalSince1970 + milliseconds)]; + } else if ([outputValueClass isSubclassOfClass:[NSString class]]) { + static NSDateFormatter *iso8601DateFormatter = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + iso8601DateFormatter = [[NSDateFormatter alloc] init]; + [iso8601DateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"]; + [iso8601DateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; + [iso8601DateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]]; + }); + *outputValue = [iso8601DateFormatter stringFromDate:(NSDate *)inputValue]; + } + return YES; + }]; +} + ++ (instancetype)stringValueTransformer +{ + static dispatch_once_t onceToken; + static RKBlockValueTransformer *valueTransformer; + return [self singletonValueTransformer:&valueTransformer name:NSStringFromSelector(_cmd) onceToken:&onceToken validationBlock:^BOOL(__unsafe_unretained Class sourceClass, __unsafe_unretained Class destinationClass) { + return ([sourceClass instancesRespondToSelector:@selector(stringValue)] && [destinationClass isSubclassOfClass:[NSString class]]); + } transformationBlock:^BOOL(id inputValue, __autoreleasing id *outputValue, Class outputValueClass, NSError *__autoreleasing *error) { + if (! [inputValue respondsToSelector:@selector(stringValue)]) { + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: @"Expected an `inputValue` that responds to `stringValue`, but it does not." }; + if (error) *error = [NSError errorWithDomain:RKValueTransformersErrorDomain code:RKValueTransformationErrorUntransformableInputValue userInfo:userInfo]; + return NO; + } + RKValueTransformerTestOutputValueClassIsSubclassOfClass(outputValueClass, [NSString class], error); + *outputValue = [inputValue stringValue]; + return YES; + }]; +} + ++ (instancetype)objectToCollectionValueTransformer +{ + static dispatch_once_t onceToken; + static RKBlockValueTransformer *valueTransformer; + return [self singletonValueTransformer:&valueTransformer name:NSStringFromSelector(_cmd) onceToken:&onceToken validationBlock:^BOOL(__unsafe_unretained Class sourceClass, __unsafe_unretained Class destinationClass) { + return (!RKVTClassIsCollection(sourceClass) && RKVTClassIsCollection(destinationClass)); + } transformationBlock:^BOOL(id inputValue, __autoreleasing id *outputValue, Class outputValueClass, NSError *__autoreleasing *error) { + if (RKVTClassIsCollection([inputValue class])) { + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: [NSString stringWithFormat:@"Expected an `inputValue` that is not a collection, but got a `%@`.", [inputValue class]] }; + if (error) *error = [NSError errorWithDomain:RKValueTransformersErrorDomain code:RKValueTransformationErrorUntransformableInputValue userInfo:userInfo]; + return NO; + } + static dispatch_once_t onceToken; + static NSArray *validClasses; + dispatch_once(&onceToken, ^{ + validClasses = @[ [NSArray class], [NSSet class], [NSOrderedSet class]]; + }); + RKValueTransformerTestOutputValueClassIsSubclassOfClass(outputValueClass, validClasses, error); + if ([outputValueClass isSubclassOfClass:[NSMutableArray class]]) *outputValue = [NSMutableArray arrayWithObject:inputValue]; + else if ([outputValueClass isSubclassOfClass:[NSMutableSet class]]) *outputValue = [NSMutableSet setWithObject:inputValue]; + else if ([outputValueClass isSubclassOfClass:[NSMutableOrderedSet class]]) *outputValue = [NSMutableOrderedSet orderedSetWithObject:inputValue]; + else if ([outputValueClass isSubclassOfClass:[NSArray class]]) *outputValue = @[ inputValue ]; + else if ([outputValueClass isSubclassOfClass:[NSSet class]]) *outputValue = [NSSet setWithObject:inputValue]; + else if ([outputValueClass isSubclassOfClass:[NSOrderedSet class]]) *outputValue = [NSOrderedSet orderedSetWithObject:inputValue]; + RKValueTransformerTestTransformation(*outputValue, error, @"Failed to transform value into collection %@", outputValueClass); + return YES; + }]; +} + ++ (instancetype)mutableValueTransformer +{ + static dispatch_once_t classesOnceToken; + static NSArray *mutableClasses; + dispatch_once(&classesOnceToken, ^{ + mutableClasses = @[ [NSMutableArray class], [NSMutableDictionary class], [NSMutableString class], [NSMutableSet class], [NSMutableOrderedSet class], [NSMutableData class], [NSMutableIndexSet class], [NSMutableString class], [NSMutableAttributedString class] ]; + }); + + static dispatch_once_t onceToken; + static RKBlockValueTransformer *valueTransformer; + return [self singletonValueTransformer:&valueTransformer name:NSStringFromSelector(_cmd) onceToken:&onceToken validationBlock:^BOOL(__unsafe_unretained Class sourceClass, __unsafe_unretained Class destinationClass) { + /** + NOTE: Because of class clusters in Foundation you cannot make any assumptions about mutability based on classes. For example, given `__NSArrayI` (immutable array) and a destination class of `NSMutableArray`, `isSubClassOfClass:` will not evaluate to `YES`. If you want a mutable result, you need to invoke `mutableCopy`. + */ + return [sourceClass conformsToProtocol:@protocol(NSMutableCopying)] && [mutableClasses containsObject:destinationClass]; + } transformationBlock:^BOOL(id inputValue, __autoreleasing id *outputValue, __unsafe_unretained Class outputValueClass, NSError *__autoreleasing *error) { + if (! [inputValue conformsToProtocol:@protocol(NSMutableCopying)]) { + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: [NSString stringWithFormat:@"Expected an `inputValue` that conforms to `NSMutableCopying`, but `%@` objects do not.", [inputValue class]] }; + if (error) *error = [NSError errorWithDomain:RKValueTransformersErrorDomain code:RKValueTransformationErrorUntransformableInputValue userInfo:userInfo]; + return NO; + } + RKValueTransformerTestOutputValueClassIsSubclassOfClass(outputValueClass, mutableClasses, error); + *outputValue = [inputValue mutableCopy]; + return YES; + }]; +} + ++ (instancetype)keyOfDictionaryValueTransformer +{ + static dispatch_once_t onceToken; + static RKBlockValueTransformer *valueTransformer; + return [self singletonValueTransformer:&valueTransformer name:NSStringFromSelector(_cmd) onceToken:&onceToken validationBlock:^BOOL(__unsafe_unretained Class sourceClass, __unsafe_unretained Class destinationClass) { + return ([sourceClass conformsToProtocol:@protocol(NSCopying)] && [destinationClass isSubclassOfClass:[NSDictionary class]]); + } transformationBlock:^BOOL(id inputValue, __autoreleasing id *outputValue, Class outputValueClass, NSError *__autoreleasing *error) { + if (! [inputValue conformsToProtocol:@protocol(NSCopying)]) { + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: @"Expected an `inputValue` that conforms to `NSCopying`, but it does not." }; + if (error) *error = [NSError errorWithDomain:RKValueTransformersErrorDomain code:RKValueTransformationErrorUntransformableInputValue userInfo:userInfo]; + return NO; + } + RKValueTransformerTestOutputValueClassIsSubclassOfClass(outputValueClass, [NSDictionary class], error); + if ([outputValueClass isSubclassOfClass:[NSMutableDictionary class]]) { + *outputValue = [NSMutableDictionary dictionaryWithObject:[NSMutableDictionary dictionary] forKey:inputValue]; + } else { + *outputValue = @{ inputValue: @{} }; + } + + return YES; + }]; +} + +static RKCompoundValueTransformer *RKDefaultValueTransformer; +static dispatch_once_t RKDefaultValueTransformerOnceToken; + ++ (RKCompoundValueTransformer *)defaultValueTransformer +{ + dispatch_once(&RKDefaultValueTransformerOnceToken, ^{ + if (! RKDefaultValueTransformer) { + RKDefaultValueTransformer = [RKCompoundValueTransformer compoundValueTransformerWithValueTransformers:@[ + [self identityValueTransformer], + [self stringToURLValueTransformer], + + // `NSDecimalNumber` transformers must be consulted ahead of `NSNumber` transformers because `NSDecimalNumber` is a subclass thereof + [self decimalNumberToNumberValueTransformer], + [self decimalNumberToStringValueTransformer], + + [self numberToBooleanValueTransformer], + [self numberToStringValueTransformer], + [self arrayToOrderedSetValueTransformer], + [self arrayToSetValueTransformer], + [self nullValueTransformer], + [self keyedArchivingValueTransformer], + [self stringValueTransformer], + [self objectToCollectionValueTransformer], + [self stringValueTransformer], + [self keyOfDictionaryValueTransformer], + [self mutableValueTransformer], + ]]; + + // Default date formatters + [RKDefaultValueTransformer addValueTransformer:[self iso8601TimestampToDateValueTransformer]]; + [RKDefaultValueTransformer addValueTransformer:[self timeIntervalSince1970ToDateValueTransformer]]; + + // The latter three date format strings below represent the three + // date formats specified by the HTTP/1.1 protocol. See + // http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 + // for details + NSArray *defaultDateFormatStrings = @[ + @"MM/dd/yyyy", + @"yyyy-MM-dd", + @"EEE, dd MMM yyyy HH:mm:ss zzz", // RFC 1123 + @"EEEE, dd-MMM-yy HH:mm:ss zzz", // RFC 850 + @"EEE MMM d HH:mm:ss yyyy" // ANSI C asctime() + ]; + for (NSString *dateFormatString in defaultDateFormatStrings) { + NSDateFormatter *dateFormatter = [NSDateFormatter new]; + dateFormatter.dateFormat = dateFormatString; + dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; + dateFormatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; + [RKDefaultValueTransformer addValueTransformer:dateFormatter]; + } + } + }); + return RKDefaultValueTransformer; +} + ++ (void)setDefaultValueTransformer:(RKCompoundValueTransformer *)compoundValueTransformer +{ + RKDefaultValueTransformerOnceToken = 0; // resets the once_token so dispatch_once will run again + RKDefaultValueTransformer = compoundValueTransformer; +} + +@end + +@interface RKBlockValueTransformer () +@property (nonatomic, copy) BOOL (^validationBlock)(Class, Class); +@property (nonatomic, copy) BOOL (^transformationBlock)(id, id *, Class, NSError **); +@end + +@implementation RKBlockValueTransformer + ++ (instancetype)valueTransformerWithValidationBlock:(BOOL (^)(Class sourceClass, Class destinationClass))validationBlock + transformationBlock:(BOOL (^)(id inputValue, id *outputValue, Class outputClass, NSError **error))transformationBlock +{ + if (! transformationBlock) [NSException raise:NSInvalidArgumentException format:@"The `transformationBlock` cannot be `nil`."]; + RKBlockValueTransformer *valueTransformer = [self new]; + valueTransformer.validationBlock = validationBlock; + valueTransformer.transformationBlock = transformationBlock; + return valueTransformer; +} + +#pragma mark RKValueTransforming + +- (BOOL)transformValue:(id)inputValue toValue:(__autoreleasing id *)outputValue ofClass:(Class)outputValueClass error:(NSError *__autoreleasing *)error +{ + NSError *blockError = nil; + BOOL success = self.transformationBlock(inputValue, outputValue, outputValueClass, &blockError); + if (error) *error = blockError; + return success; +} + +- (BOOL)validateTransformationFromClass:(Class)sourceClass toClass:(Class)destinationClass +{ + if (self.validationBlock) return self.validationBlock(sourceClass, destinationClass); + else return YES; +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@: %p, name: %@>", NSStringFromClass([self class]), self, self.name]; +} + +@end + +@interface RKCompoundValueTransformer () +@property (nonatomic, strong) NSMutableArray *valueTransformers; +@property (nonatomic, strong) NSMutableDictionary *transformerCache; +@property (nonatomic) dispatch_queue_t cacheQueue; +@end + +@implementation RKCompoundValueTransformer + ++ (instancetype)compoundValueTransformerWithValueTransformers:(NSArray *)valueTransformers +{ + if (! valueTransformers) [NSException raise:NSInvalidArgumentException format:@"`valueTransformers` argument cannot be `nil`."]; + for (id valueTransformer in valueTransformers) { + if (! [valueTransformer conformsToProtocol:@protocol(RKValueTransforming)]) { + [NSException raise:NSInvalidArgumentException format:@"All objects in the given `valueTransformers` collection must conform to the `RKValueTransforming` protocol."]; + } + } + RKCompoundValueTransformer *valueTransformer = [self new]; + valueTransformer.valueTransformers = [valueTransformers mutableCopy]; + return valueTransformer; +} + +- (id)init +{ + self = [super init]; + if (self) { + _valueTransformers = [NSMutableArray new]; + _transformerCache = [NSMutableDictionary new]; + _cacheQueue = dispatch_queue_create("org.restkit.value-transformer.compound-cache", DISPATCH_QUEUE_CONCURRENT); + } + return self; +} + +- (void)dealloc +{ +#if !OS_OBJECT_USE_OBJC + if (_cacheQueue) dispatch_release(_cacheQueue); +#endif + _cacheQueue = NULL; +} + +- (void)invalidateCache +{ + dispatch_barrier_sync(self.cacheQueue, ^{ + [self.transformerCache removeAllObjects]; + }); +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@: %p, valueTransformers=%@>", NSStringFromClass([self class]), self, self.valueTransformers]; +} + +- (void)addValueTransformer:(id)valueTransformer +{ + if (! valueTransformer) [NSException raise:NSInvalidArgumentException format:@"Cannot add `nil` to a compound transformer."]; + [self.valueTransformers addObject:valueTransformer]; + [self invalidateCache]; +} + +- (void)removeValueTransformer:(id)valueTransformer +{ + if (! valueTransformer) [NSException raise:NSInvalidArgumentException format:@"Cannot remove `nil` from a compound transformer."]; + [self.valueTransformers removeObject:valueTransformer]; + [self invalidateCache]; +} + +- (void)insertValueTransformer:(id)valueTransformer atIndex:(NSUInteger)index +{ + if (! valueTransformer) [NSException raise:NSInvalidArgumentException format:@"Cannot insert `nil` into a compound transformer."]; + [self removeValueTransformer:valueTransformer]; + [self.valueTransformers insertObject:valueTransformer atIndex:index]; +} + +- (NSUInteger)numberOfValueTransformers +{ + return [self.valueTransformers count]; +} + +- (NSArray *)valueTransformersForTransformingFromClass:(Class)sourceClass toClass:(Class)destinationClass +{ + if (sourceClass == Nil && destinationClass == Nil) return [self.valueTransformers copy]; + else if (sourceClass == Nil || destinationClass == Nil) [NSException raise:NSInvalidArgumentException format:@"If you specify a source or destination class then you must specify both."]; + + /* See if we have cached values */ + __block NSArray *transformers; + dispatch_sync(self.cacheQueue, ^{ + transformers = [[self.transformerCache objectForKey:(id)sourceClass] objectForKey:(id)destinationClass]; + }); + + if (transformers != nil) return transformers; + + NSMutableArray *matchingTransformers = [[NSMutableArray alloc] initWithCapacity:[self.valueTransformers count]]; + for (RKValueTransformer *valueTransformer in self) { + if (! [valueTransformer respondsToSelector:@selector(validateTransformationFromClass:toClass:)] + || [valueTransformer validateTransformationFromClass:sourceClass toClass:destinationClass]) { + [matchingTransformers addObject:valueTransformer]; + } + } + + transformers = [matchingTransformers copy]; + dispatch_barrier_sync(self.cacheQueue, ^{ + NSMutableDictionary *cache = self.transformerCache; + NSMutableDictionary *sourceDict = [cache objectForKey:sourceClass]; + if (sourceDict == nil) + { + sourceDict = [NSMutableDictionary new]; + [cache setObject:sourceDict forKey:(id)sourceClass]; + } + + [sourceDict setObject:transformers forKey:(id)destinationClass]; + }); + + return transformers; +} + +- (id)objectAtIndexedSubscript:(NSUInteger)index +{ + return [self.valueTransformers objectAtIndex:index]; +} + +#pragma mark RKValueTransforming + +- (BOOL)transformValue:(id)inputValue toValue:(__autoreleasing id *)outputValue ofClass:(__unsafe_unretained Class)outputValueClass error:(NSError *__autoreleasing *)error +{ + NSArray *matchingTransformers = [self valueTransformersForTransformingFromClass:[inputValue class] toClass:outputValueClass]; + NSMutableArray *errors = nil; + NSError *underlyingError = nil; + for (id valueTransformer in matchingTransformers) { + BOOL success = [valueTransformer transformValue:inputValue toValue:outputValue ofClass:outputValueClass error:&underlyingError]; + if (success) return YES; + if (errors == nil) errors = [NSMutableArray new]; + [errors addObject:underlyingError]; + } + + if (error) { + NSArray *detailedErrors = errors ?: [NSArray new]; + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: [NSString stringWithFormat:@"Failed transformation of value '%@' to %@: none of the %lu value transformers consulted were successful.", inputValue, outputValueClass, (unsigned long)[matchingTransformers count]], RKValueTransformersDetailedErrorsKey: detailedErrors }; + *error = [NSError errorWithDomain:RKValueTransformersErrorDomain code:RKValueTransformationErrorTransformationFailed userInfo:userInfo]; + } + return NO; +} + +- (BOOL)validateTransformationFromClass:(Class)sourceClass toClass:(Class)destinationClass +{ + return [[self valueTransformersForTransformingFromClass:sourceClass toClass:destinationClass] count] > 0; +} + +#pragma mark NSCopying + +- (id)copyWithZone:(NSZone *)zone +{ + RKCompoundValueTransformer *compoundValueTransformer = [[[self class] allocWithZone:zone] init]; + compoundValueTransformer.valueTransformers = [self.valueTransformers mutableCopy]; + return compoundValueTransformer; +} + +#pragma mark NSFastEnumeration + +- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id __unsafe_unretained [])buffer count:(NSUInteger)len +{ + return [self.valueTransformers countByEnumeratingWithState:state objects:buffer count:len]; +} + +@end + +@implementation NSNumberFormatter (RKValueTransformers) + +- (BOOL)validateTransformationFromClass:(Class)inputValueClass toClass:(Class)outputValueClass +{ + return (([inputValueClass isSubclassOfClass:[NSNumber class]] && [outputValueClass isSubclassOfClass:[NSString class]]) || + ([inputValueClass isSubclassOfClass:[NSString class]] && [outputValueClass isSubclassOfClass:[NSNumber class]])); +} + +- (BOOL)transformValue:(id)inputValue toValue:(id *)outputValue ofClass:(Class)outputValueClass error:(NSError **)error +{ + RKValueTransformerTestInputValueIsKindOfClass(inputValue, (@[ [NSString class], [NSNumber class] ]), error); + RKValueTransformerTestOutputValueClassIsSubclassOfClass(outputValueClass, (@[ [NSString class], [NSNumber class] ]), error); + if ([inputValue isKindOfClass:[NSString class]]) { + NSString *errorDescription = nil; + BOOL success = [self getObjectValue:outputValue forString:inputValue errorDescription:&errorDescription]; + RKValueTransformerTestTransformation(success, error, @"%@", errorDescription); + } else if ([inputValue isKindOfClass:[NSNumber class]]) { + *outputValue = [self stringFromNumber:inputValue]; + } + return YES; +} + +@end + +@implementation NSDateFormatter (RKValueTransformers) + +- (BOOL)validateTransformationFromClass:(Class)inputValueClass toClass:(Class)outputValueClass +{ + return (([inputValueClass isSubclassOfClass:[NSDate class]] && [outputValueClass isSubclassOfClass:[NSString class]]) || + ([inputValueClass isSubclassOfClass:[NSString class]] && [outputValueClass isSubclassOfClass:[NSDate class]])); +} + +- (BOOL)transformValue:(id)inputValue toValue:(id *)outputValue ofClass:(Class)outputValueClass error:(NSError **)error +{ + RKValueTransformerTestInputValueIsKindOfClass(inputValue, (@[ [NSString class], [NSDate class] ]), error); + RKValueTransformerTestOutputValueClassIsSubclassOfClass(outputValueClass, (@[ [NSString class], [NSDate class] ]), error); + if ([inputValue isKindOfClass:[NSString class]]) { + NSString *errorDescription = nil; + BOOL success = [self getObjectValue:outputValue forString:inputValue errorDescription:&errorDescription]; + RKValueTransformerTestTransformation(success, error, @"%@", errorDescription); + } else if ([inputValue isKindOfClass:[NSDate class]]) { + *outputValue = [self stringFromDate:inputValue]; + } + return YES; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RKValueTransformers/LICENSE b/code/iOS/ScriptorSprint3/Pods/RKValueTransformers/LICENSE new file mode 100644 index 0000000..37ec93a --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RKValueTransformers/LICENSE @@ -0,0 +1,191 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +2. Grant of Copyright License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +3. Grant of Patent License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. + +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source form +of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. + +5. Submission of Contributions. + +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. + +6. Trademarks. + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. + +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +8. Limitation of Liability. + +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same "printed page" as the copyright notice for easier identification within +third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/code/iOS/ScriptorSprint3/Pods/RKValueTransformers/README.md b/code/iOS/ScriptorSprint3/Pods/RKValueTransformers/README.md new file mode 100644 index 0000000..0480db0 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RKValueTransformers/README.md @@ -0,0 +1,209 @@ +RKValueTransformers +=================== + +[![Build Status](http://img.shields.io/travis/RestKit/RKValueTransformers/master.svg?style=flat)](https://travis-ci.org/RestKit/RKValueTransformers) +![Pod Version](http://cocoapod-badges.herokuapp.com/v/RKValueTransformers/badge.png) +![Pod Platform](http://cocoapod-badges.herokuapp.com/p/RKValueTransformers/badge.png) + +**A simple, powerful Objective-C value transformation API extracted from RestKit** + +RKValueTransformers is a standalone library that provides a simple value transformation API in Objective-C. Value transformation is the process of converting a value between representations and is a core part of any system that requires that data be transmitted and received in a serialization format distinct from the local data model. + +In the general context of a RESTful API this means the transformation between values encoded in an XML or JSON document and local attributes of your data model. The most familiar and obvious example is the transformation of date and time data encoded as a string in a JSON document and represented locally as an `NSDate` attribute of an `NSObject` or `NSManagedObject` derived class. RKValueTransformers provides a simple, well-designed API for generalizing and simplifying the task of handling an arbitrarily complex set of value transformation requirements for your iOS or Mac OS X application. + +Value transformation is a core feature of [RestKit](http://github.com/RestKit/RestKit) and RKValueTransformers was extracted from the parent project to benefit the larger Cocoa development community. If you are looking for a comprehensive solution for your RESTful API needs then be sure to give RestKit a closer look. + +### Features + +RKValueTransformers is a "batteries included" library that ships with value transformers handling the most common transformations. The core set of transformers can be customized and new transformers are easily implemented to meet the needs of any application. + +* Includes a rich set of transformers covering the most common transformations: + * `NSString` <-> `NSURL` + * `NSNumber` <-> `NSString` + * `NSArray` <-> `NSOrderedSet` + * `NSArray` <-> `NSSet` + * `NSDecimalNumber` <-> `NSNumber` + * `NSDecimalNumber` <-> `NSString` + * `NSNull` <-> `nil` + * Any class conforming to `NSCoding` <-> `NSData` + * UNIX Time Interval encoded as `NSNumber` or `NSString` <-> `NSDate` + * ISO 8601 Timestamp strings <-> `NSDate` (Only supports complete timestamp strings. On 32 bit systems such as iOS devices pre-iPhone 5s only years < 2038 are supported) + * Any object implementing `stringValue` -> `NSString` + * Any singular object to a collection (`NSArray`, `NSSet`, `NSOrderedSet` and their mutable counterparts) + * Any object and an `NSDictionary` (object becomes a key for empty nested dictionary) + * Any class conforming to `NSMutableCoding` -> mutable representation of itself + * `NSString` <-> `NSDate` via `NSDateFormatter`. Default formats include: + * RFC 1123 format + * RFC 850 format + * ANSI C's asctime() format + * `NSString` <-> `NSNumber` via `NSNumberFormatter` +* Lightweight. Implemented in a single pair or header and implementation files. +* Fully unit tested and documented. +* Extensible by implementing the `RKValueTransforming` protocol, subclassing `RKValueTransformer` or with blocks via `RKBlockValueTransformer`. +* Multiple value transformers can be assembled into a composite transformer via the `RKCompoundValueTransformer` class. +* Transparently improves date transformation performance by providing a cache of date formatters. +* Fully integrated with RestKit. + +## Examples + +All value transformation is performed via an abstract common interface defined by the `RKValueTransforming` protocol: + +```objc +NSString *stringContainingDecimalNumber = @"3.4593895835"; +NSError *error = nil; +NSDecimalNumber *decimalNumber = nil; +BOOL success = [[RKValueTransformers decimalNumberToStringValueTransformer] transformValue:stringContainingDecimalNumber toValue:&decimalNumber ofClass:[NSDecimalNumber class] error:&error]; +``` + +The `transformValue:toValue:ofClass:error:` method is always the same regardless of the implementation details of the underlying transformation. It is guaranteed to always return a Boolean value indicating if the transformation was successful and value transformers **must** return an `NSError` in the event the transformation could not be performed. + +### Validating a Transformation + +In many cases, whether or not a given transformation can be performed can be determined entirely by the types involved in the transformation. In these cases, a value transformer may implement the optional `RKValueTransforming` method `validateTransformationFromClass:(Class)inputValueClass toClass:(Class)outputValueClass`: + +```objc +BOOL isTransformationPossible = [[RKValueTransformers arrayToSetValueTransformer] validateTransformationFromClass:[NSSet class] toClass:[NSArray class]]; +NSAssert(isTransformationPossible == YES, @"Should be `YES`"); +isTransformationPossible = [[RKValueTransformers arrayToSetValueTransformer] validateTransformationFromClass:[NSSet class] toClass:[NSData class]]; +NSAssert(isTransformationPossible == NO, @"Should be `NO`"); +``` + +Note that as this is an optional method you must check that a given instance responds to the validation selector. If it does not then the transformation cannot be validated and a transformation must be attempted to determine success or failure. + +### Compound Transformers + +Individual transformers are very convenient -- they abstract away the need to remember how to implement a given transformation and present a simple interface for transformations. But the real power of RKValueTransformers emerges when you assemble a collection of value transformers into a compound transformer via the `RKCompoundValueTransformer` class. Compound value transformers also implement the `RKValueTransforming` protocol -- but instead of providing any value transformation and validation themselves they proxy the calls to a collection of underlying value transformers in programmer defined order. This allows you to configure a set of transformers in a specific order such that the first transformer that is capable of performing a given transformation will handle it. + +Consider for example that a given application may interact with several API's that return dates as strings in several different formats. We wish to be able to transform any given string value into an `NSDate` without worrying about the details. We could configure a compound transformer to handle this task like so: + +```objc +NSArray *dateFormats = @[ @"MM/dd/yyyy", @"yyyy-MM-dd'T'HH:mm:ss'Z'", @"yyyy-MM-dd" ]; +RKCompoundValueTransformer *compoundValueTransformer = [RKCompoundValueTransformer new]; +for (NSString *dateFormat in dateFormats) { + NSDateFormatter *dateFormatter = [NSDateFormatter new]; + dateFormatter.dateFormat = dateFormat; + [compoundValueTransformer addValueTransformer:dateFormatter]; +} + +[compoundValueTransformer addValueTransformer:[RKValueTransformer timeIntervalSince1970ToDateValueTransformer]]; + +NSArray *dateStrings = @[ @"11/27/1982", @"1378767519.18176508", @"2013-11-27", @"2013-04-23T16:29:05Z" ]; +NSError *error = nil; +for (NSString *dateString in dateStrings) { + NSDate *date = nil; + BOOL success = [compoundValueTransformer transformValue:dateString toValue:&date ofClass:[NSDate class]]; + NSLog(@"Transformed value '%@' to value '%@' successfully=%@, error=%@", dateString, date, success ? @"YES" : @"NO", error); +} +``` + +### Block Value Transformers + +RKValueTransformers supports the creation of ad-hoc value transformer instances implemented via blocks. For example, one could implement a value transformer that turns all `NSString` instances into uppercase strings like so: + +```objc +RKValueTransformer *uppercaseStringTransformer = [RKBlockValueTransformer valueTransformerWithValidationBlock:^BOOL(__unsafe_unretained Class sourceClass, __unsafe_unretained Class destinationClass) { + // We transform a `NSString` into another `NSString` + return ([sourceClass isSubclassOfClass:[NSString class]] && [destinationClass isSubclassOfClass:[NSString class]]); +} transformationBlock:^BOOL(id inputValue, __autoreleasing id *outputValue, Class outputValueClass, NSError *__autoreleasing *error) { + // Validate the input and output + RKValueTransformerTestInputValueIsKindOfClass(inputValue, [NSString class], error); + RKValueTransformerTestOutputValueClassIsSubclassOfClass(outputValueClass, [NSString class], error); + + // Perform the transformation + *outputValue = [(NSString *)inputValue uppercaseString]; + return YES; +}]; +``` + +## Installation + +RKValueTransformers is extremely lightweight and has no direct dependencies outside of the Cocoa Foundation framework. As such, the library can be trivially be installed into any Cocoa project by directly adding the source code. Despite this fact, we recommend installing via CocoaPods as it provides modularity and enables the easy installation of new value transformers that are dependent on RKValueTransformers itself. + +### Via CocoaPods + +The recommended approach for installing RKValueTransformers is via the [CocoaPods](http://cocoapods.org/) package manager, as it provides flexible dependency management and dead simple installation. For best results, it is recommended that you install via CocoaPods **>= 0.24.0** using Git **>= 1.8.0** installed via Homebrew. + +Install CocoaPods if not already available: + +``` bash +$ [sudo] gem install cocoapods +$ pod setup +``` + +Change to the directory of your Xcode project, and Create and Edit your Podfile and add RKValueTransformers: + +``` bash +$ cd /path/to/MyProject +$ touch Podfile +$ edit Podfile +platform :ios, '5.0' +# Or platform :osx, '10.7' +pod 'RKValueTransformers', '~> 1.0.0' +``` + +Install into your project: + +``` bash +$ pod install +``` + +Open your project in Xcode from the .xcworkspace file (not the usual project file) + +``` bash +$ open MyProject.xcworkspace +``` + +### Via Source Code + +Simply add `RKValueTransformers.h` and `RKValueTransformers.m` to your project and `#import "RKValueTransformers.h"`. + +## Design & Implementation Details + +RKValueTransformers is designed to be simple to integrate and use. The entire library consists of a single protocol, three classes, and a handful of category implementations: + +* `RKValueTransforming` - Defines the value transformation API. Adopted by any class that wishes to act as a value transformer. +* `RKValueTransformer` - An abstract base class that implements `RKValueTransforming`. The base class includes static accessors for retrieving singleton instances of the bundled value transformers. Extension libraries can subclass `RKValueTransformer` to provide new transformers. +* `RKBlockValueTransformer` - A concrete subclass of `RKValueTransformer` that enables the creation of ad-hoc value transformers defined via blocks. +* `RKCompoundValueTransformer` - A concrete implementation of `RKValueTransforming` that proxies calls to an underlying collection of value transformers and provides support for composing value transformers. + +For those implementing value transformers, a few macros are included to simplify the implementation of validation and transformation methods: + +* `RKValueTransformerTestInputValueIsKindOfClass` - Tests that a given input value is an instance of a given class or one of its subclasses. If the test evaluates negatively, then `NO` is returned and an appropriate `NSError` is emitted. +* `RKValueTransformerTestOutputValueClassIsSubclassOfClass` - Tests that a given output value class is equal to a given class or is a subclass there of. If the test evaluates negatively, then `NO` is returned an appropriate `NSError` is emitted. +* `RKValueTransformerTestTransformation` - Tests that a given transformation was successful. If the test evaluates negatively, then `NO` is returned an appropriate `NSError` is emitted. + +### Why not NSValueTransformer? + +In developing RKValueTransformers we looked closely at `NSValueTransformer` and ultimately determined that it was not a great fit for our needs. Specifically we found the following issues: + +1. `NSValueTransformer` defines a notion of 'forward' and 'reverse' transformation that doesn't map cleanly in a system primarilly concerned with type transformations. Which side do you consider forward? This gets worse when you consider transformations that can occur between more than just two types. +2. `NSValueTransformer` exposes the class of the "output" object via the class method `transformedValueClass`. This becomes annoying as you are forced to use inheritance to express type knowledge. This necessitates directly inheriting from `NSValueTransformer` or using fancy run-time hackery such as that [utilized by TransformerKit](https://github.com/mattt/TransformerKit/blob/master/TransformerKit/NSValueTransformer%2BTransformerKit.m). +3. `NSValueTransformer` exposes a single global name based registry for value transformers via the `setValueTransformer:forName:` and `valueTransformerForName:` methods. Ultimately this is not granular enough to provide necessary flexibility and requires the use of names (as opposed to type information) to look up transformers. + +Given all of the above it just made sense to go back to a clean slate and design a solution to the value transformation problem from scratch. + +## Unit Tests + +RKValueTransformers is tested using the [Expecta](https://github.com/specta/Expecta) library of unit testing matchers. In order to run the tests, you must do the following: + +1. Install the dependencies via CocoaPods: `pod install` +1. Open the workspace: `open RKValueTransformers.xcworkspace` +1. Run the specs via the **Product** menu > **Test** + +## Credits + +Blake Watters + +- http://github.com/blakewatters +- http://twitter.com/blakewatters +- blakewatters@gmail.com + +Samuel E. Giddins + +- https://github.com/segiddins +- http://twitter.com/segiddins +- segiddins@segiddins.me + +## License + +RKValueTransformers is available under the Apache 2 License. See the LICENSE file for more info. diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData.h new file mode 100644 index 0000000..ff8972d --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData.h @@ -0,0 +1,33 @@ +// +// CoreData.h +// RestKit +// +// Created by Blake Watters on 9/30/10. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import +#import "ObjectMapping.h" +#import "RKManagedObjectStore.h" +#import "RKManagedObjectImporter.h" +#import "RKManagedObjectMappingOperationDataSource.h" +#import "RKEntityMapping.h" +#import "RKManagedObjectCaching.h" +#import "RKInMemoryManagedObjectCache.h" +#import "RKFetchRequestManagedObjectCache.h" + +#import "RKPropertyInspector+CoreData.h" +#import "NSManagedObjectContext+RKAdditions.h" +#import "NSManagedObject+RKAdditions.h" diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/NSManagedObject+RKAdditions.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/NSManagedObject+RKAdditions.h new file mode 100644 index 0000000..5fae1b1 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/NSManagedObject+RKAdditions.h @@ -0,0 +1,38 @@ +// +// NSManagedObject+RKAdditions.h +// RestKit +// +// Created by Blake Watters on 3/14/12. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// + +#import + +@class RKManagedObjectStore, RKEntityMapping; + +/** + Provides extensions to NSManagedObject for various common tasks. + */ +@interface NSManagedObject (RKAdditions) + +///-------------------------------------- +/// @name Inspecting Managed Object State +///-------------------------------------- + +/** + Determines if the receiver has been deleted from the persistent store + and removed from the object graph. + + Unlike isDeleted, will return YES after a save event or if the managed object was deleted + in another managed object context that was then merged to the persistent store. + + @return YES if the object has been deleted from the persistent store, else NO. + */ +@property (nonatomic, readonly) BOOL hasBeenDeleted; + +/** + * Returns YES when an object has not been saved to the managed object context yet + */ +@property (nonatomic, readonly) BOOL isNew; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/NSManagedObject+RKAdditions.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/NSManagedObject+RKAdditions.m new file mode 100644 index 0000000..196ff18 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/NSManagedObject+RKAdditions.m @@ -0,0 +1,28 @@ +// +// NSManagedObject+RKAdditions.m +// RestKit +// +// Created by Blake Watters on 3/14/12. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// + +#import "NSManagedObject+RKAdditions.h" +#import "NSManagedObjectContext+RKAdditions.h" +#import "RKLog.h" +#import "RKManagedObjectStore.h" + +@implementation NSManagedObject (RKAdditions) + +- (BOOL)hasBeenDeleted +{ + NSManagedObject *managedObjectClone = [[self managedObjectContext] existingObjectWithID:[self objectID] error:nil]; + return (managedObjectClone == nil) ? YES : NO; +} + +- (BOOL)isNew +{ + NSDictionary *vals = [self committedValuesForKeys:nil]; + return [vals count] == 0; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/NSManagedObjectContext+RKAdditions.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/NSManagedObjectContext+RKAdditions.h new file mode 100644 index 0000000..cdf773d --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/NSManagedObjectContext+RKAdditions.h @@ -0,0 +1,79 @@ +// +// NSManagedObjectContext+RKAdditions.h +// RestKit +// +// Created by Blake Watters on 3/14/12. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import + +@class RKManagedObjectStore; + +/** + Provides extensions to `NSManagedObjectContext` for various common tasks. + */ +@interface NSManagedObjectContext (RKAdditions) + +///--------------------------------- +/// @name Inserting a Managed Object +///--------------------------------- + +/** + Inserts a new managed object for the entity for the given name. + + This method is functionally equivalent to the follow code example. + + [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:self]; + + @param entityName The name of an entity. + @return A new, autoreleased, fully configured instance of the class for the entity named entityName. The instance has its entity description set and is inserted into the receiver. + */ +- (id)insertNewObjectForEntityForName:(NSString *)entityName; + +///------------------------------- +/// @name Counting Managed Objects +///------------------------------- + +/** + Convenience method for performing a count of the number of instances of an entity with the given name. + + This method is functionally equivalent to the following code example. + + NSError *error; + NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:entityName]; + fetchRequest.predicate = predicate; + NSUInteger count = [managedObjectContext countForFetchRequest:fetchRequest error:&error]; + + @param entityName The name of an entity. + @param predicate A predicate to limit the search. May be nil. + @param error If there is a problem executing the fetch, upon return contains an instance of NSError that describes the problem. + @return The number of objects a fetch request for the given entity name with the given predicate would have returned if it had been passed to executeFetchRequest:error:, or NSNotFound if an error occurs. + */ +- (NSUInteger)countForEntityForName:(NSString *)entityName predicate:(NSPredicate *)predicate error:(NSError **)error; + +///------------------------------------------------- +/// @name Saving the Context to the Persistent Store +///------------------------------------------------- + +/** + Saves the receiver and then traverses up the parent context chain until a parent managed object context with a nil parent is found. If the final ancestor context does not have a reference to the persistent store coordinator, then a warning is generated and the method returns NO. + + @param error If there is a problem saving the receiver or any of its ancestor contexts, upon return contains an pointer to an instance of NSError that describes the problem. + @return YES if the save to the persistent store was successful, else NO. + */ +- (BOOL)saveToPersistentStore:(NSError **)error; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/NSManagedObjectContext+RKAdditions.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/NSManagedObjectContext+RKAdditions.m new file mode 100644 index 0000000..8f22e10 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/NSManagedObjectContext+RKAdditions.m @@ -0,0 +1,84 @@ +// +// NSManagedObjectContext+RKAdditions.m +// RestKit +// +// Created by Blake Watters on 3/14/12. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import +#import "NSManagedObjectContext+RKAdditions.h" +#import "RKLog.h" + +@implementation NSManagedObjectContext (RKAdditions) + +- (id)insertNewObjectForEntityForName:(NSString *)entityName +{ + return [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:self]; +} + +- (NSUInteger)countForEntityForName:(NSString *)entityName predicate:(NSPredicate *)predicate error:(NSError **)error +{ + NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:entityName]; + fetchRequest.predicate = predicate; + return [self countForFetchRequest:fetchRequest error:error]; +} + +- (BOOL)saveToPersistentStore:(NSError **)error +{ + __block NSError *localError = nil; + NSManagedObjectContext *contextToSave = self; + while (contextToSave) { + __block BOOL success; + + /** + To work around issues in ios 5 first obtain permanent object ids for any inserted objects. If we don't do this then its easy to get an `NSObjectInaccessibleException`. This happens when: + + 1. Create new object on main context and save it. + 2. At this point you may or may not call obtainPermanentIDsForObjects for the object, it doesn't matter + 3. Update the object in a private child context. + 4. Save the child context to the parent context (the main one) which will work, + 5. Save the main context - a NSObjectInaccessibleException will occur and Core Data will either crash your app or lock it up (a semaphore is not correctly released on the first error so the next fetch request will block forever. + */ + __block BOOL obtained; + [contextToSave performBlockAndWait:^{ + obtained = [contextToSave obtainPermanentIDsForObjects:[[contextToSave insertedObjects] allObjects] error:&localError]; + }]; + if (!obtained) { + if (error) *error = localError; + return NO; + } + + [contextToSave performBlockAndWait:^{ + success = [contextToSave save:&localError]; + if (! success && localError == nil) RKLogWarning(@"Saving of managed object context failed, but a `nil` value for the `error` argument was returned. This typically indicates an invalid implementation of a key-value validation method exists within your model. This violation of the API contract may result in the save operation being mis-interpretted by callers that rely on the availability of the error."); + }]; + + if (! success) { + if (error) *error = localError; + return NO; + } + + if (! contextToSave.parentContext && contextToSave.persistentStoreCoordinator == nil) { + RKLogWarning(@"Reached the end of the chain of nested managed object contexts without encountering a persistent store coordinator. Objects are not fully persisted."); + return NO; + } + contextToSave = contextToSave.parentContext; + } + + return YES; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKConnectionDescription.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKConnectionDescription.h new file mode 100644 index 0000000..fc3ecb4 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKConnectionDescription.h @@ -0,0 +1,164 @@ +// +// RKConnectionDescription.h +// RestKit +// +// Created by Blake Watters on 11/20/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import + +/** + The `RKConnectionDescription` class describes a means for connecting a Core Data relationship. Connections can be established either by foreign key, in which case one or more attribute values on the source entity correspond to matching values on the destination entity, or by key path, in which case a key path is evaluated on the object graph to obtain a value for the relationship. Connection objects are used by instances of `RKRelationshipConnectionOperation` to connect a relationship of a given managed object. + + ## Foreign Key Connections + + A foreign key connection is established by identifying managed objects within a context which have corresponding values on the source and destination objects. This is typically used to model relationships in the same way one would within a relational database. + + For example, consider the example of a `User` entity that has a to-many relationship named 'projects' for the `Project` entity. Within the `User` entity, there is an attribute named 'userID' that models the value for a given user's primary key as provided to the application by the remote backend API with which it is communicating. Within the `Project` entity, a corresponding 'userID' attribute exists specifying the value of the primary key for the `User` that owns the project. The applications loads each of these object representations independently from the '/me/profile' and '/projects' resources. The JSON representation returned for a given `Project` entity looks something like: + + { "project": + { "id": 12345, + "name": "My Project", + "userID": 1 + } + } + + When this representation is mapped to a managed object for the `Project` entity, the 'user' relationship cannot be mapped directly because there is no nested representation -- only the primary key is available. In this case, the relationship can be connected by describing the association between the entities with an `RKConnectionDescription` object: + + NSEntityDescription *projectEntity = [NSEntityDescription entityForName:@"Project" inManagedObjectContext:managedObjectContext]; + NSRelationshipDescription *userRelationship = [projectEntity relationshipsByName][@"user"]; + RKConnectionDescription *connection = [[RKConnectionDescription alloc] initWithRelationship:userRelationship attributes:@{ @"userID": @"userID" }]; + + Note that the value for the `attributes` argument is provided as a dictionary. Each pair within the dictionary correspond to an attribute pair in which the key is an attribute on the source entity (in this case, the `Project`) and the value is the destination entity (in this case, the `User`). + + Any number of attribute pairs may be specified, but all values must match for the connection to be satisfied and the relationship's value to be set. + + ### Connecting with Collection Values + + Connections can be established by a collection of values. For example, imagine that the previously described project representation has been extended to include a list of team members who are working on the project: + + { "project": + { "id": 12345, + "name": "My Project", + "userID": 1, + "teamMemberIDs": [1, 2, 3, 4] + } + } + + The 'teamMemberIDs' contains an array specifying the ID's of the `User` objects who are collaborating on the project, which corresponds to a to-many relationship named 'teamMembers' on the `Project` entity. In this case, the 'teamMemberIDs' could be mapped on to an `NSArray` or `NSSet` property on the `Project` entity and then connected: + + NSEntityDescription *projectEntity = [NSEntityDescription entityForName:@"Project" inManagedObjectContext:managedObjectContext]; + NSRelationshipDescription *teamMembers = [projectEntity relationshipsByName][@"teamMembers"]; // To many relationship for the `User` entity + RKConnectionDescription *connection = [[RKConnectionDescription alloc] initWithRelationship:teamMembers attributes:@{ @"teamMemberIDs": @"userID" }]; + + When evaluating the above JSON, the connection would be established for the 'teamMembers' relationship to the `User` entities whose userID's are 1, 2, 3 or 4. + + Note that collections of attribute values are always interpetted as logic OR's, but compound connections are aggregated as a logical AND. For example, if we were to add a second connecting attribute for the "gender" property and include `"gender": "male"` in the JSON, the connection would be made to all `User` managed objects whose ID is 1, 2, 3, OR 4 AND whose gender is "male". + + ## Key Path Connections + + A key path connection is established by evaluating the key path of the connection against the managed object being connected. The returned value has type transformation applied and is then assigned to the relationship. + + @see `RKManagedObjectMappingOperationDataSource` + @see `RKRelationshipConnectionOperation` + */ +@interface RKConnectionDescription : NSObject + +///----------------------------------------------- +/// @name Connecting Relationships by Foreign Keys +///----------------------------------------------- + +/** + Initializes the receiver with a given relationship and a dictionary of attributes specifying how to connect the relationship. + + @param relationship The relationship to be connected. + @param sourceToDestinationEntityAttributes A dictionary specifying how attributes on the source entity correspond to attributes on the destination entity. + @return The receiver, initialized with the given relationship and attributes. + */ +- (instancetype)initWithRelationship:(NSRelationshipDescription *)relationship attributes:(NSDictionary *)sourceToDestinationEntityAttributes; + +/** + The dictionary of attributes specifying how attributes on the source entity for the relationship correspond to attributes on the destination entity. + + This attribute is `nil` unless the value of `isForeignKeyConnection` is `YES`. + */ +@property (nonatomic, copy, readonly) NSDictionary *attributes; + +/** + Returns a Boolean value indicating if the receiver describes a foreign key connection. + + @return `YES` if the receiver describes a foreign key connection, else `NO`. + */ +@property (nonatomic, getter=isForeignKeyConnection, readonly) BOOL foreignKeyConnection; + +///------------------------------------------- +/// @name Connecting Relationships by Key Path +///------------------------------------------- + +/** + Initializes the receiver with a given relationship and key path. + + @param relationship The relationship to be connected. + @param keyPath The key path from which to read the value that is to be set for the relationship. + @return The receiver, initialized with the given relationship and key path. + */ +- (instancetype)initWithRelationship:(NSRelationshipDescription *)relationship keyPath:(NSString *)keyPath; + +/** + The key path that is to be evaluated to obtain the value for the relationship. + + This attribute is `nil` unless the value of `isKeyPathConnection` is `YES`. + */ +@property (nonatomic, copy, readonly) NSString *keyPath; + +/** + Returns a Boolean value indicating if the receiver describes a key path connection. + + @return `YES` if the receiver describes a key path connection, else `NO`. + */ +@property (nonatomic, getter=isKeyPathConnection, readonly) BOOL keyPathConnection; + +///------------------------------------------------- +/// @name Accessing the Relationship to be Connected +///------------------------------------------------- + +/** + Returns the relationship that is to be connected. + */ +@property (nonatomic, strong, readonly) NSRelationshipDescription *relationship; + +///---------------------------- +/// @name Setting the Predicate +///---------------------------- + +/** + Returns a Boolean value that determines if the connection includes subentities. If `NO`, then the connection will only be established to objects of exactly the entity specified by the relationship's entity. If `YES`, then the connection will be established to all objects of the relationship's entity and all subentities. + + **Default**: `YES` + */ +@property (nonatomic, assign) BOOL includesSubentities; + +/** + An optional predicate for conditionally evaluating the connection based on the state of the source object. + */ +@property (nonatomic, strong) NSPredicate *sourcePredicate; + +/** + An optional predicate for filtering objects to be connected. + */ +@property (nonatomic, copy) NSPredicate *destinationPredicate; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKConnectionDescription.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKConnectionDescription.m new file mode 100644 index 0000000..ee47003 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKConnectionDescription.m @@ -0,0 +1,142 @@ +// +// RKConnectionDescription.m +// RestKit +// +// Created by Blake Watters on 11/20/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKConnectionDescription.h" + +static NSSet *RKSetWithInvalidAttributesForEntity(NSArray *attributes, NSEntityDescription *entity) +{ + NSMutableSet *attributesSet = [NSMutableSet setWithArray:attributes]; + NSSet *validAttributeNames = [NSSet setWithArray:[[entity attributesByName] allKeys]]; + [attributesSet minusSet:validAttributeNames]; + return attributesSet; +} + +// Provides support for connecting a relationship by +@interface RKForeignKeyConnectionDescription : RKConnectionDescription +@end + +// Provides support for connecting a relationship by traversing the object graph +@interface RKKeyPathConnectionDescription : RKConnectionDescription +@end + +@interface RKConnectionDescription () +@property (nonatomic, strong, readwrite) NSRelationshipDescription *relationship; +@property (nonatomic, copy, readwrite) NSDictionary *attributes; +@property (nonatomic, copy, readwrite) NSString *keyPath; +@end + +@implementation RKConnectionDescription + +- (instancetype)initWithRelationship:(NSRelationshipDescription *)relationship attributes:(NSDictionary *)attributes +{ + NSParameterAssert(relationship); + NSParameterAssert(attributes); + if (! [attributes count]) [NSException raise:NSInvalidArgumentException format:@"Cannot connect a relationship without at least one pair of attributes describing the connection"]; + NSSet *invalidSourceAttributes = RKSetWithInvalidAttributesForEntity([attributes allKeys], [relationship entity]); + if ([invalidSourceAttributes count]) [NSException raise:NSInvalidArgumentException format:@"Cannot connect relationship: invalid attributes given for source entity '%@': %@", [[relationship entity] name], [[invalidSourceAttributes allObjects] componentsJoinedByString:@", "]]; + NSSet *invalidDestinationAttributes = RKSetWithInvalidAttributesForEntity([attributes allValues], [relationship destinationEntity]); + if ([invalidDestinationAttributes count]) [NSException raise:NSInvalidArgumentException format:@"Cannot connect relationship: invalid attributes given for destination entity '%@': %@", [[relationship destinationEntity] name], [[invalidDestinationAttributes allObjects] componentsJoinedByString:@", "]]; + + self = [[RKForeignKeyConnectionDescription alloc] init]; + if (self) { + self.relationship = relationship; + self.attributes = attributes; + self.includesSubentities = YES; + } + return self; +} + +- (instancetype)initWithRelationship:(NSRelationshipDescription *)relationship keyPath:(NSString *)keyPath +{ + NSParameterAssert(relationship); + NSParameterAssert(keyPath); + self = [[RKKeyPathConnectionDescription alloc] init]; + if (self) { + self.relationship = relationship; + self.keyPath = keyPath; + } + return self; +} + +- (instancetype)init +{ + if ([self class] == [RKConnectionDescription class]) { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"%@ Failed to call designated initializer. " + "Invoke initWithRelationship:attributes: instead.", + NSStringFromClass([self class])] + userInfo:nil]; + } + return [super init]; +} + +- (id)copyWithZone:(NSZone *)zone +{ + if ([self isForeignKeyConnection]) { + return [[[self class] allocWithZone:zone] initWithRelationship:self.relationship attributes:self.attributes]; + } else if ([self isKeyPathConnection]) { + return [[[self class] allocWithZone:zone] initWithRelationship:self.relationship keyPath:self.keyPath]; + } + + return nil; +} + +- (BOOL)isForeignKeyConnection +{ + return NO; +} + +- (BOOL)isKeyPathConnection +{ + return NO; +} + +@end + +@implementation RKForeignKeyConnectionDescription + +- (BOOL)isForeignKeyConnection +{ + return YES; +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@:%p connecting Relationship '%@' from Entity '%@' to Destination Entity '%@' with attributes=%@>", + NSStringFromClass([self class]), self, [self.relationship name], [[self.relationship entity] name], + [[self.relationship destinationEntity] name], self.attributes]; +} + +@end + +@implementation RKKeyPathConnectionDescription + +- (BOOL)isKeyPathConnection +{ + return YES; +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@:%p connecting Relationship '%@' of Entity '%@' with keyPath=%@>", + NSStringFromClass([self class]), self, [self.relationship name], [[self.relationship entity] name], self.keyPath]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKEntityByAttributeCache.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKEntityByAttributeCache.h new file mode 100644 index 0000000..c727462 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKEntityByAttributeCache.h @@ -0,0 +1,199 @@ +// +// RKEntityByAttributeCache.h +// RestKit +// +// Created by Blake Watters on 5/1/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import + +/** + The `RKEntityByAttributeCache` class provides an in-memory caching mechanism for managed objects instances of an entity in a managed object context with the value of one of the object's attributes acting as the cache key. When loaded, the cache will retrieve all instances of an entity from the store and build a dictionary mapping values for the given cache key attribute to the managed object ID for all objects matching the value. The cache can then be used to quickly retrieve objects by attribute value for the cache key without executing another fetch request against the managed object context. This can provide a large performance improvement when a large number of objects are being retrieved using a particular attribute as the key. + + `RKEntityByAttributeCache` instances are used by the `RKEntityCache` to provide caching for multiple entities at once. + + @bug Please note that the `RKEntityByAttribute` cache is implemented using a `NSFetchRequest` with a result type of `NSDictionaryResultType`. This means that the cache **cannot** load pending object instances via a fetch from the `load` method. Pending objects must be manually added to the cache via `addObject:` if it is desirable for the pending objects to be retrieved by subsequent invocations of `objectWithAttributeValue:inContext:` and `objectsWithAttributeValue:inContext:` prior to a save. + + This is a limitation imposed by Core Data. The dictionary result type implementation is leveraged instead a normal fetch request because it offers very large performance and memory utilization improvements by avoiding construction of managed object instances and faulting. + + @see `RKEntityCache` + */ +@interface RKEntityByAttributeCache : NSObject + +///----------------------- +/// @name Creating a Cache +///----------------------- + +/** + Initializes the receiver with a given entity, attribute, and managed object context. + + @param entity The Core Data entity description for the managed objects being cached. + @param attributeNames An array of attribute names used as the cache keys. + @param context The managed object context the cache retrieves the cached objects from. + @return The receiver, initialized with the given entity, attribute, and managed object + context. + */ +- (instancetype)initWithEntity:(NSEntityDescription *)entity attributes:(NSArray *)attributeNames managedObjectContext:(NSManagedObjectContext *)context; + +///----------------------------- +/// @name Getting Cache Identity +///----------------------------- + +/** + The Core Data entity description for the managed objects being cached. + */ +@property (nonatomic, readonly) NSEntityDescription *entity; + +/** + An array of attribute names specifying attributes of the cached entity that act as the cache key. + */ +@property (nonatomic, readonly) NSArray *attributes; + +/** + The managed object context the receiver fetches cached objects from. + */ +@property (nonatomic, readonly) NSManagedObjectContext *managedObjectContext; + +/** + The queue on which to dispatch callbacks for asynchronous operations. When `nil`, the main queue is used. + + **Default**: `nil` + */ +@property (nonatomic, assign) dispatch_queue_t callbackQueue; + +///------------------------------------- +/// @name Loading and Flushing the Cache +///------------------------------------- + +/** + Loads the cache by finding all instances of the configured entity and building + an association between the value of the cached attribute's value and the + managed object ID for the object. + + @param completion A block to execute when the cache has finished loading. + */ +- (void)load:(void (^)(void))completion; + +/** + Flushes the cache by releasing all cache attribute value to managed object ID associations. + + @param completion A block to execute when the cache has finished flushing. + */ +- (void)flush:(void (^)(void))completion; + +///----------------------------- +/// @name Inspecting Cache State +///----------------------------- + +/** + A Boolean value indicating if the cache has loaded associations between cache attribute values and managed object ID's. + */ +@property (nonatomic, getter=isLoaded, readonly) BOOL loaded; + +/** + Returns a count of the total number of cached objects. + */ +@property (nonatomic, readonly) NSUInteger count; + +/** + Returns the total number of cached objects whose attributes match the values in the given dictionary of attribute values. + + @param attributeValues The value for the cache key attribute to retrieve a count of the objects with a matching value. + @return The number of objects in the cache with the given value for the cache attribute of the receiver. + */ +- (NSUInteger)countWithAttributeValues:(NSDictionary *)attributeValues; + +/** + Returns the number of unique attribute values contained within the receiver. + + @return The number of unique attribute values within the receiver. + */ +@property (nonatomic, readonly) NSUInteger countOfAttributeValues; + +/** + Returns a Boolean value that indicates whether a given object is present + in the cache. + + @param object An object. + @return YES if object is present in the cache, otherwise NO. + */ +- (BOOL)containsObject:(NSManagedObject *)object; + +/** + Returns a Boolean value that indicates whether one of more objects is present + in the cache with a given value of the cache key attribute. + + @param attributeValues The value with which to check the cache for objects with a matching value. + @return YES if one or more objects with the given value for the cache key attribute is present in the cache, otherwise NO. + */ +- (BOOL)containsObjectWithAttributeValues:(NSDictionary *)attributeValues; + +/** + Returns the first object with a matching value for the cache key attributes in a given managed object context. + + @param attributeValues A value for the cache key attribute. + @param context The managed object context to retrieve the object from. + @return An object with the value of attribute matching attributeValue or nil. + */ +- (NSManagedObject *)objectWithAttributeValues:(NSDictionary *)attributeValues inContext:(NSManagedObjectContext *)context; + +/** + Returns the collection of objects with a matching value for the cache key attribute in a given managed object context. + + @param attributeValues A value for the cache key attribute. + @param context The managed object context to retrieve the objects from. + @return An array of objects with the value of attribute matching attributeValue or an empty array. + */ +- (NSSet *)objectsWithAttributeValues:(NSDictionary *)attributeValues inContext:(NSManagedObjectContext *)context; + +///------------------------------ +/// @name Managing Cached Objects +///------------------------------ + +/** + Asynchronously adds a managed object to the cache. + + The object must be an instance of the cached entity. + + @param managedObjects The managed object to add to the cache. + @param completion An optional block to execute once the object has been added to the cache. + */ +- (void)addObjects:(NSSet *)managedObjects completion:(void (^)(void))completion; + +/** + Asynchronously removes a managed object from the cache. + + The object must be an instance of the cached entity. + + @param managedObjects The managed object to remove from the cache. + @param completion An optional block to execute once the object has been removed from the cache. + */ +- (void)removeObjects:(NSSet *)managedObjects completion:(void (^)(void))completion; + +@end + +/* + Deprecated in 0.20.1 + + All methods below now accept a completion block + */ +@interface RKEntityByAttributeCache (Deprecations) +- (void)load DEPRECATED_ATTRIBUTE; // use `load:` +- (void)flush DEPRECATED_ATTRIBUTE; // use `flush:` +- (void)addObject:(NSManagedObject *)object DEPRECATED_ATTRIBUTE; // use `addObjects:completion:` +- (void)removeObject:(NSManagedObject *)object DEPRECATED_ATTRIBUTE; // use `removeObjects:completion:` +@property (nonatomic, assign) BOOL monitorsContextForChanges DEPRECATED_ATTRIBUTE; // No longer applies. Consumers are responsible for context change monitoring. Handled by `RKInMemoryManagedObjectCache` +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKEntityByAttributeCache.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKEntityByAttributeCache.m new file mode 100644 index 0000000..06465d6 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKEntityByAttributeCache.m @@ -0,0 +1,430 @@ +// +// RKEntityByAttributeCache.m +// RestKit +// +// Created by Blake Watters on 5/1/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "NSManagedObject+RKAdditions.h" +#import "RKEntityByAttributeCache.h" +#import "RKPropertyInspector+CoreData.h" +#import "RKObjectUtilities.h" +#import "RKPropertyInspector.h" +#import "RKLog.h" + +// Set Logging Component +#undef RKLogComponent +#define RKLogComponent RKlcl_cRestKitCoreDataCache + +static id RKCacheKeyValueForEntityAttributeWithValue(NSEntityDescription *entity, NSString *attribute, id value) +{ + if ([value isKindOfClass:[NSString class]] || [value isEqual:[NSNull null]]) { + return value; + } + return [value respondsToSelector:@selector(stringValue)] ? [value stringValue] : value; +} + +static NSString *RKCacheKeyForEntityWithAttributeValues(NSEntityDescription *entity, NSDictionary *attributeValues) +{ + // Performance optimization + if ([attributeValues count] == 1) return [[[attributeValues allValues] lastObject] description]; + NSArray *sortedAttributes = [[attributeValues allKeys] sortedArrayUsingSelector:@selector(compare:)]; + NSMutableArray *sortedValues = [NSMutableArray arrayWithCapacity:[sortedAttributes count]]; + for (NSString *attributeName in sortedAttributes) { + id cacheKeyValue = RKCacheKeyValueForEntityAttributeWithValue(entity, attributeName, attributeValues[attributeName]); + [sortedValues addObject:cacheKeyValue]; + }; + + return [sortedValues componentsJoinedByString:@":"]; +} + +/* + This function recursively calculates a set of cache keys given a dictionary of attribute values. The basic premise is that we wish to decompose all arrays of values within the dictionary into a distinct cache key, as each object within the cache will appear for only one key. + */ +static NSArray *RKCacheKeysForEntityFromAttributeValues(NSEntityDescription *entity, NSDictionary *attributeValues) +{ + NSMutableArray *cacheKeys = [NSMutableArray array]; + NSSet *collectionKeys = [attributeValues keysOfEntriesPassingTest:^BOOL(id key, id obj, BOOL *stop) { + return RKObjectIsCollection(obj); + }]; + + if ([collectionKeys count] > 0) { + for (NSString *attributeName in collectionKeys) { + id attributeValue = attributeValues[attributeName]; + for (id value in attributeValue) { + NSMutableDictionary *mutableAttributeValues = [attributeValues mutableCopy]; + [mutableAttributeValues setValue:value forKey:attributeName]; + [cacheKeys addObjectsFromArray:RKCacheKeysForEntityFromAttributeValues(entity, mutableAttributeValues)]; + } + } + } else { + [cacheKeys addObject:RKCacheKeyForEntityWithAttributeValues(entity, attributeValues)]; + } + + return cacheKeys; +} + +@interface RKEntityByAttributeCache () +@property (nonatomic, strong) NSMutableDictionary *cacheKeysToObjectIDs; +#if OS_OBJECT_USE_OBJC +@property (nonatomic, strong) dispatch_queue_t queue; +#else +@property (nonatomic, assign) dispatch_queue_t queue; +#endif +@end + +@implementation RKEntityByAttributeCache + +- (instancetype)initWithEntity:(NSEntityDescription *)entity attributes:(NSArray *)attributeNames managedObjectContext:(NSManagedObjectContext *)context +{ + NSParameterAssert(entity); + NSParameterAssert(attributeNames); + NSParameterAssert(context); + + self = [self init]; + if (self) { + _entity = entity; + _attributes = attributeNames; + _managedObjectContext = context; + NSString *queueName = [[NSString alloc] initWithFormat:@"%@.%p", @"org.restkit.core-data.entity-by-attribute-cache", self]; + self.queue = dispatch_queue_create([queueName UTF8String], DISPATCH_QUEUE_CONCURRENT); + } + + return self; +} + +- (void)dealloc +{ +#if !OS_OBJECT_USE_OBJC + dispatch_release(_queue); + _queue = NULL; +#endif + _callbackQueue = NULL; +} + +- (NSUInteger)count +{ + __block NSUInteger count; + dispatch_sync(self.queue, ^{ + count = [[[self.cacheKeysToObjectIDs allValues] valueForKeyPath:@"@sum.@count"] integerValue]; + }); + return count; +} + +- (NSUInteger)countOfAttributeValues +{ + __block NSUInteger count; + dispatch_sync(self.queue, ^{ + count = [self.cacheKeysToObjectIDs count]; + }); + return count; +} + +- (NSUInteger)countWithAttributeValues:(NSDictionary *)attributeValues +{ + return [[self objectsWithAttributeValues:attributeValues inContext:self.managedObjectContext] count]; +} + +- (void)load:(void (^)(void))completion +{ + NSExpressionDescription* objectIDExpression = [NSExpressionDescription new]; + objectIDExpression.name = @"objectID"; + objectIDExpression.expression = [NSExpression expressionForEvaluatedObject]; + objectIDExpression.expressionResultType = NSObjectIDAttributeType; + + // NOTE: `NSDictionaryResultType` does NOT support fetching pending changes. Pending objects must be manually added to the cache via `addObject:`. + NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; + fetchRequest.entity = self.entity; + fetchRequest.resultType = NSDictionaryResultType; + fetchRequest.propertiesToFetch = [self.attributes arrayByAddingObject:objectIDExpression]; + + [self.managedObjectContext performBlock:^{ + NSError *error = nil; + NSArray *dictionaries; + @try { + dictionaries = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; + } @catch (NSException *exception) { + NSLog(@"%@", exception.reason); + } + if (dictionaries) { + RKLogDebug(@"Retrieved %ld dictionaries for cachable `NSManagedObjectID` objects with fetch request: %@", (long) [dictionaries count], fetchRequest); + } else { + RKLogWarning(@"Failed to load entity cache. Failed to execute fetch request: %@", fetchRequest); + RKLogCoreDataError(error); + } + + dispatch_barrier_async(self.queue, ^{ + RKLogDebug(@"Loading entity cache for Entity '%@' by attributes '%@' in managed object context %@ (concurrencyType = %ld)", + self.entity.name, self.attributes, self.managedObjectContext, (unsigned long)self.managedObjectContext.concurrencyType); + self.cacheKeysToObjectIDs = [NSMutableDictionary dictionary]; + for (NSDictionary *dictionary in dictionaries) { + NSManagedObjectID *objectID = dictionary[@"objectID"]; + NSDictionary *attributeValues = [dictionary dictionaryWithValuesForKeys:self.attributes]; + [self cacheObjectID:objectID forAttributeValues:attributeValues]; + } + + if (completion) dispatch_async(self.callbackQueue ?: dispatch_get_main_queue(), completion); + }); + }]; +} + +- (void)flush:(void (^)(void))completion +{ + dispatch_barrier_async(self.queue, ^{ + RKLogDebug(@"Flushing entity cache for Entity '%@' by attributes '%@'", self.entity.name, self.attributes); + self.cacheKeysToObjectIDs = nil; + if (completion) dispatch_async(self.callbackQueue ?: dispatch_get_main_queue(), completion); + }); +} + +- (BOOL)isLoaded +{ + __block BOOL isLoaded; + dispatch_sync(self.queue, ^{ + isLoaded = (self.cacheKeysToObjectIDs != nil); + }); + return isLoaded; +} + +- (NSManagedObject *)objectForObjectID:(NSManagedObjectID *)objectID inContext:(NSManagedObjectContext *)context +{ + /** + NOTE: + + We use `existingObjectWithID:` as opposed to `objectWithID:` as `objectWithID:` can return us a fault + that will raise an exception when fired. `objectRegisteredForID:` is also an acceptable approach. + */ + __block NSError *error = nil; + __block NSManagedObject *object; + [context performBlockAndWait:^{ + object = [context existingObjectWithID:objectID error:&error]; + // Don't return the object if it has been deleted. + if ([object isDeleted]) object = nil; + }]; + if (! object) { + // Referential integrity errors often indicates that the temporary objectID does not exist in the specified context + if (error && !([objectID isTemporaryID] && [error code] == NSManagedObjectReferentialIntegrityError)) { + RKLogError(@"Failed to retrieve managed object with ID %@. Error %@\n%@", objectID, [error localizedDescription], [error userInfo]); + } + } + return object; +} + +- (NSManagedObject *)objectWithAttributeValues:(NSDictionary *)attributeValues inContext:(NSManagedObjectContext *)context +{ + NSSet *objects = [self objectsWithAttributeValues:attributeValues inContext:context]; + return ([objects count] > 0) ? [objects anyObject] : nil; +} + +- (NSSet *)objectsWithAttributeValues:(NSDictionary *)attributeValues inContext:(NSManagedObjectContext *)context +{ + NSMutableSet *objects = [NSMutableSet set]; + NSArray *cacheKeys = RKCacheKeysForEntityFromAttributeValues(self.entity, attributeValues); + for (NSString *cacheKey in cacheKeys) { + __block NSSet *objectIDs = nil; + dispatch_sync(self.queue, ^{ + objectIDs = [[NSSet alloc] initWithSet:(self.cacheKeysToObjectIDs)[cacheKey] copyItems:YES]; + }); + if ([objectIDs count]) { + /** + NOTE: + In my benchmarking, retrieving the objects one at a time using existingObjectWithID: is significantly faster + than issuing a single fetch request against all object ID's. + */ + for (NSManagedObjectID *objectID in objectIDs) { + NSManagedObject *object = [self objectForObjectID:objectID inContext:context]; + if (object) { + [objects addObject:object]; + } else { + RKLogDebug(@"Evicting objectID association for attributes %@ of Entity '%@': %@", attributeValues, self.entity.name, objectID); + [self evictObjectID:objectID forAttributeValues:attributeValues]; + } + } + } + } + return objects; +} + +- (void)cacheObjectID:(NSManagedObjectID *)objectID forAttributeValues:(NSDictionary *)attributeValues +{ + NSParameterAssert(objectID); + NSParameterAssert(attributeValues); + NSString *cacheKey = RKCacheKeyForEntityWithAttributeValues(self.entity, attributeValues); + NSMutableSet *objectIDs = (self.cacheKeysToObjectIDs)[cacheKey]; + if (objectIDs) { + if (! [objectIDs containsObject:objectID]) { + [objectIDs addObject:objectID]; + } + } else { + objectIDs = [NSMutableSet setWithObject:objectID]; + } + + if (nil == self.cacheKeysToObjectIDs) self.cacheKeysToObjectIDs = [NSMutableDictionary dictionary]; + [self.cacheKeysToObjectIDs setValue:objectIDs forKey:cacheKey]; +} + +- (void)deleteObjectID:(NSManagedObjectID *)objectID forAttributeValues:(NSDictionary *)attributeValues +{ + NSParameterAssert(objectID); + NSParameterAssert(attributeValues); + NSArray *cacheKeys = RKCacheKeysForEntityFromAttributeValues(self.entity, attributeValues); + for (NSString *cacheKey in cacheKeys) { + NSMutableSet *objectIDs = (self.cacheKeysToObjectIDs)[cacheKey]; + if (objectIDs && [objectIDs containsObject:objectID]) { + [objectIDs removeObject:objectID]; + } + } +} + +- (void)evictObjectID:(NSManagedObjectID *)objectID forAttributeValues:(NSDictionary *)attributeValues +{ + if (attributeValues && [attributeValues count]) { + NSArray *cacheKeys = RKCacheKeysForEntityFromAttributeValues(self.entity, attributeValues); + dispatch_barrier_async(self.queue, ^{ + for (NSString *cacheKey in cacheKeys) { + NSMutableSet *objectIDs = (self.cacheKeysToObjectIDs)[cacheKey]; + if (objectIDs && [objectIDs containsObject:objectID]) { + [objectIDs removeObject:objectID]; + } + } + }); + } else { + RKLogWarning(@"Unable to remove object for object ID %@: empty values dictionary for attributes '%@'", objectID, self.attributes); + } +} + +- (void)addObjects:(NSSet *)managedObjects completion:(void (^)(void))completion +{ + if ([managedObjects count] == 0) { + if (completion) dispatch_async(self.callbackQueue ?: dispatch_get_main_queue(), completion); + return; + } + __block NSEntityDescription *entity; + __block NSDictionary *attributeValues; + __block NSManagedObjectID *objectID; + NSManagedObjectContext *managedObjectContext = [[managedObjects anyObject] managedObjectContext]; + [managedObjectContext performBlockAndWait:^{ + NSMutableDictionary *newObjectIDsToAttributeValues = [NSMutableDictionary dictionaryWithCapacity:[managedObjects count]]; + for (NSManagedObject *managedObject in managedObjects) { + entity = managedObject.entity; + objectID = [managedObject objectID]; + attributeValues = [managedObject dictionaryWithValuesForKeys:self.attributes]; + + NSAssert([entity isKindOfEntity:self.entity], @"Cannot add object with entity '%@' to cache for entity of '%@'", [entity name], [self.entity name]); + newObjectIDsToAttributeValues[objectID] = attributeValues; + } + + if ([newObjectIDsToAttributeValues count]) { + dispatch_barrier_async(self.queue, ^{ + [newObjectIDsToAttributeValues enumerateKeysAndObjectsUsingBlock:^(NSManagedObjectID *objectID, NSDictionary *attributeValues, BOOL *stop) { + [self cacheObjectID:objectID forAttributeValues:attributeValues]; + }]; + + if (completion) dispatch_async(self.callbackQueue ?: dispatch_get_main_queue(), completion); + }); + } else { + if (completion) dispatch_async(self.callbackQueue ?: dispatch_get_main_queue(), completion); + } + }]; +} + +- (void)removeObjects:(NSSet *)managedObjects completion:(void (^)(void))completion +{ + if ([managedObjects count] == 0) { + if (completion) dispatch_async(self.callbackQueue ?: dispatch_get_main_queue(), completion); + return; + } + __block NSEntityDescription *entity; + __block NSDictionary *attributeValues; + __block NSManagedObjectID *objectID; + NSManagedObjectContext *managedObjectContext = [[managedObjects anyObject] managedObjectContext]; + [managedObjectContext performBlock:^{ + NSMutableDictionary *deletedObjectIDsToAttributeValues = [NSMutableDictionary dictionaryWithCapacity:[managedObjects count]]; + for (NSManagedObject *managedObject in managedObjects) { + entity = managedObject.entity; + objectID = [managedObject objectID]; + attributeValues = [managedObject dictionaryWithValuesForKeys:self.attributes]; + + NSAssert([entity isKindOfEntity:self.entity], @"Cannot remove object with entity '%@' from cache for entity of '%@'", [entity name], [self.entity name]); + deletedObjectIDsToAttributeValues[objectID] = attributeValues; + } + + if ([deletedObjectIDsToAttributeValues count]) { + dispatch_barrier_async(self.queue, ^{ + [deletedObjectIDsToAttributeValues enumerateKeysAndObjectsUsingBlock:^(NSManagedObjectID *objectID, NSDictionary *attributeValues, BOOL *stop) { + [self deleteObjectID:objectID forAttributeValues:attributeValues]; + }]; + + if (completion) dispatch_async(self.callbackQueue ?: dispatch_get_main_queue(), completion); + }); + } else { + if (completion) dispatch_async(self.callbackQueue ?: dispatch_get_main_queue(), completion); + } + }]; +} + +- (BOOL)containsObjectWithAttributeValues:(NSDictionary *)attributeValues +{ + return [[self objectsWithAttributeValues:attributeValues inContext:self.managedObjectContext] count] > 0; +} + +- (BOOL)containsObject:(NSManagedObject *)object +{ + __block NSArray *allObjectIDs = nil; + dispatch_sync(self.queue, ^{ + allObjectIDs = [[self.cacheKeysToObjectIDs allValues] valueForKeyPath:@"@distinctUnionOfSets.self"]; + }); + return [allObjectIDs containsObject:object.objectID]; +} + +@end + +@implementation RKEntityByAttributeCache (Deprecations) + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-implementations" + +- (void)load DEPRECATED_ATTRIBUTE +{ + [self load:nil]; +} + +- (void)flush DEPRECATED_ATTRIBUTE +{ + [self flush:nil]; +} + +- (void)addObject:(NSManagedObject *)object DEPRECATED_ATTRIBUTE +{ + [self addObjects:[NSSet setWithObject:object] completion:nil]; +} + +- (void)removeObject:(NSManagedObject *)object DEPRECATED_ATTRIBUTE +{ + [self removeObjects:[NSSet setWithObject:object] completion:nil]; +} + +- (void)setMonitorsContextForChanges:(BOOL)monitorsContextForChanges DEPRECATED_ATTRIBUTE +{} + +- (BOOL)monitorsContextForChanges DEPRECATED_ATTRIBUTE +{ + return NO; +} + +#pragma clang diagnostic pop + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKEntityCache.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKEntityCache.h new file mode 100644 index 0000000..82bcb91 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKEntityCache.h @@ -0,0 +1,182 @@ +// +// RKEntityCache.h +// RestKit +// +// Created by Blake Watters on 5/2/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import + +@class RKEntityByAttributeCache; + +/** + Instances of `RKEntityCache` provide an in-memory caching mechanism for objects in a Core Data managed object context. Managed objects can be cached by attribute for fast retrieval without repeatedly hitting the Core Data persistent store. This can provide a substantial speed advantage over issuing fetch requests in cases where repeated look-ups of the same data are performed using a small set of attributes as the query key. Internally, the cache entries are maintained as references to the `NSManagedObjectID` of corresponding cached objects. + */ +@interface RKEntityCache : NSObject + +///----------------------------- +/// @name Initializing the Cache +///----------------------------- + +/** + Initializes the receiver with a managed object context containing the entity instances to be cached. + + @param context The managed object context containing objects to be cached. + @returns The receiver, initialized with the given context. + */ +- (instancetype)initWithManagedObjectContext:(NSManagedObjectContext *)context NS_DESIGNATED_INITIALIZER; + +/** + The managed object context with which the receiver is associated. + */ +@property (nonatomic, strong, readonly) NSManagedObjectContext *managedObjectContext; + +///------------------------------------- +/// @name Configuring the Callback Queue +///------------------------------------- + +/** + The queue on which to dispatch callbacks for asynchronous operations. When `nil`, the main queue is used. + + **Default**: `nil` + */ +@property (nonatomic, assign) dispatch_queue_t callbackQueue; + +///------------------------------------ +/// @name Caching Objects by Attributes +///------------------------------------ + +/** + Caches all instances of an entity using the value for an attribute as the cache key. + + @param entity The entity to cache all instances of. + @param attributeNames The attributes to cache the instances by. + */ +- (void)cacheObjectsForEntity:(NSEntityDescription *)entity byAttributes:(NSArray *)attributeNames completion:(void (^)(void))completion; + +/** + Returns a Boolean value indicating if all instances of an entity have been cached by a given attribute name. + + @param entity The entity to check the cache status of. + @param attributeNames The attributes to check the cache status with. + @return YES if the cache has been loaded with instances with the given attribute, else NO. + */ +- (BOOL)isEntity:(NSEntityDescription *)entity cachedByAttributes:(NSArray *)attributeNames; + +/** + Retrieves the first cached instance of a given entity where the specified attribute matches the given value. + + @param entity The entity to search the cache for instances of. + @param attributeValues The attribute values return a match for. + @param context The managed object from which to retrieve the cached results. + @return A matching managed object instance or nil. + @raise NSInvalidArgumentException Raised if instances of the entity and attribute have not been cached. + */ +- (NSManagedObject *)objectForEntity:(NSEntityDescription *)entity withAttributeValues:(NSDictionary *)attributeValues inContext:(NSManagedObjectContext *)context; + +/** + Retrieves all cached instances of a given entity where the specified attribute matches the given value. + + @param entity The entity to search the cache for instances of. + @param attributeValues The attribute values return a match for. + @param context The managed object from which to retrieve the cached results. + @return All matching managed object instances or nil. + @raise NSInvalidArgumentException Raised if instances of the entity and attribute have not been cached. + */ +- (NSSet *)objectsForEntity:(NSEntityDescription *)entity withAttributeValues:(NSDictionary *)attributeValues inContext:(NSManagedObjectContext *)context; + +///----------------------------------------------------------------------------- +// @name Accessing Underlying Caches +///----------------------------------------------------------------------------- + +/** + Retrieves the underlying entity attribute cache for a given entity and attribute. + + @param entity The entity to retrieve the entity attribute cache object for. + @param attributeNames The attribute to retrieve the entity attribute cache object for. + @return The entity attribute cache for the given entity and attribute, or nil if none was found. + */ +- (RKEntityByAttributeCache *)attributeCacheForEntity:(NSEntityDescription *)entity attributes:(NSArray *)attributeNames; + +/** + Retrieves all entity attributes caches for a given entity. + + @param entity The entity to retrieve the collection of entity attribute caches for. + @return An array of entity attribute cache objects for the given entity or an empty array if none were found. + */ +- (NSArray *)attributeCachesForEntity:(NSEntityDescription *)entity; + +///----------------------------------------------------------------------------- +// @name Managing the Cache +///----------------------------------------------------------------------------- + +/** + Flushes the entity cache by sending a flush message to each entity attribute cache contained within the receiver. + + @param completion An optional block to be executed when the flush has completed. + @see [RKEntityByAttributeCache flush] + */ +- (void)flush:(void (^)(void))completion; + +/** + Adds the given set of objects to all entity attribute caches for the object's entity contained within the receiver. + + @param objects The set of objects to add to the appropriate entity attribute caches. + @param completion An optional block to be executed when the object addition has completed. + */ +- (void)addObjects:(NSSet *)objects completion:(void (^)(void))completion; + +/** + Removes the given set of objects from all entity attribute caches for the object's entity contained within the receiver. + + @param objects The set of objects to remove from the appropriate entity attribute caches. + @param completion An optional block to be executed when the object removal has completed. + */ +- (void)removeObjects:(NSSet *)objects completion:(void (^)(void))completion; + +/** + Returns a Boolean value that indicates if the receiver contains the given object in any of its attribute caches. + + @param managedObject The object to check for. + @return `YES` if the receiver contains the given object in one or more of its caches, else `NO`. + */ +- (BOOL)containsObject:(NSManagedObject *)managedObject; + +/** + Call this before beginning a sequence of operations that require the cache not to be flushed. + + This is used by RKInMemoryManagedObjectCache to workaround https://github.com/RestKit/RestKit/issues/1613 . + + @see endAccessing + */ +- (void)beginAccessing; + +/** + Call this after completing a sequence of operations that require the cache not to be flushed. + + This is used by RKInMemoryManagedObjectCache to workaround https://github.com/RestKit/RestKit/issues/1613 . + + @see beginAccessing + */ +- (void)endAccessing; + +@end + +// Deprecated in v0.20.1 +@interface RKEntityCache (Deprecations) +- (void)addObject:(NSManagedObject *)object DEPRECATED_ATTRIBUTE; // use `addObjects:completion:` +- (void)removeObject:(NSManagedObject *)object DEPRECATED_ATTRIBUTE; // use `removeObjects:completion:` +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKEntityCache.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKEntityCache.m new file mode 100644 index 0000000..0f38c88 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKEntityCache.m @@ -0,0 +1,296 @@ +// +// RKEntityCache.m +// RestKit +// +// Created by Blake Watters on 5/2/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import +#if TARGET_OS_IPHONE +#import +#endif + +#import "RKEntityByAttributeCache.h" +#import "RKEntityCache.h" + +@interface RKEntityCache () +@property (nonatomic, strong) NSMutableSet *attributeCaches; +@property (nonatomic, strong) NSLock *accessLock; +@property (nonatomic, strong) NSMutableArray *pendingFlushCompletionBlocks; +@property (nonatomic) NSInteger accessCount; +@end + +@implementation RKEntityCache + +- (instancetype)initWithManagedObjectContext:(NSManagedObjectContext *)context +{ + NSAssert(context, @"Cannot initialize entity cache with a nil context"); + self = [super init]; + if (self) { + _managedObjectContext = context; + _attributeCaches = [[NSMutableSet alloc] init]; + _accessLock = [NSLock new]; + _pendingFlushCompletionBlocks = [NSMutableArray new]; + +#if TARGET_OS_IPHONE + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(didReceiveMemoryWarning:) + name:UIApplicationDidReceiveMemoryWarningNotification + object:nil]; +#endif + } + + return self; +} + +- (instancetype)init +{ + return [self initWithManagedObjectContext:nil]; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (void)cacheObjectsForEntity:(NSEntityDescription *)entity byAttributes:(NSArray *)attributeNames completion:(void (^)(void))completion +{ + NSParameterAssert(entity); + NSParameterAssert(attributeNames); + RKEntityByAttributeCache *attributeCache = [self attributeCacheForEntity:entity attributes:attributeNames]; + if (attributeCache && !attributeCache.isLoaded) { + [attributeCache load:completion]; + } else { + attributeCache = [[RKEntityByAttributeCache alloc] initWithEntity:entity attributes:attributeNames managedObjectContext:self.managedObjectContext]; + attributeCache.callbackQueue = self.callbackQueue; + [attributeCache load:completion]; + [self.attributeCaches addObject:attributeCache]; + } +} + +- (BOOL)isEntity:(NSEntityDescription *)entity cachedByAttributes:(NSArray *)attributeNames +{ + NSParameterAssert(entity); + NSParameterAssert(attributeNames); + RKEntityByAttributeCache *attributeCache = [self attributeCacheForEntity:entity attributes:attributeNames]; + return (attributeCache && attributeCache.isLoaded); +} + +- (NSManagedObject *)objectForEntity:(NSEntityDescription *)entity withAttributeValues:(NSDictionary *)attributeValues inContext:(NSManagedObjectContext *)context +{ + NSParameterAssert(entity); + NSParameterAssert(attributeValues); + NSParameterAssert(context); + RKEntityByAttributeCache *attributeCache = [self attributeCacheForEntity:entity attributes:[attributeValues allKeys]]; + if (attributeCache) { + return [attributeCache objectWithAttributeValues:attributeValues inContext:context]; + } + + return nil; +} + +- (NSSet *)objectsForEntity:(NSEntityDescription *)entity withAttributeValues:(NSDictionary *)attributeValues inContext:(NSManagedObjectContext *)context +{ + NSParameterAssert(entity); + NSParameterAssert(attributeValues); + NSParameterAssert(context); + RKEntityByAttributeCache *attributeCache = [self attributeCacheForEntity:entity attributes:[attributeValues allKeys]]; + if (attributeCache) { + return [attributeCache objectsWithAttributeValues:attributeValues inContext:context]; + } + + return [NSSet set]; +} + +- (RKEntityByAttributeCache *)attributeCacheForEntity:(NSEntityDescription *)entity attributes:(NSArray *)attributeNames +{ + NSParameterAssert(entity); + NSParameterAssert(attributeNames); + for (RKEntityByAttributeCache *cache in [self.attributeCaches copy]) { + if ([cache.entity isEqual:entity] && [cache.attributes isEqualToArray:attributeNames]) { + return cache; + } + } + + return nil; +} + +- (NSSet *)attributeCachesForEntity:(NSEntityDescription *)entity +{ + NSAssert(entity, @"Cannot retrieve attribute caches for a nil entity"); + NSMutableSet *set = [NSMutableSet set]; + for (RKEntityByAttributeCache *cache in [self.attributeCaches copy]) { + if ([cache.entity isEqual:entity]) { + [set addObject:cache]; + } + } + + return [NSSet setWithSet:set]; +} + +- (void)waitForDispatchGroup:(dispatch_group_t)dispatchGroup withCompletionBlock:(void (^)(void))completion +{ + if (completion) { + dispatch_group_notify(dispatchGroup, self.callbackQueue ?: dispatch_get_main_queue(), ^{ +#if !OS_OBJECT_USE_OBJC + dispatch_release(dispatchGroup); +#endif + completion(); + }); + } +} + +- (void)flush:(void (^)(void))completion +{ + [_accessLock lock]; + if (_accessCount == 0) { + [self _flushNow:^{ + [self->_accessLock unlock]; + if (completion) completion(); + }]; + } else { + [_pendingFlushCompletionBlocks addObject:completion ?: ^{}]; + [_accessLock unlock]; + } +} + +- (void)_flushNow:(void (^)(void))completion +{ + dispatch_group_t dispatchGroup = completion ? dispatch_group_create() : NULL; + for (RKEntityByAttributeCache *cache in self.attributeCaches) { + if (dispatchGroup) dispatch_group_enter(dispatchGroup); + [cache flush:^{ + if (dispatchGroup) dispatch_group_leave(dispatchGroup); + }]; + } + if (dispatchGroup) [self waitForDispatchGroup:dispatchGroup withCompletionBlock:completion]; +} + +- (void)addObject:(NSManagedObject *)object completion:(void (^)(void))completion +{ + NSAssert(object, @"Cannot add a nil object to the cache"); + dispatch_group_t dispatchGroup = completion ? dispatch_group_create() : NULL; + NSArray *attributeCaches = [self attributeCachesForEntity:object.entity]; + NSSet *objects = [NSSet setWithObject:object]; + for (RKEntityByAttributeCache *cache in attributeCaches) { + if (dispatchGroup) dispatch_group_enter(dispatchGroup); + [cache addObjects:objects completion:^{ + if (dispatchGroup) dispatch_group_leave(dispatchGroup); + }]; + } + if (dispatchGroup) [self waitForDispatchGroup:dispatchGroup withCompletionBlock:completion]; +} + +- (void)removeObject:(NSManagedObject *)object completion:(void (^)(void))completion +{ + NSAssert(object, @"Cannot remove a nil object from the cache"); + NSArray *attributeCaches = [self attributeCachesForEntity:object.entity]; + NSSet *objects = [NSSet setWithObject:object]; + dispatch_group_t dispatchGroup = completion ? dispatch_group_create() : NULL; + for (RKEntityByAttributeCache *cache in attributeCaches) { + if (dispatchGroup) dispatch_group_enter(dispatchGroup); + [cache removeObjects:objects completion:^{ + if (dispatchGroup) dispatch_group_leave(dispatchGroup); + }]; + } + if (dispatchGroup) [self waitForDispatchGroup:dispatchGroup withCompletionBlock:completion]; +} + +- (void)addObjects:(NSSet *)objects completion:(void (^)(void))completion +{ + dispatch_group_t dispatchGroup = completion ? dispatch_group_create() : NULL; + NSSet *distinctEntities = [objects valueForKeyPath:@"entity"]; + for (NSEntityDescription *entity in distinctEntities) { + NSArray *attributeCaches = [self attributeCachesForEntity:entity]; + if ([attributeCaches count]) { + NSMutableSet *objectsToAdd = [NSMutableSet set]; + for (NSManagedObject *managedObject in objects) { + if ([managedObject.entity isEqual:entity]) [objectsToAdd addObject:managedObject]; + } + for (RKEntityByAttributeCache *cache in attributeCaches) { + if (dispatchGroup) dispatch_group_enter(dispatchGroup); + [cache addObjects:objectsToAdd completion:^{ + if (dispatchGroup) dispatch_group_leave(dispatchGroup); + }]; + } + } + } + if (dispatchGroup) [self waitForDispatchGroup:dispatchGroup withCompletionBlock:completion]; +} + +- (void)removeObjects:(NSSet *)objects completion:(void (^)(void))completion +{ + dispatch_group_t dispatchGroup = completion ? dispatch_group_create() : NULL; + NSSet *distinctEntities = [objects valueForKeyPath:@"entity"]; + for (NSEntityDescription *entity in distinctEntities) { + NSArray *attributeCaches = [self attributeCachesForEntity:entity]; + if ([attributeCaches count]) { + NSMutableSet *objectsToRemove = [NSMutableSet set]; + for (NSManagedObject *managedObject in objects) { + if ([managedObject.entity isEqual:entity]) [objectsToRemove addObject:managedObject]; + } + for (RKEntityByAttributeCache *cache in attributeCaches) { + if (dispatchGroup) dispatch_group_enter(dispatchGroup); + [cache removeObjects:objectsToRemove completion:^{ + if (dispatchGroup) dispatch_group_leave(dispatchGroup); + }]; + } + } + } + if (dispatchGroup) [self waitForDispatchGroup:dispatchGroup withCompletionBlock:completion]; +} + +- (BOOL)containsObject:(NSManagedObject *)managedObject +{ + for (RKEntityByAttributeCache *attributeCache in [self attributeCachesForEntity:managedObject.entity]) { + if ([attributeCache containsObject:managedObject]) return YES; + } + + return NO; +} + +- (void)beginAccessing +{ + [_accessLock lock]; + _accessCount += 1; + [_accessLock unlock]; +} + +- (void)endAccessing +{ + [_accessLock lock]; + _accessCount -= 1; + if (_accessCount == 0 && _pendingFlushCompletionBlocks.count > 0) { + [self _flushNow:^{ + NSArray *blocks = [self->_pendingFlushCompletionBlocks copy]; + [self->_pendingFlushCompletionBlocks removeAllObjects]; + [self->_accessLock unlock]; + for (dispatch_block_t block in blocks) { + block(); + } + }]; + } else { + [_accessLock unlock]; + } + +} + +- (void)didReceiveMemoryWarning:(NSNotification *)notification +{ + [self flush:nil]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKEntityMapping.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKEntityMapping.h new file mode 100644 index 0000000..8cbfb52 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKEntityMapping.h @@ -0,0 +1,316 @@ +// +// RKEntityMapping.h +// RestKit +// +// Created by Blake Watters on 5/31/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import +#import "RKObjectMapping.h" +#import "RKConnectionDescription.h" +#import "RKMacros.h" + +@class RKManagedObjectStore; + +/** + `RKEntityMapping` objects model an object mapping with a Core Data destination entity. + + ## Entity Identification + + One of the fundamental problems when object mapping representations into Core Data entities is determining if a new object should be created or an existing object should be updated. In an entity mapping, one or more attributes can be designated as being used for identification purposes via the `identificationAttributes` property. Typically the values of these attributes are populated by attribute mappings. It is common practice to use a single attribute corresponding to the primary key of the remote resource being mapped, but an arbitrary number of attributes may be specified for identification. Identifying attributes have all type transformations support by the mapper applied before the managed object context is searched, supporting such use-cases as using an `NSDate` as an identifying attribute whose value is mapped from an `NSString`. Identified objects can be further constrained by configuring an identification predicate via the `identificationPredicate` property. The predicate is applied after the managed object has been searched. + + ### Identification Inference + + The `RKEntityMapping` class provides support for inferring identification attributes from the managed object model. When inference is enabled (the default state), the entity is searched for several commonly used identifying attributes and if any is found, the value of the `identificationAttributes` property is automatically configured. Inference is performed by the `RKIdentificationAttributesInferredFromEntity` function. + + When `RKIdentificationAttributesInferredFromEntity` is invoked, the entity is first checked for a user info key specifying the identifying attributes. If the user info of the given entity contains a value for the key 'RKEntityIdentificationAttributes', then that value is used to construct an array of attributes. The user info key must contain a string or an array of strings specifying the names of attributes that exist in the given entity. + + If no attributes are specified in the user info, then the entity is searched for an attribute whose name matches the llama-cased or snake-cased name of the entity. For example, an entity named 'Article' would have an inferred identifying attributes of 'articleID' and 'article_id', and an entity named 'ApprovedComment' would be inferred as 'approvedCommentID' and 'approved_comment_id'. If such an attribute is found within the entity, an array is returned containing the attribute. If none is returned, the the attributes are searched for the following names: + + 1. 'identifier' + 1. 'id' + 1. 'ID' + 1. 'URL' + 1. 'url' + + If any of these attributes are found, then an array is returned containing the attribute. If all possible inferred attributes are exhausted, then `nil` is returned. + + Note that inference will only return a single attribute. Compound attributes must be configured manually via the `identificationAttributes` property. + + ## Connecting Relationships + + When modeling an API into Core Data representation, a common problem is that managed objects that are semantically related are loaded across discrete requests, leaving the Core Data relationships empty. The `RKConnectionDescription` class provides a means for expressing a connection between entities using corresponding attribute values or by key path. Please refer to the documentation accompanying the `RKConnectionDescription` class and the `addConnectionForRelationship:connectedBy:` method of this class. + + @see `RKConnectionDescription` + */ +@interface RKEntityMapping : RKObjectMapping + +///----------------------------------------------------------------------------- +/// @name Initializing an Entity Mapping +///----------------------------------------------------------------------------- + +/** + Initializes the receiver with a given entity. + + @param entity An entity with which to initialize the receiver. + @returns The receiver, initialized with the given entity. + */ +- (instancetype)initWithEntity:(NSEntityDescription *)entity; + +/** + A convenience initializer that creates and returns an entity mapping for the entity with the given name in + the managed object model of the given managed object store. + + This method is functionally equivalent to the following example code: + + NSEntityDescription *entity = [[managedObjectStore.managedObjectModel entitiesByName] objectForKey:entityName]; + return [RKEntityMapping mappingForEntity:entity]; + + @param entityName The name of the entity in the managed object model for which an entity mapping is to be created. + @param managedObjectStore A managed object store containing the managed object model in which an entity with the given name is defined. + @return A new entity mapping for the entity with the given name in the managed object model of the given managed object store. + */ ++ (instancetype)mappingForEntityForName:(NSString *)entityName inManagedObjectStore:(RKManagedObjectStore *)managedObjectStore; + +///--------------------------- +/// @name Accessing the Entity +///--------------------------- + +/** + The Core Data entity description used for this object mapping + */ +@property (nonatomic, strong) NSEntityDescription *entity; + +///------------------------------------------------ +/// @name Configuring Managed Object Identification +///------------------------------------------------ + +/** + The array of `NSAttributeDescription` objects specifying the attributes of the receiver's entity that are used during mapping to determine whether an existing object should be updated or a new managed object should be inserted. Please see the "Entity Identification" section of this document for more information. + + @return An array of identifying attributes or `nil` if none have been configured. + @raises NSInvalidArgumentException Raised if the setter is invoked with the name of an attribute or an `NSAttributeDescription` that does not exist in the receiver's entity. Also raised if the setter is invoked with an empty array. + @warning Note that for convenience, this property may be set with an array containing `NSAttributeDescription` objects or `NSString` objects specifying the names of attributes that exist within the receiver's entity. The getter will always return an array of `NSAttributeDescription` objects. + */ +@property (nonatomic, copy) NSArray *identificationAttributes; + +/** + An optional predicate used to filter identified objects during mapping. + + @return The identification predicate. + */ +@property (nonatomic, copy) NSPredicate *identificationPredicate; + +/** + An optional block which returns a predicate used to filter identified objects during mapping. + + @return The identification predicate block. + */ +@property (nonatomic, copy) NSPredicate *(^identificationPredicateBlock)(NSDictionary *representation, NSManagedObjectContext *managedObjectContext); + +/** + An optional attribute of the receiver's entity that can be used to detect modification of a given instance. This is used to improve the performance of mapping operations by skipping the property mappings for a given object if it is found to be not modified. + + A common modification attribute is a 'last modified' or 'updated at' timestamp that specifies the timestamp of the last change to an object. When the `modificationAttribute` is non-nil, the mapper will compare the value returned of the attribute on an existing object instance with the value in the representation being mapped. + + The semantics of the comparison are dependent on the data type of the modification attribute. If the attribute is a string, then the values are compared for equality. If the attribute is a date or a numeric value, then the values will be compared numerically and mapping will be skipped unless the value in the representation is greater than the value of the modification attribute stored on the object. + + @raises NSInvalidArgumentException Raised if the attribute given is not a property of the receiver's entity. + */ +@property (nonatomic, strong) NSAttributeDescription *modificationAttribute; + +/** + If this is YES, mapping operations will map relationships of the object even if the `modificationAttribute` shows that the object has not been modified. + + This is useful if a response contains a nested object that has been updated inside an object that has not. + + Defaults to NO. + */ +@property (nonatomic) BOOL shouldMapRelationshipsIfObjectIsUnmodified; + +/** + Sets the `modificationAttribute` to the receiver to the attribute with the specified name. + + The given name must correspond to the name of an attribute within the receiver's entity. + + @param attributeName The name of an attribute in the entity of the receiver. + @raises NSInvalidArgumentException Raised if no attribute could be found with the given name. + */ +- (void)setModificationAttributeForName:(NSString *)attributeName; + +///--------------------------------------------------------------- +/// @name Specifying a Persistent Store for Newly Inserted Objects +///--------------------------------------------------------------- + +/** + The persistent store in which new object instances mapped with the receiver should be inserted. + + If your application makes use of more than one persistent store (i.e. a combination of an in-memory store and a SQLite store), then it can be desirable to specify the persistent store in which newly created managed objects will be assigned. + + **Default**: `nil` + */ +@property (nonatomic, weak) NSPersistentStore *persistentStore; + +///------------------------------------------- +/// @name Configuring Relationship Connections +///------------------------------------------- + +/** + Returns the array of `RKConnectionDescripton` objects configured for connecting relationships during object mapping. + */ +@property (nonatomic, copy, readonly) NSArray *connections; + +/** + Adds a connection to the receiver. + + @param connection The connection to be added. + */ +- (void)addConnection:(RKConnectionDescription *)connection; + +/** + Removes a connection from the receiver. + + @param connection The connection to be removed. + */ +- (void)removeConnection:(RKConnectionDescription *)connection; + +/** + Adds a connection for the specified relationship connected using the attributes specified by the given `NSString`, `NSArray`, or `NSDictionary` object. + + This is a convenience method for flexibly adding a connection to the receiver. The relationship can be specified with by providing an `NSRelationshipDescription` object or an `NSString` specifying the name of the relationship to be connected. The connection specifier can be provided as an `NSString` object, an `NSArray` of `NSString` object, or an `NSDictionary` with `NSString` objects for the keys and values. The string objects specify the name of attributes within the entity and destination entity of the specified relationship. The `RKConnectionDescription` class models a connection as a dictionary in which the keys are `NSString` objects corresponding to the names of attributes in the source entity of the relationship being connected and the values are `NSString` objects corresponding to the names of attributes in the destination entity. + + When the `connectionSpecifier` is an `NSString` value, it is interpretted as the name of an attribute in the specified relationship's entity. The corresponding attribute in the destination entity is determined by invoking the source to destination key transformation block set via `[RKObjectMapping setSourceToDestinationKeyTransformationBlock:]`. If no transformation block is configured, then the destination attribute is assumed to have the same name as the source attribute. For example, consider a model in which there entities named 'User' and 'Project'. The 'User' entity has a to-many relationship to the 'Project' entity named 'projects'. Both the 'User' and the 'Project' entities contain an attribute named 'userID', which represents the value for the primary key of the 'User' in the API the application is communicating with. When the user's projects are loaded from the '/projects' endpoint, the user ID is sent down in the JSON representation of the Project objects as a numeric value. In order to establish a connection for the 'projects' relationship between the 'User' and 'Project' entities, we could add the connection like so: + + // JSON looks like {"project": { "name": "Project Name", "userID": 1234, "projectID": 1 } } + RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:@"Project" inManagedObjectStore:managedObjectStore]; + [mapping addAttributeMappingsFromArray:@[ @"name", @"userID", @"projectID" ]]; + + // Find a 'User' whose value for the 'userID' object is equal to the value stored on the 'userID' attribute of the 'Project' and assign it to the relationship + // In other words, "Find the User whose userID == 1234 and assign that object to the 'user' relationship" + [mapping addConnectionForRelationship:@"user" connectedBy:@"userID"]; + + When the connection is attempted to be established by an instance of `RKRelationshipConnectionOperation`, the value for the 'userID' attribute will be read from the Project (in this case, @1234) and the managed object context will be searched for a managed object for the 'User' entity with a corresponding value for its 'userID' attribute. + + When the `connectionSpecifier` is an `NSArray` object, it is interpretted as containing the names of attributes in the specified relationship's entity. Just as with a stirng value, the corresponding destination attributes are determined by invoking the source to destination key transformation block or they are assumed to have matching names. + + When the `connectionSpecifier` is an `NSDictionary` object, the keys are interpretted as containing the names of attributes on the source entity the values are interpretted as the names of attributes on the destination entity. For example: + + // Find the User whose userID is equal to the value stored on the 'createdByUserID' attribute + [mapping addConnectionForRelationship:@"createdByUser" connectedBy:@{ @"createdByUserID": @"userID" }]; + + @param relationshipOrName The relationship object or name of the relationship object that is to be connected. + @param connectionSpecifier An `NSString`, `NSArray`, or `NSDictionary` object specifying how the relationship is to be connected by matching attributes. + @see `RKConnectionDescription` + @see `[RKObjectMapping setSourceToDestinationKeyTransformationBlock:]` + */ +- (void)addConnectionForRelationship:(id)relationshipOrName connectedBy:(id)connectionSpecifier; + +/** + Returns the connection for the specified relationship. + + @param relationshipOrName The relationship object or name of the relationship object for which to retrieve the connection. + @return The connection object for the specified relationship or `nil` if none is configured. + */ +- (RKConnectionDescription *)connectionForRelationship:(id)relationshipOrName; + +///----------------------------- +/// @name Configuring Validation +///----------------------------- + +/** + A Boolean value that determines if newly created `NSManagedObject` instances mapped with the receiver should be discarded when they fail `validateForInsert:`. + + This property allows for the deletion of managed objects that fail validation such that `NSManagedObjectContext` save will complete successfully. Typically an invalid managed object in the graph will result in a failure to save the `NSManagedObjectContext` due to an NSValidation error. In some cases it is desirable to persist only the subset of objects that pass validation and discard the invalid content rather than failing the entire operation. Setting this property to `YES` will result in the deletion of in any newly created `NSManagedObject` instances that fail to return `YES` when sent the `validateForInsert:` message. + + **Default**: `NO` + */ +@property (nonatomic, assign) BOOL discardsInvalidObjectsOnInsert; + +///------------------------------------ +/// @name Flagging Objects for Deletion +///------------------------------------ + +/** + A predicate that identifies objects for the receiver's entity that are to be deleted from the local store. + + This property provides support for local deletion of managed objects mapped as a 'tombstone' record from the source representation. The deletion predicate is used in conjunction with the entity associated with the receiver to construct an `NSFetchRequest` that identifies managed objects that should be deleted when a mapping operation is committed. For example, given the following JSON: + + { "userID": 12345, "is_deleted": true } + + We could map the `is_deleted` key to a Boolean attribute on the model such as `shouldBeDeleted` and configure a deletion predicate using this attribute: + + [entityMapping addAttributeMappingsFromDictionary:@{ @"is_deleted": @"shouldBeDeleted" }]; + entityMapping.deletionPredicate = [NSPredicate predicateWithFormat:@"shouldBeDeleted = true"]; + + When a mapping operation completes, a `NSFetchRequest` will be constructed and executed. Any objects in the store whose `shouldBeDeleted` value is true will be deleted. + */ +@property (nonatomic, copy) NSPredicate *deletionPredicate; + +///------------------------------------------ +/// @name Retrieving Default Attribute Values +///------------------------------------------ + +/** + Returns the default value for the specified attribute as expressed in the Core Data entity definition. This value will + be assigned if the object mapping is applied and a value for a missing attribute is not present in the payload. + */ +- (id)defaultValueForAttribute:(NSString *)attributeName; + +///-------------------------------------------------- +/// @name Configuring Entity Identification Inference +///-------------------------------------------------- + +/** + Enables or disabled entity identification inference. + + **Default:** `YES` + + @param enabled A Boolean value indicating if entity identification inference is to be performed. + */ ++ (void)setEntityIdentificationInferenceEnabled:(BOOL)enabled; + +/** + Returns a Boolean value that indicates if entity identification inference has been enabled. + + @return `YES` if entity identification inference is enabled, else `NO`. + */ ++ (BOOL)isEntityIdentificationInferenceEnabled; + +@end + +/** + The name of a key in the user info dictionary of a `NSEntityDescription` specifying the name or one or more attributes to be used to infer an entity identifier. The value of this string is 'RKEntityIdentificationAttributes'. + */ +extern NSString * const RKEntityIdentificationAttributesUserInfoKey; + +///---------------- +/// @name Functions +///---------------- + +/** + Returns an array of attributes likely to be usable for identification purposes inferred from the given entity. + + Please see the documentation accompanying the `RKEntityMapping` class for details about the inference rules. + + @param entity The entity to infer identification from. + @return An array containing identifying attributes inferred from the given entity or `nil` if none could be inferred. + */ +NSArray *RKIdentificationAttributesInferredFromEntity(NSEntityDescription *entity); + + +@interface RKEntityMapping (Deprecations) +@property (nonatomic, copy) NSString *modificationKey DEPRECATED_ATTRIBUTE_MESSAGE("Use `setModificationAttributeForName:` instead"); +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKEntityMapping.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKEntityMapping.m new file mode 100644 index 0000000..9a90f38 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKEntityMapping.m @@ -0,0 +1,362 @@ +// +// RKEntityMapping.m +// RestKit +// +// Created by Blake Watters on 5/31/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKEntityMapping.h" +#import "RKManagedObjectStore.h" +#import "RKObjectMappingMatcher.h" +#import "RKPropertyInspector+CoreData.h" +#import "RKLog.h" +#import "RKRelationshipMapping.h" +#import "RKObjectUtilities.h" + +// Set Logging Component +#undef RKLogComponent +#define RKLogComponent RKlcl_cRestKitCoreData + +NSString * const RKEntityIdentificationAttributesUserInfoKey = @"RKEntityIdentificationAttributes"; + +#pragma mark - Functions + +static NSArray *RKEntityIdentificationAttributesFromUserInfoOfEntity(NSEntityDescription *entity) +{ + do { + id userInfoValue = [[entity userInfo] valueForKey:RKEntityIdentificationAttributesUserInfoKey]; + if (userInfoValue) { + NSArray *attributeNames; + if ([userInfoValue isKindOfClass:[NSString class]]) { + attributeNames = [userInfoValue componentsSeparatedByString:@","]; + } else if ([userInfoValue isKindOfClass:[NSArray class]]) { + attributeNames = userInfoValue; + } else { + attributeNames = @[ userInfoValue ]; + } + + NSMutableArray *attributes = [NSMutableArray arrayWithCapacity:[attributeNames count]]; + for (NSString *attributeName in attributeNames) { + if (! [attributeName isKindOfClass:[NSString class]]) { + [NSException raise:NSInvalidArgumentException format:@"Invalid value given in user info key '%@' of entity '%@': expected an `NSString` or `NSArray` of strings, instead got '%@' (%@)", RKEntityIdentificationAttributesUserInfoKey, [entity name], attributeName, [attributeName class]]; + } + + NSAttributeDescription *attribute = [[entity attributesByName] valueForKey:attributeName]; + if (! attribute) { + [NSException raise:NSInvalidArgumentException format:@"Invalid identifier attribute specified in user info key '%@' of entity '%@': no attribue was found with the name '%@'", RKEntityIdentificationAttributesUserInfoKey, [entity name], attributeName]; + } + + [attributes addObject:attribute]; + }; + return attributes; + } + entity = [entity superentity]; + } while (entity); + + return nil; +} + +static NSString *RKUnderscoredStringFromCamelCasedString(NSString *camelCasedString) +{ + NSError *error = nil; + NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:@"((^[a-z]+)|([A-Z]{1}[a-z]+)|([A-Z]+(?=([A-Z][a-z])|($))))" options:0 error:&error]; + if (! regularExpression) return nil; + NSMutableArray *lowercasedComponents = [NSMutableArray array]; + [regularExpression enumerateMatchesInString:camelCasedString options:0 range:NSMakeRange(0, [camelCasedString length]) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { + [lowercasedComponents addObject:[[camelCasedString substringWithRange:[result range]] lowercaseString]]; + }]; + return [lowercasedComponents componentsJoinedByString:@"_"]; +} + +// Given 'Human', returns 'humanID' and 'human_id'; Given 'AmenityReview' returns 'amenityReviewID' and 'amenity_review_id' +static NSArray *RKEntityIdentificationAttributeNamesForEntity(NSEntityDescription *entity) +{ + NSString *entityName = [entity name]; + NSString *lowerCasedFirstCharacter = [[entityName substringToIndex:1] lowercaseString]; + NSString *camelizedIDAttributeName = [NSString stringWithFormat:@"%@%@ID", lowerCasedFirstCharacter, [entityName substringFromIndex:1]]; + NSString *underscoredIDAttributeName = [NSString stringWithFormat:@"%@_id", RKUnderscoredStringFromCamelCasedString([entity name])]; + return @[ camelizedIDAttributeName, underscoredIDAttributeName ]; +} + +static NSArray *RKEntityIdentificationAttributeNames() +{ + return @[@"identifier", @"id", @"ID", @"URL", @"url"]; +} + +static NSArray *RKArrayOfAttributesForEntityFromAttributesOrNames(NSEntityDescription *entity, NSArray *attributesOrNames) +{ + NSMutableArray *attributes = [NSMutableArray arrayWithCapacity:[attributesOrNames count]]; + for (id attributeOrName in attributesOrNames) { + if ([attributeOrName isKindOfClass:[NSAttributeDescription class]]) { + if (! [[entity properties] containsObject:attributeOrName]) [NSException raise:NSInvalidArgumentException format:@"Invalid attribute value '%@' given for entity identifer: not found in the '%@' entity", attributeOrName, [entity name]]; + [attributes addObject:attributeOrName]; + } else if ([attributeOrName isKindOfClass:[NSString class]]) { + NSAttributeDescription *attribute = [[entity attributesByName] valueForKey:attributeOrName]; + if (!attribute) [NSException raise:NSInvalidArgumentException format:@"Invalid attribute '%@': no attribute was found for the given name in the '%@' entity.", attributeOrName, [entity name]]; + [attributes addObject:attribute]; + } else { + [NSException raise:NSInvalidArgumentException format:@"Invalid value provided for entity identifier attribute: Acceptable values are either `NSAttributeDescription` or `NSString` objects."]; + } + } + + return attributes; +} + +NSArray *RKIdentificationAttributesInferredFromEntity(NSEntityDescription *entity) +{ + NSArray *attributes = RKEntityIdentificationAttributesFromUserInfoOfEntity(entity); + if (attributes) { + NSArray *identificationAttributes = RKArrayOfAttributesForEntityFromAttributesOrNames(entity, attributes); + RKLogDebug(@"Inferred identification attributes for %@: %@", entity.name, [[identificationAttributes valueForKeyPath:@"name"] componentsJoinedByString:@", "]); + return identificationAttributes; + } + + NSMutableArray *identifyingAttributes = [RKEntityIdentificationAttributeNamesForEntity(entity) mutableCopy]; + [identifyingAttributes addObjectsFromArray:RKEntityIdentificationAttributeNames()]; + for (NSString *attributeName in identifyingAttributes) { + NSAttributeDescription *attribute = [[entity attributesByName] valueForKey:attributeName]; + if (attribute) { + RKLogDebug(@"Inferred identification attribute for %@: %@", entity.name, attributeName); + return @[ attribute ]; + } + } + RKLogDebug(@"No inferred identification attributes for %@", entity.name); + return nil; +} + +static BOOL entityIdentificationInferenceEnabled = YES; + +@interface RKObjectMapping (Private) +- (NSString *)transformSourceKeyPath:(NSString *)keyPath; +@end + +@interface RKObjectMapping () +@property (nonatomic, weak, readwrite) Class objectClass; +@end + +@interface RKEntityMapping () +@property (nonatomic, strong) NSMutableArray *mutableConnections; +@end + +@implementation RKEntityMapping + +@synthesize identificationAttributes = _identificationAttributes; +@synthesize shouldMapRelationshipsIfObjectIsUnmodified = _shouldMapRelationshipsIfObjectIsUnmodified; + ++ (instancetype)mappingForClass:(Class)objectClass +{ + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"You must provide a managedObjectStore. Invoke mappingForClass:inManagedObjectStore: instead."] + userInfo:nil]; +} + ++ (instancetype)mappingForEntityForName:(NSString *)entityName inManagedObjectStore:(RKManagedObjectStore *)managedObjectStore +{ + NSParameterAssert(entityName); + NSParameterAssert(managedObjectStore); + NSEntityDescription *entity = [managedObjectStore.managedObjectModel entitiesByName][entityName]; + NSAssert(entity, @"Unable to find an Entity with the name '%@' in the managed object model", entityName); + return [[self alloc] initWithEntity:entity]; +} + +- (instancetype)initWithEntity:(NSEntityDescription *)entity +{ + NSAssert(entity, @"Cannot initialize an RKEntityMapping without an entity. Maybe you want RKObjectMapping instead?"); + Class objectClass = NSClassFromString([entity managedObjectClassName]); + NSAssert(objectClass, @"Cannot initialize an entity mapping for an entity with a nil managed object class: Got nil class for managed object class name '%@'. Maybe you forgot to add the class files to your target?", [entity managedObjectClassName]); + self = [self initWithClass:objectClass]; + if (self) { + self.entity = entity; + self.discardsInvalidObjectsOnInsert = NO; + if ([RKEntityMapping isEntityIdentificationInferenceEnabled]) self.identificationAttributes = RKIdentificationAttributesInferredFromEntity(entity); + } + + return self; +} + +- (instancetype)initWithClass:(Class)objectClass +{ + self = [super initWithClass:objectClass]; + if (self) { + self.mutableConnections = [NSMutableArray array]; + } + + return self; +} + +- (id)copyWithZone:(NSZone *)zone +{ + RKEntityMapping *copy = [super copyWithZone:zone]; + copy.entity = self.entity; + copy.identificationAttributes = self.identificationAttributes; + copy.identificationPredicate = self.identificationPredicate; + copy.identificationPredicateBlock = self.identificationPredicateBlock; + copy.deletionPredicate = self.deletionPredicate; + copy.modificationAttribute = self.modificationAttribute; + copy.mutableConnections = [NSMutableArray array]; + + for (RKConnectionDescription *connection in self.connections) { + [copy addConnection:[connection copy]]; + } + + return copy; +} + +- (void)setIdentificationAttributes:(NSArray *)attributesOrNames +{ + if (attributesOrNames && [attributesOrNames count] == 0) [NSException raise:NSInvalidArgumentException format:@"At least one attribute must be provided to identify managed objects"]; + _identificationAttributes = attributesOrNames ? RKArrayOfAttributesForEntityFromAttributesOrNames(self.entity, attributesOrNames) : nil; +} + +- (NSArray *)identificationAttributes +{ + return _identificationAttributes; +} + +- (RKConnectionDescription *)connectionForRelationship:(id)relationshipOrName +{ + if (!([relationshipOrName isKindOfClass:[NSString class]] || [relationshipOrName isKindOfClass:[NSRelationshipDescription class]])) { + [NSException raise:NSInvalidArgumentException format:@"Relationship specifier must be a name or a relationship description"]; + } + NSString *relationshipName = [relationshipOrName isKindOfClass:[NSRelationshipDescription class]] ? [(NSRelationshipDescription *)relationshipOrName name] : relationshipOrName; + for (RKConnectionDescription *connection in self.connections) { + if ([[connection.relationship name] isEqualToString:relationshipName]) { + return connection; + } + } + return nil; +} + +- (void)addConnection:(RKConnectionDescription *)connection +{ + if (! connection) [NSException raise:NSInvalidArgumentException format:@"connection cannot be nil."]; + RKConnectionDescription *existingConnection = [self connectionForRelationship:connection.relationship]; + if (existingConnection) [NSException raise:NSInternalInconsistencyException format:@"Cannot add connection: An existing connection already exists for the '%@' relationship.", connection.relationship.name]; + NSAssert(self.mutableConnections, @"self.mutableConnections should not be nil"); + [self.mutableConnections addObject:connection]; +} + +- (void)removeConnection:(RKConnectionDescription *)connection +{ + [self.mutableConnections removeObject:connection]; +} + +- (NSArray *)connections +{ + return [NSArray arrayWithArray:self.mutableConnections]; +} + +- (void)addConnectionForRelationship:(id)relationshipOrName connectedBy:(id)connectionSpecifier +{ + NSRelationshipDescription *relationship = [relationshipOrName isKindOfClass:[NSRelationshipDescription class]] ? relationshipOrName : [[self.entity relationshipsByName] valueForKey:relationshipOrName]; + NSAssert(relationship, @"No relationship was found named '%@' in the '%@' entity", relationshipOrName, [self.entity name]); + RKConnectionDescription *connection = nil; + if ([connectionSpecifier isKindOfClass:[NSString class]]) { + NSString *sourceAttribute = connectionSpecifier; + NSString *destinationAttribute = [self transformSourceKeyPath:sourceAttribute]; + connection = [[RKConnectionDescription alloc] initWithRelationship:relationship attributes:@{ sourceAttribute: destinationAttribute }]; + } else if ([connectionSpecifier isKindOfClass:[NSArray class]]) { + NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithCapacity:[connectionSpecifier count]]; + for (NSString *sourceAttribute in connectionSpecifier) { + NSString *destinationAttribute = [self transformSourceKeyPath:sourceAttribute]; + attributes[sourceAttribute] = destinationAttribute; + } + connection = [[RKConnectionDescription alloc] initWithRelationship:relationship attributes:attributes]; + } else if ([connectionSpecifier isKindOfClass:[NSDictionary class]]) { + connection = [[RKConnectionDescription alloc] initWithRelationship:relationship attributes:connectionSpecifier]; + } else { + [NSException raise:NSInvalidArgumentException format:@"Connections can only be described using `NSString`, `NSArray`, or `NSDictionary` objects. Instead, got: %@", connectionSpecifier]; + } + + [self.mutableConnections addObject:connection]; +} + +- (id)defaultValueForAttribute:(NSString *)attributeName +{ + NSAttributeDescription *desc = [[self.entity attributesByName] valueForKey:attributeName]; + return [desc defaultValue]; +} + +- (Class)classForProperty:(NSString *)propertyName +{ + Class propertyClass = [super classForProperty:propertyName]; + if (! propertyClass) { + propertyClass = [[RKPropertyInspector sharedInspector] classForPropertyNamed:propertyName ofEntity:self.entity]; + } + + return propertyClass; +} + +- (Class)classForKeyPath:(NSString *)keyPath +{ + NSArray *components = [keyPath componentsSeparatedByString:@"."]; + Class propertyClass = self.objectClass; + for (NSString *property in components) { + propertyClass = [[RKPropertyInspector sharedInspector] classForPropertyNamed:property ofClass:propertyClass isPrimitive:nil]; + if (! propertyClass) propertyClass = [[RKPropertyInspector sharedInspector] classForPropertyNamed:property ofEntity:self.entity]; + if (! propertyClass) break; + } + + return propertyClass; +} + +- (void)setModificationAttribute:(NSAttributeDescription *)modificationAttribute +{ + if (modificationAttribute && ![self.entity.properties containsObject:modificationAttribute]) [NSException raise:NSInvalidArgumentException format:@"The attribute given is not a property of the '%@' entity.", [self.entity name]]; + _modificationAttribute = modificationAttribute; +} + +- (void)setModificationAttributeForName:(NSString *)attributeName +{ + if (attributeName) { + NSAttributeDescription *attribute = [self.entity attributesByName][attributeName]; + if (!attribute) [NSException raise:NSInvalidArgumentException format:@"No attribute with the name '%@' was found in the '%@' entity.", attributeName, self.entity.name]; + self.modificationAttribute = attribute; + } else { + self.modificationAttribute = nil; + } +} + ++ (void)setEntityIdentificationInferenceEnabled:(BOOL)enabled +{ + entityIdentificationInferenceEnabled = enabled; +} + ++ (BOOL)isEntityIdentificationInferenceEnabled +{ + return entityIdentificationInferenceEnabled; +} + +@end + +@implementation RKEntityMapping (Deprecations) + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-implementations" + +- (NSString *)modificationKey +{ + return self.modificationAttribute.name; +} + +- (void)setModificationKey:(NSString *)modificationKey +{ + [self setModificationAttributeForName:modificationKey]; +} + +#pragma clang diagnostic pop + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKFetchRequestManagedObjectCache.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKFetchRequestManagedObjectCache.h new file mode 100644 index 0000000..da50ebe --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKFetchRequestManagedObjectCache.h @@ -0,0 +1,31 @@ +// +// RKFetchRequestManagedObjectCache.h +// RestKit +// +// Created by Jeff Arena on 1/24/12. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKManagedObjectCaching.h" + +/** + Provides a simple managed object cache strategy in which every request for an object + is satisfied by dispatching an NSFetchRequest against the Core Data persistent store. + Performance can be disappointing for data sets with a large amount of redundant data + being mapped and connected together, but the memory footprint stays flat. + */ +@interface RKFetchRequestManagedObjectCache : NSObject + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKFetchRequestManagedObjectCache.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKFetchRequestManagedObjectCache.m new file mode 100644 index 0000000..6517c50 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKFetchRequestManagedObjectCache.m @@ -0,0 +1,147 @@ +// +// RKFetchRequestManagedObjectCache.m +// RestKit +// +// Created by Jeff Arena on 1/24/12. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKFetchRequestManagedObjectCache.h" +#import "RKLog.h" +#import "RKPropertyInspector.h" +#import "RKPropertyInspector+CoreData.h" +#import "RKObjectUtilities.h" + +// Set Logging Component +#undef RKLogComponent +#define RKLogComponent RKlcl_cRestKitCoreData + +/* + This function computes a cache key given a dictionary of attribute values. Each attribute name is used as a fragment within the aggregate cache key. A suffix qualifier is appended that differentiates singular vs. collection attribute values so that '==' and 'IN' predicates are computed appropriately. + */ +static NSString *RKPredicateCacheKeyForAttributeValues(NSDictionary *attributesValues) +{ + NSArray *sortedKeys = [[attributesValues allKeys] sortedArrayUsingSelector:@selector(compare:)]; + NSMutableArray *keyFragments = [NSMutableArray array]; + for (NSString *attributeName in sortedKeys) { + id value = attributesValues[attributeName]; + NSString *suffix = [value respondsToSelector:@selector(count)] ? @"+" : @"."; + [keyFragments addObject:[attributeName stringByAppendingString:suffix]]; + } + return [keyFragments componentsJoinedByString:@":"]; +} + +// NOTE: We make sure to convert the attribute values to compatible names that can be replaced correctly by `predicateWithSubstitutionVariables` +static NSString *RKAttributePlaceholderForAttributeName(NSString *attributeName) +{ + return [[attributeName componentsSeparatedByCharactersInSet:[NSCharacterSet punctuationCharacterSet]] componentsJoinedByString:@"_"]; +} + +static NSDictionary *RKSubstitutionVariablesForAttributeValues(NSDictionary *attributeValues) +{ + NSMutableDictionary *placeholders = [[NSMutableDictionary alloc] initWithCapacity:attributeValues.count]; + [attributeValues enumerateKeysAndObjectsUsingBlock:^(NSString *key, id value, BOOL *stop) { + placeholders[RKAttributePlaceholderForAttributeName(key)] = value; + }]; + + return [NSDictionary dictionaryWithDictionary:placeholders]; +} + +// NOTE: We build a dynamic format string here because `NSCompoundPredicate` does not support use of substitution variables +static NSPredicate *RKPredicateWithSubstitutionVariablesForAttributeValues(NSDictionary *attributeValues) +{ + NSArray *attributeNames = [attributeValues allKeys]; + NSMutableArray *formatFragments = [NSMutableArray arrayWithCapacity:[attributeNames count]]; + [attributeValues enumerateKeysAndObjectsUsingBlock:^(NSString *attributeName, id value, BOOL *stop) { + NSString *formatFragment = RKObjectIsCollection(value) + ? [NSString stringWithFormat:@"%@ IN $%@", attributeName, RKAttributePlaceholderForAttributeName(attributeName)] + : [NSString stringWithFormat:@"%@ = $%@", attributeName, RKAttributePlaceholderForAttributeName(attributeName)]; + [formatFragments addObject:formatFragment]; + }]; + + return [NSPredicate predicateWithFormat:[formatFragments componentsJoinedByString:@" AND "]]; +} + +@interface RKFetchRequestManagedObjectCache () +@property (nonatomic, strong) NSMutableDictionary *predicateCache; +#if OS_OBJECT_USE_OBJC +@property (nonatomic, strong) dispatch_queue_t cacheQueue; +#else +@property (nonatomic, assign) dispatch_queue_t cacheQueue; +#endif +@end + +@implementation RKFetchRequestManagedObjectCache + +- (instancetype)init +{ + self = [super init]; + if (self) { + self.predicateCache = [NSMutableDictionary dictionary]; + self.cacheQueue = dispatch_queue_create("org.restkit.core-data.fetch-request-cache-queue", DISPATCH_QUEUE_CONCURRENT); + } + return self; +} + +- (void)dealloc +{ +#if !OS_OBJECT_USE_OBJC + if (_cacheQueue) dispatch_release(_cacheQueue); +#endif + _cacheQueue = NULL; +} + +- (NSSet *)managedObjectsWithEntity:(NSEntityDescription *)entity + attributeValues:(NSDictionary *)attributeValues + inManagedObjectContext:(NSManagedObjectContext *)managedObjectContext +{ + NSAssert(entity, @"Cannot find existing managed object without a target class"); + NSAssert(attributeValues, @"Cannot retrieve cached objects without attribute values to identify them with."); + NSAssert(managedObjectContext, @"Cannot find existing managed object with a nil context"); + + if ([attributeValues count] == 0) return [NSSet set]; + + NSString *predicateCacheKey = RKPredicateCacheKeyForAttributeValues(attributeValues); + + __block NSPredicate *substitutionPredicate; + dispatch_sync(self.cacheQueue, ^{ + substitutionPredicate = (self.predicateCache)[predicateCacheKey]; + }); + + NSDictionary *substitutionVariables = RKSubstitutionVariablesForAttributeValues(attributeValues); + + if (! substitutionPredicate) { + substitutionPredicate = RKPredicateWithSubstitutionVariablesForAttributeValues(attributeValues); + dispatch_barrier_async(self.cacheQueue, ^{ + (self.predicateCache)[predicateCacheKey] = substitutionPredicate; + }); + } + + NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:[entity name]]; + fetchRequest.predicate = [substitutionPredicate predicateWithSubstitutionVariables:substitutionVariables]; + __block NSError *error = nil; + __block NSArray *objects = nil; + [managedObjectContext performBlockAndWait:^{ + objects = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; + }]; + if (! objects) { + RKLogError(@"Failed to execute fetch request due to error: %@", error); + } + RKLogDebug(@"Found objects '%@' using fetchRequest '%@'", objects, fetchRequest); + + return [NSSet setWithArray:objects]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKInMemoryManagedObjectCache.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKInMemoryManagedObjectCache.h new file mode 100644 index 0000000..0991690 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKInMemoryManagedObjectCache.h @@ -0,0 +1,42 @@ +// +// RKInMemoryManagedObjectCache.h +// RestKit +// +// Created by Jeff Arena on 1/24/12. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKManagedObjectCaching.h" + +/** + Provides a fast managed object cache where-in object instances are retained in memory to avoid hitting the Core Data persistent store. Performance is greatly increased over fetch request based strategy at the expense of memory consumption. + */ +@interface RKInMemoryManagedObjectCache : NSObject + +- (instancetype)init __attribute__((unavailable("Invoke initWithManagedObjectContext: instead."))); + +///--------------------------- +/// @name Initializing a Cache +///--------------------------- + +/** + Initializes the receiver with a managed object context that is to be observed and used to populate the in memory cache. The receiver may then be used to fulfill cache requests for child contexts of the given managed object context. + + @param managedObjectContext The managed object context with which to initialize the receiver. + @return The receiver, initialized with the given managed object context. + */ +- (instancetype)initWithManagedObjectContext:(NSManagedObjectContext *)managedObjectContext NS_DESIGNATED_INITIALIZER; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKInMemoryManagedObjectCache.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKInMemoryManagedObjectCache.m new file mode 100644 index 0000000..2143a06 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKInMemoryManagedObjectCache.m @@ -0,0 +1,167 @@ +// +// RKInMemoryManagedObjectCache.m +// RestKit +// +// Created by Jeff Arena on 1/24/12. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKInMemoryManagedObjectCache.h" +#import "RKEntityCache.h" +#import "RKLog.h" +#import "RKEntityByAttributeCache.h" + +// Set Logging Component +#undef RKLogComponent +#define RKLogComponent RKlcl_cRestKitCoreData + +static NSPersistentStoreCoordinator *RKPersistentStoreCoordinatorFromManagedObjectContext(NSManagedObjectContext *managedObjectContext) +{ + NSManagedObjectContext *currentContext = managedObjectContext; + do { + if ([currentContext persistentStoreCoordinator]) return [currentContext persistentStoreCoordinator]; + currentContext = [currentContext parentContext]; + } while (currentContext); + return nil; +} + +static dispatch_queue_t RKInMemoryManagedObjectCacheCallbackQueue(void) +{ + static dispatch_once_t onceToken; + static dispatch_queue_t callbackQueue; + dispatch_once(&onceToken, ^{ + callbackQueue = dispatch_queue_create("org.restkit.core-data.in-memory-cache.callback-queue", DISPATCH_QUEUE_CONCURRENT); + }); + return callbackQueue; +} + +@interface RKInMemoryManagedObjectCache () +@property (nonatomic, strong, readwrite) RKEntityCache *entityCache; +@property (nonatomic, assign) dispatch_queue_t callbackQueue; +@end + +@implementation RKInMemoryManagedObjectCache + +- (instancetype)initWithManagedObjectContext:(NSManagedObjectContext *)managedObjectContext +{ + self = [super init]; + if (self) { + NSManagedObjectContext *cacheContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; + [cacheContext setPersistentStoreCoordinator:RKPersistentStoreCoordinatorFromManagedObjectContext(managedObjectContext)]; + self.entityCache = [[RKEntityCache alloc] initWithManagedObjectContext:cacheContext]; + self.entityCache.callbackQueue = RKInMemoryManagedObjectCacheCallbackQueue(); + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleManagedObjectContextDidChangeNotification:) name:NSManagedObjectContextObjectsDidChangeNotification object:managedObjectContext]; + } + return self; +} + +- (instancetype)init +{ + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"%@ Failed to call designated initializer. Invoke initWithManagedObjectContext: instead.", + NSStringFromClass([self class])] + userInfo:nil]; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (NSSet *)managedObjectsWithEntity:(NSEntityDescription *)entity + attributeValues:(NSDictionary *)attributeValues + inManagedObjectContext:(NSManagedObjectContext *)managedObjectContext +{ + NSParameterAssert(entity); + NSParameterAssert(attributeValues); + NSParameterAssert(managedObjectContext); + + NSArray *attributes = [attributeValues allKeys]; + [self.entityCache beginAccessing]; + if (! [self.entityCache isEntity:entity cachedByAttributes:attributes]) { + RKLogInfo(@"Caching instances of Entity '%@' by attributes '%@'", entity.name, [attributes componentsJoinedByString:@", "]); + dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); + [self.entityCache cacheObjectsForEntity:entity byAttributes:attributes completion:^{ + dispatch_semaphore_signal(semaphore); + }]; + dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); + + RKEntityByAttributeCache *attributeCache = [self.entityCache attributeCacheForEntity:entity attributes:attributes]; + + // Fetch any pending objects and add them to the cache + NSFetchRequest *fetchRequest = [NSFetchRequest new]; + fetchRequest.entity = entity; + fetchRequest.includesPendingChanges = YES; + + [managedObjectContext performBlockAndWait:^{ + NSError *error = nil; + NSArray *objects = nil; + objects = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; + if (objects) { + [attributeCache addObjects:[NSSet setWithArray:objects] completion:^{ + dispatch_semaphore_signal(semaphore); + }]; + } else { + RKLogError(@"Fetched pre-loading existing managed objects with error: %@", error); + dispatch_semaphore_signal(semaphore); + } + }]; + dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); + +#if !OS_OBJECT_USE_OBJC + dispatch_release(semaphore); +#endif + + RKLogTrace(@"Cached %ld objects", (long)[attributeCache count]); + } + + NSSet *result = [self.entityCache objectsForEntity:entity withAttributeValues:attributeValues inContext:managedObjectContext]; + [self.entityCache endAccessing]; + return result; +} + +- (void)didFetchObject:(NSManagedObject *)object +{ + [self.entityCache addObjects:[NSSet setWithObject:object] completion:nil]; +} + +- (void)didCreateObject:(NSManagedObject *)object +{ + [self.entityCache addObjects:[NSSet setWithObject:object] completion:nil]; +} + +- (void)didDeleteObject:(NSManagedObject *)object +{ + [self.entityCache removeObjects:[NSSet setWithObject:object] completion:nil]; +} + +- (void)handleManagedObjectContextDidChangeNotification:(NSNotification *)notification +{ + // Observe the parent context for changes and update the caches + NSDictionary *userInfo = notification.userInfo; + NSSet *insertedObjects = userInfo[NSInsertedObjectsKey]; + NSSet *updatedObjects = userInfo[NSUpdatedObjectsKey]; + NSSet *deletedObjects = userInfo[NSDeletedObjectsKey]; + RKLogTrace(@"insertedObjects=%@, updatedObjects=%@, deletedObjects=%@", insertedObjects, updatedObjects, deletedObjects); + + NSMutableSet *objectsToAdd = [NSMutableSet setWithSet:insertedObjects]; + [objectsToAdd unionSet:updatedObjects]; + + [self.entityCache addObjects:objectsToAdd completion:nil]; + [self.entityCache removeObjects:deletedObjects completion:nil]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKManagedObjectCaching.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKManagedObjectCaching.h new file mode 100644 index 0000000..2fcfcad --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKManagedObjectCaching.h @@ -0,0 +1,72 @@ +// +// RKManagedObjectCaching.h +// RestKit +// +// Created by Jeff Arena on 1/24/12. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import + +/** + Objects implementing the `RKManagedObjectCaching` provide support for retrieving managed object matching a set of attributes using an opaque caching strategy. The objects retrieved are not required to be in any particular order, but must exactly match the attribute values requested. + */ +@protocol RKManagedObjectCaching + +@required + +///--------------------------------- +/// @name Retrieving Managed Objects +///--------------------------------- + +/** + Returns all managed objects for a given entity with attributes whose names and values match the given dictionary in a given context. + + @param entity The entity to retrieve managed objects for. + @param attributeValues A dictionary specifying the attribute criteria for retrieving managed objects. + @param managedObjectContext The context to fetch the matching objects in. + */ +- (NSSet *)managedObjectsWithEntity:(NSEntityDescription *)entity + attributeValues:(NSDictionary *)attributeValues + inManagedObjectContext:(NSManagedObjectContext *)managedObjectContext; + +///--------------------------------------------------- +/// @name Handling Managed Object Change Notifications +///--------------------------------------------------- + +@optional + +/** + Invoked to inform the receiver that an object was fetched and should be added to the cache. + + @param object The object that was fetched from a managed object context. + */ +- (void)didFetchObject:(NSManagedObject *)object; + +/** + Invoked to inform the receiver that an object was created and should be added to the cache. + + @param object The object that was created in a managed object context. + */ +- (void)didCreateObject:(NSManagedObject *)object; + +/** + Invoked to inform the receiver that an object was deleted and should be removed to the cache. + + @param object The object that was deleted from a managed object context. + */ +- (void)didDeleteObject:(NSManagedObject *)object; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKManagedObjectImporter.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKManagedObjectImporter.h new file mode 100644 index 0000000..84d3a32 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKManagedObjectImporter.h @@ -0,0 +1,158 @@ +// +// RKManagedObjectImporter.h +// RestKit +// +// Created by Blake Watters on 3/4/10. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import + +@class RKMapping, RKObjectManager; +@protocol RKManagedObjectCaching; + +/** + Instances of `RKManagedObjectImporter` perform bulk imports of managed objects into a persistent store from source files (typically in JSON or XML format) using object mappings. The importer provides functionality for updating an existing persistent store or creating a seed database that can be used to bootstrap a new persistent store with an initial data set. + + The importer requires that the source files have a MIME type that is identifiable by file extension and be parsable using a parser registered with the shared parser registry. + + @see RKMIMETypeSerialization + */ +@interface RKManagedObjectImporter : NSObject + +- (instancetype)init __attribute__((unavailable("Invoke initWithManagedObjectModel:storePath: instead."))); + +///------------------------------- +/// @name Initializing an Importer +///------------------------------- + +/** + Initializes the receiver with a given managed object model and a path at which a SQLite persistent store + should be created to persist imported managed objects. + + When initialized with a managed object model and store path, the receiver will construct an internal + persistent store coordinator, SQLite persistent store, and managed object context with the private queue + concurrency type with which to perform the importing. + + @param managedObjectModel A Core Data manage object model with which to initialize the receiver. + @param storePath The path at which to create a SQLite persistent store to persist the imported managed objects. + @return The receiver, initialized with the given managed object model and a complete Core Data persistence + stack with a SQLite persistent store at the given store path. + + @warning As this initialization code path is typical for generating seed databases, the value of + `resetsStoreBeforeImporting` is initialized to **YES**. + */ +- (instancetype)initWithManagedObjectModel:(NSManagedObjectModel *)managedObjectModel storePath:(NSString *)storePath NS_DESIGNATED_INITIALIZER; + +/** + Initializes the receiver with a given persistent store in which to persist imported managed objects. + + When initialized with a persistent store, the receiver will construct a managed object context with the + private queue concurrency type and the persistent store coordinator of the given persistent store. This + prepares the receiver for importing content into an existing Core Data persistence stack. + + @param persistentStore A Core Data persistent store with which to initialize the receiver. + @return The receiver, initialized with the given persistent store. The persistent store coordinator and + managed object model are determined from the given persistent store and a new managed object context with + the private queue concurrency type is constructed. + */ +- (instancetype)initWithPersistentStore:(NSPersistentStore *)persistentStore NS_DESIGNATED_INITIALIZER; + +/** + A Boolean value indicating whether existing managed objects in the persistent store should + be deleted before import. + + The default value of this property is YES if the receiver was initialized with a + managed object model and store path, else NO. + */ +@property (nonatomic, assign) BOOL resetsStoreBeforeImporting; + +///---------------------------------- +/// @name Accessing Core Data Details +///---------------------------------- + +/** + The persistent store in which imported managed objects will be persisted. + */ +@property (nonatomic, strong, readonly) NSPersistentStore *persistentStore; + +/** + The managed object model containing entities that may be imported by the receiver. + */ +@property (nonatomic, strong, readonly) NSManagedObjectModel *managedObjectModel; + +/** + A managed object context with the NSPrivateQueueConcurrencyType concurrency type + used to perform the import. + */ +@property (nonatomic, strong, readonly) NSManagedObjectContext *managedObjectContext; + +/** + A convenience accessor for retrieving the complete filesystem path to the persistent + store in which the receiver will persist imported managed objects. + + Equivalent to executing the following example code: + + NSURL *URL = [importer.persistentStore.persistentStoreCoordinator URLForPersistentStore:importer.persistentStore]; + return [URL path]; + + */ +@property (nonatomic, strong, readonly) NSString *storePath; + +/** + A class that conforms to the `RKManagedObjectCaching` protocol that should be used when performing the import. + + **Default**: An instance of `RKInMemoryManagedObjectCache`. + */ +@property (nonatomic, strong) id managedObjectCache; + +///----------------------------------------------------------------------------- +/// @name Importing Managed Objects +///----------------------------------------------------------------------------- + +/** + Imports managed objects from the file or directory at the given path. + + @param path The path to the file or directory you wish to import. This parameter must not be nil. + @param mapping The entity or dynamic mapping you wish to use for importing content at the given path. + @param keyPath An optional key path to be evaluated against the results of parsing the content read at the given path. If the + mappable content is not contained in a nesting attribute, the key path should be specified as nil. + @param error On input, a pointer to an error object. If an error occurs, this pointer is set to an actual error object containing + the error information. You may specify nil for this parameter if you do not want the error information. + @return A count of the number of managed object imported from the given path or NSNotFound if an error occurred during import. + */ +- (NSUInteger)importObjectsFromItemAtPath:(NSString *)path withMapping:(RKMapping *)mapping keyPath:(NSString *)keyPath error:(NSError **)error; + +/** + Finishes the import process by saving the managed object context to the persistent store, ensuring all + imported managed objects are written to disk. + + @param error On input, a pointer to an error object. If an error occurs, this pointer is set to an actual error object containing + the error information. You may specify nil for this parameter if you do not want the error information. + @return YES if the save to the persistent store was successful, else NO. + */ +- (BOOL)finishImporting:(NSError **)error; + +///----------------------------------------------------------------------------- +/// @name Obtaining Seeding Info +///----------------------------------------------------------------------------- + +/** + Logs information about where on the filesystem to access the SQLite database for the persistent + store in which the imported managed objects were persisted. + */ +- (void)logSeedingInfo; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKManagedObjectImporter.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKManagedObjectImporter.m new file mode 100644 index 0000000..65213b7 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKManagedObjectImporter.m @@ -0,0 +1,298 @@ +// +// RKManagedObjectImporter.m +// RestKit +// +// Created by Blake Watters on 3/4/10. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#if TARGET_OS_IPHONE +#import +#endif + +#import "RKManagedObjectImporter.h" +#import "RKMapperOperation.h" +#import "RKManagedObjectMappingOperationDataSource.h" +#import "RKInMemoryManagedObjectCache.h" +#import "RKFetchRequestManagedObjectCache.h" +#import "RKMIMETypeSerialization.h" +#import "RKPathUtilities.h" +#import "RKLog.h" + +// Set Logging Component +#undef RKLogComponent +#define RKLogComponent RKlcl_cRestKitCoreData + +@interface RKManagedObjectImporter () +@property (nonatomic, strong, readwrite) NSManagedObjectModel *managedObjectModel; +@property (nonatomic, strong, readwrite) NSString *storePath; +@property (nonatomic, strong, readwrite) NSPersistentStoreCoordinator *persistentStoreCoordinator; +@property (nonatomic, strong, readwrite) NSPersistentStore *persistentStore; +@property (nonatomic, strong, readwrite) NSManagedObjectContext *managedObjectContext; +@property (nonatomic, strong, readwrite) RKManagedObjectMappingOperationDataSource *mappingOperationDataSource; +@property (nonatomic, strong, readwrite) NSOperationQueue *connectionQueue; +@property (nonatomic, assign) BOOL hasPerformedResetIfNecessary; +@end + +@implementation RKManagedObjectImporter + +- (instancetype)initWithManagedObjectModel:(NSManagedObjectModel *)managedObjectModel storePath:(NSString *)storePath +{ + NSParameterAssert(managedObjectModel); + NSParameterAssert(storePath); + + self = [super init]; + if (self) { + self.managedObjectModel = managedObjectModel; + self.storePath = storePath; + + NSError *error = nil; + NSPersistentStoreCoordinator *persistentStoreCoordinator = [self createPersistentStoreCoordinator:&error]; + NSAssert(persistentStoreCoordinator, @"Importer initialization failed: Unable to create persistent store coordinator: %@", error); + self.persistentStoreCoordinator = persistentStoreCoordinator; + + NSManagedObjectContext *managedObjectContext = [self createManagedObjectContext]; + NSAssert(managedObjectContext, @"Importer initialization failed: Unable to create managed object context"); + self.managedObjectContext = managedObjectContext; + + self.connectionQueue = [NSOperationQueue new]; + [self.connectionQueue setName:@"RKManagedObjectImporter Connection Queue"]; + [self.connectionQueue setSuspended:YES]; + + self.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:managedObjectContext]; + + self.hasPerformedResetIfNecessary = NO; + self.resetsStoreBeforeImporting = YES; + } + + return self; +} + +- (instancetype)initWithPersistentStore:(NSPersistentStore *)persistentStore +{ + NSParameterAssert(persistentStore); + + self = [super init]; + if (self) { + self.persistentStoreCoordinator = persistentStore.persistentStoreCoordinator; + self.managedObjectModel = persistentStore.persistentStoreCoordinator.managedObjectModel; + + NSURL *storeURL = [self.persistentStoreCoordinator URLForPersistentStore:persistentStore]; + self.storePath = [storeURL path]; + + NSManagedObjectContext *managedObjectContext = [self createManagedObjectContext]; + NSAssert(managedObjectContext, @"Importer initialization failed: Unable to create managed object store"); + self.managedObjectContext = managedObjectContext; + + self.connectionQueue = [NSOperationQueue new]; + [self.connectionQueue setName:@"RKManagedObjectImporter Connection Queue"]; + [self.connectionQueue setSuspended:YES]; + + self.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:managedObjectContext]; + + self.hasPerformedResetIfNecessary = NO; + self.resetsStoreBeforeImporting = NO; + } + + return self; +} + +- (instancetype)init +{ + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"%@ Failed to call designated initializer. Invoke initWithManagedObjectModel:storePath: instead.", + NSStringFromClass([self class])] + userInfo:nil]; +} + +- (NSPersistentStoreCoordinator *)createPersistentStoreCoordinator:(NSError **)error +{ + BOOL isDirectory = NO; + [[NSFileManager defaultManager] fileExistsAtPath:self.storePath isDirectory:&isDirectory]; + NSAssert(!isDirectory, @"Cannot create SQLite persistent store: The given store path specifies a directory."); + + NSURL *storeURL = [NSURL fileURLWithPath:self.storePath]; + NSPersistentStoreCoordinator *persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel]; + NSPersistentStore *persistentStore = [persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType + configuration:nil + URL:storeURL + options:nil error:error]; + if (! persistentStore) { + return nil; + } + + return persistentStoreCoordinator; +} + +- (NSManagedObjectContext *)createManagedObjectContext +{ + NSManagedObjectContext *managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; + [managedObjectContext performBlockAndWait:^{ + managedObjectContext.persistentStoreCoordinator = self.persistentStoreCoordinator; + managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy; + }]; + + return managedObjectContext; +} + +- (void)setManagedObjectCache:(id)managedObjectCache +{ + NSAssert(self.connectionQueue, @"Connection Queue cannot be nil"); + self.mappingOperationDataSource = [[RKManagedObjectMappingOperationDataSource alloc] initWithManagedObjectContext:self.managedObjectContext + cache:managedObjectCache]; + self.mappingOperationDataSource.operationQueue = self.connectionQueue; +} + +- (void)resetPersistentStoreIfNecessary +{ + if (self.hasPerformedResetIfNecessary) return; + + if (self.resetsStoreBeforeImporting) { + RKLogInfo(@"Persistent store reset requested before importing. Deleting existing managed object instances..."); + for (NSEntityDescription *entity in self.managedObjectModel.entities) { + @autoreleasepool { + NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; + fetchRequest.entity = entity; + [self.managedObjectContext performBlockAndWait:^{ + NSError *error; + NSArray *managedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; + RKLogInfo(@"Deleting %ld managed object instances for the '%@' entity", (unsigned long) [managedObjects count], entity.name); + for (NSManagedObject *managedObject in managedObjects) { + [self.managedObjectContext deleteObject:managedObject]; + } + }]; + } + } + } + + self.hasPerformedResetIfNecessary = YES; +} + +- (NSUInteger)importObjectsFromFileAtPath:(NSString *)path withMapping:(RKMapping *)mapping keyPath:(NSString *)keyPath error:(NSError **)error +{ + NSParameterAssert(path); + NSParameterAssert(mapping); + + // Perform the reset on the first import action if requested + [self resetPersistentStoreIfNecessary]; + + __block NSError *localError = nil; + NSData *payload = [NSData dataWithContentsOfFile:path options:0 error:&localError]; + if (! payload) { + RKLogError(@"Failed to read file at path '%@': %@", path, [localError localizedDescription]); + if (error) *error = localError; + return NSNotFound; + } + + NSString *MIMEType = RKMIMETypeFromPathExtension(path); + id parsedData = [RKMIMETypeSerialization objectFromData:payload MIMEType:MIMEType error:&localError]; + if (!parsedData) { + RKLogError(@"Failed to parse file at path '%@': %@", path, [localError localizedDescription]); + } + + if (! parsedData) { + if (error) *error = localError; + return NSNotFound; + } + + NSDictionary *mappingDictionary = @{ (keyPath ?: [NSNull null]) : mapping }; + RKMapperOperation *mapper = [[RKMapperOperation alloc] initWithRepresentation:parsedData mappingsDictionary:mappingDictionary]; + mapper.mappingOperationDataSource = self.mappingOperationDataSource; + __block RKMappingResult *mappingResult; + [self.managedObjectContext performBlockAndWait:^{ + [mapper start]; + mappingResult = mapper.mappingResult; + localError = mapper.error; + }]; + if (mappingResult == nil) { + if (error) *error = localError; + RKLogError(@"Importing file at path '%@' failed with error: %@", path, localError); + return NSNotFound; + } + + NSUInteger objectCount = [mappingResult count]; + RKLogInfo(@"Imported %lu objects from file at path '%@'", (unsigned long)objectCount, path); + return objectCount; +} + +- (NSUInteger)importObjectsFromDirectoryAtPath:(NSString *)path withMapping:(RKMapping *)mapping keyPath:(NSString *)keyPath error:(NSError **)error +{ + NSError *localError = nil; + NSArray *entries = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:&localError]; + if (! entries) { + RKLogError(@"Import failed for directory at path '%@': Unable to read directory contents with error: %@", path, localError); + if (error) *error = localError; + return NSNotFound; + } + + NSUInteger aggregateObjectCount = 0; + for (NSString *entry in entries) { + NSUInteger objectCount = [self importObjectsFromFileAtPath:[path stringByAppendingPathComponent:entry] withMapping:mapping keyPath:keyPath error:&localError]; + if (objectCount == NSNotFound) { + if (error) *error = localError; + return NSNotFound; + } else { + aggregateObjectCount += objectCount; + } + } + + return aggregateObjectCount; +} + +- (NSUInteger)importObjectsFromItemAtPath:(NSString *)path withMapping:(RKMapping *)mapping keyPath:(NSString *)keyPath error:(NSError **)error +{ + NSParameterAssert(path); + NSParameterAssert(mapping); + + BOOL isDirectory; + [[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDirectory]; + if (isDirectory) { + return [self importObjectsFromDirectoryAtPath:path withMapping:mapping keyPath:keyPath error:error]; + } + + return [self importObjectsFromFileAtPath:path withMapping:mapping keyPath:keyPath error:error]; +} + +- (BOOL)finishImporting:(NSError **)error +{ + // Perform our connection operations in a batch, before we save the MOC + RKLogInfo(@"Starting %lu connection operations...", (unsigned long) self.connectionQueue.operationCount); + [self.connectionQueue setMaxConcurrentOperationCount:50]; + [self.connectionQueue setSuspended:NO]; + [self.connectionQueue waitUntilAllOperationsAreFinished]; + + __block BOOL success; + __block NSError *localError = nil; + [self.managedObjectContext performBlockAndWait:^{ + success = [self.managedObjectContext save:&localError]; + if (! success) { + RKLogCoreDataError(localError); + } + }]; + + if (! success && error) *error = localError; + return success; +} + +- (void)logSeedingInfo +{ + NSString *storeDirectory = [self.storePath stringByDeletingLastPathComponent]; + NSString *storeFilename = [self.storePath lastPathComponent]; + RKLogCritical(@"A seed database has been generated at '%@'. " + @"Please execute `open \"%@\"` in your Terminal and copy %@ to your app. Be sure to add the seed database to your \"Copy Resources\" build phase.", + self.storePath, storeDirectory, storeFilename); +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKManagedObjectMappingOperationDataSource.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKManagedObjectMappingOperationDataSource.h new file mode 100644 index 0000000..9f8c19d --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKManagedObjectMappingOperationDataSource.h @@ -0,0 +1,84 @@ +// +// RKManagedObjectMappingOperationDataSource.h +// RestKit +// +// Created by Blake Watters on 7/3/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import +#import "RKMappingOperationDataSource.h" + +@protocol RKManagedObjectCaching; + +/** + The `RKManagedObjectMappingOperationDataSource` class provides support for performing object mapping operations where the mapped objects exist within a Core Data managed object context. The class is responsible for finding exist managed object instances by the identification attributes, instantiating new managed objects, and connecting relationships for mapped objects. + + @see `RKMappingOperationDataSource` + @see `RKConnectionMapping` + */ +@interface RKManagedObjectMappingOperationDataSource : NSObject + +///------------------------------------------------------------------ +/// @name Initializing a Managed Object Mapping Operation Data Source +///------------------------------------------------------------------ + +/** + Initializes the receiver with a given managed object context and managed object cache. + + @param managedObjectContext The managed object context with which to associate the receiver. Cannot be nil. + @param managedObjectCache The managed object cache used by the receiver to find existing object instances by their identification attributes. + @return The receiver, initialized with the given managed object context and managed objet cache. + */ +- (instancetype)initWithManagedObjectContext:(NSManagedObjectContext *)managedObjectContext cache:(id)managedObjectCache; + +///----------------------------------------------------- +/// @name Accessing the Managed Object Context and Cache +///----------------------------------------------------- + +/** + The managed object context with which the receiver is associated. + */ +@property (nonatomic, strong, readonly) NSManagedObjectContext *managedObjectContext; + +/** + The managed object cache utilized by the receiver to find existing managed object instances by the identification attributes. A nil managed object cache will result in the insertion of new managed objects for all mapped content. + + @see `RKFetchRequestManagedObjectCache` + @see `RKInMemoryManagedObjectCache` + */ +@property (nonatomic, strong, readonly) id managedObjectCache; + +///--------------------------------------------------- +/// @name Configuring Relationship Connection Queueing +///--------------------------------------------------- + +/** + The parent operation upon which instances of `RKRelationshipConnectionOperation` created by the data source are dependent upon. + + When connecting relationships as part of a managed object mapping operation, it is possible that the mapping operation itself will create managed objects that should be used to satisfy the connections mappings of representations being mapped. To support such cases, is is desirable to defer the execution of connection operations until the execution of the aggregate mapping operation is complete. The `parentOperation` property provides support for deferring the execution of the enqueued relationship connection operations by establishing a dependency between the connection operations and a parent operation, such as an instance of `RKMapperOperation` such that they will not be executed by the `operationQueue` until the parent operation has finished executing. + */ +@property (nonatomic, weak) NSOperation *parentOperation; + +/** + The operation queue in which instances of `RKRelationshipConnectionOperation` will be enqueued to connect the relationships of mapped objects. + + If `nil`, then current operation queue as returned from `[NSOperationQueue currentQueue]` will be used. + + Please see the documentation for `parentOperation` for a discussion of this property's function. + */ +@property (nonatomic, strong) NSOperationQueue *operationQueue; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKManagedObjectMappingOperationDataSource.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKManagedObjectMappingOperationDataSource.m new file mode 100644 index 0000000..8a53d53 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKManagedObjectMappingOperationDataSource.m @@ -0,0 +1,527 @@ +// +// RKManagedObjectMappingOperationDataSource.m +// RestKit +// +// Created by Blake Watters on 7/3/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import +#import "RKManagedObjectMappingOperationDataSource.h" +#import "RKObjectMapping.h" +#import "RKEntityMapping.h" +#import "RKLog.h" +#import "RKManagedObjectStore.h" +#import "RKMappingOperation.h" +#import "RKObjectMappingMatcher.h" +#import "RKManagedObjectCaching.h" +#import "RKRelationshipConnectionOperation.h" +#import "RKMappingErrors.h" +#import "RKValueTransformers.h" +#import "RKRelationshipMapping.h" +#import "RKObjectUtilities.h" +#import "NSManagedObject+RKAdditions.h" + +extern NSString * const RKObjectMappingNestingAttributeKeyName; + +static void *RKManagedObjectMappingOperationDataSourceAssociatedObjectKey = &RKManagedObjectMappingOperationDataSourceAssociatedObjectKey; + +NSArray *RKApplyNestingAttributeValueToMappings(NSString *attributeName, id value, NSArray *propertyMappings); + +static id RKValueForAttributeMappingInRepresentation(RKAttributeMapping *attributeMapping, NSDictionary *representation) +{ + if ([attributeMapping.sourceKeyPath isEqualToString:RKObjectMappingNestingAttributeKeyName]) { + return [[representation allKeys] lastObject]; + } else if (attributeMapping.sourceKeyPath == nil){ + return representation[[NSNull null]]; + } else { + return [representation valueForKeyPath:attributeMapping.sourceKeyPath]; + } +} + +static RKAttributeMapping *RKAttributeMappingForNameInMappings(NSString *name, NSArray *attributeMappings) +{ + for (RKAttributeMapping *attributeMapping in attributeMappings) { + if ([[attributeMapping destinationKeyPath] isEqualToString:name]) return attributeMapping; + } + + return nil; +} + +/** + This function is the workhorse for extracting entity identifier attributes from a dictionary representation. It supports type transformations, compound entity identifier attributes, and dynamic nesting keys within the representation. + */ +static NSDictionary *RKEntityIdentificationAttributesForEntityMappingWithRepresentation(RKEntityMapping *entityMapping, NSDictionary *representation) +{ + NSCParameterAssert(entityMapping); + NSCAssert([representation isKindOfClass:[NSDictionary class]], @"Expected a dictionary representation"); + NSArray *attributeMappings = entityMapping.attributeMappings; + __block NSError *error = nil; + + // If the representation is mapped with a nesting attribute, we must apply the nesting value to the representation before constructing the identification attributes + RKAttributeMapping *nestingAttributeMapping = [entityMapping mappingForSourceKeyPath:RKObjectMappingNestingAttributeKeyName]; + if (nestingAttributeMapping) { + Class attributeClass = [entityMapping classForProperty:nestingAttributeMapping.destinationKeyPath]; + id attributeValue = nil; + id valueTransformer = nestingAttributeMapping.valueTransformer ?: entityMapping.valueTransformer; + [valueTransformer transformValue:[[representation allKeys] lastObject] toValue:&attributeValue ofClass:attributeClass error:&error]; + attributeMappings = RKApplyNestingAttributeValueToMappings(nestingAttributeMapping.destinationKeyPath, attributeValue, attributeMappings); + } + + // Map the identification attributes + NSMutableDictionary *entityIdentifierAttributes = [NSMutableDictionary dictionaryWithCapacity:[entityMapping.identificationAttributes count]]; + [entityMapping.identificationAttributes enumerateObjectsUsingBlock:^(NSAttributeDescription *attribute, NSUInteger idx, BOOL *stop) { + RKAttributeMapping *attributeMapping = RKAttributeMappingForNameInMappings([attribute name], attributeMappings); + Class attributeClass = [entityMapping classForProperty:[attribute name]]; + id sourceValue = RKValueForAttributeMappingInRepresentation(attributeMapping, representation); + id attributeValue = nil; + id valueTransformer = attributeMapping.valueTransformer ?: entityMapping.valueTransformer; + + if (sourceValue) [valueTransformer transformValue:sourceValue toValue:&attributeValue ofClass:attributeClass error:&error]; + entityIdentifierAttributes[[attribute name]] = attributeValue ?: [NSNull null]; + }]; + + return entityIdentifierAttributes; +} + +static id RKMutableCollectionValueWithObjectForKeyPath(id object, NSString *keyPath) +{ + id value = [object valueForKeyPath:keyPath]; + if ([value isKindOfClass:[NSArray class]]) { + return [object mutableArrayValueForKeyPath:keyPath]; + } else if ([value isKindOfClass:[NSSet class]]) { + return [object mutableSetValueForKeyPath:keyPath]; + } else if ([value isKindOfClass:[NSOrderedSet class]]) { + return [object mutableOrderedSetValueForKeyPath:keyPath]; + } else if (value) { + return [NSMutableArray arrayWithObject:value]; + } + + return nil; +} + +// Pre-condition: invoked from the managed object context of the given object +static BOOL RKDeleteInvalidNewManagedObject(NSManagedObject *managedObject) +{ + if ([managedObject isKindOfClass:[NSManagedObject class]] && [managedObject managedObjectContext] && [managedObject isNew]) { + NSError *validationError = nil; + if (! [managedObject validateForInsert:&validationError]) { + RKLogDebug(@"Unsaved NSManagedObject failed `validateForInsert:` - Deleting object from context: %@", validationError); + [managedObject.managedObjectContext deleteObject:managedObject]; + return YES; + } + } + + return NO; +} + +@interface RKManagedObjectDeletionOperation : NSOperation + +- (instancetype)initWithManagedObjectContext:(NSManagedObjectContext *)managedObjectContext; +- (void)addEntityMapping:(RKEntityMapping *)entityMapping; +@end + +@interface RKManagedObjectDeletionOperation () +@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext; +@property (nonatomic, strong) NSMutableSet *entityMappings; +@end + +@implementation RKManagedObjectDeletionOperation + +- (instancetype)initWithManagedObjectContext:(NSManagedObjectContext *)managedObjectContext +{ + self = [self init]; + if (self) { + self.managedObjectContext = managedObjectContext; + self.entityMappings = [NSMutableSet new]; + } + return self; +} + +- (void)addEntityMapping:(RKEntityMapping *)entityMapping +{ + if (! entityMapping.deletionPredicate) return; + [self.entityMappings addObject:entityMapping]; +} + +- (void)main +{ + [self.managedObjectContext performBlockAndWait:^{ + NSMutableSet *objectsToDelete = [NSMutableSet set]; + for (RKEntityMapping *entityMapping in self.entityMappings) { + NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:[entityMapping.entity name]]; + [fetchRequest setPredicate:entityMapping.deletionPredicate]; + NSError *error = nil; + NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; + if (fetchedObjects) { + [objectsToDelete addObjectsFromArray:fetchedObjects]; + } + } + + for (NSManagedObject *managedObject in objectsToDelete) { + [self.managedObjectContext deleteObject:managedObject]; + } + }]; + + self.entityMappings = nil; +} + +@end + +// Set Logging Component +#undef RKLogComponent +#define RKLogComponent RKlcl_cRestKitCoreData + +extern NSString * const RKObjectMappingNestingAttributeKeyName; + +@interface RKManagedObjectMappingOperationDataSource () +@property (nonatomic, strong, readwrite) NSManagedObjectContext *managedObjectContext; +@property (nonatomic, strong, readwrite) id managedObjectCache; +@property (nonatomic, strong) NSMutableArray *deletionPredicates; +@end + +@implementation RKManagedObjectMappingOperationDataSource + +- (instancetype)initWithManagedObjectContext:(NSManagedObjectContext *)managedObjectContext cache:(id)managedObjectCache +{ + NSParameterAssert(managedObjectContext); + + self = [self init]; + if (self) { + self.managedObjectContext = managedObjectContext; + self.managedObjectCache = managedObjectCache; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(updateCacheWithChangesFromContextWillSaveNotification:) + name:NSManagedObjectContextWillSaveNotification + object:managedObjectContext]; + } + + return self; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (id)mappingOperation:(RKMappingOperation *)mappingOperation targetObjectForMapping:(RKObjectMapping *)mapping inRelationship:(RKRelationshipMapping *)relationship +{ + if (! [mapping isKindOfClass:[RKEntityMapping class]]) { + return [mapping.objectClass new]; + } + + return nil; +} + +- (id)mappingOperation:(RKMappingOperation *)mappingOperation targetObjectForRepresentation:(NSDictionary *)representation withMapping:(RKObjectMapping *)mapping inRelationship:(RKRelationshipMapping *)relationship +{ + NSAssert(representation, @"Mappable data cannot be nil"); + NSAssert(self.managedObjectContext, @"%@ must be initialized with a managed object context.", [self class]); + + if (! [mapping isKindOfClass:[RKEntityMapping class]]) { + return [mapping.objectClass new]; + } + + RKEntityMapping *entityMapping = (RKEntityMapping *)mapping; + NSDictionary *entityIdentifierAttributes = RKEntityIdentificationAttributesForEntityMappingWithRepresentation(entityMapping, representation); + if (! self.managedObjectCache) { + RKLogWarning(@"Performing managed object mapping with a nil managed object cache:\n" + "Unable to update existing object instances by identification attributes. Duplicate objects may be created."); + } + + NSEntityDescription *entity = [entityMapping entity]; + NSManagedObject *managedObject = nil; + + // If we are mapping within a relationship, try to find an existing object without identifying attributes + // NOTE: We avoid doing the mutable(Array|Set|OrderedSet)ValueForKey if there are identification attributes for performance (see issue GH-1232) + if (relationship) { + NSArray *identificationAttributes = [entityMapping.identificationAttributes valueForKey:@"name"]; + id existingObjectsOfRelationship = identificationAttributes ? [mappingOperation.destinationObject valueForKeyPath:relationship.destinationKeyPath] : RKMutableCollectionValueWithObjectForKeyPath(mappingOperation.destinationObject, relationship.destinationKeyPath); + if (existingObjectsOfRelationship && !RKObjectIsCollection(existingObjectsOfRelationship)) existingObjectsOfRelationship = @[ existingObjectsOfRelationship ]; + NSSet *setWithNull = [NSSet setWithObject:[NSNull null]]; + for (NSManagedObject *existingObject in existingObjectsOfRelationship) { + if(existingObject.isDeleted) { + continue; + } + + if (!identificationAttributes) { + managedObject = existingObject; + [existingObjectsOfRelationship removeObject:managedObject]; + break; + } + + NSDictionary *identificationAttributeValues = [existingObject dictionaryWithValuesForKeys:identificationAttributes]; + if ([[NSSet setWithArray:[identificationAttributeValues allValues]] isEqualToSet:setWithNull]) { + managedObject = existingObject; + break; + } + } + } + + // If we have found the entity identification attributes, try to find an existing instance to update + if ([entityIdentifierAttributes count]) { + NSSet *objects = [self.managedObjectCache managedObjectsWithEntity:entity + attributeValues:entityIdentifierAttributes + inManagedObjectContext:self.managedObjectContext]; + if (entityMapping.identificationPredicate) objects = [objects filteredSetUsingPredicate:entityMapping.identificationPredicate]; + if (entityMapping.identificationPredicateBlock) { + NSPredicate *predicate = entityMapping.identificationPredicateBlock(representation, self.managedObjectContext); + if (predicate) objects = [objects filteredSetUsingPredicate:predicate]; + } + if ([objects count] > 0) { + managedObject = [objects anyObject]; + if ([objects count] > 1) RKLogWarning(@"Managed object cache returned %ld objects for the identifier configured for the '%@' entity, expected 1.", (long) [objects count], [entity name]); + } + if (managedObject && [self.managedObjectCache respondsToSelector:@selector(didFetchObject:)]) { + [self.managedObjectCache didFetchObject:managedObject]; + } + } + + if (managedObject == nil) { + NSEntityDescription *localEntity = [NSEntityDescription entityForName:[entity name] inManagedObjectContext:self.managedObjectContext]; + managedObject = [[NSManagedObject alloc] initWithEntity:localEntity insertIntoManagedObjectContext:self.managedObjectContext]; + [managedObject setValuesForKeysWithDictionary:entityIdentifierAttributes]; + if (entityMapping.persistentStore) [self.managedObjectContext assignObject:managedObject toPersistentStore:entityMapping.persistentStore]; + + if ([self.managedObjectCache respondsToSelector:@selector(didCreateObject:)]) { + [self.managedObjectCache didCreateObject:managedObject]; + } + } + + return managedObject; +} + +// Mapping operations should be executed against managed object contexts with the `NSPrivateQueueConcurrencyType` concurrency type +- (BOOL)executingConnectionOperationsWouldDeadlock +{ + return [NSThread isMainThread] && [self.managedObjectContext concurrencyType] == NSMainQueueConcurrencyType && self.operationQueue; +} + +- (void)emitDeadlockWarningIfNecessary +{ + if ([self executingConnectionOperationsWouldDeadlock]) { + RKLogWarning(@"Mapping operation was configured with a managedObjectContext with the `NSMainQueueConcurrencyType` concurrency type" + " and given an operationQueue to perform background work. This configuration will lead to a deadlock with" + " the main queue waiting on the mapping to complete and the operationQueue waiting for access to the MOC." + " You should instead provide a managedObjectContext with the NSPrivateQueueConcurrencyType."); + } +} + +- (BOOL)commitChangesForMappingOperation:(RKMappingOperation *)mappingOperation error:(NSError **)error +{ + if ([mappingOperation.objectMapping isKindOfClass:[RKEntityMapping class]]) { + [self emitDeadlockWarningIfNecessary]; + + RKEntityMapping *entityMapping = (RKEntityMapping *)mappingOperation.objectMapping; + NSArray *connections = [entityMapping connections]; + if ([connections count] > 0 && self.managedObjectCache == nil) { + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: @"Cannot map an entity mapping that contains connection mappings with a data source whose managed object cache is nil." }; + NSError *localError = [NSError errorWithDomain:RKErrorDomain code:RKMappingErrorNilManagedObjectCache userInfo:userInfo]; + if (error) *error = localError; + return NO; + } + + /** + Attempt to establish the connections and delete the object if its invalid once we are done + + NOTE: We obtain a weak reference to the MOC to avoid a potential crash under iOS 5 if the MOC is deallocated before the operation executes. Under iOS 6, the object returns a nil `managedObjectContext` and the `performBlockAndWait:` message is sent to nil. + */ + NSOperationQueue *operationQueue = self.operationQueue ?: [NSOperationQueue currentQueue]; + __weak NSManagedObjectContext *weakContext = [(NSManagedObject *)mappingOperation.destinationObject managedObjectContext]; + NSBlockOperation *deletionOperation = entityMapping.discardsInvalidObjectsOnInsert ? [NSBlockOperation blockOperationWithBlock:^{ + [weakContext performBlockAndWait:^{ + RKDeleteInvalidNewManagedObject(mappingOperation.destinationObject); + }]; + }] : nil; + + // Add a dependency on the parent operation. If we are being mapped as part of a relationship, then the assignment of the mapped object to a parent may well fulfill the validation requirements. This ensures that the relationship mapping has completed before we evaluate the object for deletion. + if (self.parentOperation) [deletionOperation addDependency:self.parentOperation]; + + RKRelationshipConnectionOperation *connectionOperation = nil; + if ([connections count]) { + connectionOperation = [[RKRelationshipConnectionOperation alloc] initWithManagedObject:mappingOperation.destinationObject connections:connections managedObjectCache:self.managedObjectCache]; + [connectionOperation setConnectionBlock:^(RKRelationshipConnectionOperation *operation, RKConnectionDescription *connection, id connectedValue) { + if (connectedValue) { + if ([mappingOperation.delegate respondsToSelector:@selector(mappingOperation:didConnectRelationship:toValue:usingConnection:)]) { + [mappingOperation.delegate mappingOperation:mappingOperation didConnectRelationship:connection.relationship toValue:connectedValue usingConnection:connection]; + } + } else { + if ([mappingOperation.delegate respondsToSelector:@selector(mappingOperation:didFailToConnectRelationship:usingConnection:)]) { + [mappingOperation.delegate mappingOperation:mappingOperation didFailToConnectRelationship:connection.relationship usingConnection:connection]; + } + } + }]; + + if (self.parentOperation) [connectionOperation addDependency:self.parentOperation]; + [deletionOperation addDependency:connectionOperation]; + [operationQueue addOperation:connectionOperation]; + RKLogTrace(@"Enqueued %@ dependent upon parent operation %@ to operation queue %@", connectionOperation, self.parentOperation, operationQueue); + } + + // Enqueue our deletion operation for execution after all the connections + [operationQueue addOperation:deletionOperation]; + + // Handle tombstone deletion by predicate + if ([(RKEntityMapping *)mappingOperation.objectMapping deletionPredicate]) { + RKManagedObjectDeletionOperation *predicateDeletionOperation = nil; + // Attach a deletion operation for execution after the parent operation completes + predicateDeletionOperation = (RKManagedObjectDeletionOperation *)objc_getAssociatedObject(self.parentOperation, RKManagedObjectMappingOperationDataSourceAssociatedObjectKey); + if (! predicateDeletionOperation) { + predicateDeletionOperation = [[RKManagedObjectDeletionOperation alloc] initWithManagedObjectContext:self.managedObjectContext]; + + // Attach a deletion operation for execution after the parent operation completes + if (self.parentOperation) { + objc_setAssociatedObject(self.parentOperation, RKManagedObjectMappingOperationDataSourceAssociatedObjectKey, predicateDeletionOperation, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + [predicateDeletionOperation addDependency:self.parentOperation]; + } + + // Ensure predicate deletion executes after any connections have been established + if (connectionOperation) [predicateDeletionOperation addDependency:connectionOperation]; + + [operationQueue addOperation:predicateDeletionOperation]; + } + [predicateDeletionOperation addEntityMapping:(RKEntityMapping *)mappingOperation.objectMapping]; + } + } + + return YES; +} + +// NOTE: In theory we should be able to use the userInfo dictionary, but the dictionary was coming in empty (12/18/2012) +- (void)updateCacheWithChangesFromContextWillSaveNotification:(NSNotification *)notification +{ + __block NSSet *objectsToAdd; + __block NSSet *objectsToDelete; + + __block BOOL success; + __block NSError *error = nil; + [self.managedObjectContext performBlockAndWait:^{ + objectsToAdd = [[self.managedObjectContext insertedObjects] setByAddingObjectsFromSet:[self.managedObjectContext updatedObjects]]; + objectsToDelete = [[self.managedObjectContext deletedObjects] copy]; + success = [self.managedObjectContext obtainPermanentIDsForObjects:[objectsToAdd allObjects] error:&error]; + }]; + + if (! success) { + RKLogWarning(@"Failed obtaining permanent managed object ID's for %ld objects: the managed object cache was not updated and duplicate objects may be created.", (long) [objectsToAdd count]); + RKLogError(@"Obtaining permanent managed object IDs failed with error: %@", error); + return; + } + + // Update the cache + if ([self.managedObjectCache respondsToSelector:@selector(didFetchObject:)]) { + for (NSManagedObject *managedObject in objectsToAdd) { + [self.managedObjectCache didFetchObject:managedObject]; + } + } + + if ([self.managedObjectCache respondsToSelector:@selector(didDeleteObject:)]) { + for (NSManagedObject *managedObject in objectsToDelete) { + [self.managedObjectCache didDeleteObject:managedObject]; + } + } +} + +- (BOOL)mappingOperation:(RKMappingOperation *)mappingOperation deleteExistingValueOfRelationshipWithMapping:(RKRelationshipMapping *)relationshipMapping error:(NSError **)error +{ + // Validate the assignment policy + if (relationshipMapping.assignmentPolicy != RKReplaceAssignmentPolicy) { + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: @"Unable to satisfy deletion request: Relationship mapping was expected to have an assignment policy of `RKReplaceAssignmentPolicy`, but did not." }; + NSError *localError = [NSError errorWithDomain:RKErrorDomain code:RKMappingErrorInvalidAssignmentPolicy userInfo:userInfo]; + if (error) *error = localError; + return NO; + } + + // Delete any managed objects at the destination key path from the context + id existingValue = [mappingOperation.destinationObject valueForKeyPath:relationshipMapping.destinationKeyPath]; + if ([existingValue isKindOfClass:[NSManagedObject class]]) { + [self.managedObjectContext deleteObject:existingValue]; + } else { + if (RKObjectIsCollection(existingValue)) { + for (NSManagedObject *managedObject in existingValue) { + if (! [managedObject isKindOfClass:[NSManagedObject class]]) continue; + [self.managedObjectContext deleteObject:managedObject]; + } + } + } + + return YES; +} + +- (BOOL)mappingOperationShouldSetUnchangedValues:(RKMappingOperation *)mappingOperation +{ + // Only new objects should have a temporary ID + if ([mappingOperation.destinationObject isKindOfClass:[NSManagedObject class]]) { + return [[(NSManagedObject *)mappingOperation.destinationObject objectID] isTemporaryID]; + } + + return [mappingOperation isNewDestinationObject]; +} + +- (BOOL)isDestinationObjectNotModifiedInMappingOperation:(RKMappingOperation *)mappingOperation { + // Use concrete mapping or original mapping if not available + RKMapping *checkedMapping = mappingOperation.objectMapping ?: mappingOperation.mapping; + + if (! [checkedMapping isKindOfClass:[RKEntityMapping class]]) return NO; + RKEntityMapping *entityMapping = (RKEntityMapping *)checkedMapping; + NSString *modificationKey = [entityMapping.modificationAttribute name]; + if (! modificationKey) return NO; + id currentValue = [mappingOperation.destinationObject valueForKey:modificationKey]; + if (! currentValue) return NO; + if (! [currentValue respondsToSelector:@selector(compare:)]) return NO; + + RKPropertyMapping *propertyMappingForModificationKey = [(RKEntityMapping *)checkedMapping mappingForDestinationKeyPath:modificationKey]; + id rawValue = [[mappingOperation sourceObject] valueForKeyPath:propertyMappingForModificationKey.sourceKeyPath]; + if (! rawValue) return NO; + Class attributeClass = [entityMapping classForProperty:propertyMappingForModificationKey.destinationKeyPath]; + + id transformedValue = nil; + NSError *error = nil; + id valueTransformer = propertyMappingForModificationKey.valueTransformer ?: entityMapping.valueTransformer; + [valueTransformer transformValue:rawValue toValue:&transformedValue ofClass:attributeClass error:&error]; + if (! transformedValue) return NO; + + if ([currentValue isKindOfClass:[NSString class]]) { + return [currentValue isEqualToString:transformedValue]; + } else { + return [currentValue compare:transformedValue] != NSOrderedAscending; + } +} + +- (BOOL)mappingOperationShouldSkipAttributeMapping:(RKMappingOperation *)mappingOperation +{ + return [self isDestinationObjectNotModifiedInMappingOperation:mappingOperation]; +} + +- (BOOL)mappingOperationShouldSkipRelationshipMapping:(RKMappingOperation *)mappingOperation +{ + // Use concrete mapping or original mapping if not available + RKMapping *checkedMapping = mappingOperation.objectMapping ?: mappingOperation.mapping; + + if (! [checkedMapping isKindOfClass:[RKEntityMapping class]]) return NO; + RKEntityMapping *entityMapping = (id)checkedMapping; + if (entityMapping.shouldMapRelationshipsIfObjectIsUnmodified) { + return NO; + } else { + return [self isDestinationObjectNotModifiedInMappingOperation:mappingOperation]; + } +} + +- (BOOL)mappingOperationShouldCollectMappingInfo:(RKMappingOperation *)mappingOperation +{ + return YES; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKManagedObjectStore.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKManagedObjectStore.h new file mode 100644 index 0000000..d11ecf3 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKManagedObjectStore.h @@ -0,0 +1,307 @@ +// +// RKManagedObjectStore.h +// RestKit +// +// Created by Blake Watters on 9/22/09. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import +#import "RKEntityMapping.h" +#import "RKManagedObjectCaching.h" + +@class RKManagedObjectStore; + +/** + The `RKManagedObjectStore` class encapsulates a Core Data stack including a managed object model, a persistent store coordinator, and a set of managed object contexts. The managed object store simplifies the task of properly setting up a Core Data stack and provides some additional functionality, such as the use of a seed database to initialize a SQLite backed persistent store and a simple code path for resetting the store by destroying and recreating the persistent stores. + + ## Initialization + + The managed object store is designed to easily initialize a Core Data stack in a recommended configuration. A store object must always be initialized with a managed object model, but this managed object model can be directly provided, inferred from an already configured persistent store coordinator, or read from the currently available bundles within the application. Note that several features provided by the framework rely on the store being initialized with a mutable managed object model. Please refer to the documentation in the `initWithManagedObjectModel:` for details. + + ## Managed Object Contexts + + The managed object store provides the application developer with a pair of managed object contexts with which to work with Core Data. The store configures a primary managed object context with the NSPrivateQueueConcurrencyType that is associated with the persistent store coordinator for handling Core Data persistence. A second context is also created with the NSMainQueueConcurrencyType that is a child of the primary managed object context for doing work on the main queue. Additional child contexts can be created directly or via a convenience method interface provided by the store (see newChildManagedObjectContextWithConcurrencyType:tracksChanges:). + + The managed object context hierarchy is designed to isolate the main thread from disk I/O and avoid deadlocks. Because the primary context manages its own private queue, saving the main queue context will not result in the objects being saved to the persistent store. The primary context must be saved as well for objects to be persisted to disk. + + It is also worth noting that because of the parent/child context hierarchy, objects created on the main thread will not obtain permanent managed object ID's even after the primary context has been saved. If you need to refer to the permanent representations of objects created on the main thread after a save, you may ask the main queue context to obtain permanent managed objects for your objects via `obtainPermanentIDsForObjects:error:`. Be warned that when obtaining permanent managed object ID's, you must include all newly created objects that are reachable from the object you are concerned with in the set of objects provided to `obtainPermanentIDsForObjects:error:`. This means any newly created object in a one-to-one or one-to-many relationship must be provided or you will face a crash from the managed object context. This is due to a bug in Core Data still present in iOS5, but fixed in iOS6 (see Open Radar http://openradar.appspot.com/11478919). + */ +@interface RKManagedObjectStore : NSObject + +///----------------------------------------- +/// @name Accessing the Default Object Store +///----------------------------------------- + +/** + Returns the default managed object store for the application. + + @return The default managed object store. + */ ++ (instancetype)defaultStore; + +/** + Sets the default managed object store for the application. + + @param managedObjectStore The new default managed object store. + */ ++ (void)setDefaultStore:(RKManagedObjectStore *)managedObjectStore; + +///----------------------------------- +/// @name Initializing an Object Store +///----------------------------------- + +/** + Initializes the receiver with a given managed object model. This is the designated initializer for `RKManagedObjectStore`. + + @param managedObjectModel The managed object model with which to initialize the receiver. + @return The receiver, initialized with the given managed object model. + @bug Several features require that the managed object model used to initialize the store be mutable so that entities may be changed before the persistent store coordinator is created. Since iOS 5, managed object models initialized via initWithContentsOfURL: return an immutable model. The application developer must send the returned managed object model a mutable copy message to ensure that it is mutable before initializing the managed object store. The recommended approach for initializing a managed object store is as follows: + + NSURL *modelURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"MyApplication" ofType:@"momd"]]; + // NOTE: Due to an iOS 5 bug, the managed object model returned is immutable. + NSManagedObjectModel *managedObjectModel = [[[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL] mutableCopy]; + RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel]; + + */ +- (instancetype)initWithManagedObjectModel:(NSManagedObjectModel *)managedObjectModel NS_DESIGNATED_INITIALIZER; + +/** + Initializes the receiver with an existing persistent store coordinator. + + The managed object model from the persistent store coordinator will be used to initialize the receiver and the given persistent store coordinator will be configured as the persistent store coordinator for the managed object store. + + This initialization method provides for easy integration with an existing Core Data stack. + + @param persistentStoreCoordinator The persistent store coordinator with which to initialize the receiver. + @return The receiver, initialized with the managed object model of the given persistent store coordinator and the persistent store coordinator. + */ +- (instancetype)initWithPersistentStoreCoordinator:(NSPersistentStoreCoordinator *)persistentStoreCoordinator; + +/** + Initializes the receiver with a managed object model obtained by merging the models from all of the application's non-framework bundles. + + @see `[NSBundle allBundles]` + @see `[NSManagedObjectModel mergedModelFromBundles:]` + + @warning Obtaining a managed object model by merging all bundles may result in an application error if versioned object models are in use. + */ +- (instancetype)init; + +///----------------------------------------------------------------------------- +/// @name Configuring Persistent Stores +///----------------------------------------------------------------------------- + +/** + Creates a persistent store coordinator with the receiver's managed object model. After invocation, the persistentStoreCoordinator property will no longer be nil. + + @warning Creating the persistent store coordinator will render the managed object model immutable. Attempts to use functionality that requires a mutable managed object model after the persistent store coordinator has been created will raise an application error. + */ +- (void)createPersistentStoreCoordinator; + +/** + Adds a new in memory persistent store to the persistent store coordinator of the receiver. + + This method will invoke createPersistentStore if a persistent store coordinator has not yet been created. + + @param error On input, a pointer to an error object. If an error occurs, this pointer is set to an actual error object containing the error information. You may specify nil for this parameter if you do not want the error information. + @returns The new persistent store, or nil in the event of an error. + */ +- (NSPersistentStore *)addInMemoryPersistentStore:(NSError **)error; + +/** + Adds a new SQLite persistent store, optionally initialized with a seed database, to the persistent store coordinator of the receiver. + + @param storePath The path at which to save the persistent store on disk. + @param seedPath An optional path to a seed database to copy to the given storePath in the event that a store does not yet exist. + @param nilOrConfigurationName An optional name of a Core Data configuration in the managed object model. + @param nilOrOptions An optional dictionary of options with which to configure the persistent store. If `nil`, a dictionary of options enabling `NSMigratePersistentStoresAutomaticallyOption` and `NSInferMappingModelAutomaticallyOption` will be used. + @param error On input, a pointer to an error object. If an error occurs, this pointer is set to an actual error object containing the error information. You may specify nil for this parameter if you do not want the error information. + + @bug Note that when built for iOS, this method will set a resource value on the SQLite file backing the persistent store for the `NSURLIsExcludedFromBackupKey` key set to `YES` to exclude the SQLite file from being backed up by iCloud to conform with the ["iOS Data Storage Guidelines"](https://developer.apple.com/icloud/documentation/data-storage/) + @warning If the seed database at the given path was created with an incompatible managed object model an application error may be raised. + */ +- (NSPersistentStore *)addSQLitePersistentStoreAtPath:(NSString *)storePath + fromSeedDatabaseAtPath:(NSString *)seedPath + withConfiguration:(NSString *)nilOrConfigurationName + options:(NSDictionary *)nilOrOptions + error:(NSError **)error; + +/** + Resets the persistent stores in the receiver's persistent store coordinator and recreates them. If a store being reset is backed by a file on disk (such as a SQLite file), the file will be removed prior to recreating the store. If the store was originally created using a seed database, the seed will be recopied to reset the store to its seeded state. If the managed object model uses External Storage for any of its entities, then the external storage directory will be recursively deleted when the store is reset. + + @param error On input, a pointer to an error object. If an error occurs, this pointer is set to an actual error object containing the error information. You may specify nil for this parameter if you do not want the error information. + @return A Boolean value indicating if the reset was successful. + + @bug This method will implictly result in the managed object contexts associated with the receiver to be discarded and recreated. Any managed objects or additional child contexts associated with the store will need to be discarded or else exceptions may be raised (i.e. `NSObjectInaccessibleException`). + + Also note that care must be taken to cancel/suspend all mapping operations, reset all managed object contexts, and disconnect all `NSFetchedResultController` objects that are associated with managed object contexts using the persistent stores of the receiver before attempting a reset. Failure to completely disconnect usage before calling this method is likely to result in a deadlock. + + As an alternative to resetting the persistent store, you may wish to consider simply deleting all managed objects out of the managed object context. If your data set is not very large, this can be a performant operation and is significantly easier to implement correctly. An example implementation for truncating all managed objects from the store is provided below: + + NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ + NSManagedObjectContext *managedObjectContext = [RKManagedObjectStore defaultStore].persistentStoreManagedObjectContext; + [managedObjectContext performBlockAndWait:^{ + NSError *error = nil; + for (NSEntityDescription *entity in [RKManagedObjectStore defaultStore].managedObjectModel) { + NSFetchRequest *fetchRequest = [NSFetchRequest new]; + [fetchRequest setEntity:entity]; + [fetchRequest setIncludesSubentities:NO]; + NSArray *objects = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; + if (! objects) RKLogWarning(@"Failed execution of fetch request %@: %@", fetchRequest, error); + for (NSManagedObject *managedObject in objects) { + [managedObjectContext deleteObject:managedObject]; + } + } + + BOOL success = [managedObjectContext save:&error]; + if (!success) RKLogWarning(@"Failed saving managed object context: %@", error); + }]; + }]; + [operation setCompletionBlock:^{ + // Do stuff once the truncation is complete + }]; + [operation start]; + */ +- (BOOL)resetPersistentStores:(NSError **)error; + +///----------------------------------------- +/// @name Retrieving Details about the Store +///----------------------------------------- + +/** + Returns the managed object model of the receiver. + + @return The managed object model of the receiver. + */ +@property (nonatomic, strong, readonly) NSManagedObjectModel *managedObjectModel; + +/** + Returns the persistent store coordinator of the receiver. + + @return The persistent store coordinator of the receiver. + */ +@property (nonatomic, strong, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator; + +/** + The managed object cache associated with the receiver. + + The managed object cache is used to accelerate intensive Core Data operations by caching managed objects by one or more attributes. + + **Default**: An instance of `RKFetchRequestManagedObjectCache`. + + @see `RKManagedObjectCaching` + @warning A nil managed object cache will result in a store that is unable to uniquely identify existing objects by identification attributes and may result in the creation of duplicate objects within the store. + */ +@property (nonatomic, strong) id managedObjectCache; + +///------------------------------------------- +/// @name Working with Managed Object Contexts +///------------------------------------------- + +/** + Creates the persistent store and main queue managed object contexts for the receiver. + + @see `persistentStoreManagedObjectContext` + @see `mainQueueManagedObjectContext` + @raises NSInternalInconsistencyException Raised if the managed object contexts have already been created. + */ +- (void)createManagedObjectContexts; + +/** + Returns the managed object context of the receiver that is associated with the persistent store coordinator and is responsible for managing persistence. + + The persistent store context is created with the `NSPrivateQueueConcurrencyType` and as such must be interacted with using `[NSManagedObjectContext performBlock:]` or `[NSManagedObjectContext performBlockAndWait:]`. This context typically serves as the parent context for scratch contexts or main queue contexts for interacting with the user interface. Created by the invocation of `createManagedObjectContexts`. + + @see `createManagedObjectContexts` + */ +@property (nonatomic, strong, readonly) NSManagedObjectContext *persistentStoreManagedObjectContext; + +/** + The main queue managed object context of the receiver. + + The main queue context is available for usage on the main queue to drive user interface needs. The context is created with the NSMainQueueConcurrencyType and as such may be messaged directly from the main thread. The context is a child context of the persistentStoreManagedObjectContext and can persist changes up to the parent via a save. + */ +@property (nonatomic, strong, readonly) NSManagedObjectContext *mainQueueManagedObjectContext; + +/** + Creates a new child managed object context of the persistent store managed object context with a given concurrency type, optionally tracking changes saved to the parent context and merging them on save. + + @param concurrencyType The desired concurrency type for the new context. + @param tracksChanges When `YES`, the new context will observe the `persistentStoreManagedObjectContext` for save events and merge in any changes via `[NSManagedObjectContext mergeChangesFromContextDidSaveNotification:]`. + @return A newly created managed object context with the given concurrency type whose parent is the `persistentStoreManagedObjectContext`. + */ +- (NSManagedObjectContext *)newChildManagedObjectContextWithConcurrencyType:(NSManagedObjectContextConcurrencyType)concurrencyType tracksChanges:(BOOL)tracksChanges; +- (NSManagedObjectContext *)newChildManagedObjectContextWithConcurrencyType:(NSManagedObjectContextConcurrencyType)concurrencyType DEPRECATED_ATTRIBUTE; // invokes above with `tracksChanges:NO` + +///---------------------------- +/// @name Performing Migrations +///---------------------------- + +/** + Performs a migration on a persistent store at a given URL to the model at the specified URL. + + This method provides support for migrating persistent stores in which the source and destination models have been mutated after being loaded from the model archive on disk, such as when the RestKit managed object searching support is used. In a situation where the persistent store has been created with a dynamically modified managed object model. Core Data is unable to infer the mapping model because the metadata of the persistent store does not agree with that of the managed object model due to the dynamic modifications. In order to perform a migration, one must load the appropriate source model, apply the dynamic changes appropriate for that model, then infer a mapping model from the modified model. This method assists in this process by accepting a source store and a destination model as arguments and searching through all models in the .momd package and yielding each model to the given configuration block for processing. After the block is invoked, the metadata of the store is checked for compatibility with the modified managed object model to identify the source store. Once the source store is found, a mapping model is inferred and the migration proceeds. The migration is done against a copy of the given persistent store and if successful, the migrated store is moved to replace the original store. + + To understand how this is used, consider the following example: Given a managed object model containing two entities 'Article' and 'Tag', the user wishes to configure managed object search indexing on the models and wishes to be able to migrate existing persistent stores across versions. The migration configuration would look something like this: + + NSURL *storeURL = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"MyStore.sqlite"]; + NSURL *modelURL = [[RKTestFixture fixtureBundle] URLForResource:@"VersionedModel" withExtension:@"momd"]; + BOOL success = [RKManagedObjectStore migratePersistentStoreOfType:NSSQLiteStoreType atURL:storeURL toModelAtURL:modelURL error:&error configuringModelsWithBlock:^(NSManagedObjectModel *model, NSURL *sourceURL) { + // Examine each model and configure search indexing appropriately based on the versionIdentifiers configured in the model + if ([[model versionIdentifiers] isEqualToSet:[NSSet setWithObject:@"1.0"]]) { + NSEntityDescription *articleEntity = [[model entitiesByName] objectForKey:@"Article"]; + NSEntityDescription *tagEntity = [[model entitiesByName] objectForKey:@"Tag"]; + [RKSearchIndexer addSearchIndexingToEntity:articleEntity onAttributes:@[ @"title" ]]; + [RKSearchIndexer addSearchIndexingToEntity:tagEntity onAttributes:@[ @"name" ]]; + } else if ([[model versionIdentifiers] isEqualToSet:[NSSet setWithObject:@"2.0"]]) { + NSEntityDescription *articleEntity = [[model entitiesByName] objectForKey:@"Article"]; + NSEntityDescription *tagEntity = [[model entitiesByName] objectForKey:@"Tag"]; + [RKSearchIndexer addSearchIndexingToEntity:articleEntity onAttributes:@[ @"title", @"body" ]]; + [RKSearchIndexer addSearchIndexingToEntity:tagEntity onAttributes:@[ @"name" ]]; + } else if ([[model versionIdentifiers] containsObject:@"3.0"] || [[model versionIdentifiers] containsObject:@"4.0"]) { + // We index the same attributes on v3 and v4 + NSEntityDescription *articleEntity = [[model entitiesByName] objectForKey:@"Article"]; + NSEntityDescription *tagEntity = [[model entitiesByName] objectForKey:@"Tag"]; + [RKSearchIndexer addSearchIndexingToEntity:articleEntity onAttributes:@[ @"title", @"body", @"authorName" ]]; + [RKSearchIndexer addSearchIndexingToEntity:tagEntity onAttributes:@[ @"name" ]]; + } + }]; + + @param storeType The type of store that given URL. May be `nil`. + @param storeURL A URL to the store that is to be migrated. + @param destinationModelURL A URL to the managed object model that the persistent store is to be updated to. This URL may target a specific model version with a .momd package or point to the .momd package itself, in which case the migration is performed to the current version of the model as configured on the .xcdatamodeld file used to the build the .momd package. + @param error A pointer to an error object that is set in the event that the migration is unsuccessful. + @param block A block object used to configure + + @warning This method is only usable with a versioned Managed Object Model stored as a .momd package containing .mom managed object model archives. + */ ++ (BOOL)migratePersistentStoreOfType:(NSString *)storeType + atURL:(NSURL *)storeURL + toModelAtURL:(NSURL *)destinationModelURL + error:(NSError **)error + configuringModelsWithBlock:(void (^)(NSManagedObjectModel *model, NSURL *sourceURL))block; + +@end + +/** + Option containing the path to the seed database a SQLite store was initialized with + **/ +extern NSString *const RKSQLitePersistentStoreSeedDatabasePathOption; + +/** + Posted when a managed object context has reset its persistent stores. + */ +extern NSString *const RKManagedObjectStoreDidResetPersistentStoresNotification; diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKManagedObjectStore.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKManagedObjectStore.m new file mode 100644 index 0000000..3e3ef24 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKManagedObjectStore.m @@ -0,0 +1,576 @@ +// +// RKManagedObjectStore.m +// RestKit +// +// Created by Blake Watters on 9/22/09. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import +#import "RKManagedObjectStore.h" +#import "RKLog.h" +#import "RKPropertyInspector.h" +#import "RKPropertyInspector+CoreData.h" +#import "RKPathUtilities.h" +#import "RKInMemoryManagedObjectCache.h" +#import "RKFetchRequestManagedObjectCache.h" +#import "NSManagedObjectContext+RKAdditions.h" +#import "RKManagedObjectStore_Private.h" + +// Set Logging Component +#undef RKLogComponent +#define RKLogComponent RKlcl_cRestKitCoreData + +extern NSString *const RKErrorDomain; + +NSString *const RKSQLitePersistentStoreSeedDatabasePathOption = @"RKSQLitePersistentStoreSeedDatabasePathOption"; +NSString *const RKManagedObjectStoreDidFailSaveNotification = @"RKManagedObjectStoreDidFailSaveNotification"; +NSString *const RKManagedObjectStoreDidResetPersistentStoresNotification = @"RKManagedObjectStoreDidResetPersistentStoresNotification"; + +static RKManagedObjectStore *defaultStore = nil; + +static BOOL RKIsManagedObjectContextDescendentOfContext(NSManagedObjectContext *childContext, NSManagedObjectContext *potentialAncestor) +{ + NSManagedObjectContext *context = [childContext parentContext]; + while (context) { + if ([context isEqual:potentialAncestor]) return YES; + context = [context parentContext]; + } + return NO; +} + +NSSet *RKSetOfManagedObjectIDsFromManagedObjectContextDidSaveNotification(NSNotification *notification) +{ + NSMutableSet *objectIDs = [NSMutableSet set]; + + void (^unionObjectIDs)(NSMutableSet *, NSSet *) = ^(NSMutableSet *objectIDs, NSSet *objects) { + if (objects != nil) { + [objectIDs unionSet:[objects valueForKey:NSStringFromSelector(@selector(objectID))]]; + } + }; + + unionObjectIDs(objectIDs,notification.userInfo[NSInsertedObjectsKey]); + unionObjectIDs(objectIDs,notification.userInfo[NSUpdatedObjectsKey]); + unionObjectIDs(objectIDs,notification.userInfo[NSDeletedObjectsKey]); + + return objectIDs; +} + +@interface RKManagedObjectContextChangeMergingObserver : NSObject +@property (nonatomic, weak) NSManagedObjectContext *observedContext; +@property (nonatomic, weak) NSManagedObjectContext *mergeContext; +@property (nonatomic, strong) NSSet *objectIDsFromChildDidSaveNotification; + +- (instancetype)initWithObservedContext:(NSManagedObjectContext *)observedContext mergeContext:(NSManagedObjectContext *)mergeContext NS_DESIGNATED_INITIALIZER; +@end + +@implementation RKManagedObjectContextChangeMergingObserver + +- (instancetype)init +{ + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"-init is not a valid initializer for the class %@, use designated initilizer -initWithObservedContext:mergeContext:", NSStringFromClass([self class])] + userInfo:nil]; + return [self init]; +} + +- (instancetype)initWithObservedContext:(NSManagedObjectContext *)observedContext mergeContext:(NSManagedObjectContext *)mergeContext +{ + if (! observedContext) [NSException raise:NSInvalidArgumentException format:@"observedContext cannot be `nil`."]; + if (! mergeContext) [NSException raise:NSInvalidArgumentException format:@"mergeContext cannot be `nil`."]; + self = [super init]; + if (self) { + self.observedContext = observedContext; + self.mergeContext = mergeContext; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleManagedObjectContextDidSaveNotification:) name:NSManagedObjectContextDidSaveNotification object:observedContext]; + + if (RKIsManagedObjectContextDescendentOfContext(mergeContext, observedContext)) { + RKLogDebug(@"Detected observation of ancestor context by child: enabling child context save detection"); + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleManagedObjectContextWillSaveNotification:) name:NSManagedObjectContextDidSaveNotification object:mergeContext]; + } + } + return self; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (void)handleManagedObjectContextWillSaveNotification:(NSNotification *)notification +{ + self.objectIDsFromChildDidSaveNotification = RKSetOfManagedObjectIDsFromManagedObjectContextDidSaveNotification(notification); +} + +- (void)handleManagedObjectContextDidSaveNotification:(NSNotification *)notification +{ + NSAssert([notification object] == self.observedContext, @"Received Managed Object Context Did Save Notification for Unexpected Context: %@", [notification object]); + if (! [self.objectIDsFromChildDidSaveNotification isEqual:RKSetOfManagedObjectIDsFromManagedObjectContextDidSaveNotification(notification)]) { + [self.mergeContext performBlock:^{ + + /* + Fault updated objects before merging changes into mainQueueManagedObjectContext. + + This enables NSFetchedResultsController to update and re-sort its fetch results and to call its delegate methods + in response Managed Object updates merged from another context. + See: + http://stackoverflow.com/a/3927811/489376 + http://stackoverflow.com/a/16296365/489376 + for issue details. + */ + for (NSManagedObject *object in [[notification userInfo] objectForKey:NSUpdatedObjectsKey]) { + NSManagedObjectID *objectID = [object objectID]; + if (objectID && ![objectID isTemporaryID]) { + NSError *error = nil; + NSManagedObject * updatedObject = [self.mergeContext existingObjectWithID:objectID error:&error]; + if (error) { + RKLogDebug(@"Failed to get existing object for objectID (%@). Failed with error: %@", objectID, error); + } + else { + [updatedObject willAccessValueForKey:nil]; + } + } + } + + [self.mergeContext mergeChangesFromContextDidSaveNotification:notification]; + }]; + } else { + RKLogDebug(@"Skipping merge of `NSManagedObjectContextDidSaveNotification`: the save event originated from the mergeContext and thus no save is necessary."); + } + self.objectIDsFromChildDidSaveNotification = nil; +} + +@end + +static char RKManagedObjectContextChangeMergingObserverAssociationKey; + +@interface RKManagedObjectStore () +@property (nonatomic, strong, readwrite) NSManagedObjectModel *managedObjectModel; +@property (nonatomic, strong, readwrite) NSPersistentStoreCoordinator *persistentStoreCoordinator; +@property (nonatomic, strong, readwrite) NSManagedObjectContext *persistentStoreManagedObjectContext; +@property (nonatomic, strong, readwrite) NSManagedObjectContext *mainQueueManagedObjectContext; +@end + +@implementation RKManagedObjectStore + ++ (instancetype)defaultStore +{ + return defaultStore; +} + ++ (void)setDefaultStore:(RKManagedObjectStore *)managedObjectStore +{ + if (defaultStore) { + @synchronized(defaultStore) { + defaultStore = managedObjectStore; + } + } else { + defaultStore = managedObjectStore; + } +} + +- (instancetype)initWithManagedObjectModel:(NSManagedObjectModel *)managedObjectModel +{ + self = [super init]; + if (self) { + self.managedObjectModel = managedObjectModel; + self.managedObjectCache = [RKFetchRequestManagedObjectCache new]; + + // Hydrate the defaultStore + if (! defaultStore) { + [RKManagedObjectStore setDefaultStore:self]; + } + } + + return self; +} + +- (instancetype)init +{ + NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:[NSBundle allBundles]]; + return [self initWithManagedObjectModel:managedObjectModel]; +} + +- (instancetype)initWithPersistentStoreCoordinator:(NSPersistentStoreCoordinator *)persistentStoreCoordinator +{ + self = [self initWithManagedObjectModel:persistentStoreCoordinator.managedObjectModel]; + if (self) { + self.persistentStoreCoordinator = persistentStoreCoordinator; + } + + return self; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (void)createPersistentStoreCoordinator +{ + self.persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel]; +} + +- (NSPersistentStore *)addInMemoryPersistentStore:(NSError **)error +{ + if (! self.persistentStoreCoordinator) [self createPersistentStoreCoordinator]; + + return [self.persistentStoreCoordinator addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:error]; +} + +- (NSPersistentStore *)addSQLitePersistentStoreAtPath:(NSString *)storePath + fromSeedDatabaseAtPath:(NSString *)seedPath + withConfiguration:(NSString *)nilOrConfigurationName + options:(NSDictionary *)nilOrOptions + error:(NSError **)error +{ + if (! self.persistentStoreCoordinator) [self createPersistentStoreCoordinator]; + + NSURL *storeURL = [NSURL fileURLWithPath:storePath]; + + if (seedPath) { + BOOL success = [self copySeedDatabaseIfNecessaryFromPath:seedPath toPath:storePath error:error]; + if (! success) return nil; + } + + NSDictionary *options = nil; + if (nilOrOptions) { + NSMutableDictionary *mutableOptions = [nilOrOptions mutableCopy]; + mutableOptions[RKSQLitePersistentStoreSeedDatabasePathOption] = (seedPath ?: [NSNull null]); + options = mutableOptions; + } else { + options = @{ RKSQLitePersistentStoreSeedDatabasePathOption: (seedPath ?: [NSNull null]), + NSMigratePersistentStoresAutomaticallyOption: @(YES), + NSInferMappingModelAutomaticallyOption: @(YES) }; + } + + /** + There seems to be trouble with combining configurations and migration. So do this in two steps: first, attach the store with NO configuration, but WITH migration options; then remove it and reattach WITH configuration, but NOT migration options. + + http://blog.atwam.com/blog/2012/05/11/multiple-persistent-stores-and-seed-data-with-core-data/ + http://stackoverflow.com/questions/1774359/core-data-migration-error-message-model-does-not-contain-configuration-xyz + */ + NSPersistentStore *persistentStore = [self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:error]; + if (! persistentStore) return nil; + if (! [self.persistentStoreCoordinator removePersistentStore:persistentStore error:error]) return nil; + + NSDictionary *seedOptions = nil; + if (nilOrOptions) { + NSMutableDictionary *mutableOptions = [nilOrOptions mutableCopy]; + mutableOptions[RKSQLitePersistentStoreSeedDatabasePathOption] = (seedPath ?: [NSNull null]); + seedOptions = mutableOptions; + } else { + seedOptions = @{ RKSQLitePersistentStoreSeedDatabasePathOption: (seedPath ?: [NSNull null]) }; + } + persistentStore = [self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nilOrConfigurationName URL:storeURL options:seedOptions error:error]; + if (! persistentStore) return nil; + + // Exclude the SQLite database from iCloud Backups to conform to the iCloud Data Storage Guidelines + RKSetExcludeFromBackupAttributeForItemAtPath(storePath); + + return persistentStore; +} + +- (BOOL)copySeedDatabaseIfNecessaryFromPath:(NSString *)seedPath toPath:(NSString *)storePath error:(NSError **)error +{ + if (NO == [[NSFileManager defaultManager] fileExistsAtPath:storePath]) { + NSError *localError; + if (![[NSFileManager defaultManager] copyItemAtPath:seedPath toPath:storePath error:&localError]) { + RKLogError(@"Failed to copy seed database from path '%@' to path '%@': %@", seedPath, storePath, [localError localizedDescription]); + if (error) *error = localError; + + return NO; + } + if ([[NSFileManager defaultManager] fileExistsAtPath:[seedPath stringByAppendingString:@"-shm"]]) { + if (![[NSFileManager defaultManager] copyItemAtPath:[seedPath stringByAppendingString:@"-shm"] toPath:[storePath stringByAppendingString:@"-shm"] error:&localError]) { + RKLogError(@"Failed to copy seed database (SHM) from path '%@' to path '%@': %@", seedPath, storePath, [localError localizedDescription]); + if (error) *error = localError; + + return NO; + } + } + if ([[NSFileManager defaultManager] fileExistsAtPath:[seedPath stringByAppendingString:@"-wal"]]) { + if (![[NSFileManager defaultManager] copyItemAtPath:[seedPath stringByAppendingString:@"-wal"] toPath:[storePath stringByAppendingString:@"-wal"] error:&localError]) { + RKLogError(@"Failed to copy seed database (WAL) from path '%@' to path '%@': %@", seedPath, storePath, [localError localizedDescription]); + if (error) *error = localError; + + return NO; + } + } + } + + return YES; +} + +- (NSManagedObjectContext *)newChildManagedObjectContextWithConcurrencyType:(NSManagedObjectContextConcurrencyType)concurrencyType tracksChanges:(BOOL)tracksChanges +{ + NSManagedObjectContext *managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:concurrencyType]; + [managedObjectContext performBlockAndWait:^{ + managedObjectContext.parentContext = self.persistentStoreManagedObjectContext; + managedObjectContext.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy; + }]; + + if (tracksChanges) { + RKManagedObjectContextChangeMergingObserver *observer = [[RKManagedObjectContextChangeMergingObserver alloc] initWithObservedContext:self.persistentStoreManagedObjectContext mergeContext:managedObjectContext]; + objc_setAssociatedObject(managedObjectContext, + &RKManagedObjectContextChangeMergingObserverAssociationKey, + observer, + OBJC_ASSOCIATION_RETAIN); + } + + return managedObjectContext; +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-implementations" +- (NSManagedObjectContext *)newChildManagedObjectContextWithConcurrencyType:(NSManagedObjectContextConcurrencyType)concurrencyType +{ + return [self newChildManagedObjectContextWithConcurrencyType:concurrencyType tracksChanges:NO]; +} +#pragma clang diagnostic pop + +- (void)createManagedObjectContexts +{ + NSAssert(!self.persistentStoreManagedObjectContext, @"Unable to create managed object contexts: A primary managed object context already exists."); + NSAssert(!self.mainQueueManagedObjectContext, @"Unable to create managed object contexts: A main queue managed object context already exists."); + NSAssert([[self.persistentStoreCoordinator persistentStores] count], @"Cannot create managed object contexts: The persistent store coordinator does not have any persistent stores. This likely means that you forgot to add a persistent store or your attempt to do so failed with an error."); + + // Our primary MOC is a private queue concurrency type + self.persistentStoreManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; + self.persistentStoreManagedObjectContext.persistentStoreCoordinator = self.persistentStoreCoordinator; + self.persistentStoreManagedObjectContext.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy; + + // Create an MOC for use on the main queue + self.mainQueueManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; + self.mainQueueManagedObjectContext.parentContext = self.persistentStoreManagedObjectContext; + self.mainQueueManagedObjectContext.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy; + + // Merge changes from a primary MOC back into the main queue when complete + RKManagedObjectContextChangeMergingObserver *observer = [[RKManagedObjectContextChangeMergingObserver alloc] initWithObservedContext:self.persistentStoreManagedObjectContext mergeContext:self.mainQueueManagedObjectContext]; + objc_setAssociatedObject(self.mainQueueManagedObjectContext, + &RKManagedObjectContextChangeMergingObserverAssociationKey, + observer, + OBJC_ASSOCIATION_RETAIN); +} + +- (void)recreateManagedObjectContexts +{ + self.persistentStoreManagedObjectContext = nil; + self.mainQueueManagedObjectContext = nil; + [self createManagedObjectContexts]; +} + +- (BOOL)resetPersistentStores:(NSError **)error +{ + [self.mainQueueManagedObjectContext performBlockAndWait:^{ + [self.mainQueueManagedObjectContext reset]; + }]; + [self.persistentStoreManagedObjectContext performBlockAndWait:^{ + [self.persistentStoreManagedObjectContext reset]; + }]; + + NSError *localError; + for (NSPersistentStore *persistentStore in self.persistentStoreCoordinator.persistentStores) { + NSURL *URL = [self.persistentStoreCoordinator URLForPersistentStore:persistentStore]; + BOOL success = [self.persistentStoreCoordinator removePersistentStore:persistentStore error:&localError]; + if (success) { + if ([URL isFileURL]) { + if (! [[NSFileManager defaultManager] removeItemAtURL:URL error:&localError]) { + RKLogError(@"Failed to remove persistent store at URL %@: %@", URL, localError); + if (error) *error = localError; + return NO; + } + + // Check for and remove an external storage directory + NSString *supportDirectoryName = [NSString stringWithFormat:@".%@_SUPPORT", [[URL lastPathComponent] stringByDeletingPathExtension]]; + NSURL *supportDirectoryFileURL = [NSURL URLWithString:supportDirectoryName relativeToURL:[URL URLByDeletingLastPathComponent]]; + BOOL isDirectory = NO; + if ([[NSFileManager defaultManager] fileExistsAtPath:[supportDirectoryFileURL path] isDirectory:&isDirectory]) { + if (isDirectory) { + if (! [[NSFileManager defaultManager] removeItemAtURL:supportDirectoryFileURL error:&localError]) { + RKLogError(@"Failed to remove persistent store Support directory at URL %@: %@", supportDirectoryFileURL, localError); + if (error) *error = localError; + return NO; + } + } else { + RKLogWarning(@"Found external support item for store at path that is not a directory: %@", [supportDirectoryFileURL path]); + } + } + + // Check for and remove -shm and -wal files + for (NSString *suffix in @[ @"-shm", @"-wal" ]) { + NSString *supportFileName = [[URL lastPathComponent] stringByAppendingString:suffix]; + NSURL *supportFileURL = [NSURL URLWithString:supportFileName relativeToURL:[URL URLByDeletingLastPathComponent]]; + if ([[NSFileManager defaultManager] fileExistsAtPath:[supportFileURL path]]) { + if (! [[NSFileManager defaultManager] removeItemAtURL:supportFileURL error:&localError]) { + RKLogError(@"Failed to remove support file at URL %@: %@", supportFileURL, localError); + if (error) *error = localError; + return NO; + } + } + } + } else { + RKLogDebug(@"Skipped removal of persistent store file: URL for persistent store is not a file URL. (%@)", URL); + } + + NSPersistentStore *newStore; + if ([persistentStore.type isEqualToString:NSSQLiteStoreType]) { + // Seed path for reclone the persistent store from the seed path if necessary + NSString *seedPath = [persistentStore.options valueForKey:RKSQLitePersistentStoreSeedDatabasePathOption]; + if ([seedPath isEqual:[NSNull null]]) { + seedPath = nil; + } + + // Add a new store with the same options, except RKSQLitePersistentStoreSeedDatabasePathOption option + // that is not expected in this method. + NSMutableDictionary *mutableOptions = [persistentStore.options mutableCopy]; + [mutableOptions removeObjectForKey:RKSQLitePersistentStoreSeedDatabasePathOption]; + mutableOptions = [mutableOptions count] > 0 ? mutableOptions : nil; + // This method is only for NSSQLiteStoreType + newStore = [self addSQLitePersistentStoreAtPath:[persistentStore.URL path] + fromSeedDatabaseAtPath:seedPath + withConfiguration:persistentStore.configurationName + options:mutableOptions + error:&localError]; + } + else { + // Add a new store with the same options + newStore = [self.persistentStoreCoordinator addPersistentStoreWithType:persistentStore.type + configuration:persistentStore.configurationName + URL:persistentStore.URL + options:persistentStore.options error:&localError]; + + } + + + if (! newStore) { + if (error) *error = localError; + return NO; + } + } else { + RKLogError(@"Failed reset of persistent store %@: Failed to remove persistent store with error: %@", persistentStore, localError); + if (error) *error = localError; + return NO; + } + } + + [self recreateManagedObjectContexts]; + + [[NSNotificationCenter defaultCenter] postNotificationName:RKManagedObjectStoreDidResetPersistentStoresNotification object:self]; + + return YES; +} + ++ (BOOL)migratePersistentStoreOfType:(NSString *)storeType + atURL:(NSURL *)storeURL + toModelAtURL:(NSURL *)destinationModelURL + error:(NSError **)error + configuringModelsWithBlock:(void (^)(NSManagedObjectModel *, NSURL *))block +{ + BOOL isMomd = [[destinationModelURL pathExtension] isEqualToString:@"momd"]; // Momd contains a directory of versioned models + NSManagedObjectModel *destinationModel = [[[NSManagedObjectModel alloc] initWithContentsOfURL:destinationModelURL] mutableCopy]; + + // Yield the destination model for configuration (i.e. search indexing) + if (block) block(destinationModel, destinationModelURL); + + // Check if the store is compatible with our model + NSDictionary *storeMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType + URL:storeURL + error:error]; + if (! storeMetadata) return NO; + if ([destinationModel isConfiguration:nil compatibleWithStoreMetadata:storeMetadata]) { + // Our store is compatible with the current model, no migration is necessary + return YES; + } + + RKLogInfo(@"Determined that store at URL %@ has incompatible metadata for managed object model: performing migration...", storeURL); + + NSURL *momdURL = isMomd ? destinationModelURL : [destinationModelURL URLByDeletingLastPathComponent]; + + // We can only do migrations within a versioned momd + if (![[momdURL pathExtension] isEqualToString:@"momd"]) { + NSString *errorDescription = [NSString stringWithFormat:@"Migration failed: Migrations can only be performed to versioned destination models contained in a .momd package. Incompatible destination model given at path '%@'", [momdURL path]]; + if (error) *error = [NSError errorWithDomain:RKErrorDomain code:NSMigrationError userInfo:@{ NSLocalizedDescriptionKey: errorDescription }]; + return NO; + } + + NSArray *versionedModelURLs = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:momdURL + includingPropertiesForKeys:@[] // We only want the URLs + options:NSDirectoryEnumerationSkipsPackageDescendants|NSDirectoryEnumerationSkipsHiddenFiles + error:error]; + if (! versionedModelURLs) { + return NO; + } + + // Iterate across each model version and try to find a compatible store + NSManagedObjectModel *sourceModel = nil; + for (NSURL *versionedModelURL in versionedModelURLs) { + if (! [@[@"mom", @"momd"] containsObject:[versionedModelURL pathExtension]]) continue; + NSManagedObjectModel *model = [[[NSManagedObjectModel alloc] initWithContentsOfURL:versionedModelURL] mutableCopy]; + if (! model) continue; + if (block) block(model, versionedModelURL); + + if ([model isConfiguration:nil compatibleWithStoreMetadata:storeMetadata]) { + sourceModel = model; + break; + } + } + + // Cannot complete the migration as we can't find a source model + if (! sourceModel) { + NSString *errorDescription = [NSString stringWithFormat:@"Migration failed: Unable to find the source managed object model used to create the %@ store at path '%@'", storeType, [storeURL path]]; + if (error) *error = [NSError errorWithDomain:RKErrorDomain code:NSMigrationMissingSourceModelError userInfo:@{ NSLocalizedDescriptionKey: errorDescription }]; + return NO; + } + + // Infer a mapping model and complete the migration + NSMappingModel *mappingModel = [NSMappingModel inferredMappingModelForSourceModel:sourceModel + destinationModel:destinationModel + error:error]; + if (!mappingModel) { + RKLogError(@"Failed to obtain inferred mapping model for source and destination models: aborting migration..."); + RKLogError(@"%@", *error); + return NO; + } + + CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault); + NSString *UUID = (__bridge_transfer NSString*)CFUUIDCreateString(kCFAllocatorDefault, uuid); + CFRelease(uuid); + + NSString *migrationPath = [NSTemporaryDirectory() stringByAppendingFormat:@"Migration-%@.sqlite", UUID]; + NSURL *migrationURL = [NSURL fileURLWithPath:migrationPath]; + + // Create a migration manager to perform the migration. + NSMigrationManager *manager = [[NSMigrationManager alloc] initWithSourceModel:sourceModel destinationModel:destinationModel]; + BOOL success = [manager migrateStoreFromURL:storeURL type:NSSQLiteStoreType + options:nil withMappingModel:mappingModel toDestinationURL:migrationURL + destinationType:NSSQLiteStoreType destinationOptions:nil error:error]; + + if (success) { + success = [[NSFileManager defaultManager] removeItemAtURL:storeURL error:error]; + if (success) { + success = [[NSFileManager defaultManager] moveItemAtURL:migrationURL toURL:storeURL error:error]; + if (success) RKLogInfo(@"Successfully migrated existing store to managed object model at path '%@'...", [destinationModelURL path]); + } else { + RKLogError(@"Failed to remove existing store at path '%@': unable to complete migration...", [storeURL path]); + RKLogError(@"%@", *error); + } + } else { + RKLogError(@"Failed migration with error: %@", *error); + } + return success; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKManagedObjectStore_Private.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKManagedObjectStore_Private.h new file mode 100644 index 0000000..fe35b1e --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKManagedObjectStore_Private.h @@ -0,0 +1,11 @@ +// +// RKManagedObjectStore_Private.h +// RestKit +// +// Created by Alexander Edge on 03/08/2016. +// Copyright © 2016 RestKit. All rights reserved. +// + +#import + +NSSet *RKSetOfManagedObjectIDsFromManagedObjectContextDidSaveNotification(NSNotification *notification); diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKPropertyInspector+CoreData.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKPropertyInspector+CoreData.h new file mode 100644 index 0000000..2afbc8d --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKPropertyInspector+CoreData.h @@ -0,0 +1,45 @@ +// +// RKPropertyInspector+CoreData.h +// RestKit +// +// Created by Blake Watters on 8/14/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKPropertyInspector.h" + +/** + The `CoreData` category augments the `RKPropertyInspector` class with support for introspecting the property types for `NSManagedObject` and `NSEntityDescription` objects. + */ +@interface RKPropertyInspector (CoreData) + +/** + Returns a dictionary wherein the keys are the names of attribute and relationship properties and the values are the class used to represent the corresponding property for a given entity. + + @param entity The entity to retrieve the properties names and classes of. + @return A dictionary containing the names and classes of the given entity. + */ +- (NSDictionary *)propertyInspectionForEntity:(NSEntityDescription *)entity; + +/** + Returns the class used to represent the property with the given name on the given entity. + + @param propertyName The name of the property to retrieve the class for. + @param entity The entity containing the property to retrieve the class for. + @return The class used to represent the property. + */ +- (Class)classForPropertyNamed:(NSString *)propertyName ofEntity:(NSEntityDescription *)entity; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKPropertyInspector+CoreData.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKPropertyInspector+CoreData.m new file mode 100644 index 0000000..f9f38ed --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKPropertyInspector+CoreData.m @@ -0,0 +1,162 @@ +// +// RKPropertyInspector+CoreData.m +// RestKit +// +// Created by Blake Watters on 8/14/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import +#import +#import "RKPropertyInspector+CoreData.h" +#import "RKLog.h" +#import "RKObjectUtilities.h" +#import "RKMacros.h" +#import "RKBooleanClass.h" + +// Set Logging Component +#undef RKLogComponent +#define RKLogComponent RKlcl_cRestKitCoreData + +@interface RKPropertyInspector () +@property (nonatomic, assign) dispatch_queue_t queue; +@property (nonatomic, strong) NSMutableDictionary *inspectionCache; +@end + +@implementation RKPropertyInspector (CoreData) + +- (NSDictionary *)propertyInspectionForEntity:(NSEntityDescription *)entity +{ + __block NSMutableDictionary *entityInspection; + dispatch_sync(self.queue, ^{ + entityInspection = (self.inspectionCache)[[entity name]]; + }); + if (entityInspection) return entityInspection; + + entityInspection = [NSMutableDictionary dictionary]; + for (NSString *name in [entity attributesByName]) { + NSAttributeDescription *attributeDescription = [[entity attributesByName] valueForKey:name]; + if ([attributeDescription attributeValueClassName]) { + Class cls = NSClassFromString([attributeDescription attributeValueClassName]); + if ([cls isSubclassOfClass:[NSNumber class]] && [attributeDescription attributeType] == NSBooleanAttributeType) { + cls = RK_BOOLEAN_CLASS; + } + RKPropertyInspectorPropertyInfo *info; + info = [RKPropertyInspectorPropertyInfo propertyInfoWithName:name + keyValueClass:cls + isPrimitive:NO]; + [entityInspection setValue:info forKey:name]; + + } else if ([attributeDescription attributeType] == NSTransformableAttributeType && + ![name isEqualToString:@"_mapkit_hasPanoramaID"]) { + + const char *className = [[entity managedObjectClassName] cStringUsingEncoding:NSUTF8StringEncoding]; + const char *propertyName = [name cStringUsingEncoding:NSUTF8StringEncoding]; + Class managedObjectClass = objc_getClass(className); + + objc_property_t prop = class_getProperty(managedObjectClass, propertyName); + + // Property is not defined in the Core Data model -- we cannot infer any details about the destination type + if (prop) { + const char *attr = property_getAttributes(prop); + Class destinationClass = RKKeyValueCodingClassFromPropertyAttributes(attr); + if (destinationClass) { + RKPropertyInspectorPropertyInfo *info; + info = [RKPropertyInspectorPropertyInfo propertyInfoWithName:name + keyValueClass:destinationClass + isPrimitive:NO]; + entityInspection[name] = info; + } + } + } + } + + for (NSString *name in [entity relationshipsByName]) { + NSRelationshipDescription *relationshipDescription = [[entity relationshipsByName] valueForKey:name]; + if ([relationshipDescription isToMany]) { + if ([relationshipDescription isOrdered]) { + RKPropertyInspectorPropertyInfo *info; + info = [RKPropertyInspectorPropertyInfo propertyInfoWithName:name + keyValueClass:[NSOrderedSet class] + isPrimitive:NO]; + entityInspection[name] = info; + } else { + RKPropertyInspectorPropertyInfo *info; + info = [RKPropertyInspectorPropertyInfo propertyInfoWithName:name + keyValueClass:[NSSet class] + isPrimitive:NO]; + entityInspection[name] = info; + } + } else { + NSEntityDescription *destinationEntity = [relationshipDescription destinationEntity]; + Class destinationClass = NSClassFromString([destinationEntity managedObjectClassName]); + if (! destinationClass) { + RKLogWarning(@"Retrieved `Nil` value for class named '%@': This likely indicates that the class is invalid or does not exist in the current target.", [destinationEntity managedObjectClassName]); + } + RKPropertyInspectorPropertyInfo *info; + info = [RKPropertyInspectorPropertyInfo propertyInfoWithName:name + keyValueClass:destinationClass ?: [NSNull null] + isPrimitive:NO]; + entityInspection[name] = info; + } + } + + dispatch_barrier_async(self.queue, ^{ + (self.inspectionCache)[[entity name]] = entityInspection; + RKLogDebug(@"Cached property inspection for Entity '%@': %@", entity, entityInspection); + }); + return entityInspection; +} + +- (Class)classForPropertyNamed:(NSString *)propertyName ofEntity:(NSEntityDescription *)entity +{ + NSDictionary *entityInspection = [self propertyInspectionForEntity:entity]; + RKPropertyInspectorPropertyInfo *propertyInspection = entityInspection[propertyName]; + return propertyInspection.keyValueCodingClass; +} + +@end + +@interface NSManagedObject (RKPropertyInspection) +- (Class)rk_classForPropertyAtKeyPath:(NSString *)keyPath isPrimitive:(BOOL *)isPrimitive; +@end + +@implementation NSManagedObject (RKPropertyInspection) + +- (Class)rk_classForPropertyAtKeyPath:(NSString *)keyPath isPrimitive:(BOOL *)isPrimitive +{ + NSRange dotRange = [keyPath rangeOfString:@"." options:NSLiteralSearch]; + RKPropertyInspector *inspector = [RKPropertyInspector sharedInspector]; + Class currentPropertyClass = [self class]; + Class propertyClass = nil; + + if (dotRange.length == 0) { + propertyClass = [inspector classForPropertyNamed:keyPath ofEntity:[self entity]]; + return propertyClass ?: [inspector classForPropertyNamed:keyPath ofClass:currentPropertyClass isPrimitive:isPrimitive]; + } + + NSArray *components = [keyPath componentsSeparatedByString:@"."]; + for (NSString *property in components) { + if (isPrimitive) *isPrimitive = NO; // Core Data does not enable you to model primitives + propertyClass = [inspector classForPropertyNamed:property ofEntity:[self entity]]; + propertyClass = propertyClass ?: [inspector classForPropertyNamed:property ofClass:currentPropertyClass isPrimitive:isPrimitive]; + if (! propertyClass) break; + currentPropertyClass = propertyClass; + } + + return propertyClass; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKRelationshipConnectionOperation.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKRelationshipConnectionOperation.h new file mode 100644 index 0000000..3dbdef6 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKRelationshipConnectionOperation.h @@ -0,0 +1,90 @@ +// +// RKRelationshipConnectionOperation.h +// RestKit +// +// Created by Blake Watters on 7/12/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import + +@class RKConnectionDescription; +@protocol RKManagedObjectCaching; + +/** + The `RKRelationshipConnectionOperation` class is a subclass of `NSOperation` that manages the connection of `NSManagedObject` relationships as described by an `RKConnectionDescription` object. When executed, the operation will find related objects by searching the associated managed object cache for objects matching the connection description and setting them as the value for the relationship being connected. + + For example, given a managed object for the `Employee` entity with a one-to-one relationship to a `Company` named `company` (with an inverse relationship one-to-many relationship named `employees`) and a connection specifying that the relationship can be connected by finding the `Company` managed object whose `companyID` attribute matches the `companyID` of the `Employee`, the operation would find the Company that employs the Employee by primary key and set the Core Data relationship to reflect the relationship appropriately. + + @see `RKConnectionDescription` + */ +@interface RKRelationshipConnectionOperation : NSOperation + +///------------------------------------------------------- +/// @name Initializing a Relationship Connection Operation +///------------------------------------------------------- + +/** + Initializes the receiver with a given managed object, connection mapping, and managed object cache. + + @param managedObject The object to attempt to connect a relationship to. + @param connections An array of connection objects describing how establish a Core Data relationship between objects. + @param managedObjectCache The managed object cache from which to attempt to fetch a matching object to satisfy the connection. + @return The receiver, initialized with the given managed object, connection mapping, and managed object cache. + */ +- (instancetype)initWithManagedObject:(NSManagedObject *)managedObject + connections:(NSArray *)connections + managedObjectCache:(id)managedObjectCache; + +///-------------------------------------------- +/// @name Accessing Details About the Operation +///-------------------------------------------- + +/** + The managed object the receiver will attempt to connect a relationship for. + */ +@property (nonatomic, strong, readonly) NSManagedObject *managedObject; + +/** + An array of `RKConnectionDescription` objects describing the relationship connection the receiver will attempt to connect. + */ +@property (nonatomic, strong, readonly) NSArray *connections; + +/** + The managed object cache the receiver will use to fetch a related object satisfying the connection mapping. + */ +@property (nonatomic, strong, readonly) id managedObjectCache; + +/** + A dictionary keyed by the name of each relationship that was established by the receiver wherein each value is the objects or objects that were connected. + + For each key in the dictionary, the value will either be `[NSNull null]`, indicating that the relationship could not be connected, a single `NSManagedObject` object (if the relationship is one-to-one), or an array of `NSManagedObject` objects (if the relationship is one-to-many). + */ +@property (nonatomic, strong, readonly) NSDictionary *connectedValuesByRelationshipName; + +///----------------------------------- +/// @name Setting the Connection Block +///----------------------------------- + +/** + Sets a block to be executed on the operation attempted to establish the connection. + + Unlike the block set with `setCompletionBlock:`, this block is executed during the body of the operation within the queue of the managed object context in which the connection was established. This means that it is safe to executed both the `connectedValue` and `managedObject` directly within the body of the block. + + @param block A block object to be executed when the connection is evaluated. The block accepts two arguments: the operation itself and the value, if any, that was set for the relationship targetted by the connection description. + */ +- (void)setConnectionBlock:(void (^)(RKRelationshipConnectionOperation *operation, RKConnectionDescription *connection, id connectedValue))block; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKRelationshipConnectionOperation.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKRelationshipConnectionOperation.m new file mode 100644 index 0000000..5cba533 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/CoreData/RKRelationshipConnectionOperation.m @@ -0,0 +1,237 @@ +// +// RKRelationshipConnectionOperation.m +// RestKit +// +// Created by Blake Watters on 7/12/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import +#import "RKRelationshipConnectionOperation.h" +#import "RKConnectionDescription.h" +#import "RKEntityMapping.h" +#import "RKLog.h" +#import "RKManagedObjectCaching.h" +#import "RKObjectMappingMatcher.h" +#import "RKErrors.h" +#import "RKObjectUtilities.h" + +// Set Logging Component +#undef RKLogComponent +#define RKLogComponent RKlcl_cRestKitCoreData + +id RKMutableSetValueForRelationship(NSRelationshipDescription *relationship); +id RKMutableSetValueForRelationship(NSRelationshipDescription *relationship) +{ + if (! [relationship isToMany]) return nil; + return [relationship isOrdered] ? [NSMutableOrderedSet orderedSet] : [NSMutableSet set]; +} + +static BOOL RKConnectionAttributeValuesIsNotConnectable(NSDictionary *attributeValues) +{ + return [[NSSet setWithArray:[attributeValues allValues]] isEqualToSet:[NSSet setWithObject:[NSNull null]]]; +} + +static NSDictionary *RKConnectionAttributeValuesWithObject(RKConnectionDescription *connection, NSManagedObject *managedObject) +{ + NSCAssert([connection isForeignKeyConnection], @"Only valid for a foreign key connection"); + NSMutableDictionary *destinationEntityAttributeValues = [NSMutableDictionary dictionaryWithCapacity:[connection.attributes count]]; + [managedObject.managedObjectContext performBlockAndWait:^{ + for (NSString *sourceAttribute in connection.attributes) { + NSString *destinationAttribute = (connection.attributes)[sourceAttribute]; + id sourceValue = [managedObject valueForKey:sourceAttribute]; + [destinationEntityAttributeValues setValue:sourceValue ?: [NSNull null] forKey:destinationAttribute]; + } + }]; + return RKConnectionAttributeValuesIsNotConnectable(destinationEntityAttributeValues) ? nil : destinationEntityAttributeValues; +} + +@interface RKRelationshipConnectionOperation () +@property (nonatomic, strong, readwrite) NSManagedObject *managedObject; +@property (nonatomic, strong, readwrite) NSArray *connections; +@property (nonatomic, strong, readwrite) id managedObjectCache; +@property (nonatomic, strong, readwrite) NSError *error; +@property (nonatomic, strong, readwrite) NSMutableDictionary *connectedValuesByRelationshipName; +@property (nonatomic, copy) void (^connectionBlock)(RKRelationshipConnectionOperation *operation, RKConnectionDescription *connection, id connectedValue); + +// Helpers +@property (weak, nonatomic, readonly) NSManagedObjectContext *managedObjectContext; + +@end + +@implementation RKRelationshipConnectionOperation + +- (instancetype)initWithManagedObject:(NSManagedObject *)managedObject + connections:(NSArray *)connections + managedObjectCache:(id)managedObjectCache +{ + NSParameterAssert(managedObject); + NSAssert([managedObject isKindOfClass:[NSManagedObject class]], @"Relationship connection requires an instance of NSManagedObject"); + NSParameterAssert(connections); + NSParameterAssert(managedObjectCache); + self = [self init]; + if (self) { + self.managedObject = managedObject; + self.connections = connections; + self.managedObjectCache = managedObjectCache; + } + + return self; +} + +- (NSManagedObjectContext *)managedObjectContext +{ + return self.managedObject.managedObjectContext; +} + +- (id)relationshipValueForConnection:(RKConnectionDescription *)connection withConnectionResult:(id)result +{ + // TODO: Replace with use of object mapping engine for type conversion + + // NOTE: This is a nasty hack to work around the fact that NSOrderedSet does not support key-value + // collection operators. We try to detect and unpack a doubly wrapped collection + if ([connection.relationship isToMany] && RKObjectIsCollectionOfCollections(result)) { + id mutableSet = RKMutableSetValueForRelationship(connection.relationship); + for (id enumerable in result) { + for (id object in enumerable) { + [mutableSet addObject:object]; + } + } + + return mutableSet; + } + + if ([connection.relationship isToMany]) { + if ([result isKindOfClass:[NSArray class]]) { + if ([connection.relationship isOrdered]) { + return [NSOrderedSet orderedSetWithArray:result]; + } else { + return [NSSet setWithArray:result]; + } + } else if ([result isKindOfClass:[NSSet class]]) { + if ([connection.relationship isOrdered]) { + return [NSOrderedSet orderedSetWithSet:result]; + } else { + return result; + } + } else if ([result isKindOfClass:[NSOrderedSet class]]) { + if ([connection.relationship isOrdered]) { + return result; + } else { + return [(NSOrderedSet *)result set]; + } + } else { + if ([connection.relationship isOrdered]) { + return [NSOrderedSet orderedSetWithObject:result]; + } else { + return [NSSet setWithObject:result]; + } + } + } + + return result; +} + +- (id)findConnectedValueForConnection:(RKConnectionDescription *)connection shouldConnect:(BOOL *)shouldConnectRelationship +{ + *shouldConnectRelationship = YES; + id connectionResult = nil; + if (connection.sourcePredicate) { + __block BOOL evaluationResult; + [self.managedObject.managedObjectContext performBlockAndWait:^{ + evaluationResult = [connection.sourcePredicate evaluateWithObject:self.managedObject]; + }]; + + if (!evaluationResult) return nil; + } + + if ([connection isForeignKeyConnection]) { + NSDictionary *attributeValues = RKConnectionAttributeValuesWithObject(connection, self.managedObject); + // If there are no attribute values available for connecting, skip the connection entirely + if (! attributeValues) { + *shouldConnectRelationship = NO; + return nil; + } + __block NSSet *managedObjects = [self.managedObjectCache managedObjectsWithEntity:[connection.relationship destinationEntity] + attributeValues:attributeValues + inManagedObjectContext:self.managedObjectContext]; + + [self.managedObjectContext performBlockAndWait:^{ + if (connection.destinationPredicate) managedObjects = [managedObjects filteredSetUsingPredicate:connection.destinationPredicate]; + if (!connection.includesSubentities) managedObjects = [managedObjects filteredSetUsingPredicate:[NSPredicate predicateWithFormat:@"entity == %@", [connection.relationship destinationEntity]]]; + }]; + + if ([connection.relationship isToMany]) { + connectionResult = managedObjects; + } else { + if ([managedObjects count] > 1) RKLogWarning(@"Retrieved %ld objects satisfying connection criteria for one-to-one relationship connection: only one object will be connected.", (long) [managedObjects count]); + if ([managedObjects count]) connectionResult = [managedObjects anyObject]; + } + } else if ([connection isKeyPathConnection]) { + connectionResult = [self.managedObject valueForKeyPath:connection.keyPath]; + } else { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"%@ Attempted to establish a relationship using a mapping that" + " specifies neither a foreign key or a key path connection: %@", + NSStringFromClass([self class]), connection] + userInfo:nil]; + } + + return [self relationshipValueForConnection:connection withConnectionResult:connectionResult]; +} + +- (void)main +{ + for (RKConnectionDescription *connection in self.connections) { + __block BOOL isDeleted; + [self.managedObject.managedObjectContext performBlockAndWait:^{ + isDeleted=[self.managedObject isDeleted]; + }]; + if (self.isCancelled || isDeleted) return; + NSString *relationshipName = connection.relationship.name; + RKLogTrace(@"Connecting relationship '%@' with mapping: %@", relationshipName, connection); + + BOOL shouldConnect = YES; + // TODO: What I need to do is make all of this based on callbacks so I can jump in/out of the MOC queue + id connectedValue = [self findConnectedValueForConnection:connection shouldConnect:&shouldConnect]; + [self.connectedValuesByRelationshipName setValue:(connectedValue ?: [NSNull null]) forKey:relationshipName]; + if (shouldConnect) { + [self.managedObjectContext performBlockAndWait:^{ + if (self.isCancelled || [self.managedObject isDeleted]) return; + @try { + [self.managedObject setValue:connectedValue forKeyPath:relationshipName]; + RKLogDebug(@"Connected relationship '%@' to object '%@'", relationshipName, connectedValue); + if (self.connectionBlock) self.connectionBlock(self, connection, connectedValue); + } + @catch (NSException *exception) { + if ([[exception name] isEqualToString:NSObjectInaccessibleException]) { + // Object has been deleted + RKLogDebug(@"Rescued an `NSObjectInaccessibleException` exception while attempting to establish a relationship."); + } else { + [exception raise]; + } + } + }]; + } + } +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@:%p %@ in %@ using %@>", + [self class], self, self.connections, self.managedObjectContext, self.managedObjectCache]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network.h new file mode 100644 index 0000000..5226b5a --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network.h @@ -0,0 +1,34 @@ +// +// Network.h +// RestKit +// +// Created by Blake Watters on 9/30/10. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKRoute.h" +#import "RKRouteSet.h" +#import "RKRouter.h" +#import "RKRequestDescriptor.h" +#import "RKResponseDescriptor.h" +#import "RKObjectManager.h" +#import "RKHTTPUtilities.h" +#import "RKObjectRequestOperation.h" +#import "RKObjectParameterization.h" +#import "RKPathMatcher.h" + +#if __has_include("CoreData.h") +#import "RKManagedObjectRequestOperation.h" +#endif diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKHTTPClient.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKHTTPClient.h new file mode 100644 index 0000000..e1aee6e --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKHTTPClient.h @@ -0,0 +1,651 @@ +// AFHTTPClient.h +// +// Copyright (c) 2011 Gowalla (http://gowalla.com/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#import "AFRKURLConnectionOperation.h" + +#import + +#if __IPHONE_OS_VERSION_MIN_REQUIRED +#import +#import +#import +#else +#import +#import +#import +#endif + +/** + `AFHTTPClient` captures the common patterns of communicating with an web application over HTTP. It encapsulates information like base URL, authorization credentials, and HTTP headers, and uses them to construct and manage the execution of HTTP request operations. + + ## Automatic Content Parsing + + Instances of `AFHTTPClient` may specify which types of requests it expects and should handle by registering HTTP operation classes for automatic parsing. Registered classes will determine whether they can handle a particular request, and then construct a request operation accordingly in `enqueueHTTPRequestOperationWithRequest:success:failure`. + + ## Subclassing Notes + + In most cases, one should create an `AFHTTPClient` subclass for each website or web application that your application communicates with. It is often useful, also, to define a class method that returns a singleton shared HTTP client in each subclass, that persists authentication credentials and other configuration across the entire application. + + ## Methods to Override + + To change the behavior of all url request construction for an `AFHTTPClient` subclass, override `requestWithMethod:path:parameters`. + + To change the behavior of all request operation construction for an `AFHTTPClient` subclass, override `HTTPRequestOperationWithRequest:success:failure`. + + ## Default Headers + + By default, `AFHTTPClient` sets the following HTTP headers: + + - `Accept-Language: (comma-delimited preferred languages), en-us;q=0.8` + - `User-Agent: (generated user agent)` + + You can override these HTTP headers or define new ones using `setDefaultHeader:value:`. + + ## URL Construction Using Relative Paths + + Both `-requestWithMethod:path:parameters:` and `-multipartFormRequestWithMethod:path:parameters:constructingBodyWithBlock:` construct URLs from the path relative to the `-baseURL`, using `NSURL +URLWithString:relativeToURL:`. Below are a few examples of how `baseURL` and relative paths interact: + + NSURL *baseURL = [NSURL URLWithString:@"http://example.com/v1/"]; + [NSURL URLWithString:@"foo" relativeToURL:baseURL]; // http://example.com/v1/foo + [NSURL URLWithString:@"foo?bar=baz" relativeToURL:baseURL]; // http://example.com/v1/foo?bar=baz + [NSURL URLWithString:@"/foo" relativeToURL:baseURL]; // http://example.com/foo + [NSURL URLWithString:@"foo/" relativeToURL:baseURL]; // http://example.com/v1/foo + [NSURL URLWithString:@"/foo/" relativeToURL:baseURL]; // http://example.com/foo/ + [NSURL URLWithString:@"http://example2.com/" relativeToURL:baseURL]; // http://example2.com/ + + Also important to note is that a trailing slash will be added to any `baseURL` without one, which would otherwise cause unexpected behavior when constructing URLs using paths without a leading slash. + + ## NSCoding / NSCopying Conformance + + `AFHTTPClient` conforms to the `NSCoding` and `NSCopying` protocols, allowing operations to be archived to disk, and copied in memory, respectively. There are a few minor caveats to keep in mind, however: + + - Archives and copies of HTTP clients will be initialized with an empty operation queue. + - NSCoding cannot serialize / deserialize block properties, so an archive of an HTTP client will not include any reachability callback block that may be set. + */ + +#ifdef _SYSTEMCONFIGURATION_H +typedef enum { + AFRKNetworkReachabilityStatusUnknown = -1, + AFRKNetworkReachabilityStatusNotReachable = 0, + AFRKNetworkReachabilityStatusReachableViaWWAN = 1, + AFRKNetworkReachabilityStatusReachableViaWiFi = 2, +} AFRKNetworkReachabilityStatus; +#else +#pragma message("SystemConfiguration framework not found in project, or not included in precompiled header. Network reachability functionality will not be available.") +#endif + +#ifndef __UTTYPE__ +#if __IPHONE_OS_VERSION_MIN_REQUIRED +#pragma message("MobileCoreServices framework not found in project, or not included in precompiled header. Automatic MIME type detection when uploading files in multipart requests will not be available.") +#else +#pragma message("CoreServices framework not found in project, or not included in precompiled header. Automatic MIME type detection when uploading files in multipart requests will not be available.") +#endif +#endif + +typedef enum { + AFRKFormURLParameterEncoding, + AFRKJSONParameterEncoding, + AFRKPropertyListParameterEncoding, +} AFRKHTTPClientParameterEncoding; + +@class AFRKHTTPRequestOperation; +@protocol AFRKMultipartFormData; + +@interface AFRKHTTPClient : NSObject + +///--------------------------------------- +/// @name Accessing HTTP Client Properties +///--------------------------------------- + +/** + The url used as the base for paths specified in methods such as `getPath:parameters:success:failure` + */ +@property (readonly, nonatomic, strong) NSURL *baseURL; + +/** + The string encoding used in constructing url requests. This is `NSUTF8StringEncoding` by default. + */ +@property (nonatomic, assign) NSStringEncoding stringEncoding; + +/** + The `AFHTTPClientParameterEncoding` value corresponding to how parameters are encoded into a request body for request methods other than `GET`, `HEAD` or `DELETE`. This is `AFFormURLParameterEncoding` by default. + + @warning Some nested parameter structures, such as a keyed array of hashes containing inconsistent keys (i.e. `@{@"": @[@{@"a" : @(1)}, @{@"b" : @(2)}]}`), cannot be unambiguously represented in query strings. It is strongly recommended that an unambiguous encoding, such as `AFJSONParameterEncoding`, is used when posting complicated or nondeterministic parameter structures. + */ +@property (nonatomic, assign) AFRKHTTPClientParameterEncoding parameterEncoding; + +/** + The operation queue which manages operations enqueued by the HTTP client. + */ +@property (readonly, nonatomic, strong) NSOperationQueue *operationQueue; + +/** + The reachability status from the device to the current `baseURL` of the `AFHTTPClient`. + + @warning This property requires the `SystemConfiguration` framework. Add it in the active target's "Link Binary With Library" build phase, and add `#import ` to the header prefix of the project (`Prefix.pch`). + */ +#ifdef _SYSTEMCONFIGURATION_H +@property (readonly, nonatomic, assign) AFRKNetworkReachabilityStatus networkReachabilityStatus; +#endif + +/** + Default SSL pinning mode for each `AFHTTPRequestOperation` created by `HTTPRequestOperationWithRequest:success:failure:`. + */ +@property (nonatomic, assign) AFRKURLConnectionOperationSSLPinningMode defaultSSLPinningMode; + +/** + Whether each `AFHTTPRequestOperation` created by `HTTPRequestOperationWithRequest:success:failure:` should accept an invalid SSL certificate. + + If `_AFRKNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_` is set, this property defaults to `YES` for backwards compatibility. Otherwise, this property defaults to `NO`. + */ +@property (nonatomic, assign) BOOL allowsInvalidSSLCertificate; + +///--------------------------------------------- +/// @name Creating and Initializing HTTP Clients +///--------------------------------------------- + +/** + Creates and initializes an `AFHTTPClient` object with the specified base URL. + + @param url The base URL for the HTTP client. This argument must not be `nil`. + + @return The newly-initialized HTTP client + */ ++ (instancetype)clientWithBaseURL:(NSURL *)url; + +/** + Initializes an `AFHTTPClient` object with the specified base URL. + + This is the designated initializer. + + @param url The base URL for the HTTP client. This argument must not be `nil`. + + @return The newly-initialized HTTP client + */ +- (id)initWithBaseURL:(NSURL *)url; + +///----------------------------------- +/// @name Managing Reachability Status +///----------------------------------- + +/** + Sets a callback to be executed when the network availability of the `baseURL` host changes. + + @param block A block object to be executed when the network availability of the `baseURL` host changes.. This block has no return value and takes a single argument which represents the various reachability states from the device to the `baseURL`. + + @warning This method requires the `SystemConfiguration` framework. Add it in the active target's "Link Binary With Library" build phase, and add `#import ` to the header prefix of the project (`Prefix.pch`). + */ +#ifdef _SYSTEMCONFIGURATION_H +- (void)setReachabilityStatusChangeBlock:(void (^)(AFRKNetworkReachabilityStatus status))block; +#endif + +///------------------------------- +/// @name Managing HTTP Operations +///------------------------------- + +/** + Attempts to register a subclass of `AFHTTPRequestOperation`, adding it to a chain to automatically generate request operations from a URL request. + + When `enqueueHTTPRequestOperationWithRequest:success:failure` is invoked, each registered class is consulted in turn to see if it can handle the specific request. The first class to return `YES` when sent a `canProcessRequest:` message is used to create an operation using `initWithURLRequest:` and do `setCompletionBlockWithSuccess:failure:`. There is no guarantee that all registered classes will be consulted. Classes are consulted in the reverse order of their registration. Attempting to register an already-registered class will move it to the top of the list. + + @param operationClass The subclass of `AFHTTPRequestOperation` to register + + @return `YES` if the registration is successful, `NO` otherwise. The only failure condition is if `operationClass` is not a subclass of `AFHTTPRequestOperation`. + */ +- (BOOL)registerHTTPOperationClass:(Class)operationClass; + +/** + Unregisters the specified subclass of `AFHTTPRequestOperation` from the chain of classes consulted when `-requestWithMethod:path:parameters` is called. + + @param operationClass The subclass of `AFHTTPRequestOperation` to register + */ +- (void)unregisterHTTPOperationClass:(Class)operationClass; + +///---------------------------------- +/// @name Managing HTTP Header Values +///---------------------------------- + +/** + Returns the value for the HTTP headers set in request objects created by the HTTP client. + + @param header The HTTP header to return the default value for + + @return The default value for the HTTP header, or `nil` if unspecified + */ +- (NSString *)defaultValueForHeader:(NSString *)header; + +/** + Sets the value for the HTTP headers set in request objects made by the HTTP client. If `nil`, removes the existing value for that header. + + @param header The HTTP header to set a default value for + @param value The value set as default for the specified header, or `nil + */ +- (void)setDefaultHeader:(NSString *)header + value:(NSString *)value; + +/** + Sets the "Authorization" HTTP header set in request objects made by the HTTP client to a basic authentication value with Base64-encoded username and password. This overwrites any existing value for this header. + + @param username The HTTP basic auth username + @param password The HTTP basic auth password + */ +- (void)setAuthorizationHeaderWithUsername:(NSString *)username + password:(NSString *)password; + +/** + Sets the "Authorization" HTTP header set in request objects made by the HTTP client to a token-based authentication value, such as an OAuth access token. This overwrites any existing value for this header. + + @param token The authentication token + */ +- (void)setAuthorizationHeaderWithToken:(NSString *)token; + + +/** + Clears any existing value for the "Authorization" HTTP header. + */ +- (void)clearAuthorizationHeader; + +///------------------------------- +/// @name Managing URL Credentials +///------------------------------- + +/** + Set the default URL credential to be set for request operations. + + @param credential The URL credential + */ +- (void)setDefaultCredential:(NSURLCredential *)credential; + +///------------------------------- +/// @name Creating Request Objects +///------------------------------- + +/** + Creates an `NSMutableURLRequest` object with the specified HTTP method and path. + + If the HTTP method is `GET`, `HEAD`, or `DELETE`, the parameters will be used to construct a url-encoded query string that is appended to the request's URL. Otherwise, the parameters will be encoded according to the value of the `parameterEncoding` property, and set as the request body. + + @param method The HTTP method for the request, such as `GET`, `POST`, `PUT`, or `DELETE`. This parameter must not be `nil`. + @param path The path to be appended to the HTTP client's base URL and used as the request URL. If `nil`, no path will be appended to the base URL. + @param parameters The parameters to be either set as a query string for `GET` requests, or the request HTTP body. + + @return An `NSMutableURLRequest` object + */ +- (NSMutableURLRequest *)requestWithMethod:(NSString *)method + path:(NSString *)path + parameters:(NSDictionary *)parameters; + +/** + Creates an `NSMutableURLRequest` object with the specified HTTP method and path, and constructs a `multipart/form-data` HTTP body, using the specified parameters and multipart form data block. See http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.2 + + Multipart form requests are automatically streamed, reading files directly from disk along with in-memory data in a single HTTP body. The resulting `NSMutableURLRequest` object has an `HTTPBodyStream` property, so refrain from setting `HTTPBodyStream` or `HTTPBody` on this request object, as it will clear out the multipart form body stream. + + @param method The HTTP method for the request. This parameter must not be `GET` or `HEAD`, or `nil`. + @param path The path to be appended to the HTTP client's base URL and used as the request URL. + @param parameters The parameters to be encoded and set in the request HTTP body. + @param block A block that takes a single argument and appends data to the HTTP body. The block argument is an object adopting the `AFMultipartFormData` protocol. This can be used to upload files, encode HTTP body as JSON or XML, or specify multiple values for the same parameter, as one might for array values. + + @return An `NSMutableURLRequest` object + */ +- (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method + path:(NSString *)path + parameters:(NSDictionary *)parameters + constructingBodyWithBlock:(void (^)(id formData))block; + +///------------------------------- +/// @name Creating HTTP Operations +///------------------------------- + +/** + Creates an `AFHTTPRequestOperation`. + + In order to determine what kind of operation is created, each registered subclass conforming to the `AFHTTPClient` protocol is consulted (in reverse order of when they were specified) to see if it can handle the specific request. The first class to return `YES` when sent a `canProcessRequest:` message is used to generate an operation using `HTTPRequestOperationWithRequest:success:failure:`. + + @param urlRequest The request object to be loaded asynchronously during execution of the operation. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the created request operation and the object created from the response data of request. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes two arguments:, the created request operation and the `NSError` object describing the network or parsing error that occurred. + */ +- (AFRKHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)urlRequest + success:(void (^)(AFRKHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFRKHTTPRequestOperation *operation, NSError *error))failure; + +///---------------------------------------- +/// @name Managing Enqueued HTTP Operations +///---------------------------------------- + +/** + Enqueues an `AFHTTPRequestOperation` to the HTTP client's operation queue. + + @param operation The HTTP request operation to be enqueued. + */ +- (void)enqueueHTTPRequestOperation:(AFRKHTTPRequestOperation *)operation; + +/** + Cancels all operations in the HTTP client's operation queue whose URLs match the specified HTTP method and path. + + This method only cancels `AFHTTPRequestOperations` whose request URL matches the HTTP client base URL with the path appended. For complete control over the lifecycle of enqueued operations, you can access the `operationQueue` property directly, which allows you to, for instance, cancel operations filtered by a predicate, or simply use `-cancelAllRequests`. Note that the operation queue may include non-HTTP operations, so be sure to check the type before attempting to directly introspect an operation's `request` property. + + @param method The HTTP method to match for the cancelled requests, such as `GET`, `POST`, `PUT`, or `DELETE`. If `nil`, all request operations with URLs matching the path will be cancelled. + @param path The path appended to the HTTP client base URL to match against the cancelled requests. If `nil`, no path will be appended to the base URL. + */ +- (void)cancelAllHTTPOperationsWithMethod:(NSString *)method path:(NSString *)path; + +///--------------------------------------- +/// @name Batching HTTP Request Operations +///--------------------------------------- + +/** + Creates and enqueues an `AFHTTPRequestOperation` to the HTTP client's operation queue for each specified request object into a batch. When each request operation finishes, the specified progress block is executed, until all of the request operations have finished, at which point the completion block also executes. + + Operations are created by passing the specified `NSURLRequest` objects in `requests`, using `-HTTPRequestOperationWithRequest:success:failure:`, with `nil` for both the `success` and `failure` parameters. + + @param urlRequests The `NSURLRequest` objects used to create and enqueue operations. + @param progressBlock A block object to be executed upon the completion of each request operation in the batch. This block has no return value and takes two arguments: the number of operations that have already finished execution, and the total number of operations. + @param completionBlock A block object to be executed upon the completion of all of the request operations in the batch. This block has no return value and takes a single argument: the batched request operations. + */ +- (void)enqueueBatchOfHTTPRequestOperationsWithRequests:(NSArray *)urlRequests + progressBlock:(void (^)(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations))progressBlock + completionBlock:(void (^)(NSArray *operations))completionBlock; + +/** + Enqueues the specified request operations into a batch. When each request operation finishes, the specified progress block is executed, until all of the request operations have finished, at which point the completion block also executes. + + @param operations The request operations used to be batched and enqueued. + @param progressBlock A block object to be executed upon the completion of each request operation in the batch. This block has no return value and takes two arguments: the number of operations that have already finished execution, and the total number of operations. + @param completionBlock A block object to be executed upon the completion of all of the request operations in the batch. This block has no return value and takes a single argument: the batched request operations. + */ +- (void)enqueueBatchOfHTTPRequestOperations:(NSArray *)operations + progressBlock:(void (^)(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations))progressBlock + completionBlock:(void (^)(NSArray *operations))completionBlock; + +///--------------------------- +/// @name Making HTTP Requests +///--------------------------- + +/** + Creates an `AFHTTPRequestOperation` with a `GET` request, and enqueues it to the HTTP client's operation queue. + + @param path The path to be appended to the HTTP client's base URL and used as the request URL. + @param parameters The parameters to be encoded and appended as the query string for the request URL. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the created request operation and the object created from the response data of request. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes two arguments: the created request operation and the `NSError` object describing the network or parsing error that occurred. + + @see -HTTPRequestOperationWithRequest:success:failure: + */ +- (void)getPath:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(AFRKHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFRKHTTPRequestOperation *operation, NSError *error))failure; + +/** + Creates an `AFHTTPRequestOperation` with a `POST` request, and enqueues it to the HTTP client's operation queue. + + @param path The path to be appended to the HTTP client's base URL and used as the request URL. + @param parameters The parameters to be encoded and set in the request HTTP body. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the created request operation and the object created from the response data of request. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes two arguments: the created request operation and the `NSError` object describing the network or parsing error that occurred. + + @see -HTTPRequestOperationWithRequest:success:failure: + */ +- (void)postPath:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(AFRKHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFRKHTTPRequestOperation *operation, NSError *error))failure; + +/** + Creates an `AFHTTPRequestOperation` with a `PUT` request, and enqueues it to the HTTP client's operation queue. + + @param path The path to be appended to the HTTP client's base URL and used as the request URL. + @param parameters The parameters to be encoded and set in the request HTTP body. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the created request operation and the object created from the response data of request. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes two arguments: the created request operation and the `NSError` object describing the network or parsing error that occurred. + + @see -HTTPRequestOperationWithRequest:success:failure: + */ +- (void)putPath:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(AFRKHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFRKHTTPRequestOperation *operation, NSError *error))failure; + +/** + Creates an `AFHTTPRequestOperation` with a `DELETE` request, and enqueues it to the HTTP client's operation queue. + + @param path The path to be appended to the HTTP client's base URL and used as the request URL. + @param parameters The parameters to be encoded and appended as the query string for the request URL. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the created request operation and the object created from the response data of request. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes two arguments: the created request operation and the `NSError` object describing the network or parsing error that occurred. + + @see -HTTPRequestOperationWithRequest:success:failure: + */ +- (void)deletePath:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(AFRKHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFRKHTTPRequestOperation *operation, NSError *error))failure; + +/** + Creates an `AFHTTPRequestOperation` with a `PATCH` request, and enqueues it to the HTTP client's operation queue. + + @param path The path to be appended to the HTTP client's base URL and used as the request URL. + @param parameters The parameters to be encoded and set in the request HTTP body. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the created request operation and the object created from the response data of request. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes two arguments: the created request operation and the `NSError` object describing the network or parsing error that occurred. + + @see -HTTPRequestOperationWithRequest:success:failure: + */ +- (void)patchPath:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(AFRKHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFRKHTTPRequestOperation *operation, NSError *error))failure; +@end + +///---------------- +/// @name Constants +///---------------- + +/** + ## Network Reachability + + The following constants are provided by `AFHTTPClient` as possible network reachability statuses. + + enum { + AFNetworkReachabilityStatusUnknown, + AFNetworkReachabilityStatusNotReachable, + AFNetworkReachabilityStatusReachableViaWWAN, + AFNetworkReachabilityStatusReachableViaWiFi, + } + + `AFNetworkReachabilityStatusUnknown` + The `baseURL` host reachability is not known. + + `AFNetworkReachabilityStatusNotReachable` + The `baseURL` host cannot be reached. + + `AFNetworkReachabilityStatusReachableViaWWAN` + The `baseURL` host can be reached via a cellular connection, such as EDGE or GPRS. + + `AFNetworkReachabilityStatusReachableViaWiFi` + The `baseURL` host can be reached via a Wi-Fi connection. + + ### Keys for Notification UserInfo Dictionary + + Strings that are used as keys in a `userInfo` dictionary in a network reachability status change notification. + + `AFNetworkingReachabilityNotificationStatusItem` + A key in the userInfo dictionary in a `AFNetworkingReachabilityDidChangeNotification` notification. + The corresponding value is an `NSNumber` object representing the `AFNetworkReachabilityStatus` value for the current reachability status. + + ## Parameter Encoding + + The following constants are provided by `AFHTTPClient` as possible methods for serializing parameters into query string or message body values. + + enum { + AFFormURLParameterEncoding, + AFJSONParameterEncoding, + AFPropertyListParameterEncoding, + } + + `AFFormURLParameterEncoding` + Parameters are encoded into field/key pairs in the URL query string for `GET` `HEAD` and `DELETE` requests, and in the message body otherwise. Dictionary keys are sorted with the `caseInsensitiveCompare:` selector of their description, in order to mitigate the possibility of ambiguous query strings being generated non-deterministically. See the warning for the `parameterEncoding` property for additional information. + + `AFJSONParameterEncoding` + Parameters are encoded into JSON in the message body. + + `AFPropertyListParameterEncoding` + Parameters are encoded into a property list in the message body. + */ + +///---------------- +/// @name Functions +///---------------- + +/** + Returns a query string constructed by a set of parameters, using the specified encoding. + + Query strings are constructed by collecting each key-value pair, percent escaping a string representation of the key-value pair, and then joining the pairs with "&". + + If a query string pair has a an `NSArray` for its value, each member of the array will be represented in the format `field[]=value1&field[]value2`. Otherwise, the pair will be formatted as "field=value". String representations of both keys and values are derived using the `-description` method. The constructed query string does not include the ? character used to delimit the query component. + + @param parameters The parameters used to construct the query string + @param encoding The encoding to use in constructing the query string. If you are uncertain of the correct encoding, you should use UTF-8 (`NSUTF8StringEncoding`), which is the encoding designated by RFC 3986 as the correct encoding for use in URLs. + + @return A percent-escaped query string + */ +extern NSString * AFRKQueryStringFromParametersWithEncoding(NSDictionary *parameters, NSStringEncoding encoding); + +///-------------------- +/// @name Notifications +///-------------------- + +/** + Posted when network reachability changes. + This notification assigns no notification object. The `userInfo` dictionary contains an `NSNumber` object under the `AFNetworkingReachabilityNotificationStatusItem` key, representing the `AFNetworkReachabilityStatus` value for the current network reachability. + + @warning In order for network reachability to be monitored, include the `SystemConfiguration` framework in the active target's "Link Binary With Library" build phase, and add `#import ` to the header prefix of the project (`Prefix.pch`). + */ +#ifdef _SYSTEMCONFIGURATION_H +extern NSString * const AFRKNetworkingReachabilityDidChangeNotification; +extern NSString * const AFRKNetworkingReachabilityNotificationStatusItem; +#endif + +#pragma mark - + +extern NSUInteger const kAFRKUploadStream3GSuggestedPacketSize; +extern NSTimeInterval const kAFRKUploadStream3GSuggestedDelay; + +/** + The `AFMultipartFormData` protocol defines the methods supported by the parameter in the block argument of `AFHTTPClient -multipartFormRequestWithMethod:path:parameters:constructingBodyWithBlock:`. + */ +@protocol AFRKMultipartFormData + +/** + Appends the HTTP header `Content-Disposition: file; filename=#{generated filename}; name=#{name}"` and `Content-Type: #{generated mimeType}`, followed by the encoded file data and the multipart form boundary. + + The filename and MIME type for this data in the form will be automatically generated, using the last path component of the `fileURL` and system associated MIME type for the `fileURL` extension, respectively. + + @param fileURL The URL corresponding to the file whose content will be appended to the form. This parameter must not be `nil`. + @param name The name to be associated with the specified data. This parameter must not be `nil`. + @param error If an error occurs, upon return contains an `NSError` object that describes the problem. + + @return `YES` if the file data was successfully appended, otherwise `NO`. + */ +- (BOOL)appendPartWithFileURL:(NSURL *)fileURL + name:(NSString *)name + error:(NSError * __autoreleasing *)error; + +/** + Appends the HTTP header `Content-Disposition: file; filename=#{filename}; name=#{name}"` and `Content-Type: #{mimeType}`, followed by the encoded file data and the multipart form boundary. + + @param fileURL The URL corresponding to the file whose content will be appended to the form. This parameter must not be `nil`. + @param name The name to be associated with the specified data. This parameter must not be `nil`. + @param fileName The file name to be used in the `Content-Disposition` header. This parameter must not be `nil`. + @param mimeType The declared MIME type of the file data. This parameter must not be `nil`. + @param error If an error occurs, upon return contains an `NSError` object that describes the problem. + + @return `YES` if the file data was successfully appended otherwise `NO`. + */ +- (BOOL)appendPartWithFileURL:(NSURL *)fileURL + name:(NSString *)name + fileName:(NSString *)fileName + mimeType:(NSString *)mimeType + error:(NSError * __autoreleasing *)error; + +/** + Appends the HTTP header `Content-Disposition: file; filename=#{filename}; name=#{name}"` and `Content-Type: #{mimeType}`, followed by the data from the input stream and the multipart form boundary. + + @param inputStream The input stream to be appended to the form data + @param name The name to be associated with the specified input stream. This parameter must not be `nil`. + @param fileName The filename to be associated with the specified input stream. This parameter must not be `nil`. + @param length The length of the specified input stream in bytes. + @param mimeType The MIME type of the specified data. (For example, the MIME type for a JPEG image is image/jpeg.) For a list of valid MIME types, see http://www.iana.org/assignments/media-types/. This parameter must not be `nil`. + */ +- (void)appendPartWithInputStream:(NSInputStream *)inputStream + name:(NSString *)name + fileName:(NSString *)fileName + length:(unsigned long long)length + mimeType:(NSString *)mimeType; + +/** + Appends the HTTP header `Content-Disposition: file; filename=#{filename}; name=#{name}"` and `Content-Type: #{mimeType}`, followed by the encoded file data and the multipart form boundary. + + @param data The data to be encoded and appended to the form data. + @param name The name to be associated with the specified data. This parameter must not be `nil`. + @param fileName The filename to be associated with the specified data. This parameter must not be `nil`. + @param mimeType The MIME type of the specified data. (For example, the MIME type for a JPEG image is image/jpeg.) For a list of valid MIME types, see http://www.iana.org/assignments/media-types/. This parameter must not be `nil`. + */ +- (void)appendPartWithFileData:(NSData *)data + name:(NSString *)name + fileName:(NSString *)fileName + mimeType:(NSString *)mimeType; + +/** + Appends the HTTP headers `Content-Disposition: form-data; name=#{name}"`, followed by the encoded data and the multipart form boundary. + + @param data The data to be encoded and appended to the form data. + @param name The name to be associated with the specified data. This parameter must not be `nil`. + */ + +- (void)appendPartWithFormData:(NSData *)data + name:(NSString *)name; + + +/** + Appends HTTP headers, followed by the encoded data and the multipart form boundary. + + @param headers The HTTP headers to be appended to the form data. + @param body The data to be encoded and appended to the form data. + */ +- (void)appendPartWithHeaders:(NSDictionary *)headers + body:(NSData *)body; + +/** + Throttles request bandwidth by limiting the packet size and adding a delay for each chunk read from the upload stream. + + When uploading over a 3G or EDGE connection, requests may fail with "request body stream exhausted". Setting a maximum packet size and delay according to the recommended values (`kAFRKUploadStream3GSuggestedPacketSize` and `kAFRKUploadStream3GSuggestedDelay`) lowers the risk of the input stream exceeding its allocated bandwidth. Unfortunately, as of iOS 6, there is no definite way to distinguish between a 3G, EDGE, or LTE connection. As such, it is not recommended that you throttle bandwidth based solely on network reachability. Instead, you should consider checking for the "request body stream exhausted" in a failure block, and then retrying the request with throttled bandwidth. + + @param numberOfBytes Maximum packet size, in number of bytes. The default packet size for an input stream is 32kb. + @param delay Duration of delay each time a packet is read. By default, no delay is set. + */ +- (void)throttleBandwidthWithPacketSize:(NSUInteger)numberOfBytes + delay:(NSTimeInterval)delay; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKHTTPClient.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKHTTPClient.m new file mode 100644 index 0000000..16794b0 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKHTTPClient.m @@ -0,0 +1,1403 @@ +// AFHTTPClient.m +// +// Copyright (c) 2011 Gowalla (http://gowalla.com/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +#import "AFRKHTTPClient.h" +#import "AFRKHTTPRequestOperation.h" + +#import + +#ifdef _SYSTEMCONFIGURATION_H +#import +#import +#import +#import +#import +#endif + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#import +#endif + +#ifdef _SYSTEMCONFIGURATION_H +NSString * const AFRKNetworkingReachabilityDidChangeNotification = @"com.restkit.alamofire.networking.reachability.change"; +NSString * const AFRKNetworkingReachabilityNotificationStatusItem = @"AFRKNetworkingReachabilityNotificationStatusItem"; + +typedef SCNetworkReachabilityRef AFRKNetworkReachabilityRef; +typedef void (^AFRKNetworkReachabilityStatusBlock)(AFRKNetworkReachabilityStatus status); +#else +typedef id AFRKNetworkReachabilityRef; +#endif + +typedef void (^AFRKCompletionBlock)(void); + +static NSString * AFRKBase64EncodedStringFromString(NSString *string) { + NSData *data = [NSData dataWithBytes:[string UTF8String] length:[string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]]; + NSUInteger length = [data length]; + NSMutableData *mutableData = [NSMutableData dataWithLength:((length + 2) / 3) * 4]; + + uint8_t *input = (uint8_t *)[data bytes]; + uint8_t *output = (uint8_t *)[mutableData mutableBytes]; + + for (NSUInteger i = 0; i < length; i += 3) { + NSUInteger value = 0; + for (NSUInteger j = i; j < (i + 3); j++) { + value <<= 8; + if (j < length) { + value |= (0xFF & input[j]); + } + } + + static uint8_t const kAFRKBase64EncodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + NSUInteger idx = (i / 3) * 4; + output[idx + 0] = kAFRKBase64EncodingTable[(value >> 18) & 0x3F]; + output[idx + 1] = kAFRKBase64EncodingTable[(value >> 12) & 0x3F]; + output[idx + 2] = (i + 1) < length ? kAFRKBase64EncodingTable[(value >> 6) & 0x3F] : '='; + output[idx + 3] = (i + 2) < length ? kAFRKBase64EncodingTable[(value >> 0) & 0x3F] : '='; + } + + return [[NSString alloc] initWithData:mutableData encoding:NSASCIIStringEncoding]; +} + +static NSString * const kAFRKCharactersToBeEscapedInQueryString = @":/?&=;+!@#$()',*"; + +static NSString * AFRKPercentEscapedQueryStringKeyFromStringWithEncoding(NSString *string, NSStringEncoding encoding) { + static NSString * const kAFRKCharactersToLeaveUnescapedInQueryStringPairKey = @"[]."; + + return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, (__bridge CFStringRef)kAFRKCharactersToLeaveUnescapedInQueryStringPairKey, (__bridge CFStringRef)kAFRKCharactersToBeEscapedInQueryString, CFStringConvertNSStringEncodingToEncoding(encoding)); +} + +static NSString * AFRKPercentEscapedQueryStringValueFromStringWithEncoding(NSString *string, NSStringEncoding encoding) { + return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, NULL, (__bridge CFStringRef)kAFRKCharactersToBeEscapedInQueryString, CFStringConvertNSStringEncodingToEncoding(encoding)); +} + +#pragma mark - + +@interface AFRKQueryStringPair : NSObject +@property (readwrite, nonatomic, strong) id field; +@property (readwrite, nonatomic, strong) id value; + +- (id)initWithField:(id)field value:(id)value; + +- (NSString *)URLEncodedStringValueWithEncoding:(NSStringEncoding)stringEncoding; +@end + +@implementation AFRKQueryStringPair +@synthesize field = _field; +@synthesize value = _value; + +- (id)initWithField:(id)field value:(id)value { + self = [super init]; + if (!self) { + return nil; + } + + self.field = field; + self.value = value; + + return self; +} + +- (NSString *)URLEncodedStringValueWithEncoding:(NSStringEncoding)stringEncoding { + if (!self.value || [self.value isEqual:[NSNull null]]) { + return AFRKPercentEscapedQueryStringKeyFromStringWithEncoding([self.field description], stringEncoding); + } else { + return [NSString stringWithFormat:@"%@=%@", AFRKPercentEscapedQueryStringKeyFromStringWithEncoding([self.field description], stringEncoding), AFRKPercentEscapedQueryStringValueFromStringWithEncoding([self.value description], stringEncoding)]; + } +} + +@end + +#pragma mark - + +extern NSArray * AFRKQueryStringPairsFromDictionary(NSDictionary *dictionary); +extern NSArray * AFRKQueryStringPairsFromKeyAndValue(NSString *key, id value); + +NSString * AFRKQueryStringFromParametersWithEncoding(NSDictionary *parameters, NSStringEncoding stringEncoding) { + NSMutableArray *mutablePairs = [NSMutableArray array]; + for (AFRKQueryStringPair *pair in AFRKQueryStringPairsFromDictionary(parameters)) { + [mutablePairs addObject:[pair URLEncodedStringValueWithEncoding:stringEncoding]]; + } + + return [mutablePairs componentsJoinedByString:@"&"]; +} + +NSArray * AFRKQueryStringPairsFromDictionary(NSDictionary *dictionary) { + return AFRKQueryStringPairsFromKeyAndValue(nil, dictionary); +} + +NSArray * AFRKQueryStringPairsFromKeyAndValue(NSString *key, id value) { + NSMutableArray *mutableQueryStringComponents = [NSMutableArray array]; + + if ([value isKindOfClass:[NSDictionary class]]) { + NSDictionary *dictionary = value; + // Sort dictionary keys to ensure consistent ordering in query string, which is important when deserializing potentially ambiguous sequences, such as an array of dictionaries + NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES selector:@selector(caseInsensitiveCompare:)]; + for (id nestedKey in [dictionary.allKeys sortedArrayUsingDescriptors:@[ sortDescriptor ]]) { + id nestedValue = [dictionary objectForKey:nestedKey]; + if (nestedValue) { + [mutableQueryStringComponents addObjectsFromArray:AFRKQueryStringPairsFromKeyAndValue((key ? [NSString stringWithFormat:@"%@[%@]", key, nestedKey] : nestedKey), nestedValue)]; + } + } + } else if ([value isKindOfClass:[NSArray class]]) { + NSArray *array = value; + for (id nestedValue in array) { + [mutableQueryStringComponents addObjectsFromArray:AFRKQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)]; + } + } else if ([value isKindOfClass:[NSSet class]]) { + NSSet *set = value; + for (id obj in set) { + [mutableQueryStringComponents addObjectsFromArray:AFRKQueryStringPairsFromKeyAndValue(key, obj)]; + } + } else { + [mutableQueryStringComponents addObject:[[AFRKQueryStringPair alloc] initWithField:key value:value]]; + } + + return mutableQueryStringComponents; +} + +@interface AFRKStreamingMultipartFormData : NSObject +- (id)initWithURLRequest:(NSMutableURLRequest *)urlRequest + stringEncoding:(NSStringEncoding)encoding; + +- (NSMutableURLRequest *)requestByFinalizingMultipartFormData; +@end + +#pragma mark - + +@interface AFRKHTTPClient () +@property (readwrite, nonatomic, strong) NSURL *baseURL; +@property (readwrite, nonatomic, strong) NSMutableArray *registeredHTTPOperationClassNames; +@property (readwrite, nonatomic, strong) NSMutableDictionary *defaultHeaders; +@property (readwrite, nonatomic, strong) NSURLCredential *defaultCredential; +@property (readwrite, nonatomic, strong) NSOperationQueue *operationQueue; +#ifdef _SYSTEMCONFIGURATION_H +@property (readwrite, nonatomic, assign) AFRKNetworkReachabilityRef networkReachability; +@property (readwrite, nonatomic, assign) AFRKNetworkReachabilityStatus networkReachabilityStatus; +@property (readwrite, nonatomic, copy) AFRKNetworkReachabilityStatusBlock networkReachabilityStatusBlock; +#endif + +#ifdef _SYSTEMCONFIGURATION_H +- (void)startMonitoringNetworkReachability; +- (void)stopMonitoringNetworkReachability; +#endif +@end + +@implementation AFRKHTTPClient +@synthesize baseURL = _baseURL; +@synthesize stringEncoding = _stringEncoding; +@synthesize parameterEncoding = _parameterEncoding; +@synthesize registeredHTTPOperationClassNames = _registeredHTTPOperationClassNames; +@synthesize defaultHeaders = _defaultHeaders; +@synthesize defaultCredential = _defaultCredential; +@synthesize operationQueue = _operationQueue; +#ifdef _SYSTEMCONFIGURATION_H +@synthesize networkReachability = _networkReachability; +@synthesize networkReachabilityStatus = _networkReachabilityStatus; +@synthesize networkReachabilityStatusBlock = _networkReachabilityStatusBlock; +#endif +@synthesize defaultSSLPinningMode = _defaultSSLPinningMode; +@synthesize allowsInvalidSSLCertificate = _allowsInvalidSSLCertificate; + ++ (instancetype)clientWithBaseURL:(NSURL *)url { + return [[self alloc] initWithBaseURL:url]; +} + +- (id)init { + @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:[NSString stringWithFormat:@"%@ Failed to call designated initializer. Invoke `initWithBaseURL:` instead.", NSStringFromClass([self class])] userInfo:nil]; +} + +- (id)initWithBaseURL:(NSURL *)url { + NSParameterAssert(url); + + self = [super init]; + if (!self) { + return nil; + } + + // Ensure terminal slash for baseURL path, so that NSURL +URLWithString:relativeToURL: works as expected + if ([[url path] length] > 0 && ![[url absoluteString] hasSuffix:@"/"]) { + url = [url URLByAppendingPathComponent:@""]; + } + + self.baseURL = url; + + self.stringEncoding = NSUTF8StringEncoding; + self.parameterEncoding = AFRKFormURLParameterEncoding; + + self.registeredHTTPOperationClassNames = [NSMutableArray array]; + + self.defaultHeaders = [NSMutableDictionary dictionary]; + + // Accept-Language HTTP Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4 + NSMutableArray *acceptLanguagesComponents = [NSMutableArray array]; + [[NSLocale preferredLanguages] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { + float q = 1.0f - (idx * 0.1f); + [acceptLanguagesComponents addObject:[NSString stringWithFormat:@"%@;q=%0.1g", obj, q]]; + *stop = q <= 0.5f; + }]; + [self setDefaultHeader:@"Accept-Language" value:[acceptLanguagesComponents componentsJoinedByString:@", "]]; + + NSString *userAgent = nil; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + // User-Agent Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.43 + userAgent = [NSString stringWithFormat:@"%@/%@ (%@; iOS %@; Scale/%0.2f)", [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleExecutableKey] ?: [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleIdentifierKey], (__bridge id)CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), kCFBundleVersionKey) ?: [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleVersionKey], [[UIDevice currentDevice] model], [[UIDevice currentDevice] systemVersion], ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] ? [[UIScreen mainScreen] scale] : 1.0f)]; +#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) + userAgent = [NSString stringWithFormat:@"%@/%@ (Mac OS X %@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleExecutableKey] ?: [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleIdentifierKey], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"] ?: [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleVersionKey], [[NSProcessInfo processInfo] operatingSystemVersionString]]; +#endif +#pragma clang diagnostic pop + if (userAgent) { + if (![userAgent canBeConvertedToEncoding:NSASCIIStringEncoding]) { + NSMutableString *mutableUserAgent = [userAgent mutableCopy]; + if (CFStringTransform((__bridge CFMutableStringRef)(mutableUserAgent), NULL, kCFStringTransformToLatin, false)) { + userAgent = mutableUserAgent; + } + } + [self setDefaultHeader:@"User-Agent" value:userAgent]; + } + +#ifdef _SYSTEMCONFIGURATION_H + self.networkReachabilityStatus = AFRKNetworkReachabilityStatusUnknown; + [self startMonitoringNetworkReachability]; +#endif + + self.operationQueue = [[NSOperationQueue alloc] init]; + [self.operationQueue setMaxConcurrentOperationCount:NSOperationQueueDefaultMaxConcurrentOperationCount]; + + // #ifdef included for backwards-compatibility +#ifdef _AFRKNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ + self.allowsInvalidSSLCertificate = YES; +#endif + + return self; +} + +- (void)dealloc { +#ifdef _SYSTEMCONFIGURATION_H + [self stopMonitoringNetworkReachability]; +#endif +} + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p, baseURL: %@, defaultHeaders: %@, registeredOperationClasses: %@, operationQueue: %@>", NSStringFromClass([self class]), self, [self.baseURL absoluteString], self.defaultHeaders, self.registeredHTTPOperationClassNames, self.operationQueue]; +} + +#pragma mark - + +#ifdef _SYSTEMCONFIGURATION_H +static BOOL AFRKURLHostIsIPAddress(NSURL *url) { + struct sockaddr_in sa_in; + struct sockaddr_in6 sa_in6; + + return [url host] && (inet_pton(AF_INET, [[url host] UTF8String], &sa_in) == 1 || inet_pton(AF_INET6, [[url host] UTF8String], &sa_in6) == 1); +} + +static AFRKNetworkReachabilityStatus AFRKNetworkReachabilityStatusForFlags(SCNetworkReachabilityFlags flags) { + BOOL isReachable = ((flags & kSCNetworkReachabilityFlagsReachable) != 0); + BOOL needsConnection = ((flags & kSCNetworkReachabilityFlagsConnectionRequired) != 0); + BOOL canConnectionAutomatically = (((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) || ((flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0)); + BOOL canConnectWithoutUserInteraction = (canConnectionAutomatically && (flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0); + BOOL isNetworkReachable = (isReachable && (!needsConnection || canConnectWithoutUserInteraction)); + + AFRKNetworkReachabilityStatus status = AFRKNetworkReachabilityStatusUnknown; + if (isNetworkReachable == NO) { + status = AFRKNetworkReachabilityStatusNotReachable; + } +#if TARGET_OS_IPHONE + else if ((flags & kSCNetworkReachabilityFlagsIsWWAN) != 0) { + status = AFRKNetworkReachabilityStatusReachableViaWWAN; + } +#endif + else { + status = AFRKNetworkReachabilityStatusReachableViaWiFi; + } + + return status; +} + +static void AFRKNetworkReachabilityCallback(SCNetworkReachabilityRef __unused target, SCNetworkReachabilityFlags flags, void *info) { + AFRKNetworkReachabilityStatus status = AFRKNetworkReachabilityStatusForFlags(flags); + AFRKNetworkReachabilityStatusBlock block = (__bridge AFRKNetworkReachabilityStatusBlock)info; + if (block) { + block(status); + } + + dispatch_async(dispatch_get_main_queue(), ^{ + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + [notificationCenter postNotificationName:AFRKNetworkingReachabilityDidChangeNotification object:nil userInfo:[NSDictionary dictionaryWithObject:[NSNumber numberWithInteger:status] forKey:AFRKNetworkingReachabilityNotificationStatusItem]]; + }); +} + +static const void * AFRKNetworkReachabilityRetainCallback(const void *info) { + return Block_copy(info); +} + +static void AFRKNetworkReachabilityReleaseCallback(const void *info) { + if (info) { + Block_release(info); + } +} + +- (void)startMonitoringNetworkReachability { + [self stopMonitoringNetworkReachability]; + + if (!self.baseURL) { + return; + } + + self.networkReachability = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, [[self.baseURL host] UTF8String]); + + if (!self.networkReachability) { + return; + } + + __weak __typeof(&*self)weakSelf = self; + AFRKNetworkReachabilityStatusBlock callback = ^(AFRKNetworkReachabilityStatus status) { + __strong __typeof(&*weakSelf)strongSelf = weakSelf; + if (!strongSelf) { + return; + } + + strongSelf.networkReachabilityStatus = status; + if (strongSelf.networkReachabilityStatusBlock) { + strongSelf.networkReachabilityStatusBlock(status); + } + }; + + SCNetworkReachabilityContext context = {0, (__bridge void *)callback, AFRKNetworkReachabilityRetainCallback, AFRKNetworkReachabilityReleaseCallback, NULL}; + SCNetworkReachabilitySetCallback(self.networkReachability, AFRKNetworkReachabilityCallback, &context); + + /* Network reachability monitoring does not establish a baseline for IP addresses as it does for hostnames, so if the base URL host is an IP address, the initial reachability callback is manually triggered. + */ + if (AFRKURLHostIsIPAddress(self.baseURL)) { + SCNetworkReachabilityFlags flags; + SCNetworkReachabilityGetFlags(self.networkReachability, &flags); + dispatch_async(dispatch_get_main_queue(), ^{ + AFRKNetworkReachabilityStatus status = AFRKNetworkReachabilityStatusForFlags(flags); + callback(status); + }); + } + + SCNetworkReachabilityScheduleWithRunLoop(self.networkReachability, CFRunLoopGetMain(), kCFRunLoopCommonModes); +} + +- (void)stopMonitoringNetworkReachability { + if (self.networkReachability) { + SCNetworkReachabilityUnscheduleFromRunLoop(self.networkReachability, CFRunLoopGetMain(), kCFRunLoopCommonModes); + + CFRelease(_networkReachability); + _networkReachability = NULL; + } +} + +- (void)setReachabilityStatusChangeBlock:(void (^)(AFRKNetworkReachabilityStatus status))block { + self.networkReachabilityStatusBlock = block; +} +#endif + +#pragma mark - + +- (BOOL)registerHTTPOperationClass:(Class)operationClass { + if (![operationClass isSubclassOfClass:[AFRKHTTPRequestOperation class]]) { + return NO; + } + + NSString *className = NSStringFromClass(operationClass); + [self.registeredHTTPOperationClassNames removeObject:className]; + [self.registeredHTTPOperationClassNames insertObject:className atIndex:0]; + + return YES; +} + +- (void)unregisterHTTPOperationClass:(Class)operationClass { + NSString *className = NSStringFromClass(operationClass); + [self.registeredHTTPOperationClassNames removeObject:className]; +} + +#pragma mark - + +- (NSString *)defaultValueForHeader:(NSString *)header { + return [self.defaultHeaders valueForKey:header]; +} + +- (void)setDefaultHeader:(NSString *)header value:(NSString *)value { + [self.defaultHeaders setValue:value forKey:header]; +} + +- (void)setAuthorizationHeaderWithUsername:(NSString *)username password:(NSString *)password { + NSString *basicAuthCredentials = [NSString stringWithFormat:@"%@:%@", username, password]; + [self setDefaultHeader:@"Authorization" value:[NSString stringWithFormat:@"Basic %@", AFRKBase64EncodedStringFromString(basicAuthCredentials)]]; +} + +- (void)setAuthorizationHeaderWithToken:(NSString *)token { + [self setDefaultHeader:@"Authorization" value:[NSString stringWithFormat:@"Token token=\"%@\"", token]]; +} + +- (void)clearAuthorizationHeader { + [self.defaultHeaders removeObjectForKey:@"Authorization"]; +} + +#pragma mark - + +- (NSMutableURLRequest *)requestWithMethod:(NSString *)method + path:(NSString *)path + parameters:(NSDictionary *)parameters +{ + NSParameterAssert(method); + + if (!path) { + path = @""; + } + + NSURL *url = [NSURL URLWithString:path relativeToURL:self.baseURL]; + NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; + [request setHTTPMethod:method]; + [request setAllHTTPHeaderFields:self.defaultHeaders]; + + if (parameters) { + if ([method isEqualToString:@"GET"] || [method isEqualToString:@"HEAD"] || [method isEqualToString:@"DELETE"]) { + url = [NSURL URLWithString:[[url absoluteString] stringByAppendingFormat:[path rangeOfString:@"?"].location == NSNotFound ? @"?%@" : @"&%@", AFRKQueryStringFromParametersWithEncoding(parameters, self.stringEncoding)]]; + [request setURL:url]; + } else { + NSString *charset = (__bridge NSString *)CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(self.stringEncoding)); + NSError *error = nil; + + switch (self.parameterEncoding) { + case AFRKFormURLParameterEncoding:; + [request setValue:[NSString stringWithFormat:@"application/x-www-form-urlencoded; charset=%@", charset] forHTTPHeaderField:@"Content-Type"]; + [request setHTTPBody:[AFRKQueryStringFromParametersWithEncoding(parameters, self.stringEncoding) dataUsingEncoding:self.stringEncoding]]; + break; + case AFRKJSONParameterEncoding:; + [request setValue:[NSString stringWithFormat:@"application/json; charset=%@", charset] forHTTPHeaderField:@"Content-Type"]; + [request setHTTPBody:[NSJSONSerialization dataWithJSONObject:parameters options:(NSJSONWritingOptions)0 error:&error]]; + break; + case AFRKPropertyListParameterEncoding:; + [request setValue:[NSString stringWithFormat:@"application/x-plist; charset=%@", charset] forHTTPHeaderField:@"Content-Type"]; + [request setHTTPBody:[NSPropertyListSerialization dataWithPropertyList:parameters format:NSPropertyListXMLFormat_v1_0 options:0 error:&error]]; + break; + } + + if (error) { + NSLog(@"%@ %@: %@", [self class], NSStringFromSelector(_cmd), error); + } + } + } + + return request; +} + +- (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method + path:(NSString *)path + parameters:(NSDictionary *)parameters + constructingBodyWithBlock:(void (^)(id formData))block +{ + NSParameterAssert(method); + NSParameterAssert(![method isEqualToString:@"GET"] && ![method isEqualToString:@"HEAD"]); + + NSMutableURLRequest *request = [self requestWithMethod:method path:path parameters:nil]; + + __block AFRKStreamingMultipartFormData *formData = [[AFRKStreamingMultipartFormData alloc] initWithURLRequest:request stringEncoding:self.stringEncoding]; + + if (parameters) { + for (AFRKQueryStringPair *pair in AFRKQueryStringPairsFromDictionary(parameters)) { + NSData *data = nil; + if ([pair.value isKindOfClass:[NSData class]]) { + data = pair.value; + } else if ([pair.value isEqual:[NSNull null]]) { + data = [NSData data]; + } else { + data = [[pair.value description] dataUsingEncoding:self.stringEncoding]; + } + + if (data) { + [formData appendPartWithFormData:data name:[pair.field description]]; + } + } + } + + if (block) { + block(formData); + } + + return [formData requestByFinalizingMultipartFormData]; +} + +- (AFRKHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)urlRequest + success:(void (^)(AFRKHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFRKHTTPRequestOperation *operation, NSError *error))failure +{ + AFRKHTTPRequestOperation *operation = nil; + + for (NSString *className in self.registeredHTTPOperationClassNames) { + Class operationClass = NSClassFromString(className); + if (operationClass && [operationClass canProcessRequest:urlRequest]) { + operation = [(AFRKHTTPRequestOperation *)[operationClass alloc] initWithRequest:urlRequest]; + break; + } + } + + if (!operation) { + operation = [[AFRKHTTPRequestOperation alloc] initWithRequest:urlRequest]; + } + + [operation setCompletionBlockWithSuccess:success failure:failure]; + + operation.credential = self.defaultCredential; + operation.SSLPinningMode = self.defaultSSLPinningMode; + operation.allowsInvalidSSLCertificate = self.allowsInvalidSSLCertificate; + + return operation; +} + +#pragma mark - + +- (void)enqueueHTTPRequestOperation:(AFRKHTTPRequestOperation *)operation { + [self.operationQueue addOperation:operation]; +} + +- (void)cancelAllHTTPOperationsWithMethod:(NSString *)method + path:(NSString *)path +{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + NSString *pathToBeMatched = [[[self requestWithMethod:(method ?: @"GET") path:path parameters:nil] URL] path]; +#pragma clang diagnostic pop + + for (NSOperation *operation in [self.operationQueue operations]) { + if (![operation isKindOfClass:[AFRKHTTPRequestOperation class]]) { + continue; + } + + BOOL hasMatchingMethod = !method || [method isEqualToString:[[(AFRKHTTPRequestOperation *)operation request] HTTPMethod]]; + BOOL hasMatchingPath = [[[[(AFRKHTTPRequestOperation *)operation request] URL] path] isEqual:pathToBeMatched]; + + if (hasMatchingMethod && hasMatchingPath) { + [operation cancel]; + } + } +} + +- (void)enqueueBatchOfHTTPRequestOperationsWithRequests:(NSArray *)urlRequests + progressBlock:(void (^)(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations))progressBlock + completionBlock:(void (^)(NSArray *operations))completionBlock +{ + NSMutableArray *mutableOperations = [NSMutableArray array]; + for (NSURLRequest *request in urlRequests) { + AFRKHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:nil failure:nil]; + [mutableOperations addObject:operation]; + } + + [self enqueueBatchOfHTTPRequestOperations:mutableOperations progressBlock:progressBlock completionBlock:completionBlock]; +} + +- (void)enqueueBatchOfHTTPRequestOperations:(NSArray *)operations + progressBlock:(void (^)(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations))progressBlock + completionBlock:(void (^)(NSArray *operations))completionBlock +{ + __block dispatch_group_t dispatchGroup = dispatch_group_create(); + NSBlockOperation *batchedOperation = [NSBlockOperation blockOperationWithBlock:^{ + dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^{ + if (completionBlock) { + completionBlock(operations); + } + }); +#if !OS_OBJECT_USE_OBJC + dispatch_release(dispatchGroup); +#endif + }]; + + for (AFRKHTTPRequestOperation *operation in operations) { + AFRKCompletionBlock originalCompletionBlock = [operation.completionBlock copy]; + __weak __typeof(&*operation)weakOperation = operation; + operation.completionBlock = ^{ + __strong __typeof(&*weakOperation)strongOperation = weakOperation; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + dispatch_queue_t queue = strongOperation.successCallbackQueue ?: dispatch_get_main_queue(); +#pragma clang diagnostic pop + dispatch_group_async(dispatchGroup, queue, ^{ + if (originalCompletionBlock) { + originalCompletionBlock(); + } + + NSUInteger numberOfFinishedOperations = [[operations indexesOfObjectsPassingTest:^BOOL(id op, NSUInteger __unused idx, BOOL __unused *stop) { + return [op isFinished]; + }] count]; + + if (progressBlock) { + progressBlock(numberOfFinishedOperations, [operations count]); + } + + dispatch_group_leave(dispatchGroup); + }); + }; + + dispatch_group_enter(dispatchGroup); + [batchedOperation addDependency:operation]; + } + [self.operationQueue addOperations:operations waitUntilFinished:NO]; + [self.operationQueue addOperation:batchedOperation]; +} + +#pragma mark - + +- (void)getPath:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(AFRKHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFRKHTTPRequestOperation *operation, NSError *error))failure +{ + NSURLRequest *request = [self requestWithMethod:@"GET" path:path parameters:parameters]; + AFRKHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure]; + [self enqueueHTTPRequestOperation:operation]; +} + +- (void)postPath:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(AFRKHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFRKHTTPRequestOperation *operation, NSError *error))failure +{ + NSURLRequest *request = [self requestWithMethod:@"POST" path:path parameters:parameters]; + AFRKHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure]; + [self enqueueHTTPRequestOperation:operation]; +} + +- (void)putPath:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(AFRKHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFRKHTTPRequestOperation *operation, NSError *error))failure +{ + NSURLRequest *request = [self requestWithMethod:@"PUT" path:path parameters:parameters]; + AFRKHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure]; + [self enqueueHTTPRequestOperation:operation]; +} + +- (void)deletePath:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(AFRKHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFRKHTTPRequestOperation *operation, NSError *error))failure +{ + NSURLRequest *request = [self requestWithMethod:@"DELETE" path:path parameters:parameters]; + AFRKHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure]; + [self enqueueHTTPRequestOperation:operation]; +} + +- (void)patchPath:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(AFRKHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFRKHTTPRequestOperation *operation, NSError *error))failure +{ + NSURLRequest *request = [self requestWithMethod:@"PATCH" path:path parameters:parameters]; + AFRKHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure]; + [self enqueueHTTPRequestOperation:operation]; +} + +#pragma mark - NSCoding + +- (id)initWithCoder:(NSCoder *)aDecoder { + NSURL *baseURL = [aDecoder decodeObjectForKey:@"baseURL"]; + + self = [self initWithBaseURL:baseURL]; + if (!self) { + return nil; + } + + self.stringEncoding = [aDecoder decodeIntegerForKey:@"stringEncoding"]; + self.parameterEncoding = (AFRKHTTPClientParameterEncoding) [aDecoder decodeIntegerForKey:@"parameterEncoding"]; + self.registeredHTTPOperationClassNames = [aDecoder decodeObjectForKey:@"registeredHTTPOperationClassNames"]; + self.defaultHeaders = [aDecoder decodeObjectForKey:@"defaultHeaders"]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:self.baseURL forKey:@"baseURL"]; + [aCoder encodeInteger:(NSInteger)self.stringEncoding forKey:@"stringEncoding"]; + [aCoder encodeInteger:self.parameterEncoding forKey:@"parameterEncoding"]; + [aCoder encodeObject:self.registeredHTTPOperationClassNames forKey:@"registeredHTTPOperationClassNames"]; + [aCoder encodeObject:self.defaultHeaders forKey:@"defaultHeaders"]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFRKHTTPClient *HTTPClient = [[[self class] allocWithZone:zone] initWithBaseURL:self.baseURL]; + + HTTPClient.stringEncoding = self.stringEncoding; + HTTPClient.parameterEncoding = self.parameterEncoding; + HTTPClient.registeredHTTPOperationClassNames = [self.registeredHTTPOperationClassNames mutableCopyWithZone:zone]; + HTTPClient.defaultHeaders = [self.defaultHeaders mutableCopyWithZone:zone]; +#ifdef _SYSTEMCONFIGURATION_H + HTTPClient.networkReachabilityStatusBlock = self.networkReachabilityStatusBlock; +#endif + return HTTPClient; +} + +@end + +#pragma mark - + +static NSString * AFCreateMultipartFormBoundary() { + return [NSString stringWithFormat:@"Boundary+%08X%08X", arc4random(), arc4random()]; +} + +static NSString * const kAFRKMultipartFormCRLF = @"\r\n"; + +static inline NSString * AFMultipartFormInitialBoundary(NSString *boundary) { + return [NSString stringWithFormat:@"--%@%@", boundary, kAFRKMultipartFormCRLF]; +} + +static inline NSString * AFMultipartFormEncapsulationBoundary(NSString *boundary) { + return [NSString stringWithFormat:@"%@--%@%@", kAFRKMultipartFormCRLF, boundary, kAFRKMultipartFormCRLF]; +} + +static inline NSString * AFMultipartFormFinalBoundary(NSString *boundary) { + return [NSString stringWithFormat:@"%@--%@--%@", kAFRKMultipartFormCRLF, boundary, kAFRKMultipartFormCRLF]; +} + +static inline NSString * AFContentTypeForPathExtension(NSString *extension) { +#ifdef __UTTYPE__ + NSString *UTI = (__bridge_transfer NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)extension, NULL); + NSString *contentType = (__bridge_transfer NSString *)UTTypeCopyPreferredTagWithClass((__bridge CFStringRef)UTI, kUTTagClassMIMEType); + if (!contentType) { + return @"application/octet-stream"; + } else { + return contentType; + } +#else + return @"application/octet-stream"; +#endif +} + +NSUInteger const kAFRKUploadStream3GSuggestedPacketSize = 1024 * 16; +NSTimeInterval const kAFRKUploadStream3GSuggestedDelay = 0.2; + +@interface AFRKHTTPBodyPart : NSObject +@property (nonatomic, assign) NSStringEncoding stringEncoding; +@property (nonatomic, strong) NSDictionary *headers; +@property (nonatomic, strong) id body; +@property (nonatomic, assign) unsigned long long bodyContentLength; +@property (nonatomic, strong) NSInputStream *inputStream; + +@property (nonatomic, copy) NSString *boundary; +@property (nonatomic, assign) BOOL hasInitialBoundary; +@property (nonatomic, assign) BOOL hasFinalBoundary; + +@property (nonatomic, readonly, getter = hasBytesAvailable) BOOL bytesAvailable; +@property (nonatomic, readonly) unsigned long long contentLength; + +- (NSInteger)read:(uint8_t *)buffer + maxLength:(NSUInteger)length; +@end + +@interface AFRKMultipartBodyStream : NSInputStream +@property (nonatomic, assign) NSUInteger numberOfBytesInPacket; +@property (nonatomic, assign) NSTimeInterval delay; +@property (nonatomic, strong) NSInputStream *inputStream; +@property (nonatomic, readonly) unsigned long long contentLength; +@property (nonatomic, readonly, getter = isEmpty) BOOL empty; + +- (id)initWithStringEncoding:(NSStringEncoding)encoding; +- (void)setInitialAndFinalBoundaries; +- (void)appendHTTPBodyPart:(AFRKHTTPBodyPart *)bodyPart; +@end + +#pragma mark - + +@interface AFRKStreamingMultipartFormData () +@property (readwrite, nonatomic, copy) NSMutableURLRequest *request; +@property (nonatomic, copy) NSString *boundary; +@property (readwrite, nonatomic, strong) AFRKMultipartBodyStream *bodyStream; +@property (readwrite, nonatomic, assign) NSStringEncoding stringEncoding; +@end + +@implementation AFRKStreamingMultipartFormData +@synthesize request = _request; +@synthesize bodyStream = _bodyStream; +@synthesize stringEncoding = _stringEncoding; + +- (id)initWithURLRequest:(NSMutableURLRequest *)urlRequest + stringEncoding:(NSStringEncoding)encoding +{ + self = [super init]; + if (!self) { + return nil; + } + + self.request = urlRequest; + self.stringEncoding = encoding; + self.boundary = AFCreateMultipartFormBoundary(); + self.bodyStream = [[AFRKMultipartBodyStream alloc] initWithStringEncoding:encoding]; + + return self; +} + +- (BOOL)appendPartWithFileURL:(NSURL *)fileURL + name:(NSString *)name + error:(NSError * __autoreleasing *)error +{ + NSParameterAssert(fileURL); + NSParameterAssert(name); + + NSString *fileName = [fileURL lastPathComponent]; + NSString *mimeType = AFContentTypeForPathExtension([fileURL pathExtension]); + + return [self appendPartWithFileURL:fileURL name:name fileName:fileName mimeType:mimeType error:error]; +} + +- (BOOL)appendPartWithFileURL:(NSURL *)fileURL + name:(NSString *)name + fileName:(NSString *)fileName + mimeType:(NSString *)mimeType + error:(NSError * __autoreleasing *)error +{ + NSParameterAssert(fileURL); + NSParameterAssert(name); + NSParameterAssert(fileName); + NSParameterAssert(mimeType); + + if (![fileURL isFileURL]) { + NSDictionary *userInfo = [NSDictionary dictionaryWithObject:NSLocalizedStringFromTable(@"Expected URL to be a file URL", @"AFRKNetworking", nil) forKey:NSLocalizedFailureReasonErrorKey]; + if (error != NULL) { + *error = [[NSError alloc] initWithDomain:AFRKNetworkingErrorDomain code:NSURLErrorBadURL userInfo:userInfo]; + } + + return NO; + } else if ([fileURL checkResourceIsReachableAndReturnError:error] == NO) { + NSDictionary *userInfo = [NSDictionary dictionaryWithObject:NSLocalizedStringFromTable(@"File URL not reachable.", @"AFRKNetworking", nil) forKey:NSLocalizedFailureReasonErrorKey]; + if (error != NULL) { + *error = [[NSError alloc] initWithDomain:AFRKNetworkingErrorDomain code:NSURLErrorBadURL userInfo:userInfo]; + } + + return NO; + } + + NSMutableDictionary *mutableHeaders = [NSMutableDictionary dictionary]; + [mutableHeaders setValue:[NSString stringWithFormat:@"form-data; name=\"%@\"; filename=\"%@\"", name, fileName] forKey:@"Content-Disposition"]; + [mutableHeaders setValue:mimeType forKey:@"Content-Type"]; + + AFRKHTTPBodyPart *bodyPart = [[AFRKHTTPBodyPart alloc] init]; + bodyPart.stringEncoding = self.stringEncoding; + bodyPart.headers = mutableHeaders; + bodyPart.boundary = self.boundary; + bodyPart.body = fileURL; + + NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[fileURL path] error:nil]; + bodyPart.bodyContentLength = [[fileAttributes objectForKey:NSFileSize] unsignedLongLongValue]; + + [self.bodyStream appendHTTPBodyPart:bodyPart]; + + return YES; +} + + +- (void)appendPartWithInputStream:(NSInputStream *)inputStream + name:(NSString *)name + fileName:(NSString *)fileName + length:(unsigned long long)length + mimeType:(NSString *)mimeType +{ + NSParameterAssert(name); + NSParameterAssert(fileName); + NSParameterAssert(mimeType); + + NSMutableDictionary *mutableHeaders = [NSMutableDictionary dictionary]; + [mutableHeaders setValue:[NSString stringWithFormat:@"form-data; name=\"%@\"; filename=\"%@\"", name, fileName] forKey:@"Content-Disposition"]; + [mutableHeaders setValue:mimeType forKey:@"Content-Type"]; + + + AFRKHTTPBodyPart *bodyPart = [[AFRKHTTPBodyPart alloc] init]; + bodyPart.stringEncoding = self.stringEncoding; + bodyPart.headers = mutableHeaders; + bodyPart.boundary = self.boundary; + bodyPart.body = inputStream; + + bodyPart.bodyContentLength = length; + + [self.bodyStream appendHTTPBodyPart:bodyPart]; +} + +- (void)appendPartWithFileData:(NSData *)data + name:(NSString *)name + fileName:(NSString *)fileName + mimeType:(NSString *)mimeType +{ + NSParameterAssert(name); + NSParameterAssert(fileName); + NSParameterAssert(mimeType); + + NSMutableDictionary *mutableHeaders = [NSMutableDictionary dictionary]; + [mutableHeaders setValue:[NSString stringWithFormat:@"form-data; name=\"%@\"; filename=\"%@\"", name, fileName] forKey:@"Content-Disposition"]; + [mutableHeaders setValue:mimeType forKey:@"Content-Type"]; + + [self appendPartWithHeaders:mutableHeaders body:data]; +} + +- (void)appendPartWithFormData:(NSData *)data + name:(NSString *)name +{ + NSParameterAssert(name); + + NSMutableDictionary *mutableHeaders = [NSMutableDictionary dictionary]; + [mutableHeaders setValue:[NSString stringWithFormat:@"form-data; name=\"%@\"", name] forKey:@"Content-Disposition"]; + + [self appendPartWithHeaders:mutableHeaders body:data]; +} + +- (void)appendPartWithHeaders:(NSDictionary *)headers + body:(NSData *)body +{ + NSParameterAssert(body); + + AFRKHTTPBodyPart *bodyPart = [[AFRKHTTPBodyPart alloc] init]; + bodyPart.stringEncoding = self.stringEncoding; + bodyPart.headers = headers; + bodyPart.boundary = self.boundary; + bodyPart.bodyContentLength = [body length]; + bodyPart.body = body; + + [self.bodyStream appendHTTPBodyPart:bodyPart]; +} + +- (void)throttleBandwidthWithPacketSize:(NSUInteger)numberOfBytes + delay:(NSTimeInterval)delay +{ + self.bodyStream.numberOfBytesInPacket = numberOfBytes; + self.bodyStream.delay = delay; +} + +- (NSMutableURLRequest *)requestByFinalizingMultipartFormData { + if ([self.bodyStream isEmpty]) { + return self.request; + } + + // Reset the initial and final boundaries to ensure correct Content-Length + [self.bodyStream setInitialAndFinalBoundaries]; + + [self.request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", self.boundary] forHTTPHeaderField:@"Content-Type"]; + [self.request setValue:[NSString stringWithFormat:@"%llu", [self.bodyStream contentLength]] forHTTPHeaderField:@"Content-Length"]; + [self.request setHTTPBodyStream:self.bodyStream]; + + return self.request; +} + +@end + +#pragma mark - + +@interface AFRKMultipartBodyStream () +@property (nonatomic, assign) NSStreamStatus streamStatus; +@property (nonatomic, strong) NSError *streamError; +@property (nonatomic, assign) NSStringEncoding stringEncoding; +@property (nonatomic, strong) NSMutableArray *HTTPBodyParts; +@property (nonatomic, strong) NSEnumerator *HTTPBodyPartEnumerator; +@property (nonatomic, strong) AFRKHTTPBodyPart *currentHTTPBodyPart; +@property (nonatomic, strong) NSOutputStream *outputStream; +@property (nonatomic, strong) NSMutableData *buffer; +@end + +@implementation AFRKMultipartBodyStream +@synthesize streamStatus = _streamStatus; +@synthesize streamError = _streamError; +@synthesize stringEncoding = _stringEncoding; +@synthesize HTTPBodyParts = _HTTPBodyParts; +@synthesize HTTPBodyPartEnumerator = _HTTPBodyPartEnumerator; +@synthesize currentHTTPBodyPart = _currentHTTPBodyPart; +@synthesize inputStream = _inputStream; +@synthesize outputStream = _outputStream; +@synthesize buffer = _buffer; +@synthesize numberOfBytesInPacket = _numberOfBytesInPacket; +@synthesize delay = _delay; + +- (id)initWithStringEncoding:(NSStringEncoding)encoding { + self = [super init]; + if (!self) { + return nil; + } + + self.stringEncoding = encoding; + self.HTTPBodyParts = [NSMutableArray array]; + self.numberOfBytesInPacket = NSIntegerMax; + + return self; +} + +- (void)setInitialAndFinalBoundaries { + if ([self.HTTPBodyParts count] > 0) { + for (AFRKHTTPBodyPart *bodyPart in self.HTTPBodyParts) { + bodyPart.hasInitialBoundary = NO; + bodyPart.hasFinalBoundary = NO; + } + + [[self.HTTPBodyParts objectAtIndex:0] setHasInitialBoundary:YES]; + [[self.HTTPBodyParts lastObject] setHasFinalBoundary:YES]; + } +} + +- (void)appendHTTPBodyPart:(AFRKHTTPBodyPart *)bodyPart { + [self.HTTPBodyParts addObject:bodyPart]; +} + +- (BOOL)isEmpty { + return [self.HTTPBodyParts count] == 0; +} + +#pragma mark - NSInputStream + +- (NSInteger)read:(uint8_t *)buffer + maxLength:(NSUInteger)length +{ + if ([self streamStatus] == NSStreamStatusClosed) { + return 0; + } + + NSInteger totalNumberOfBytesRead = 0; + + while ((NSUInteger)totalNumberOfBytesRead < MIN(length, self.numberOfBytesInPacket)) { + if (!self.currentHTTPBodyPart || ![self.currentHTTPBodyPart hasBytesAvailable]) { + if (!(self.currentHTTPBodyPart = [self.HTTPBodyPartEnumerator nextObject])) { + break; + } + } else { + NSUInteger maxLength = length - (NSUInteger)totalNumberOfBytesRead; + NSInteger numberOfBytesRead = [self.currentHTTPBodyPart read:&buffer[totalNumberOfBytesRead] maxLength:maxLength]; + if (numberOfBytesRead == -1) { + self.streamError = self.currentHTTPBodyPart.inputStream.streamError; + break; + } else { + totalNumberOfBytesRead += numberOfBytesRead; + + if (self.delay > 0.0f) { + [NSThread sleepForTimeInterval:self.delay]; + } + } + } + } + + return totalNumberOfBytesRead; +} + +- (BOOL)getBuffer:(__unused uint8_t **)buffer + length:(__unused NSUInteger *)len +{ + return NO; +} + +- (BOOL)hasBytesAvailable { + return [self streamStatus] == NSStreamStatusOpen; +} + +#pragma mark - NSStream + +- (void)open { + if (self.streamStatus == NSStreamStatusOpen) { + return; + } + + self.streamStatus = NSStreamStatusOpen; + + [self setInitialAndFinalBoundaries]; + self.HTTPBodyPartEnumerator = [self.HTTPBodyParts objectEnumerator]; +} + +- (void)close { + self.streamStatus = NSStreamStatusClosed; +} + +- (id)propertyForKey:(__unused NSString *)key { + return nil; +} + +- (BOOL)setProperty:(__unused id)property + forKey:(__unused NSString *)key +{ + return NO; +} + +- (void)scheduleInRunLoop:(__unused NSRunLoop *)aRunLoop + forMode:(__unused NSString *)mode +{} + +- (void)removeFromRunLoop:(__unused NSRunLoop *)aRunLoop + forMode:(__unused NSString *)mode +{} + +- (unsigned long long)contentLength { + unsigned long long length = 0; + for (AFRKHTTPBodyPart *bodyPart in self.HTTPBodyParts) { + length += [bodyPart contentLength]; + } + + return length; +} + +#pragma mark - Undocumented CFReadStream Bridged Methods + +- (void)_scheduleInCFRunLoop:(__unused CFRunLoopRef)aRunLoop + forMode:(__unused CFStringRef)aMode +{} + +- (void)_unscheduleFromCFRunLoop:(__unused CFRunLoopRef)aRunLoop + forMode:(__unused CFStringRef)aMode +{} + +- (BOOL)_setCFClientFlags:(__unused CFOptionFlags)inFlags + callback:(__unused CFReadStreamClientCallBack)inCallback + context:(__unused CFStreamClientContext *)inContext { + return NO; +} + +#pragma mark - NSCopying + +-(id)copyWithZone:(NSZone *)zone { + AFRKMultipartBodyStream *bodyStreamCopy = [[[self class] allocWithZone:zone] initWithStringEncoding:self.stringEncoding]; + + for (AFRKHTTPBodyPart *bodyPart in self.HTTPBodyParts) { + [bodyStreamCopy appendHTTPBodyPart:[bodyPart copy]]; + } + + [bodyStreamCopy setInitialAndFinalBoundaries]; + + return bodyStreamCopy; +} + +@end + +#pragma mark - + +typedef enum { + AFRKEncapsulationBoundaryPhase = 1, + AFRKHeaderPhase = 2, + AFRKBodyPhase = 3, + AFRKFinalBoundaryPhase = 4, +} AFRKHTTPBodyPartReadPhase; + +@interface AFRKHTTPBodyPart () { + AFRKHTTPBodyPartReadPhase _phase; + NSInputStream *_inputStream; + unsigned long long _phaseReadOffset; +} + +- (BOOL)transitionToNextPhase; +- (NSInteger)readData:(NSData *)data + intoBuffer:(uint8_t *)buffer + maxLength:(NSUInteger)length; +@end + +@implementation AFRKHTTPBodyPart +@synthesize stringEncoding = _stringEncoding; +@synthesize headers = _headers; +@synthesize body = _body; +@synthesize bodyContentLength = _bodyContentLength; +@synthesize inputStream = _inputStream; +@synthesize hasInitialBoundary = _hasInitialBoundary; +@synthesize hasFinalBoundary = _hasFinalBoundary; + +- (id)init { + self = [super init]; + if (!self) { + return nil; + } + + [self transitionToNextPhase]; + + return self; +} + +- (void)dealloc { + if (_inputStream) { + [_inputStream close]; + _inputStream = nil; + } +} + +- (NSInputStream *)inputStream { + if (!_inputStream) { + if ([self.body isKindOfClass:[NSData class]]) { + _inputStream = [NSInputStream inputStreamWithData:self.body]; + } else if ([self.body isKindOfClass:[NSURL class]]) { + _inputStream = [NSInputStream inputStreamWithURL:self.body]; + } else if ([self.body isKindOfClass:[NSInputStream class]]) { + _inputStream = self.body; + } + } + + return _inputStream; +} + +- (NSString *)stringForHeaders { + NSMutableString *headerString = [NSMutableString string]; + for (NSString *field in [self.headers allKeys]) { + [headerString appendString:[NSString stringWithFormat:@"%@: %@%@", field, [self.headers valueForKey:field], kAFRKMultipartFormCRLF]]; + } + [headerString appendString:kAFRKMultipartFormCRLF]; + + return [NSString stringWithString:headerString]; +} + +- (unsigned long long)contentLength { + unsigned long long length = 0; + + NSData *encapsulationBoundaryData = [([self hasInitialBoundary] ? AFMultipartFormInitialBoundary(self.boundary) : AFMultipartFormEncapsulationBoundary(self.boundary)) dataUsingEncoding:self.stringEncoding]; + length += [encapsulationBoundaryData length]; + + NSData *headersData = [[self stringForHeaders] dataUsingEncoding:self.stringEncoding]; + length += [headersData length]; + + length += _bodyContentLength; + + NSData *closingBoundaryData = ([self hasFinalBoundary] ? [AFMultipartFormFinalBoundary(self.boundary) dataUsingEncoding:self.stringEncoding] : [NSData data]); + length += [closingBoundaryData length]; + + return length; +} + +- (BOOL)hasBytesAvailable { + // Allows `read:maxLength:` to be called again if `AFMultipartFormFinalBoundary` doesn't fit into the available buffer + if (_phase == AFRKFinalBoundaryPhase) { + return YES; + } + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wcovered-switch-default" + switch (self.inputStream.streamStatus) { + case NSStreamStatusNotOpen: + case NSStreamStatusOpening: + case NSStreamStatusOpen: + case NSStreamStatusReading: + case NSStreamStatusWriting: + return YES; + case NSStreamStatusAtEnd: + case NSStreamStatusClosed: + case NSStreamStatusError: + default: + return NO; + } +#pragma clang diagnostic pop +} + +- (NSInteger)read:(uint8_t *)buffer + maxLength:(NSUInteger)length +{ + NSUInteger totalNumberOfBytesRead = 0; + + if (_phase == AFRKEncapsulationBoundaryPhase) { + NSData *encapsulationBoundaryData = [([self hasInitialBoundary] ? AFMultipartFormInitialBoundary(self.boundary) : AFMultipartFormEncapsulationBoundary(self.boundary)) dataUsingEncoding:self.stringEncoding]; + totalNumberOfBytesRead += [self readData:encapsulationBoundaryData intoBuffer:&buffer[totalNumberOfBytesRead] maxLength:(length - (NSUInteger)totalNumberOfBytesRead)]; + } + + if (_phase == AFRKHeaderPhase) { + NSData *headersData = [[self stringForHeaders] dataUsingEncoding:self.stringEncoding]; + totalNumberOfBytesRead += [self readData:headersData intoBuffer:&buffer[totalNumberOfBytesRead] maxLength:(length - (NSUInteger)totalNumberOfBytesRead)]; + } + + if (_phase == AFRKBodyPhase) { + NSInteger numberOfBytesRead = 0; + + numberOfBytesRead = [self.inputStream read:&buffer[totalNumberOfBytesRead] maxLength:(length - (NSUInteger)totalNumberOfBytesRead)]; + if (numberOfBytesRead == -1) { + return -1; + } else { + totalNumberOfBytesRead += numberOfBytesRead; + + if ([self.inputStream streamStatus] >= NSStreamStatusAtEnd) { + [self transitionToNextPhase]; + } + } + } + + if (_phase == AFRKFinalBoundaryPhase) { + NSData *closingBoundaryData = ([self hasFinalBoundary] ? [AFMultipartFormFinalBoundary(self.boundary) dataUsingEncoding:self.stringEncoding] : [NSData data]); + totalNumberOfBytesRead += [self readData:closingBoundaryData intoBuffer:&buffer[totalNumberOfBytesRead] maxLength:(length - (NSUInteger)totalNumberOfBytesRead)]; + } + + return totalNumberOfBytesRead; +} + +- (NSInteger)readData:(NSData *)data + intoBuffer:(uint8_t *)buffer + maxLength:(NSUInteger)length +{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + NSRange range = NSMakeRange((NSUInteger)_phaseReadOffset, MIN([data length] - ((NSUInteger)_phaseReadOffset), length)); + [data getBytes:buffer range:range]; +#pragma clang diagnostic pop + + _phaseReadOffset += range.length; + + if (((NSUInteger)_phaseReadOffset) >= [data length]) { + [self transitionToNextPhase]; + } + + return (NSInteger)range.length; +} + +- (BOOL)transitionToNextPhase { + if (![[NSThread currentThread] isMainThread]) { + [self performSelectorOnMainThread:@selector(transitionToNextPhase) withObject:nil waitUntilDone:YES]; + return YES; + } + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wcovered-switch-default" + switch (_phase) { + case AFRKEncapsulationBoundaryPhase: + _phase = AFRKHeaderPhase; + break; + case AFRKHeaderPhase: + [self.inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; + [self.inputStream open]; + _phase = AFRKBodyPhase; + break; + case AFRKBodyPhase: + [self.inputStream close]; + _phase = AFRKFinalBoundaryPhase; + break; + case AFRKFinalBoundaryPhase: + default: + _phase = AFRKEncapsulationBoundaryPhase; + break; + } + _phaseReadOffset = 0; +#pragma clang diagnostic pop + + return YES; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFRKHTTPBodyPart *bodyPart = [[[self class] allocWithZone:zone] init]; + + bodyPart.stringEncoding = self.stringEncoding; + bodyPart.headers = self.headers; + bodyPart.bodyContentLength = self.bodyContentLength; + bodyPart.body = self.body; + + return bodyPart; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKHTTPRequestOperation.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKHTTPRequestOperation.h new file mode 100644 index 0000000..fa9df26 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKHTTPRequestOperation.h @@ -0,0 +1,133 @@ +// AFHTTPRequestOperation.h +// +// Copyright (c) 2011 Gowalla (http://gowalla.com/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#import "AFRKURLConnectionOperation.h" + +/** + `AFHTTPRequestOperation` is a subclass of `AFURLConnectionOperation` for requests using the HTTP or HTTPS protocols. It encapsulates the concept of acceptable status codes and content types, which determine the success or failure of a request. + */ +@interface AFRKHTTPRequestOperation : AFRKURLConnectionOperation + +///---------------------------------------------- +/// @name Getting HTTP URL Connection Information +///---------------------------------------------- + +/** + The last HTTP response received by the operation's connection. + */ +@property (readonly, nonatomic, strong) NSHTTPURLResponse *response; + +///---------------------------------------------------------- +/// @name Managing And Checking For Acceptable HTTP Responses +///---------------------------------------------------------- + +/** + A Boolean value that corresponds to whether the status code of the response is within the specified set of acceptable status codes. Returns `YES` if `acceptableStatusCodes` is `nil`. + */ +@property (nonatomic, readonly) BOOL hasAcceptableStatusCode; + +/** + A Boolean value that corresponds to whether the MIME type of the response is among the specified set of acceptable content types. Returns `YES` if `acceptableContentTypes` is `nil`. + */ +@property (nonatomic, readonly) BOOL hasAcceptableContentType; + +/** + The callback dispatch queue on success. If `NULL` (default), the main queue is used. + */ +@property (nonatomic, assign) dispatch_queue_t successCallbackQueue; + +/** + The callback dispatch queue on failure. If `NULL` (default), the main queue is used. + */ +@property (nonatomic, assign) dispatch_queue_t failureCallbackQueue; + +///------------------------------------------------------------ +/// @name Managing Acceptable HTTP Status Codes & Content Types +///------------------------------------------------------------ + +/** + Returns an `NSIndexSet` object containing the ranges of acceptable HTTP status codes. When non-`nil`, the operation will set the `error` property to an error in `AFErrorDomain`. See http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html + + By default, this is the range 200 to 299, inclusive. + */ ++ (NSIndexSet *)acceptableStatusCodes; + +/** + Adds status codes to the set of acceptable HTTP status codes returned by `+acceptableStatusCodes` in subsequent calls by this class and its descendants. + + @param statusCodes The status codes to be added to the set of acceptable HTTP status codes + */ ++ (void)addAcceptableStatusCodes:(NSIndexSet *)statusCodes; + +/** + Returns an `NSSet` object containing the acceptable MIME types. When non-`nil`, the operation will set the `error` property to an error in `AFErrorDomain`. See http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.17 + + By default, this is `nil`. + */ ++ (NSSet *)acceptableContentTypes; + +/** + Adds content types to the set of acceptable MIME types returned by `+acceptableContentTypes` in subsequent calls by this class and its descendants. + + @param contentTypes The content types to be added to the set of acceptable MIME types + */ ++ (void)addAcceptableContentTypes:(NSSet *)contentTypes; + + +///----------------------------------------------------- +/// @name Determining Whether A Request Can Be Processed +///----------------------------------------------------- + +/** + A Boolean value determining whether or not the class can process the specified request. For example, `AFJSONRequestOperation` may check to make sure the content type was `application/json` or the URL path extension was `.json`. + + @param urlRequest The request that is determined to be supported or not supported for this class. + */ ++ (BOOL)canProcessRequest:(NSURLRequest *)urlRequest; + +///----------------------------------------------------------- +/// @name Setting Completion Block Success / Failure Callbacks +///----------------------------------------------------------- + +/** + Sets the `completionBlock` property with a block that executes either the specified success or failure block, depending on the state of the request on completion. If `error` returns a value, which can be caused by an unacceptable status code or content type, then `failure` is executed. Otherwise, `success` is executed. + + This method should be overridden in subclasses in order to specify the response object passed into the success block. + + @param success The block to be executed on the completion of a successful request. This block has no return value and takes two arguments: the receiver operation and the object constructed from the response data of the request. + @param failure The block to be executed on the completion of an unsuccessful request. This block has no return value and takes two arguments: the receiver operation and the error that occurred during the request. + */ +- (void)setCompletionBlockWithSuccess:(void (^)(AFRKHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFRKHTTPRequestOperation *operation, NSError *error))failure; + +@end + +///---------------- +/// @name Functions +///---------------- + +/** + Returns a set of MIME types detected in an HTTP `Accept` or `Content-Type` header. + */ +extern NSSet * AFRKContentTypesFromHTTPHeader(NSString *string); + diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKHTTPRequestOperation.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKHTTPRequestOperation.m new file mode 100644 index 0000000..d8056e1 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKHTTPRequestOperation.m @@ -0,0 +1,327 @@ +// AFHTTPRequestOperation.m +// +// Copyright (c) 2011 Gowalla (http://gowalla.com/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "AFRKHTTPRequestOperation.h" +#import + +// Workaround for change in imp_implementationWithBlock() with Xcode 4.5 +#if defined(__IPHONE_6_0) || defined(__MAC_10_8) +#define AFRK_CAST_TO_BLOCK id +#else +#define AFRK_CAST_TO_BLOCK __bridge void * +#endif + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wstrict-selector-match" + +NSSet * AFRKContentTypesFromHTTPHeader(NSString *string) { + if (!string) { + return nil; + } + + NSArray *mediaRanges = [string componentsSeparatedByString:@","]; + NSMutableSet *mutableContentTypes = [NSMutableSet setWithCapacity:mediaRanges.count]; + + [mediaRanges enumerateObjectsUsingBlock:^(NSString *mediaRange, __unused NSUInteger idx, __unused BOOL *stop) { + NSRange parametersRange = [mediaRange rangeOfString:@";"]; + if (parametersRange.location != NSNotFound) { + mediaRange = [mediaRange substringToIndex:parametersRange.location]; + } + + mediaRange = [mediaRange stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + + if (mediaRange.length > 0) { + [mutableContentTypes addObject:mediaRange]; + } + }]; + + return [NSSet setWithSet:mutableContentTypes]; +} + +static void AFRKGetMediaTypeAndSubtypeWithString(NSString *string, NSString **type, NSString **subtype) { + if (!string) { + return; + } + + NSScanner *scanner = [NSScanner scannerWithString:string]; + [scanner setCharactersToBeSkipped:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + [scanner scanUpToString:@"/" intoString:type]; + [scanner scanString:@"/" intoString:nil]; + [scanner scanUpToString:@";" intoString:subtype]; +} + +static NSString * AFRKStringFromIndexSet(NSIndexSet *indexSet) { + NSMutableString *string = [NSMutableString string]; + + NSRange range = NSMakeRange([indexSet firstIndex], 1); + while (range.location != NSNotFound) { + NSUInteger nextIndex = [indexSet indexGreaterThanIndex:range.location]; + while (nextIndex == range.location + range.length) { + range.length++; + nextIndex = [indexSet indexGreaterThanIndex:nextIndex]; + } + + if (string.length) { + [string appendString:@","]; + } + + if (range.length == 1) { + [string appendFormat:@"%lu", (long)range.location]; + } else { + NSUInteger firstIndex = range.location; + NSUInteger lastIndex = firstIndex + range.length - 1; + [string appendFormat:@"%lu-%lu", (long)firstIndex, (long)lastIndex]; + } + + range.location = nextIndex; + range.length = 1; + } + + return string; +} + +static void AFRKSwizzleClassMethodWithClassAndSelectorUsingBlock(Class klass, SEL selector, id block) { + Method originalMethod = class_getClassMethod(klass, selector); + IMP implementation = imp_implementationWithBlock((AFRK_CAST_TO_BLOCK)block); + class_replaceMethod(objc_getMetaClass([NSStringFromClass(klass) UTF8String]), selector, implementation, method_getTypeEncoding(originalMethod)); +} + +#pragma mark - + +@interface AFRKHTTPRequestOperation () +@property (readwrite, nonatomic, strong) NSURLRequest *request; +@property (readwrite, nonatomic, strong) NSHTTPURLResponse *response; +@property (readwrite, nonatomic, strong) NSError *HTTPError; +@property (readwrite, nonatomic, strong) NSRecursiveLock *lock; +@end + +@implementation AFRKHTTPRequestOperation +@synthesize HTTPError = _HTTPError; +@synthesize successCallbackQueue = _successCallbackQueue; +@synthesize failureCallbackQueue = _failureCallbackQueue; +@dynamic lock; +@dynamic request; +@dynamic response; + +- (void)dealloc { + if (_successCallbackQueue) { +#if !OS_OBJECT_USE_OBJC + dispatch_release(_successCallbackQueue); +#endif + _successCallbackQueue = NULL; + } + + if (_failureCallbackQueue) { +#if !OS_OBJECT_USE_OBJC + dispatch_release(_failureCallbackQueue); +#endif + _failureCallbackQueue = NULL; + } +} + +- (NSError *)error { + [self.lock lock]; + if (!self.HTTPError && self.response) { + if (![self hasAcceptableStatusCode] || ![self hasAcceptableContentType]) { + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + [userInfo setValue:self.responseString forKey:NSLocalizedRecoverySuggestionErrorKey]; + [userInfo setValue:[self.request URL] forKey:NSURLErrorFailingURLErrorKey]; + [userInfo setValue:self.request forKey:AFRKNetworkingOperationFailingURLRequestErrorKey]; + [userInfo setValue:self.response forKey:AFRKNetworkingOperationFailingURLResponseErrorKey]; + + if (![self hasAcceptableStatusCode]) { + NSInteger statusCode = ([self.response isKindOfClass:[NSHTTPURLResponse class]]) ? [self.response statusCode] : 200; + [userInfo setValue:[NSString stringWithFormat:NSLocalizedStringFromTable(@"Expected status code in (%@), got %ld", @"AFRKNetworking", nil), AFRKStringFromIndexSet([[self class] acceptableStatusCodes]), (long)statusCode] forKey:NSLocalizedDescriptionKey]; + self.HTTPError = [[NSError alloc] initWithDomain:AFRKNetworkingErrorDomain code:NSURLErrorBadServerResponse userInfo:userInfo]; + } else if (![self hasAcceptableContentType]) { + // Don't invalidate content type if there is no content + if ([self.responseData length] > 0) { + [userInfo setValue:[NSString stringWithFormat:NSLocalizedStringFromTable(@"Expected content type %@, got %@", @"AFRKNetworking", nil), [[self class] acceptableContentTypes], [self.response MIMEType]] forKey:NSLocalizedDescriptionKey]; + self.HTTPError = [[NSError alloc] initWithDomain:AFRKNetworkingErrorDomain code:NSURLErrorCannotDecodeContentData userInfo:userInfo]; + } + } + } + } + [self.lock unlock]; + + if (self.HTTPError) { + return self.HTTPError; + } else { + return [super error]; + } +} + +- (NSStringEncoding)responseStringEncoding { + // When no explicit charset parameter is provided by the sender, media subtypes of the "text" type are defined to have a default charset value of "ISO-8859-1" when received via HTTP. Data in character sets other than "ISO-8859-1" or its subsets MUST be labeled with an appropriate charset value. + // See http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.4.1 + if (self.response && !self.response.textEncodingName && self.responseData && [self.response respondsToSelector:@selector(allHeaderFields)]) { + NSString *type = nil; + AFRKGetMediaTypeAndSubtypeWithString([[self.response allHeaderFields] valueForKey:@"Content-Type"], &type, nil); + + if ([type isEqualToString:@"text"]) { + return NSISOLatin1StringEncoding; + } + } + + return [super responseStringEncoding]; +} + +- (void)pause { + unsigned long long offset = 0; + if ([self.outputStream propertyForKey:NSStreamFileCurrentOffsetKey]) { + offset = [[self.outputStream propertyForKey:NSStreamFileCurrentOffsetKey] unsignedLongLongValue]; + } else { + offset = [[self.outputStream propertyForKey:NSStreamDataWrittenToMemoryStreamKey] length]; + } + + NSMutableURLRequest *mutableURLRequest = [self.request mutableCopy]; + if ([self.response respondsToSelector:@selector(allHeaderFields)] && [[self.response allHeaderFields] valueForKey:@"ETag"]) { + [mutableURLRequest setValue:[[self.response allHeaderFields] valueForKey:@"ETag"] forHTTPHeaderField:@"If-Range"]; + } + [mutableURLRequest setValue:[NSString stringWithFormat:@"bytes=%llu-", offset] forHTTPHeaderField:@"Range"]; + self.request = mutableURLRequest; + + [super pause]; +} + +- (BOOL)hasAcceptableStatusCode { + if (!self.response) { + return NO; + } + + NSUInteger statusCode = ([self.response isKindOfClass:[NSHTTPURLResponse class]]) ? (NSUInteger)[self.response statusCode] : 200; + return ![[self class] acceptableStatusCodes] || [[[self class] acceptableStatusCodes] containsIndex:statusCode]; +} + +- (BOOL)hasAcceptableContentType { + if (!self.response) { + return NO; + } + + // Any HTTP/1.1 message containing an entity-body SHOULD include a Content-Type header field defining the media type of that body. If and only if the media type is not given by a Content-Type field, the recipient MAY attempt to guess the media type via inspection of its content and/or the name extension(s) of the URI used to identify the resource. If the media type remains unknown, the recipient SHOULD treat it as type "application/octet-stream". + // See http://www.w3.org/Protocols/rfc2616/rfc2616-sec7.html + NSString *contentType = [self.response MIMEType]; + if (!contentType) { + contentType = @"application/octet-stream"; + } + + return ![[self class] acceptableContentTypes] || [[[self class] acceptableContentTypes] containsObject:contentType]; +} + +- (void)setSuccessCallbackQueue:(dispatch_queue_t)successCallbackQueue { + if (successCallbackQueue != _successCallbackQueue) { + if (_successCallbackQueue) { +#if !OS_OBJECT_USE_OBJC + dispatch_release(_successCallbackQueue); +#endif + _successCallbackQueue = NULL; + } + + if (successCallbackQueue) { +#if !OS_OBJECT_USE_OBJC + dispatch_retain(successCallbackQueue); +#endif + _successCallbackQueue = successCallbackQueue; + } + } +} + +- (void)setFailureCallbackQueue:(dispatch_queue_t)failureCallbackQueue { + if (failureCallbackQueue != _failureCallbackQueue) { + if (_failureCallbackQueue) { +#if !OS_OBJECT_USE_OBJC + dispatch_release(_failureCallbackQueue); +#endif + _failureCallbackQueue = NULL; + } + + if (failureCallbackQueue) { +#if !OS_OBJECT_USE_OBJC + dispatch_retain(failureCallbackQueue); +#endif + _failureCallbackQueue = failureCallbackQueue; + } + } +} + +- (void)setCompletionBlockWithSuccess:(void (^)(AFRKHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFRKHTTPRequestOperation *operation, NSError *error))failure +{ + // completionBlock is manually nilled out in AFURLConnectionOperation to break the retain cycle. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-retain-cycles" +#pragma clang diagnostic ignored "-Wgnu" + self.completionBlock = ^{ + if (self.error) { + if (failure) { + dispatch_async(self.failureCallbackQueue ?: dispatch_get_main_queue(), ^{ + failure(self, self.error); + }); + } + } else { + if (success) { + dispatch_async(self.successCallbackQueue ?: dispatch_get_main_queue(), ^{ + success(self, self.responseData); + }); + } + } + }; +#pragma clang diagnostic pop +} + +#pragma mark - AFHTTPRequestOperation + ++ (NSIndexSet *)acceptableStatusCodes { + return [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 100)]; +} + ++ (void)addAcceptableStatusCodes:(NSIndexSet *)statusCodes { + NSMutableIndexSet *mutableStatusCodes = [[NSMutableIndexSet alloc] initWithIndexSet:[self acceptableStatusCodes]]; + [mutableStatusCodes addIndexes:statusCodes]; + AFRKSwizzleClassMethodWithClassAndSelectorUsingBlock([self class], @selector(acceptableStatusCodes), ^(__unused id _self) { + return mutableStatusCodes; + }); +} + ++ (NSSet *)acceptableContentTypes { + return nil; +} + ++ (void)addAcceptableContentTypes:(NSSet *)contentTypes { + NSMutableSet *mutableContentTypes = [[NSMutableSet alloc] initWithSet:[self acceptableContentTypes] copyItems:YES]; + [mutableContentTypes unionSet:contentTypes]; + AFRKSwizzleClassMethodWithClassAndSelectorUsingBlock([self class], @selector(acceptableContentTypes), ^(__unused id _self) { + return mutableContentTypes; + }); +} + ++ (BOOL)canProcessRequest:(NSURLRequest *)request { + if ([[self class] isEqual:[AFRKHTTPRequestOperation class]]) { + return YES; + } + + return [[self acceptableContentTypes] intersectsSet:AFRKContentTypesFromHTTPHeader([request valueForHTTPHeaderField:@"Accept"])]; +} + +@end + +#pragma clang diagnostic pop diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKImageRequestOperation.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKImageRequestOperation.h new file mode 100644 index 0000000..2f88ffd --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKImageRequestOperation.h @@ -0,0 +1,113 @@ +// AFImageRequestOperation.h +// +// Copyright (c) 2011 Gowalla (http://gowalla.com/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#import "AFRKHTTPRequestOperation.h" + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#import +#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) +#import +#endif + +/** + `AFImageRequestOperation` is a subclass of `AFHTTPRequestOperation` for downloading and processing images. + + ## Acceptable Content Types + + By default, `AFImageRequestOperation` accepts the following MIME types, which correspond to the image formats supported by UIImage or NSImage: + + - `image/tiff` + - `image/jpeg` + - `image/gif` + - `image/png` + - `image/ico` + - `image/x-icon` + - `image/bmp` + - `image/x-bmp` + - `image/x-xbitmap` + - `image/x-win-bitmap` + */ +@interface AFRKImageRequestOperation : AFRKHTTPRequestOperation + +/** + An image constructed from the response data. If an error occurs during the request, `nil` will be returned, and the `error` property will be set to the error. + */ +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +@property (readonly, nonatomic, strong) UIImage *responseImage; +#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) +@property (readonly, nonatomic, strong) NSImage *responseImage; +#endif + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +/** + The scale factor used when interpreting the image data to construct `responseImage`. Specifying a scale factor of 1.0 results in an image whose size matches the pixel-based dimensions of the image. Applying a different scale factor changes the size of the image as reported by the size property. This is set to the value of scale of the main screen by default, which automatically scales images for retina displays, for instance. + */ +@property (nonatomic, assign) CGFloat imageScale; + +/** + Whether to automatically inflate response image data for compressed formats (such as PNG or JPEG). Enabling this can significantly improve drawing performance on iOS when used with `setCompletionBlockWithSuccess:failure:`, as it allows a bitmap representation to be constructed in the background rather than on the main thread. `YES` by default. + */ +@property (nonatomic, assign) BOOL automaticallyInflatesResponseImage; +#endif + +/** + Creates and returns an `AFImageRequestOperation` object and sets the specified success callback. + + @param urlRequest The request object to be loaded asynchronously during execution of the operation. + @param success A block object to be executed when the request finishes successfully. This block has no return value and takes a single argument, the image created from the response data of the request. + + @return A new image request operation + */ +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) ++ (instancetype)imageRequestOperationWithRequest:(NSURLRequest *)urlRequest + success:(void (^)(UIImage *image))success; +#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) ++ (instancetype)imageRequestOperationWithRequest:(NSURLRequest *)urlRequest + success:(void (^)(NSImage *image))success; +#endif + +/** + Creates and returns an `AFImageRequestOperation` object and sets the specified success callback. + + @param urlRequest The request object to be loaded asynchronously during execution of the operation. + @param imageProcessingBlock A block object to be executed after the image request finishes successfully, but before the image is returned in the `success` block. This block takes a single argument, the image loaded from the response body, and returns the processed image. + @param success A block object to be executed when the request finishes successfully, with a status code in the 2xx range, and with an acceptable content type (e.g. `image/png`). This block has no return value and takes three arguments: the request object of the operation, the response for the request, and the image created from the response data. + @param failure A block object to be executed when the request finishes unsuccessfully. This block has no return value and takes three arguments: the request object of the operation, the response for the request, and the error associated with the cause for the unsuccessful operation. + + @return A new image request operation + */ +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) ++ (instancetype)imageRequestOperationWithRequest:(NSURLRequest *)urlRequest + imageProcessingBlock:(UIImage *(^)(UIImage *image))imageProcessingBlock + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success + failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error))failure; +#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) ++ (instancetype)imageRequestOperationWithRequest:(NSURLRequest *)urlRequest + imageProcessingBlock:(NSImage *(^)(NSImage *image))imageProcessingBlock + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSImage *image))success + failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error))failure; +#endif + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKImageRequestOperation.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKImageRequestOperation.m new file mode 100644 index 0000000..5c1a778 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKImageRequestOperation.m @@ -0,0 +1,321 @@ +// AFImageRequestOperation.m +// +// Copyright (c) 2011 Gowalla (http://gowalla.com/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "AFRKImageRequestOperation.h" + +static dispatch_queue_t image_request_operation_processing_queue() { + static dispatch_queue_t afrk_image_request_operation_processing_queue; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + afrk_image_request_operation_processing_queue = dispatch_queue_create("com.restkit.alamofire.networking.image-request.processing", DISPATCH_QUEUE_CONCURRENT); + }); + + return afrk_image_request_operation_processing_queue; +} + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#import + +static UIImage * AFRKImageWithDataAtScale(NSData *data, CGFloat scale) { + UIImage *image = [[UIImage alloc] initWithData:data]; + + return [[UIImage alloc] initWithCGImage:[image CGImage] scale:scale orientation:image.imageOrientation]; +} + +static UIImage * AFRKInflatedImageFromResponseWithDataAtScale(NSHTTPURLResponse *response, NSData *data, CGFloat scale) { + if (!data || [data length] == 0) { + return nil; + } + + UIImage *image = AFRKImageWithDataAtScale(data, scale); + if (image.images) { + return image; + } + + CGImageRef imageRef = nil; + CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data); + + if ([response.MIMEType isEqualToString:@"image/png"]) { + imageRef = CGImageCreateWithPNGDataProvider(dataProvider, NULL, true, kCGRenderingIntentDefault); + } else if ([response.MIMEType isEqualToString:@"image/jpeg"]) { + imageRef = CGImageCreateWithJPEGDataProvider(dataProvider, NULL, true, kCGRenderingIntentDefault); + } + + if (!imageRef) { + imageRef = CGImageCreateCopy([image CGImage]); + + if (!imageRef) { + CGDataProviderRelease(dataProvider); + return image; + } + } + + CGDataProviderRelease(dataProvider); + + size_t width = CGImageGetWidth(imageRef); + size_t height = CGImageGetHeight(imageRef); + size_t bitsPerComponent = CGImageGetBitsPerComponent(imageRef); + size_t bytesPerRow = 0; // CGImageGetBytesPerRow() calculates incorrectly in iOS 5.0, so defer to CGBitmapContextCreate() + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef); + + if (CGColorSpaceGetNumberOfComponents(colorSpace) == 3) { + int alpha = (bitmapInfo & kCGBitmapAlphaInfoMask); + if (alpha == kCGImageAlphaNone) { + bitmapInfo &= ~kCGBitmapAlphaInfoMask; + bitmapInfo |= kCGImageAlphaNoneSkipFirst; + } else if (!(alpha == kCGImageAlphaNoneSkipFirst || alpha == kCGImageAlphaNoneSkipLast)) { + bitmapInfo &= ~kCGBitmapAlphaInfoMask; + bitmapInfo |= kCGImageAlphaPremultipliedFirst; + } + } + + CGContextRef context = CGBitmapContextCreate(NULL, width, height, bitsPerComponent, bytesPerRow, colorSpace, bitmapInfo); + + CGColorSpaceRelease(colorSpace); + + if (!context) { + CGImageRelease(imageRef); + + return image; + } + + CGRect rect = CGRectMake(0.0f, 0.0f, width, height); + CGContextDrawImage(context, rect, imageRef); + CGImageRef inflatedImageRef = CGBitmapContextCreateImage(context); + CGContextRelease(context); + + UIImage *inflatedImage = [[UIImage alloc] initWithCGImage:inflatedImageRef scale:scale orientation:image.imageOrientation]; + CGImageRelease(inflatedImageRef); + CGImageRelease(imageRef); + + return inflatedImage; +} +#endif + +@interface AFRKImageRequestOperation () +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +@property (readwrite, nonatomic, strong) UIImage *responseImage; +#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) +@property (readwrite, nonatomic, strong) NSImage *responseImage; +#endif +@end + +@implementation AFRKImageRequestOperation +@synthesize responseImage = _responseImage; +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +@synthesize imageScale = _imageScale; +#endif + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) ++ (instancetype)imageRequestOperationWithRequest:(NSURLRequest *)urlRequest + success:(void (^)(UIImage *image))success +{ + return [self imageRequestOperationWithRequest:urlRequest imageProcessingBlock:nil success:^(NSURLRequest __unused *request, NSHTTPURLResponse __unused *response, UIImage *image) { + if (success) { + success(image); + } + } failure:nil]; +} +#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) ++ (instancetype)imageRequestOperationWithRequest:(NSURLRequest *)urlRequest + success:(void (^)(NSImage *image))success +{ + return [self imageRequestOperationWithRequest:urlRequest imageProcessingBlock:nil success:^(NSURLRequest __unused *request, NSHTTPURLResponse __unused *response, NSImage *image) { + if (success) { + success(image); + } + } failure:nil]; +} +#endif + + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) ++ (instancetype)imageRequestOperationWithRequest:(NSURLRequest *)urlRequest + imageProcessingBlock:(UIImage *(^)(UIImage *))imageProcessingBlock + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success + failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error))failure +{ + AFRKImageRequestOperation *requestOperation = [(AFRKImageRequestOperation *)[self alloc] initWithRequest:urlRequest]; + [requestOperation setCompletionBlockWithSuccess:^(AFRKHTTPRequestOperation *operation, id responseObject) { + if (success) { + UIImage *image = responseObject; + if (imageProcessingBlock) { + dispatch_async(image_request_operation_processing_queue(), ^(void) { + UIImage *processedImage = imageProcessingBlock(image); +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + dispatch_async(operation.successCallbackQueue ?: dispatch_get_main_queue(), ^(void) { + success(operation.request, operation.response, processedImage); + }); +#pragma clang diagnostic pop + }); + } else { + success(operation.request, operation.response, image); + } + } + } failure:^(AFRKHTTPRequestOperation *operation, NSError *error) { + if (failure) { + failure(operation.request, operation.response, error); + } + }]; + + + return requestOperation; +} +#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) ++ (instancetype)imageRequestOperationWithRequest:(NSURLRequest *)urlRequest + imageProcessingBlock:(NSImage *(^)(NSImage *))imageProcessingBlock + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSImage *image))success + failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error))failure +{ + AFRKImageRequestOperation *requestOperation = [(AFRKImageRequestOperation *)[self alloc] initWithRequest:urlRequest]; + [requestOperation setCompletionBlockWithSuccess:^(AFRKHTTPRequestOperation *operation, id responseObject) { + if (success) { + NSImage *image = responseObject; + if (imageProcessingBlock) { + dispatch_async(image_request_operation_processing_queue(), ^(void) { + NSImage *processedImage = imageProcessingBlock(image); + + dispatch_async(operation.successCallbackQueue ?: dispatch_get_main_queue(), ^(void) { + success(operation.request, operation.response, processedImage); + }); + }); + } else { + success(operation.request, operation.response, image); + } + } + } failure:^(AFRKHTTPRequestOperation *operation, NSError *error) { + if (failure) { + failure(operation.request, operation.response, error); + } + }]; + + return requestOperation; +} +#endif + +- (id)initWithRequest:(NSURLRequest *)urlRequest { + self = [super initWithRequest:urlRequest]; + if (!self) { + return nil; + } + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + self.imageScale = [[UIScreen mainScreen] scale]; + self.automaticallyInflatesResponseImage = YES; +#endif + + return self; +} + + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +- (UIImage *)responseImage { + if (!_responseImage && [self.responseData length] > 0 && [self isFinished]) { + if (self.automaticallyInflatesResponseImage) { + self.responseImage = AFRKInflatedImageFromResponseWithDataAtScale(self.response, self.responseData, self.imageScale); + } else { + self.responseImage = AFRKImageWithDataAtScale(self.responseData, self.imageScale); + } + } + + return _responseImage; +} + +- (void)setImageScale:(CGFloat)imageScale { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wfloat-equal" + if (imageScale == _imageScale) { + return; + } +#pragma clang diagnostic pop + + _imageScale = imageScale; + + self.responseImage = nil; +} +#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) +- (NSImage *)responseImage { + if (!_responseImage && [self.responseData length] > 0 && [self isFinished]) { + // Ensure that the image is set to it's correct pixel width and height + NSBitmapImageRep *bitimage = [[NSBitmapImageRep alloc] initWithData:self.responseData]; + self.responseImage = [[NSImage alloc] initWithSize:NSMakeSize([bitimage pixelsWide], [bitimage pixelsHigh])]; + [self.responseImage addRepresentation:bitimage]; + } + + return _responseImage; +} +#endif + +#pragma mark - AFHTTPRequestOperation + ++ (NSSet *)acceptableContentTypes { + return [NSSet setWithObjects:@"image/tiff", @"image/jpeg", @"image/gif", @"image/png", @"image/ico", @"image/x-icon", @"image/bmp", @"image/x-bmp", @"image/x-xbitmap", @"image/x-win-bitmap", nil]; +} + ++ (BOOL)canProcessRequest:(NSURLRequest *)request { + static NSSet * _acceptablePathExtension = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _acceptablePathExtension = [[NSSet alloc] initWithObjects:@"tif", @"tiff", @"jpg", @"jpeg", @"gif", @"png", @"ico", @"bmp", @"cur", nil]; + }); + + return [_acceptablePathExtension containsObject:[[request URL] pathExtension]] || [super canProcessRequest:request]; +} + +- (void)setCompletionBlockWithSuccess:(void (^)(AFRKHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFRKHTTPRequestOperation *operation, NSError *error))failure +{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-retain-cycles" +#pragma clang diagnostic ignored "-Wgnu" + + self.completionBlock = ^ { + dispatch_async(image_request_operation_processing_queue(), ^(void) { + if (self.error) { + if (failure) { + dispatch_async(self.failureCallbackQueue ?: dispatch_get_main_queue(), ^{ + failure(self, self.error); + }); + } + } else { + if (success) { +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + UIImage *image = nil; +#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) + NSImage *image = nil; +#endif + + image = self.responseImage; + + dispatch_async(self.successCallbackQueue ?: dispatch_get_main_queue(), ^{ + success(self, image); + }); + } + } + }); + }; +#pragma clang diagnostic pop +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKJSONRequestOperation.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKJSONRequestOperation.h new file mode 100644 index 0000000..cdc25bc --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKJSONRequestOperation.h @@ -0,0 +1,71 @@ +// AFJSONRequestOperation.h +// +// Copyright (c) 2011 Gowalla (http://gowalla.com/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#import "AFRKHTTPRequestOperation.h" + +/** + `AFJSONRequestOperation` is a subclass of `AFHTTPRequestOperation` for downloading and working with JSON response data. + + ## Acceptable Content Types + + By default, `AFJSONRequestOperation` accepts the following MIME types, which includes the official standard, `application/json`, as well as other commonly-used types: + + - `application/json` + - `text/json` + + @warning JSON parsing will use the built-in `NSJSONSerialization` class. + */ +@interface AFRKJSONRequestOperation : AFRKHTTPRequestOperation + +///---------------------------- +/// @name Getting Response Data +///---------------------------- + +/** + A JSON object constructed from the response data. If an error occurs while parsing, `nil` will be returned, and the `error` property will be set to the error. + */ +@property (readonly, nonatomic, strong) id responseJSON; + +/** + Options for reading the response JSON data and creating the Foundation objects. For possible values, see the `NSJSONSerialization` documentation section "NSJSONReadingOptions". + */ +@property (nonatomic, assign) NSJSONReadingOptions JSONReadingOptions; + +///---------------------------------- +/// @name Creating Request Operations +///---------------------------------- + +/** + Creates and returns an `AFJSONRequestOperation` object and sets the specified success and failure callbacks. + + @param urlRequest The request object to be loaded asynchronously during execution of the operation + @param success A block object to be executed when the operation finishes successfully. This block has no return value and takes three arguments: the request sent from the client, the response received from the server, and the JSON object created from the response data of request. + @param failure A block object to be executed when the operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data as JSON. This block has no return value and takes three arguments: the request sent from the client, the response received from the server, and the error describing the network or parsing error that occurred. + + @return A new JSON request operation + */ ++ (instancetype)JSONRequestOperationWithRequest:(NSURLRequest *)urlRequest + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, id JSON))success + failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON))failure; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKJSONRequestOperation.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKJSONRequestOperation.m new file mode 100644 index 0000000..6fd74b6 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKJSONRequestOperation.m @@ -0,0 +1,150 @@ +// AFJSONRequestOperation.m +// +// Copyright (c) 2011 Gowalla (http://gowalla.com/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "AFRKJSONRequestOperation.h" + +static dispatch_queue_t json_request_operation_processing_queue() { + static dispatch_queue_t afrk_json_request_operation_processing_queue; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + afrk_json_request_operation_processing_queue = dispatch_queue_create("com.restkit.alamofire.networking.json-request.processing", DISPATCH_QUEUE_CONCURRENT); + }); + + return afrk_json_request_operation_processing_queue; +} + +@interface AFRKJSONRequestOperation () +@property (readwrite, nonatomic, strong) id responseJSON; +@property (readwrite, nonatomic, strong) NSError *JSONError; +@property (readwrite, nonatomic, strong) NSRecursiveLock *lock; +@end + +@implementation AFRKJSONRequestOperation +@synthesize responseJSON = _responseJSON; +@synthesize JSONReadingOptions = _JSONReadingOptions; +@synthesize JSONError = _JSONError; +@dynamic lock; + ++ (instancetype)JSONRequestOperationWithRequest:(NSURLRequest *)urlRequest + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, id JSON))success + failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON))failure +{ + AFRKJSONRequestOperation *requestOperation = [(AFRKJSONRequestOperation *)[self alloc] initWithRequest:urlRequest]; + [requestOperation setCompletionBlockWithSuccess:^(AFRKHTTPRequestOperation *operation, id responseObject) { + if (success) { + success(operation.request, operation.response, responseObject); + } + } failure:^(AFRKHTTPRequestOperation *operation, NSError *error) { + if (failure) { + failure(operation.request, operation.response, error, [(AFRKJSONRequestOperation *)operation responseJSON]); + } + }]; + + return requestOperation; +} + + +- (id)responseJSON { + [self.lock lock]; + if (!_responseJSON && [self.responseData length] > 0 && [self isFinished] && !self.JSONError) { + NSError *error = nil; + + // Workaround for behavior of Rails to return a single space for `head :ok` (a workaround for a bug in Safari), which is not interpreted as valid input by NSJSONSerialization. + // See https://github.com/rails/rails/issues/1742 + if (self.responseString && ![self.responseString isEqualToString:@" "]) { + // Workaround for a bug in NSJSONSerialization when Unicode character escape codes are used instead of the actual character + // See http://stackoverflow.com/a/12843465/157142 + NSData *data = [self.responseString dataUsingEncoding:NSUTF8StringEncoding]; + + if (data) { + self.responseJSON = [NSJSONSerialization JSONObjectWithData:data options:self.JSONReadingOptions error:&error]; + } else { + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + [userInfo setValue:@"Operation responseData failed decoding as a UTF-8 string" forKey:NSLocalizedDescriptionKey]; + [userInfo setValue:[NSString stringWithFormat:@"Could not decode string: %@", self.responseString] forKey:NSLocalizedFailureReasonErrorKey]; + error = [[NSError alloc] initWithDomain:AFRKNetworkingErrorDomain code:NSURLErrorCannotDecodeContentData userInfo:userInfo]; + } + } + + self.JSONError = error; + } + [self.lock unlock]; + + return _responseJSON; +} + +- (NSError *)error { + if (_JSONError) { + return _JSONError; + } else { + return [super error]; + } +} + +#pragma mark - AFHTTPRequestOperation + ++ (NSSet *)acceptableContentTypes { + return [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", nil]; +} + ++ (BOOL)canProcessRequest:(NSURLRequest *)request { + return [[[request URL] pathExtension] isEqualToString:@"json"] || [super canProcessRequest:request]; +} + +- (void)setCompletionBlockWithSuccess:(void (^)(AFRKHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFRKHTTPRequestOperation *operation, NSError *error))failure +{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-retain-cycles" +#pragma clang diagnostic ignored "-Wgnu" + + self.completionBlock = ^ { + if (self.error) { + if (failure) { + dispatch_async(self.failureCallbackQueue ?: dispatch_get_main_queue(), ^{ + failure(self, self.error); + }); + } + } else { + dispatch_async(json_request_operation_processing_queue(), ^{ + id JSON = self.responseJSON; + + if (self.error) { + if (failure) { + dispatch_async(self.failureCallbackQueue ?: dispatch_get_main_queue(), ^{ + failure(self, self.error); + }); + } + } else { + if (success) { + dispatch_async(self.successCallbackQueue ?: dispatch_get_main_queue(), ^{ + success(self, JSON); + }); + } + } + }); + } + }; +#pragma clang diagnostic pop +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKNetworkActivityIndicatorManager.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKNetworkActivityIndicatorManager.h new file mode 100644 index 0000000..08d4aff --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKNetworkActivityIndicatorManager.h @@ -0,0 +1,75 @@ +// AFNetworkActivityIndicatorManager.h +// +// Copyright (c) 2011 Gowalla (http://gowalla.com/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#import + +/** + `AFNetworkActivityIndicatorManager` manages the state of the network activity indicator in the status bar. When enabled, it will listen for notifications indicating that a network request operation has started or finished, and start or stop animating the indicator accordingly. The number of active requests is incremented and decremented much like a stack or a semaphore, and the activity indicator will animate so long as that number is greater than zero. + + You should enable the shared instance of `AFNetworkActivityIndicatorManager` when your application finishes launching. In `AppDelegate application:didFinishLaunchingWithOptions:` you can do so with the following code: + + [[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]; + + By setting `isNetworkActivityIndicatorVisible` to `YES` for `sharedManager`, the network activity indicator will show and hide automatically as requests start and finish. You should not ever need to call `incrementActivityCount` or `decrementActivityCount` yourself. + + See the Apple Human Interface Guidelines section about the Network Activity Indicator for more information: + http://developer.apple.com/library/iOS/#documentation/UserExperience/Conceptual/MobileHIG/UIElementGuidelines/UIElementGuidelines.html#//apple_ref/doc/uid/TP40006556-CH13-SW44 + */ +@interface AFRKNetworkActivityIndicatorManager : NSObject + +/** + A Boolean value indicating whether the manager is enabled. + + If YES, the manager will change status bar network activity indicator according to network operation notifications it receives. The default value is NO. + */ +@property (nonatomic, assign, getter = isEnabled) BOOL enabled; + +/** + A Boolean value indicating whether the network activity indicator is currently displayed in the status bar. + */ +@property (readonly, nonatomic, assign) BOOL isNetworkActivityIndicatorVisible; + +/** + Returns the shared network activity indicator manager object for the system. + + @return The systemwide network activity indicator manager. + */ ++ (instancetype)sharedManager; + +/** + Increments the number of active network requests. If this number was zero before incrementing, this will start animating the status bar network activity indicator. + */ +- (void)incrementActivityCount; + +/** + Decrements the number of active network requests. If this number becomes zero before decrementing, this will stop animating the status bar network activity indicator. + */ +- (void)decrementActivityCount; + +@end + +#endif diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKNetworkActivityIndicatorManager.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKNetworkActivityIndicatorManager.m new file mode 100644 index 0000000..69c59ae --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKNetworkActivityIndicatorManager.m @@ -0,0 +1,157 @@ +// AFNetworkActivityIndicatorManager.m +// +// Copyright (c) 2011 Gowalla (http://gowalla.com/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "AFRKNetworkActivityIndicatorManager.h" + +#import "AFRKHTTPRequestOperation.h" + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +static NSTimeInterval const kAFRKNetworkActivityIndicatorInvisibilityDelay = 0.17; + +@interface AFRKNetworkActivityIndicatorManager () +@property (readwrite, nonatomic, assign) NSInteger activityCount; +@property (readwrite, nonatomic, strong) NSTimer *activityIndicatorVisibilityTimer; +@property (readonly, nonatomic, getter = isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible; + +- (void)updateNetworkActivityIndicatorVisibility; +- (void)updateNetworkActivityIndicatorVisibilityDelayed; +@end + +@implementation AFRKNetworkActivityIndicatorManager +@synthesize activityCount = _activityCount; +@synthesize activityIndicatorVisibilityTimer = _activityIndicatorVisibilityTimer; +@synthesize enabled = _enabled; +@dynamic networkActivityIndicatorVisible; + ++ (instancetype)sharedManager { + static AFRKNetworkActivityIndicatorManager *_sharedManager = nil; + static dispatch_once_t oncePredicate; + dispatch_once(&oncePredicate, ^{ + _sharedManager = [[self alloc] init]; + }); + + return _sharedManager; +} + ++ (NSSet *)keyPathsForValuesAffectingIsNetworkActivityIndicatorVisible { + return [NSSet setWithObject:@"activityCount"]; +} + +- (id)init { + self = [super init]; + if (!self) { + return nil; + } + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkingOperationDidStart:) name:AFRKNetworkingOperationDidStartNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkingOperationDidFinish:) name:AFRKNetworkingOperationDidFinishNotification object:nil]; + + return self; +} + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; + + [_activityIndicatorVisibilityTimer invalidate]; + +} + +- (void)updateNetworkActivityIndicatorVisibilityDelayed { + if (self.enabled) { + // Delay hiding of activity indicator for a short interval, to avoid flickering + if (![self isNetworkActivityIndicatorVisible]) { + [self.activityIndicatorVisibilityTimer invalidate]; + self.activityIndicatorVisibilityTimer = [NSTimer timerWithTimeInterval:kAFRKNetworkActivityIndicatorInvisibilityDelay target:self selector:@selector(updateNetworkActivityIndicatorVisibility) userInfo:nil repeats:NO]; + [[NSRunLoop mainRunLoop] addTimer:self.activityIndicatorVisibilityTimer forMode:NSRunLoopCommonModes]; + } else { + [self performSelectorOnMainThread:@selector(updateNetworkActivityIndicatorVisibility) withObject:nil waitUntilDone:NO modes:[NSArray arrayWithObject:NSRunLoopCommonModes]]; + } + } +} + +- (BOOL)isNetworkActivityIndicatorVisible { + return _activityCount > 0; +} + +- (void)updateNetworkActivityIndicatorVisibility { + [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:[self isNetworkActivityIndicatorVisible]]; +} + +// Not exposed, but used if activityCount is set via KVC. +- (NSInteger)activityCount { + return _activityCount; +} + +- (void)setActivityCount:(NSInteger)activityCount { + @synchronized(self) { + _activityCount = activityCount; + } + + dispatch_async(dispatch_get_main_queue(), ^{ + [self updateNetworkActivityIndicatorVisibilityDelayed]; + }); +} + +- (void)incrementActivityCount { + [self willChangeValueForKey:@"activityCount"]; + @synchronized(self) { + _activityCount++; + } + [self didChangeValueForKey:@"activityCount"]; + + dispatch_async(dispatch_get_main_queue(), ^{ + [self updateNetworkActivityIndicatorVisibilityDelayed]; + }); +} + +- (void)decrementActivityCount { + [self willChangeValueForKey:@"activityCount"]; + @synchronized(self) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + _activityCount = MAX(_activityCount - 1, 0); +#pragma clang diagnostic pop + } + [self didChangeValueForKey:@"activityCount"]; + + dispatch_async(dispatch_get_main_queue(), ^{ + [self updateNetworkActivityIndicatorVisibilityDelayed]; + }); +} + +- (void)networkingOperationDidStart:(NSNotification *)notification { + AFRKURLConnectionOperation *connectionOperation = [notification object]; + if (connectionOperation.request.URL) { + [self incrementActivityCount]; + } +} + +- (void)networkingOperationDidFinish:(NSNotification *)notification { + AFRKURLConnectionOperation *connectionOperation = [notification object]; + if (connectionOperation.request.URL) { + [self decrementActivityCount]; + } +} + +@end + +#endif diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKNetworking.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKNetworking.h new file mode 100644 index 0000000..cc500a3 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKNetworking.h @@ -0,0 +1,54 @@ +// AFNetworking.h +// +// Copyright (c) 2011 Gowalla (http://gowalla.com/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#import + +#if __IPHONE_OS_VERSION_MIN_REQUIRED + #import + #import + #import +#else + #import + #import + #import +#endif + +#ifndef _AFRKNETWORKING_ + #define _AFRKNETWORKING_ + #define _AFRKNETWORKING_PIN_SSL_CERTIFICATES_ + + #import "AFRKURLConnectionOperation.h" + + #import "AFRKHTTPRequestOperation.h" + #import "AFRKJSONRequestOperation.h" + #import "AFRKXMLRequestOperation.h" + #import "AFRKPropertyListRequestOperation.h" + #import "AFRKHTTPClient.h" + + #import "AFRKImageRequestOperation.h" + + #if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + #import "AFRKNetworkActivityIndicatorManager.h" + #import "UIImageView+AFRKNetworking.h" + #endif +#endif /* _AFNETWORKING_ */ diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKPropertyListRequestOperation.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKPropertyListRequestOperation.h new file mode 100644 index 0000000..bb84d59 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKPropertyListRequestOperation.h @@ -0,0 +1,68 @@ +// AFPropertyListRequestOperation.h +// +// Copyright (c) 2011 Gowalla (http://gowalla.com/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#import "AFRKHTTPRequestOperation.h" + +/** + `AFPropertyListRequestOperation` is a subclass of `AFHTTPRequestOperation` for downloading and deserializing objects with property list (plist) response data. + + ## Acceptable Content Types + + By default, `AFPropertyListRequestOperation` accepts the following MIME types: + + - `application/x-plist` + */ +@interface AFRKPropertyListRequestOperation : AFRKHTTPRequestOperation + +///---------------------------- +/// @name Getting Response Data +///---------------------------- + +/** + An object deserialized from a plist constructed using the response data. + */ +@property (readonly, nonatomic) id responsePropertyList; + +///-------------------------------------- +/// @name Managing Property List Behavior +///-------------------------------------- + +/** + One of the `NSPropertyListMutabilityOptions` options, specifying the mutability of objects deserialized from the property list. By default, this is `NSPropertyListImmutable`. + */ +@property (nonatomic, assign) NSPropertyListReadOptions propertyListReadOptions; + +/** + Creates and returns an `AFPropertyListRequestOperation` object and sets the specified success and failure callbacks. + + @param urlRequest The request object to be loaded asynchronously during execution of the operation + @param success A block object to be executed when the operation finishes successfully. This block has no return value and takes three arguments: the request sent from the client, the response received from the server, and the object deserialized from a plist constructed using the response data. + @param failure A block object to be executed when the operation finishes unsuccessfully, or that finishes successfully, but encountered an error while deserializing the object from a property list. This block has no return value and takes three arguments: the request sent from the client, the response received from the server, and the error describing the network or parsing error that occurred. + + @return A new property list request operation + */ ++ (instancetype)propertyListRequestOperationWithRequest:(NSURLRequest *)urlRequest + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, id propertyList))success + failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id propertyList))failure; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKPropertyListRequestOperation.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKPropertyListRequestOperation.m new file mode 100644 index 0000000..7289989 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKPropertyListRequestOperation.m @@ -0,0 +1,143 @@ +// AFPropertyListRequestOperation.m +// +// Copyright (c) 2011 Gowalla (http://gowalla.com/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "AFRKPropertyListRequestOperation.h" + +static dispatch_queue_t property_list_request_operation_processing_queue() { + static dispatch_queue_t afrk_property_list_request_operation_processing_queue; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + afrk_property_list_request_operation_processing_queue = dispatch_queue_create("com.restkit.alamofire.networking.property-list-request.processing", DISPATCH_QUEUE_CONCURRENT); + }); + + return afrk_property_list_request_operation_processing_queue; +} + +@interface AFRKPropertyListRequestOperation () +@property (readwrite, nonatomic) id responsePropertyList; +@property (readwrite, nonatomic, assign) NSPropertyListFormat propertyListFormat; +@property (readwrite, nonatomic) NSError *propertyListError; +@end + +@implementation AFRKPropertyListRequestOperation +@synthesize responsePropertyList = _responsePropertyList; +@synthesize propertyListReadOptions = _propertyListReadOptions; +@synthesize propertyListFormat = _propertyListFormat; +@synthesize propertyListError = _propertyListError; + ++ (instancetype)propertyListRequestOperationWithRequest:(NSURLRequest *)request + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, id propertyList))success + failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id propertyList))failure +{ + AFRKPropertyListRequestOperation *requestOperation = [(AFRKPropertyListRequestOperation *)[self alloc] initWithRequest:request]; + [requestOperation setCompletionBlockWithSuccess:^(AFRKHTTPRequestOperation *operation, id responseObject) { + if (success) { + success(operation.request, operation.response, responseObject); + } + } failure:^(AFRKHTTPRequestOperation *operation, NSError *error) { + if (failure) { + failure(operation.request, operation.response, error, [(AFRKPropertyListRequestOperation *)operation responsePropertyList]); + } + }]; + + return requestOperation; +} + +- (id)initWithRequest:(NSURLRequest *)urlRequest { + self = [super initWithRequest:urlRequest]; + if (!self) { + return nil; + } + + self.propertyListReadOptions = NSPropertyListImmutable; + + return self; +} + + +- (id)responsePropertyList { + if (!_responsePropertyList && [self.responseData length] > 0 && [self isFinished]) { + NSPropertyListFormat format; + NSError *error = nil; + self.responsePropertyList = [NSPropertyListSerialization propertyListWithData:self.responseData options:self.propertyListReadOptions format:&format error:&error]; + self.propertyListFormat = format; + self.propertyListError = error; + } + + return _responsePropertyList; +} + +- (NSError *)error { + if (_propertyListError) { + return _propertyListError; + } else { + return [super error]; + } +} + +#pragma mark - AFHTTPRequestOperation + ++ (NSSet *)acceptableContentTypes { + return [NSSet setWithObjects:@"application/x-plist", nil]; +} + ++ (BOOL)canProcessRequest:(NSURLRequest *)request { + return [[[request URL] pathExtension] isEqualToString:@"plist"] || [super canProcessRequest:request]; +} + +- (void)setCompletionBlockWithSuccess:(void (^)(AFRKHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFRKHTTPRequestOperation *operation, NSError *error))failure +{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-retain-cycles" +#pragma clang diagnostic ignored "-Wgnu" + self.completionBlock = ^ { + if (self.error) { + if (failure) { + dispatch_async(self.failureCallbackQueue ?: dispatch_get_main_queue(), ^{ + failure(self, self.error); + }); + } + } else { + dispatch_async(property_list_request_operation_processing_queue(), ^(void) { + id propertyList = self.responsePropertyList; + + if (self.propertyListError) { + if (failure) { + dispatch_async(self.failureCallbackQueue ?: dispatch_get_main_queue(), ^{ + failure(self, self.error); + }); + } + } else { + if (success) { + dispatch_async(self.successCallbackQueue ?: dispatch_get_main_queue(), ^{ + success(self, propertyList); + }); + } + } + }); + } + }; +#pragma clang diagnostic pop +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKURLConnectionOperation.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKURLConnectionOperation.h new file mode 100644 index 0000000..5148769 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKURLConnectionOperation.h @@ -0,0 +1,370 @@ +// AFURLConnectionOperation.h +// +// Copyright (c) 2011 Gowalla (http://gowalla.com/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +#import + +/** + `AFURLConnectionOperation` is a subclass of `NSOperation` that implements `NSURLConnection` delegate methods. + + ## Subclassing Notes + + This is the base class of all network request operations. You may wish to create your own subclass in order to implement additional `NSURLConnection` delegate methods (see "`NSURLConnection` Delegate Methods" below), or to provide additional properties and/or class constructors. + + If you are creating a subclass that communicates over the HTTP or HTTPS protocols, you may want to consider subclassing `AFHTTPRequestOperation` instead, as it supports specifying acceptable content types or status codes. + + ## NSURLConnection Delegate Methods + + `AFURLConnectionOperation` implements the following `NSURLConnection` delegate methods: + + - `connection:didReceiveResponse:` + - `connection:didReceiveData:` + - `connectionDidFinishLoading:` + - `connection:didFailWithError:` + - `connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:` + - `connection:willCacheResponse:` + - `connectionShouldUseCredentialStorage:` + - `connection:willSendRequestForAuthenticationChallenge:` + + If any of these methods are overridden in a subclass, they _must_ call the `super` implementation first. + + ## Class Constructors + + Class constructors, or methods that return an unowned instance, are the preferred way for subclasses to encapsulate any particular logic for handling the setup or parsing of response data. For instance, `AFJSONRequestOperation` provides `JSONRequestOperationWithRequest:success:failure:`, which takes block arguments, whose parameter on for a successful request is the JSON object initialized from the `response data`. + + ## Callbacks and Completion Blocks + + The built-in `completionBlock` provided by `NSOperation` allows for custom behavior to be executed after the request finishes. It is a common pattern for class constructors in subclasses to take callback block parameters, and execute them conditionally in the body of its `completionBlock`. Make sure to handle cancelled operations appropriately when setting a `completionBlock` (i.e. returning early before parsing response data). See the implementation of any of the `AFHTTPRequestOperation` subclasses for an example of this. + + Subclasses are strongly discouraged from overriding `setCompletionBlock:`, as `AFURLConnectionOperation`'s implementation includes a workaround to mitigate retain cycles, and what Apple rather ominously refers to as ["The Deallocation Problem"](http://developer.apple.com/library/ios/#technotes/tn2109/). + + ## SSL Pinning + + Relying on the CA trust model to validate SSL certificates exposes your app to security vulnerabilities, such as man-in-the-middle attacks. For applications that connect to known servers, SSL certificate pinning provides an increased level of security, by checking server certificate validity against those specified in the app bundle. + + SSL with certificate pinning is strongly recommended for any application that transmits sensitive information to an external webservice. + + When `defaultSSLPinningMode` is defined on `AFHTTPClient` and the Security framework is linked, connections will be validated on all matching certificates with a `.cer` extension in the bundle root. + + ## NSCoding & NSCopying Conformance + + `AFURLConnectionOperation` conforms to the `NSCoding` and `NSCopying` protocols, allowing operations to be archived to disk, and copied in memory, respectively. However, because of the intrinsic limitations of capturing the exact state of an operation at a particular moment, there are some important caveats to keep in mind: + + ### NSCoding Caveats + + - Encoded operations do not include any block or stream properties. Be sure to set `completionBlock`, `outputStream`, and any callback blocks as necessary when using `-initWithCoder:` or `NSKeyedUnarchiver`. + - Operations are paused on `encodeWithCoder:`. If the operation was encoded while paused or still executing, its archived state will return `YES` for `isReady`. Otherwise, the state of an operation when encoding will remain unchanged. + + ### NSCopying Caveats + + - `-copy` and `-copyWithZone:` return a new operation with the `NSURLRequest` of the original. So rather than an exact copy of the operation at that particular instant, the copying mechanism returns a completely new instance, which can be useful for retrying operations. + - A copy of an operation will not include the `outputStream` of the original. + - Operation copies do not include `completionBlock`. `completionBlock` often strongly captures a reference to `self`, which would otherwise have the unintuitive side-effect of pointing to the _original_ operation when copied. + */ + +typedef enum { + AFRKSSLPinningModeNone, + AFRKSSLPinningModePublicKey, + AFRKSSLPinningModeCertificate, +} AFRKURLConnectionOperationSSLPinningMode; + +@interface AFRKURLConnectionOperation : NSOperation = 50000) || \ + (defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1080) +NSURLConnectionDataDelegate, +#endif +NSCoding, NSCopying> + +///------------------------------- +/// @name Accessing Run Loop Modes +///------------------------------- + +/** + The run loop modes in which the operation will run on the network thread. By default, this is a single-member set containing `NSRunLoopCommonModes`. + */ +@property (nonatomic, strong) NSSet *runLoopModes; + +///----------------------------------------- +/// @name Getting URL Connection Information +///----------------------------------------- + +/** + The request used by the operation's connection. + */ +@property (readonly, nonatomic, strong) NSURLRequest *request; + +/** + The last response received by the operation's connection. + */ +@property (readonly, nonatomic, strong) NSURLResponse *response; + +/** + The error, if any, that occurred in the lifecycle of the request. + */ +@property (readonly, nonatomic, strong) NSError *error; + +/** + Whether the connection should accept an invalid SSL certificate. + + If `_AFRKNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_` is set, this property defaults to `YES` for backwards compatibility. Otherwise, this property defaults to `NO`. + */ +@property (nonatomic, assign) BOOL allowsInvalidSSLCertificate; + +///---------------------------- +/// @name Getting Response Data +///---------------------------- + +/** + The data received during the request. + */ +@property (readonly, nonatomic, strong) NSData *responseData; + +/** + The string representation of the response data. + */ +@property (readonly, nonatomic, copy) NSString *responseString; + +/** + The string encoding of the response. + + If the response does not specify a valid string encoding, `responseStringEncoding` will return `NSUTF8StringEncoding`. + */ +@property (readonly, nonatomic, assign) NSStringEncoding responseStringEncoding; + +///------------------------------- +/// @name Managing URL Credentials +///------------------------------- + +/** + Whether the URL connection should consult the credential storage for authenticating the connection. `YES` by default. + + This is the value that is returned in the `NSURLConnectionDelegate` method `-connectionShouldUseCredentialStorage:`. + */ +@property (nonatomic, assign) BOOL shouldUseCredentialStorage; + +/** + The credential used for authentication challenges in `-connection:didReceiveAuthenticationChallenge:`. + + This will be overridden by any shared credentials that exist for the username or password of the request URL, if present. + */ +@property (nonatomic, strong) NSURLCredential *credential; + +/** + The pinning mode which will be used for SSL connections. `AFSSLPinningModePublicKey` by default. + + SSL Pinning requires that the Security framework is linked with the binary. See the "SSL Pinning" section in the `AFURLConnectionOperation`" header for more information. + */ +@property (nonatomic, assign) AFRKURLConnectionOperationSSLPinningMode SSLPinningMode; + +///------------------------ +/// @name Accessing Streams +///------------------------ + +/** + The input stream used to read data to be sent during the request. + + This property acts as a proxy to the `HTTPBodyStream` property of `request`. + */ +@property (nonatomic, strong) NSInputStream *inputStream; + +/** + The output stream that is used to write data received until the request is finished. + + By default, data is accumulated into a buffer that is stored into `responseData` upon completion of the request. When `outputStream` is set, the data will not be accumulated into an internal buffer, and as a result, the `responseData` property of the completed request will be `nil`. The output stream will be scheduled in the network thread runloop upon being set. + */ +@property (nonatomic, strong) NSOutputStream *outputStream; + +///--------------------------------------------- +/// @name Managing Request Operation Information +///--------------------------------------------- + +/** + The user info dictionary for the receiver. + */ +@property (nonatomic, strong) NSDictionary *userInfo; + +///------------------------------------------------------ +/// @name Initializing an AFURLConnectionOperation Object +///------------------------------------------------------ + +/** + Initializes and returns a newly allocated operation object with a url connection configured with the specified url request. + + This is the designated initializer. + + @param urlRequest The request object to be used by the operation connection. + */ +- (id)initWithRequest:(NSURLRequest *)urlRequest; + +///---------------------------------- +/// @name Pausing / Resuming Requests +///---------------------------------- + +/** + Pauses the execution of the request operation. + + A paused operation returns `NO` for `-isReady`, `-isExecuting`, and `-isFinished`. As such, it will remain in an `NSOperationQueue` until it is either cancelled or resumed. Pausing a finished, cancelled, or paused operation has no effect. + */ +- (void)pause; + +/** + Whether the request operation is currently paused. + + @return `YES` if the operation is currently paused, otherwise `NO`. + */ +- (BOOL)isPaused; + +/** + Resumes the execution of the paused request operation. + + Pause/Resume behavior varies depending on the underlying implementation for the operation class. In its base implementation, resuming a paused requests restarts the original request. However, since HTTP defines a specification for how to request a specific content range, `AFHTTPRequestOperation` will resume downloading the request from where it left off, instead of restarting the original request. + */ +- (void)resume; + +///---------------------------------------------- +/// @name Configuring Backgrounding Task Behavior +///---------------------------------------------- + +/** + Specifies that the operation should continue execution after the app has entered the background, and the expiration handler for that background task. + + @param handler A handler to be called shortly before the application’s remaining background time reaches 0. The handler is wrapped in a block that cancels the operation, and cleans up and marks the end of execution, unlike the `handler` parameter in `UIApplication -beginBackgroundTaskWithExpirationHandler:`, which expects this to be done in the handler itself. The handler is called synchronously on the main thread, thus blocking the application’s suspension momentarily while the application is notified. + */ +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +- (void)setShouldExecuteAsBackgroundTaskWithExpirationHandler:(void (^)(void))handler; +#endif + +///--------------------------------- +/// @name Setting Progress Callbacks +///--------------------------------- + +/** + Sets a callback to be called when an undetermined number of bytes have been uploaded to the server. + + @param block A block object to be called when an undetermined number of bytes have been uploaded to the server. This block has no return value and takes three arguments: the number of bytes written since the last time the upload progress block was called, the total bytes written, and the total bytes expected to be written during the request, as initially determined by the length of the HTTP body. This block may be called multiple times, and will execute on the main thread. + */ +- (void)setUploadProgressBlock:(void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))block; + +/** + Sets a callback to be called when an undetermined number of bytes have been downloaded from the server. + + @param block A block object to be called when an undetermined number of bytes have been downloaded from the server. This block has no return value and takes three arguments: the number of bytes read since the last time the download progress block was called, the total bytes read, and the total bytes expected to be read during the request, as initially determined by the expected content size of the `NSHTTPURLResponse` object. This block may be called multiple times, and will execute on the main thread. + */ +- (void)setDownloadProgressBlock:(void (^)(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead))block; + +///------------------------------------------------- +/// @name Setting NSURLConnection Delegate Callbacks +///------------------------------------------------- + +/** + Sets a block to be executed when the connection will authenticate a challenge in order to download its request, as handled by the `NSURLConnectionDelegate` method `connection:willSendRequestForAuthenticationChallenge:`. + + @param block A block object to be executed when the connection will authenticate a challenge in order to download its request. The block has no return type and takes two arguments: the URL connection object, and the challenge that must be authenticated. This block must invoke one of the challenge-responder methods (NSURLAuthenticationChallengeSender protocol). + + If `allowsInvalidSSLCertificate` is set to YES, `connection:willSendRequestForAuthenticationChallenge:` will attempt to have the challenge sender use credentials with invalid SSL certificates. + */ +- (void)setWillSendRequestForAuthenticationChallengeBlock:(void (^)(NSURLConnection *connection, NSURLAuthenticationChallenge *challenge))block; + +/** + Sets a block to be executed when the server redirects the request from one URL to another URL, or when the request URL changed by the `NSURLProtocol` subclass handling the request in order to standardize its format, as handled by the `NSURLConnectionDelegate` method `connection:willSendRequest:redirectResponse:`. + + @param block A block object to be executed when the request URL was changed. The block returns an `NSURLRequest` object, the URL request to redirect, and takes three arguments: the URL connection object, the the proposed redirected request, and the URL response that caused the redirect. + */ +- (void)setRedirectResponseBlock:(NSURLRequest * (^)(NSURLConnection *connection, NSURLRequest *request, NSURLResponse *redirectResponse))block; + +/** + Sets a block to be executed to modify the response a connection will cache, if any, as handled by the `NSURLConnectionDelegate` method `connection:willCacheResponse:`. + + @param block A block object to be executed to determine what response a connection will cache, if any. The block returns an `NSCachedURLResponse` object, the cached response to store in memory or `nil` to prevent the response from being cached, and takes two arguments: the URL connection object, and the cached response provided for the request. + */ +- (void)setCacheResponseBlock:(NSCachedURLResponse * (^)(NSURLConnection *connection, NSCachedURLResponse *cachedResponse))block; + +@end + +///---------------- +/// @name Constants +///---------------- + +/** + ## SSL Pinning Options + + The following constants are provided by `AFURLConnectionOperation` as possible SSL Pinning options. + + enum { + AFSSLPinningModeNone, + AFSSLPinningModePublicKey, + AFSSLPinningModeCertificate, + } + + `AFSSLPinningModeNone` + Do not pin SSL connections + + `AFSSLPinningModePublicKey` + Pin SSL connections to certificate public key (SPKI). + + `AFSSLPinningModeCertificate` + Pin SSL connections to exact certificate. This may cause problems when your certificate expires and needs re-issuance. + + ## User info dictionary keys + + These keys may exist in the user info dictionary, in addition to those defined for NSError. + + - `NSString * const AFNetworkingOperationFailingURLRequestErrorKey` + - `NSString * const AFNetworkingOperationFailingURLResponseErrorKey` + + ### Constants + + `AFNetworkingOperationFailingURLRequestErrorKey` + The corresponding value is an `NSURLRequest` containing the request of the operation associated with an error. This key is only present in the `AFNetworkingErrorDomain`. + + `AFNetworkingOperationFailingURLResponseErrorKey` + The corresponding value is an `NSURLResponse` containing the response of the operation associated with an error. This key is only present in the `AFNetworkingErrorDomain`. + + ## Error Domains + + The following error domain is predefined. + + - `NSString * const AFNetworkingErrorDomain` + + ### Constants + + `AFNetworkingErrorDomain` + AFNetworking errors. Error codes for `AFNetworkingErrorDomain` correspond to codes in `NSURLErrorDomain`. + */ +extern NSString * const AFRKNetworkingErrorDomain; +extern NSString * const AFRKNetworkingOperationFailingURLRequestErrorKey; +extern NSString * const AFRKNetworkingOperationFailingURLResponseErrorKey; + +///-------------------- +/// @name Notifications +///-------------------- + +/** + Posted when an operation begins executing. + */ +extern NSString * const AFRKNetworkingOperationDidStartNotification; + +/** + Posted when an operation finishes. + */ +extern NSString * const AFRKNetworkingOperationDidFinishNotification; diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKURLConnectionOperation.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKURLConnectionOperation.m new file mode 100644 index 0000000..73ae1cb --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKURLConnectionOperation.m @@ -0,0 +1,862 @@ +// AFURLConnectionOperation.m +// +// Copyright (c) 2011 Gowalla (http://gowalla.com/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "AFRKURLConnectionOperation.h" + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#import +#endif + +#if !__has_feature(objc_arc) +#error AFNetworking must be built with ARC. +// You can turn on ARC for only AFNetworking files by adding -fobjc-arc to the build phase for each of its files. +#endif + +typedef enum { + AFRKOperationPausedState = -1, + AFRKOperationReadyState = 1, + AFRKOperationExecutingState = 2, + AFRKOperationFinishedState = 3, +} _AFRKOperationState; + +typedef signed short AFRKOperationState; + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +typedef UIBackgroundTaskIdentifier AFRKBackgroundTaskIdentifier; +#else +typedef id AFRKBackgroundTaskIdentifier; +#endif + +static NSString * const kAFRKNetworkingLockName = @"com.restkit.alamofire.networking.operation.lock"; + +NSString * const AFRKNetworkingErrorDomain = @"AFRKNetworkingErrorDomain"; +NSString * const AFRKNetworkingOperationFailingURLRequestErrorKey = @"AFRKNetworkingOperationFailingURLRequestErrorKey"; +NSString * const AFRKNetworkingOperationFailingURLResponseErrorKey = @"AFRKNetworkingOperationFailingURLResponseErrorKey"; + +NSString * const AFRKNetworkingOperationDidStartNotification = @"com.restkit.alamofire.networking.operation.start"; +NSString * const AFRKNetworkingOperationDidFinishNotification = @"com.restkit.alamofire.networking.operation.finish"; + +typedef void (^AFRKURLConnectionOperationProgressBlock)(NSUInteger bytes, long long totalBytes, long long totalBytesExpected); +typedef void (^AFRKURLConnectionOperationAuthenticationChallengeBlock)(NSURLConnection *connection, NSURLAuthenticationChallenge *challenge); +typedef NSCachedURLResponse * (^AFRKURLConnectionOperationCacheResponseBlock)(NSURLConnection *connection, NSCachedURLResponse *cachedResponse); +typedef NSURLRequest * (^AFRKURLConnectionOperationRedirectResponseBlock)(NSURLConnection *connection, NSURLRequest *request, NSURLResponse *redirectResponse); + +static inline NSString * AFRKKeyPathFromOperationState(AFRKOperationState state) { + switch (state) { + case AFRKOperationReadyState: + return @"isReady"; + case AFRKOperationExecutingState: + return @"isExecuting"; + case AFRKOperationFinishedState: + return @"isFinished"; + case AFRKOperationPausedState: + return @"isPaused"; + default: + return @"state"; + } +} + +static inline BOOL AFRKStateTransitionIsValid(AFRKOperationState fromState, AFRKOperationState toState, BOOL isCancelled) { + switch (fromState) { + case AFRKOperationReadyState: + switch (toState) { + case AFRKOperationPausedState: + case AFRKOperationExecutingState: + return YES; + case AFRKOperationFinishedState: + return isCancelled; + default: + return NO; + } + case AFRKOperationExecutingState: + switch (toState) { + case AFRKOperationPausedState: + case AFRKOperationFinishedState: + return YES; + default: + return NO; + } + case AFRKOperationFinishedState: + return NO; + case AFRKOperationPausedState: + return toState == AFRKOperationReadyState; + default: + return YES; + } +} + +#if !defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +static NSData *AFRKSecKeyGetData(SecKeyRef key) { + CFDataRef data = NULL; + +#if defined(NS_BLOCK_ASSERTIONS) + SecItemExport(key, kSecFormatUnknown, kSecItemPemArmour, NULL, &data); +#else + OSStatus status = SecItemExport(key, kSecFormatUnknown, kSecItemPemArmour, NULL, &data); + NSCAssert(status == errSecSuccess, @"SecItemExport error: %ld", (long int)status); +#endif + + NSCParameterAssert(data); + + return (__bridge_transfer NSData *)data; +} +#endif + +static BOOL AFRKSecKeyIsEqualToKey(SecKeyRef key1, SecKeyRef key2) { +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + return [(__bridge id)key1 isEqual:(__bridge id)key2]; +#else + return [AFRKSecKeyGetData(key1) isEqual:AFRKSecKeyGetData(key2)]; +#endif +} + +@interface AFRKURLConnectionOperation () +@property (readwrite, nonatomic, assign) AFRKOperationState state; +@property (readwrite, nonatomic, assign, getter = isCancelled) BOOL cancelled; +@property (readwrite, nonatomic, strong) NSRecursiveLock *lock; +@property (readwrite, nonatomic, strong) NSURLConnection *connection; +@property (readwrite, nonatomic, strong) NSURLRequest *request; +@property (readwrite, nonatomic, strong) NSURLResponse *response; +@property (readwrite, nonatomic, strong) NSError *error; +@property (readwrite, nonatomic, strong) NSData *responseData; +@property (readwrite, nonatomic, copy) NSString *responseString; +@property (readwrite, nonatomic, assign) NSStringEncoding responseStringEncoding; +@property (readwrite, nonatomic, assign) long long totalBytesRead; +@property (readwrite, nonatomic, assign) AFRKBackgroundTaskIdentifier backgroundTaskIdentifier; +@property (readwrite, nonatomic, copy) AFRKURLConnectionOperationProgressBlock uploadProgress; +@property (readwrite, nonatomic, copy) AFRKURLConnectionOperationProgressBlock downloadProgress; +@property (readwrite, nonatomic, copy) AFRKURLConnectionOperationAuthenticationChallengeBlock authenticationChallenge; +@property (readwrite, nonatomic, copy) AFRKURLConnectionOperationCacheResponseBlock cacheResponse; +@property (readwrite, nonatomic, copy) AFRKURLConnectionOperationRedirectResponseBlock redirectResponse; + +- (void)operationDidStart; +- (void)finish; +- (void)cancelConnection; +@end + +@implementation AFRKURLConnectionOperation +@synthesize state = _state; +@synthesize cancelled = _cancelled; +@synthesize connection = _connection; +@synthesize runLoopModes = _runLoopModes; +@synthesize request = _request; +@synthesize response = _response; +@synthesize error = _error; +@synthesize allowsInvalidSSLCertificate = _allowsInvalidSSLCertificate; +@synthesize responseData = _responseData; +@synthesize responseString = _responseString; +@synthesize responseStringEncoding = _responseStringEncoding; +@synthesize totalBytesRead = _totalBytesRead; +@dynamic inputStream; +@synthesize outputStream = _outputStream; +@synthesize credential = _credential; +@synthesize SSLPinningMode = _SSLPinningMode; +@synthesize shouldUseCredentialStorage = _shouldUseCredentialStorage; +@synthesize userInfo = _userInfo; +@synthesize backgroundTaskIdentifier = _backgroundTaskIdentifier; +@synthesize uploadProgress = _uploadProgress; +@synthesize downloadProgress = _downloadProgress; +@synthesize authenticationChallenge = _authenticationChallenge; +@synthesize cacheResponse = _cacheResponse; +@synthesize redirectResponse = _redirectResponse; +@synthesize lock = _lock; + ++ (void)networkRequestThreadEntryPoint:(id __unused)object { + @autoreleasepool { + [[NSThread currentThread] setName:@"AFRKNetworking"]; + + NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; + [runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode]; + [runLoop run]; + } +} + ++ (NSThread *)networkRequestThread { + static NSThread *_networkRequestThread = nil; + static dispatch_once_t oncePredicate; + dispatch_once(&oncePredicate, ^{ + _networkRequestThread = [[NSThread alloc] initWithTarget:self selector:@selector(networkRequestThreadEntryPoint:) object:nil]; + [_networkRequestThread start]; + }); + + return _networkRequestThread; +} + ++ (NSArray *)pinnedCertificates { + static NSArray *_pinnedCertificates = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSBundle *bundle = [NSBundle mainBundle]; + NSArray *paths = [bundle pathsForResourcesOfType:@"cer" inDirectory:@"."]; + + NSMutableArray *certificates = [NSMutableArray arrayWithCapacity:[paths count]]; + for (NSString *path in paths) { + NSData *certificateData = [NSData dataWithContentsOfFile:path]; + [certificates addObject:certificateData]; + } + + _pinnedCertificates = [[NSArray alloc] initWithArray:certificates]; + }); + + return _pinnedCertificates; +} + ++ (NSArray *)pinnedPublicKeys { + static NSArray *_pinnedPublicKeys = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSArray *pinnedCertificates = [self pinnedCertificates]; + NSMutableArray *publicKeys = [NSMutableArray arrayWithCapacity:[pinnedCertificates count]]; + + for (NSData *data in pinnedCertificates) { + SecCertificateRef allowedCertificate = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)data); + NSParameterAssert(allowedCertificate); + + SecCertificateRef allowedCertificates[] = {allowedCertificate}; + CFArrayRef certificates = CFArrayCreate(NULL, (const void **)allowedCertificates, 1, NULL); + + SecPolicyRef policy = SecPolicyCreateBasicX509(); + SecTrustRef allowedTrust = NULL; + OSStatus status = SecTrustCreateWithCertificates(certificates, policy, &allowedTrust); + NSAssert(status == errSecSuccess, @"SecTrustCreateWithCertificates error: %ld", (long int)status); + if (status == errSecSuccess && allowedTrust) { + SecTrustResultType result = 0; + status = SecTrustEvaluate(allowedTrust, &result); + NSAssert(status == errSecSuccess, @"SecTrustEvaluate error: %ld", (long int)status); + if (status == errSecSuccess) { + SecKeyRef allowedPublicKey = SecTrustCopyPublicKey(allowedTrust); + NSParameterAssert(allowedPublicKey); + if (allowedPublicKey) { + [publicKeys addObject:(__bridge_transfer id)allowedPublicKey]; + } + } + + CFRelease(allowedTrust); + } + + CFRelease(policy); + CFRelease(certificates); + CFRelease(allowedCertificate); + } + + _pinnedPublicKeys = [[NSArray alloc] initWithArray:publicKeys]; + }); + + return _pinnedPublicKeys; +} + +- (id)initWithRequest:(NSURLRequest *)urlRequest { + NSParameterAssert(urlRequest); + + self = [super init]; + if (!self) { + return nil; + } + + self.lock = [[NSRecursiveLock alloc] init]; + self.lock.name = kAFRKNetworkingLockName; + + self.runLoopModes = [NSSet setWithObject:NSRunLoopCommonModes]; + + self.request = urlRequest; + + self.shouldUseCredentialStorage = YES; + + // #ifdef included for backwards-compatibility +#ifdef _AFRKNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ + self.allowsInvalidSSLCertificate = YES; +#endif + + self.state = AFRKOperationReadyState; + + return self; +} + +- (void)dealloc { + if (_outputStream) { + [_outputStream close]; + _outputStream = nil; + } + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + if (_backgroundTaskIdentifier) { + [[UIApplication sharedApplication] endBackgroundTask:_backgroundTaskIdentifier]; + _backgroundTaskIdentifier = UIBackgroundTaskInvalid; + } +#endif +} + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p, state: %@, cancelled: %@ request: %@, response: %@>", NSStringFromClass([self class]), self, AFRKKeyPathFromOperationState(self.state), ([self isCancelled] ? @"YES" : @"NO"), self.request, self.response]; +} + +- (void)setCompletionBlock:(void (^)(void))block { + [self.lock lock]; + if (!block) { + [super setCompletionBlock:nil]; + } else { + __weak __typeof(&*self)weakSelf = self; + [super setCompletionBlock:^ { + __strong __typeof(&*weakSelf)strongSelf = weakSelf; + + block(); + [strongSelf setCompletionBlock:nil]; + }]; + } + [self.lock unlock]; +} + +- (NSInputStream *)inputStream { + return self.request.HTTPBodyStream; +} + +- (void)setInputStream:(NSInputStream *)inputStream { + [self willChangeValueForKey:@"inputStream"]; + NSMutableURLRequest *mutableRequest = [self.request mutableCopy]; + mutableRequest.HTTPBodyStream = inputStream; + self.request = mutableRequest; + [self didChangeValueForKey:@"inputStream"]; +} + +- (NSOutputStream *)outputStream { + if (!_outputStream) { + self.outputStream = [NSOutputStream outputStreamToMemory]; + } + + return _outputStream; +} + +- (void)setOutputStream:(NSOutputStream *)outputStream { + [self.lock lock]; + if (outputStream != _outputStream) { + [self willChangeValueForKey:@"outputStream"]; + if (_outputStream) { + [_outputStream close]; + } + _outputStream = outputStream; + [self didChangeValueForKey:@"outputStream"]; + } + [self.lock unlock]; +} + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +- (void)setShouldExecuteAsBackgroundTaskWithExpirationHandler:(void (^)(void))handler { + [self.lock lock]; + if (!self.backgroundTaskIdentifier) { + UIApplication *application = [UIApplication sharedApplication]; + __weak __typeof(&*self)weakSelf = self; + self.backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^{ + __strong __typeof(&*weakSelf)strongSelf = weakSelf; + + if (handler) { + handler(); + } + + if (strongSelf) { + [strongSelf cancel]; + + [application endBackgroundTask:strongSelf.backgroundTaskIdentifier]; + strongSelf.backgroundTaskIdentifier = UIBackgroundTaskInvalid; + } + }]; + } + [self.lock unlock]; +} +#endif + +- (void)setUploadProgressBlock:(void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))block { + self.uploadProgress = block; +} + +- (void)setDownloadProgressBlock:(void (^)(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead))block { + self.downloadProgress = block; +} + +- (void)setWillSendRequestForAuthenticationChallengeBlock:(void (^)(NSURLConnection *connection, NSURLAuthenticationChallenge *challenge))block { + self.authenticationChallenge = block; +} + +- (void)setCacheResponseBlock:(NSCachedURLResponse * (^)(NSURLConnection *connection, NSCachedURLResponse *cachedResponse))block { + self.cacheResponse = block; +} + +- (void)setRedirectResponseBlock:(NSURLRequest * (^)(NSURLConnection *connection, NSURLRequest *request, NSURLResponse *redirectResponse))block { + self.redirectResponse = block; +} + +- (void)setState:(AFRKOperationState)state { + if (!AFRKStateTransitionIsValid(self.state, state, [self isCancelled])) { + return; + } + + [self.lock lock]; + NSString *oldStateKey = AFRKKeyPathFromOperationState(self.state); + NSString *newStateKey = AFRKKeyPathFromOperationState(state); + + [self willChangeValueForKey:newStateKey]; + [self willChangeValueForKey:oldStateKey]; + _state = state; + [self didChangeValueForKey:oldStateKey]; + [self didChangeValueForKey:newStateKey]; + [self.lock unlock]; +} + +- (NSString *)responseString { + [self.lock lock]; + if (!_responseString && self.response && self.responseData) { + self.responseString = [[NSString alloc] initWithData:self.responseData encoding:self.responseStringEncoding]; + } + [self.lock unlock]; + + return _responseString; +} + +- (NSStringEncoding)responseStringEncoding { + [self.lock lock]; + if (!_responseStringEncoding && self.response) { + NSStringEncoding stringEncoding = NSUTF8StringEncoding; + if (self.response.textEncodingName) { + CFStringEncoding IANAEncoding = CFStringConvertIANACharSetNameToEncoding((__bridge CFStringRef)self.response.textEncodingName); + if (IANAEncoding != kCFStringEncodingInvalidId) { + stringEncoding = CFStringConvertEncodingToNSStringEncoding(IANAEncoding); + } + } + + self.responseStringEncoding = stringEncoding; + } + [self.lock unlock]; + + return _responseStringEncoding; +} + +- (void)pause { + if ([self isPaused] || [self isFinished] || [self isCancelled]) { + return; + } + + [self.lock lock]; + + if ([self isExecuting]) { + [self.connection performSelector:@selector(cancel) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]]; + + dispatch_async(dispatch_get_main_queue(), ^{ + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + [notificationCenter postNotificationName:AFRKNetworkingOperationDidFinishNotification object:self]; + }); + } + + self.state = AFRKOperationPausedState; + + [self.lock unlock]; +} + +- (BOOL)isPaused { + return self.state == AFRKOperationPausedState; +} + +- (void)resume { + if (![self isPaused]) { + return; + } + + [self.lock lock]; + self.state = AFRKOperationReadyState; + + [self start]; + [self.lock unlock]; +} + +#pragma mark - NSOperation + +- (BOOL)isReady { + return self.state == AFRKOperationReadyState && [super isReady]; +} + +- (BOOL)isExecuting { + return self.state == AFRKOperationExecutingState; +} + +- (BOOL)isFinished { + return self.state == AFRKOperationFinishedState; +} + +- (BOOL)isConcurrent { + return YES; +} + +- (void)start { + [self.lock lock]; + if ([self isReady]) { + self.state = AFRKOperationExecutingState; + + [self performSelector:@selector(operationDidStart) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]]; + } + [self.lock unlock]; +} + +- (void)operationDidStart { + [self.lock lock]; + if (![self isCancelled]) { + self.connection = [[NSURLConnection alloc] initWithRequest:self.request delegate:self startImmediately:NO]; + + NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; + for (NSString *runLoopMode in self.runLoopModes) { + [self.connection scheduleInRunLoop:runLoop forMode:runLoopMode]; + [self.outputStream scheduleInRunLoop:runLoop forMode:runLoopMode]; + } + + [self.connection start]; + } + [self.lock unlock]; + + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:AFRKNetworkingOperationDidStartNotification object:self]; + }); + + if ([self isCancelled]) { + NSDictionary *userInfo = nil; + if ([self.request URL]) { + userInfo = [NSDictionary dictionaryWithObject:[self.request URL] forKey:NSURLErrorFailingURLErrorKey]; + } + self.error = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorCancelled userInfo:userInfo]; + + [self finish]; + } +} + +- (void)finish { + self.state = AFRKOperationFinishedState; + + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:AFRKNetworkingOperationDidFinishNotification object:self]; + }); +} + +- (void)cancel { + [self.lock lock]; + if (![self isFinished] && ![self isCancelled]) { + [self willChangeValueForKey:@"isCancelled"]; + _cancelled = YES; + [super cancel]; + [self didChangeValueForKey:@"isCancelled"]; + + // Cancel the connection on the thread it runs on to prevent race conditions + [self performSelector:@selector(cancelConnection) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]]; + } + [self.lock unlock]; +} + +- (void)cancelConnection { + NSDictionary *userInfo = nil; + if ([self.request URL]) { + userInfo = [NSDictionary dictionaryWithObject:[self.request URL] forKey:NSURLErrorFailingURLErrorKey]; + } + NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorCancelled userInfo:userInfo]; + + if (![self isFinished] && self.connection) { + [self.connection cancel]; + [self performSelector:@selector(connection:didFailWithError:) withObject:self.connection withObject:error]; + } +} + +#pragma mark - NSURLConnectionDelegate + +- (void)connection:(NSURLConnection *)connection +willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge +{ + if (self.authenticationChallenge) { + self.authenticationChallenge(connection, challenge); + return; + } + + if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { + SecTrustRef serverTrust = challenge.protectionSpace.serverTrust; + + SecPolicyRef policy = SecPolicyCreateBasicX509(); + SecTrustEvaluate(serverTrust, NULL); + CFIndex certificateCount = SecTrustGetCertificateCount(serverTrust); + NSMutableArray *trustChain = [NSMutableArray arrayWithCapacity:certificateCount]; + + for (CFIndex i = 0; i < certificateCount; i++) { + SecCertificateRef certificate = SecTrustGetCertificateAtIndex(serverTrust, i); + + if (self.SSLPinningMode == AFRKSSLPinningModeCertificate) { + [trustChain addObject:(__bridge_transfer NSData *)SecCertificateCopyData(certificate)]; + } else if (self.SSLPinningMode == AFRKSSLPinningModePublicKey) { + SecCertificateRef someCertificates[] = {certificate}; + CFArrayRef certificates = CFArrayCreate(NULL, (const void **)someCertificates, 1, NULL); + + SecTrustRef trust = NULL; + + OSStatus status = SecTrustCreateWithCertificates(certificates, policy, &trust); + NSAssert(status == errSecSuccess, @"SecTrustCreateWithCertificates error: %ld", (long int)status); + if (status == errSecSuccess && trust) { + SecTrustResultType result; + status = SecTrustEvaluate(trust, &result); + NSAssert(status == errSecSuccess, @"SecTrustEvaluate error: %ld", (long int)status); + if (status == errSecSuccess) { + [trustChain addObject:(__bridge_transfer id)SecTrustCopyPublicKey(trust)]; + } + + CFRelease(trust); + } + + CFRelease(certificates); + } + } + + CFRelease(policy); + + switch (self.SSLPinningMode) { + case AFRKSSLPinningModePublicKey: { + NSArray *pinnedPublicKeys = [self.class pinnedPublicKeys]; + NSAssert([pinnedPublicKeys count] > 0, @"AFRKSSLPinningModePublicKey needs at least one key file in the application bundle"); + + for (id publicKey in trustChain) { + for (id pinnedPublicKey in pinnedPublicKeys) { + if (AFRKSecKeyIsEqualToKey((__bridge SecKeyRef)publicKey, (__bridge SecKeyRef)pinnedPublicKey)) { + NSURLCredential *credential = [NSURLCredential credentialForTrust:serverTrust]; + [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge]; + return; + } + } + } + + NSLog(@"Error: Unknown Public Key during Pinning operation"); + [[challenge sender] cancelAuthenticationChallenge:challenge]; + break; + } + case AFRKSSLPinningModeCertificate: { + NSAssert([[self.class pinnedCertificates] count] > 0, @"AFRKSSLPinningModeCertificate needs at least one certificate file in the application bundle"); + for (id serverCertificateData in trustChain) { + if ([[self.class pinnedCertificates] containsObject:serverCertificateData]) { + NSURLCredential *credential = [NSURLCredential credentialForTrust:serverTrust]; + [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge]; + return; + } + } + + NSLog(@"Error: Unknown Certificate during Pinning operation"); + [[challenge sender] cancelAuthenticationChallenge:challenge]; + break; + } + case AFRKSSLPinningModeNone: { + if (self.allowsInvalidSSLCertificate){ + NSURLCredential *credential = [NSURLCredential credentialForTrust:serverTrust]; + [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge]; + } else { + SecTrustResultType result = 0; + OSStatus status = SecTrustEvaluate(serverTrust, &result); + NSAssert(status == errSecSuccess, @"SecTrustEvaluate error: %ld", (long int)status); + + if (status == errSecSuccess && (result == kSecTrustResultUnspecified || result == kSecTrustResultProceed)) { + NSURLCredential *credential = [NSURLCredential credentialForTrust:serverTrust]; + [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge]; + } else { + [[challenge sender] cancelAuthenticationChallenge:challenge]; + } + } + break; + } + } + } else { + if ([challenge previousFailureCount] == 0) { + if (self.credential) { + [[challenge sender] useCredential:self.credential forAuthenticationChallenge:challenge]; + } else { + [[challenge sender] continueWithoutCredentialForAuthenticationChallenge:challenge]; + } + } else { + [[challenge sender] continueWithoutCredentialForAuthenticationChallenge:challenge]; + } + } +} + +- (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection __unused *)connection { + return self.shouldUseCredentialStorage; +} + +- (NSURLRequest *)connection:(NSURLConnection *)connection + willSendRequest:(NSURLRequest *)request + redirectResponse:(NSURLResponse *)redirectResponse +{ + if (self.redirectResponse) { + return self.redirectResponse(connection, request, redirectResponse); + } else { + return request; + } +} + +- (void)connection:(NSURLConnection __unused *)connection + didSendBodyData:(NSInteger)bytesWritten + totalBytesWritten:(NSInteger)totalBytesWritten +totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite +{ + if (self.uploadProgress) { + dispatch_async(dispatch_get_main_queue(), ^{ + self.uploadProgress((NSUInteger)bytesWritten, totalBytesWritten, totalBytesExpectedToWrite); + }); + } +} + +- (void)connection:(NSURLConnection __unused *)connection +didReceiveResponse:(NSURLResponse *)response +{ + self.response = response; + + [self.outputStream open]; +} + +- (void)connection:(NSURLConnection __unused *)connection + didReceiveData:(NSData *)data +{ + NSUInteger length = [data length]; + while (YES) { + NSUInteger totalNumberOfBytesWritten = 0; + if ([self.outputStream hasSpaceAvailable]) { + const uint8_t *dataBuffer = (uint8_t *)[data bytes]; + + NSInteger numberOfBytesWritten = 0; + while (totalNumberOfBytesWritten < length) { + numberOfBytesWritten = [self.outputStream write:&dataBuffer[0] maxLength:length]; + if (numberOfBytesWritten == -1) { + break; + } + + totalNumberOfBytesWritten += numberOfBytesWritten; + } + + break; + } + + if (self.outputStream.streamError) { + [self.connection cancel]; + [self performSelector:@selector(connection:didFailWithError:) withObject:self.connection withObject:self.outputStream.streamError]; + return; + } + } + + dispatch_async(dispatch_get_main_queue(), ^{ + self.totalBytesRead += length; + + if (self.downloadProgress) { + self.downloadProgress(length, self.totalBytesRead, self.response.expectedContentLength); + } + }); +} + +- (void)connectionDidFinishLoading:(NSURLConnection __unused *)connection { + self.responseData = [self.outputStream propertyForKey:NSStreamDataWrittenToMemoryStreamKey]; + + [self.outputStream close]; + + [self finish]; + + self.connection = nil; +} + +- (void)connection:(NSURLConnection __unused *)connection + didFailWithError:(NSError *)error +{ + self.error = error; + + [self.outputStream close]; + + [self finish]; + + self.connection = nil; +} + +- (NSCachedURLResponse *)connection:(NSURLConnection *)connection + willCacheResponse:(NSCachedURLResponse *)cachedResponse +{ + if (self.cacheResponse) { + return self.cacheResponse(connection, cachedResponse); + } else { + if ([self isCancelled]) { + return nil; + } + + return cachedResponse; + } +} + +#pragma mark - NSCoding + +- (id)initWithCoder:(NSCoder *)aDecoder { + NSURLRequest *request = [aDecoder decodeObjectForKey:@"request"]; + + self = [self initWithRequest:request]; + if (!self) { + return nil; + } + + self.state = (AFRKOperationState)[aDecoder decodeIntegerForKey:@"state"]; + self.cancelled = [aDecoder decodeBoolForKey:@"isCancelled"]; + self.response = [aDecoder decodeObjectForKey:@"response"]; + self.error = [aDecoder decodeObjectForKey:@"error"]; + self.responseData = [aDecoder decodeObjectForKey:@"responseData"]; + self.totalBytesRead = [[aDecoder decodeObjectForKey:@"totalBytesRead"] longLongValue]; + self.allowsInvalidSSLCertificate = [[aDecoder decodeObjectForKey:@"allowsInvalidSSLCertificate"] boolValue]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [self pause]; + + [aCoder encodeObject:self.request forKey:@"request"]; + + switch (self.state) { + case AFRKOperationExecutingState: + case AFRKOperationPausedState: + [aCoder encodeInteger:AFRKOperationReadyState forKey:@"state"]; + break; + default: + [aCoder encodeInteger:self.state forKey:@"state"]; + break; + } + + [aCoder encodeBool:[self isCancelled] forKey:@"isCancelled"]; + [aCoder encodeObject:self.response forKey:@"response"]; + [aCoder encodeObject:self.error forKey:@"error"]; + [aCoder encodeObject:self.responseData forKey:@"responseData"]; + [aCoder encodeObject:[NSNumber numberWithLongLong:self.totalBytesRead] forKey:@"totalBytesRead"]; + [aCoder encodeObject:[NSNumber numberWithBool:self.allowsInvalidSSLCertificate] forKey:@"allowsInvalidSSLCertificate"]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFRKURLConnectionOperation *operation = [(AFRKURLConnectionOperation *)[[self class] allocWithZone:zone] initWithRequest:self.request]; + + operation.uploadProgress = self.uploadProgress; + operation.downloadProgress = self.downloadProgress; + operation.authenticationChallenge = self.authenticationChallenge; + operation.cacheResponse = self.cacheResponse; + operation.redirectResponse = self.redirectResponse; + operation.allowsInvalidSSLCertificate = self.allowsInvalidSSLCertificate; + + return operation; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKXMLRequestOperation.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKXMLRequestOperation.h new file mode 100644 index 0000000..2254fc2 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKXMLRequestOperation.h @@ -0,0 +1,89 @@ +// AFXMLRequestOperation.h +// +// Copyright (c) 2011 Gowalla (http://gowalla.com/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#import "AFRKHTTPRequestOperation.h" + +#import + +/** + `AFXMLRequestOperation` is a subclass of `AFHTTPRequestOperation` for downloading and working with XML response data. + + ## Acceptable Content Types + + By default, `AFXMLRequestOperation` accepts the following MIME types, which includes the official standard, `application/xml`, as well as other commonly-used types: + + - `application/xml` + - `text/xml` + + ## Use With AFHTTPClient + + When `AFXMLRequestOperation` is registered with `AFHTTPClient`, the response object in the success callback of `HTTPRequestOperationWithRequest:success:failure:` will be an instance of `NSXMLParser`. On platforms that support `NSXMLDocument`, you have the option to ignore the response object, and simply use the `responseXMLDocument` property of the operation argument of the callback. + */ +@interface AFRKXMLRequestOperation : AFRKHTTPRequestOperation + +///---------------------------- +/// @name Getting Response Data +///---------------------------- + +/** + An `NSXMLParser` object constructed from the response data. + */ +@property (readonly, nonatomic, strong) NSXMLParser *responseXMLParser; + +#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED +/** + An `NSXMLDocument` object constructed from the response data. If an error occurs while parsing, `nil` will be returned, and the `error` property will be set to the error. + */ +@property (readonly, nonatomic, strong) NSXMLDocument *responseXMLDocument; +#endif + +/** + Creates and returns an `AFXMLRequestOperation` object and sets the specified success and failure callbacks. + + @param urlRequest The request object to be loaded asynchronously during execution of the operation + @param success A block object to be executed when the operation finishes successfully. This block has no return value and takes three arguments: the request sent from the client, the response received from the server, and the XML parser constructed with the response data of request. + @param failure A block object to be executed when the operation finishes unsuccessfully. This block has no return value and takes three arguments: the request sent from the client, the response received from the server, and the error describing the network error that occurred. + + @return A new XML request operation + */ ++ (instancetype)XMLParserRequestOperationWithRequest:(NSURLRequest *)urlRequest + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSXMLParser *XMLParser))success + failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, NSXMLParser *XMLParser))failure; + + +#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED +/** + Creates and returns an `AFXMLRequestOperation` object and sets the specified success and failure callbacks. + + @param urlRequest The request object to be loaded asynchronously during execution of the operation + @param success A block object to be executed when the operation finishes successfully. This block has no return value and takes three arguments: the request sent from the client, the response received from the server, and the XML document created from the response data of request. + @param failure A block object to be executed when the operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data as XML. This block has no return value and takes three arguments: the request sent from the client, the response received from the server, and the error describing the network or parsing error that occurred. + + @return A new XML request operation + */ ++ (instancetype)XMLDocumentRequestOperationWithRequest:(NSURLRequest *)urlRequest + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSXMLDocument *document))success + failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, NSXMLDocument *document))failure; +#endif + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKXMLRequestOperation.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKXMLRequestOperation.m new file mode 100644 index 0000000..125881f --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/AFRKXMLRequestOperation.m @@ -0,0 +1,167 @@ +// AFXMLRequestOperation.m +// +// Copyright (c) 2011 Gowalla (http://gowalla.com/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "AFRKXMLRequestOperation.h" + +#include + +static dispatch_queue_t xml_request_operation_processing_queue() { + static dispatch_queue_t afrk_xml_request_operation_processing_queue; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + afrk_xml_request_operation_processing_queue = dispatch_queue_create("com.restkit.alamofire.networking.xml-request.processing", DISPATCH_QUEUE_CONCURRENT); + }); + + return afrk_xml_request_operation_processing_queue; +} + +@interface AFRKXMLRequestOperation () +@property (readwrite, nonatomic, strong) NSXMLParser *responseXMLParser; +#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED +@property (readwrite, nonatomic, strong) NSXMLDocument *responseXMLDocument; +#endif +@property (readwrite, nonatomic, strong) NSError *XMLError; +@end + +@implementation AFRKXMLRequestOperation +@synthesize responseXMLParser = _responseXMLParser; +#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED +@synthesize responseXMLDocument = _responseXMLDocument; +#endif +@synthesize XMLError = _XMLError; + ++ (instancetype)XMLParserRequestOperationWithRequest:(NSURLRequest *)urlRequest + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSXMLParser *XMLParser))success + failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, NSXMLParser *XMLParser))failure +{ + AFRKXMLRequestOperation *requestOperation = [(AFRKXMLRequestOperation *)[self alloc] initWithRequest:urlRequest]; + [requestOperation setCompletionBlockWithSuccess:^(AFRKHTTPRequestOperation *operation, id responseObject) { + if (success) { + success(operation.request, operation.response, responseObject); + } + } failure:^(AFRKHTTPRequestOperation *operation, NSError *error) { + if (failure) { + failure(operation.request, operation.response, error, [(AFRKXMLRequestOperation *)operation responseXMLParser]); + } + }]; + + return requestOperation; +} + +#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED ++ (instancetype)XMLDocumentRequestOperationWithRequest:(NSURLRequest *)urlRequest + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSXMLDocument *document))success + failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, NSXMLDocument *document))failure +{ + AFRKXMLRequestOperation *requestOperation = [[self alloc] initWithRequest:urlRequest]; + [requestOperation setCompletionBlockWithSuccess:^(AFRKHTTPRequestOperation *operation, __unused id responseObject) { + if (success) { + NSXMLDocument *XMLDocument = [(AFRKXMLRequestOperation *)operation responseXMLDocument]; + success(operation.request, operation.response, XMLDocument); + } + } failure:^(AFRKHTTPRequestOperation *operation, NSError *error) { + if (failure) { + NSXMLDocument *XMLDocument = [(AFRKXMLRequestOperation *)operation responseXMLDocument]; + failure(operation.request, operation.response, error, XMLDocument); + } + }]; + + return requestOperation; +} +#endif + + +- (NSXMLParser *)responseXMLParser { + if (!_responseXMLParser && [self.responseData length] > 0 && [self isFinished]) { + self.responseXMLParser = [[NSXMLParser alloc] initWithData:self.responseData]; + } + + return _responseXMLParser; +} + +#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED +- (NSXMLDocument *)responseXMLDocument { + if (!_responseXMLDocument && [self.responseData length] > 0 && [self isFinished]) { + NSError *error = nil; + self.responseXMLDocument = [[NSXMLDocument alloc] initWithData:self.responseData options:0 error:&error]; + self.XMLError = error; + } + + return _responseXMLDocument; +} +#endif + +- (NSError *)error { + if (_XMLError) { + return _XMLError; + } else { + return [super error]; + } +} + +#pragma mark - NSOperation + +- (void)cancel { + [super cancel]; + + self.responseXMLParser.delegate = nil; +} + +#pragma mark - AFHTTPRequestOperation + ++ (NSSet *)acceptableContentTypes { + return [NSSet setWithObjects:@"application/xml", @"text/xml", nil]; +} + ++ (BOOL)canProcessRequest:(NSURLRequest *)request { + return [[[request URL] pathExtension] isEqualToString:@"xml"] || [super canProcessRequest:request]; +} + +- (void)setCompletionBlockWithSuccess:(void (^)(AFRKHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFRKHTTPRequestOperation *operation, NSError *error))failure +{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-retain-cycles" +#pragma clang diagnostic ignored "-Wgnu" + self.completionBlock = ^ { + dispatch_async(xml_request_operation_processing_queue(), ^(void) { + NSXMLParser *XMLParser = self.responseXMLParser; + + if (self.error) { + if (failure) { + dispatch_async(self.failureCallbackQueue ?: dispatch_get_main_queue(), ^{ + failure(self, self.error); + }); + } + } else { + if (success) { + dispatch_async(self.successCallbackQueue ?: dispatch_get_main_queue(), ^{ + success(self, XMLParser); + }); + } + } + }); + }; +#pragma clang diagnostic pop +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/UIImageView+AFRKNetworking.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/UIImageView+AFRKNetworking.h new file mode 100644 index 0000000..c254bb4 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/UIImageView+AFRKNetworking.h @@ -0,0 +1,78 @@ +// UIImageView+AFNetworking.h +// +// Copyright (c) 2011 Gowalla (http://gowalla.com/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#import "AFRKImageRequestOperation.h" + +#import + +#if __IPHONE_OS_VERSION_MIN_REQUIRED +#import + +/** + This category adds methods to the UIKit framework's `UIImageView` class. The methods in this category provide support for loading remote images asynchronously from a URL. + */ +@interface UIImageView (AFRKNetworking) + +/** + Creates and enqueues an image request operation, which asynchronously downloads the image from the specified URL, and sets it the request is finished. Any previous image request for the receiver will be cancelled. If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. + + By default, URL requests have a cache policy of `NSURLCacheStorageAllowed` and a timeout interval of 30 seconds, and are set not handle cookies. To configure URL requests differently, use `setImageWithURLRequest:placeholderImage:success:failure:` + + @param url The URL used for the image request. + */ +- (void)afrk_setImageWithURL:(NSURL *)url; + +/** + Creates and enqueues an image request operation, which asynchronously downloads the image from the specified URL. Any previous image request for the receiver will be cancelled. If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. + + By default, URL requests have a cache policy of `NSURLCacheStorageAllowed` and a timeout interval of 30 seconds, and are set not handle cookies. To configure URL requests differently, use `setImageWithURLRequest:placeholderImage:success:failure:` + + @param url The URL used for the image request. + @param placeholderImage The image to be set initially, until the image request finishes. If `nil`, the image view will not change its image until the image request finishes. + */ +- (void)afrk_setImageWithURL:(NSURL *)url + placeholderImage:(UIImage *)placeholderImage; + +/** + Creates and enqueues an image request operation, which asynchronously downloads the image with the specified URL request object. Any previous image request for the receiver will be cancelled. If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. + + If a success block is specified, it is the responsibility of the block to set the image of the image view before returning. If no success block is specified, the default behavior of setting the image with `self.image = image` is executed. + + @param urlRequest The URL request used for the image request. + @param placeholderImage The image to be set initially, until the image request finishes. If `nil`, the image view will not change its image until the image request finishes. + @param success A block to be executed when the image request operation finishes successfully, with a status code in the 2xx range, and with an acceptable content type (e.g. `image/png`). This block has no return value and takes three arguments: the request sent from the client, the response received from the server, and the image created from the response data of request. If the image was returned from cache, the request and response parameters will be `nil`. + @param failure A block object to be executed when the image request operation finishes unsuccessfully, or that finishes successfully. This block has no return value and takes three arguments: the request sent from the client, the response received from the server, and the error object describing the network or parsing error that occurred. + */ +- (void)afrk_setImageWithURLRequest:(NSURLRequest *)urlRequest + placeholderImage:(UIImage *)placeholderImage + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success + failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error))failure; + +/** + Cancels any executing image request operation for the receiver, if one exists. + */ +- (void)afrk_cancelImageRequestOperation; + +@end + +#endif diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/UIImageView+AFRKNetworking.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/UIImageView+AFRKNetworking.m new file mode 100644 index 0000000..242b9fa --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/AFNetworking/UIImageView+AFRKNetworking.m @@ -0,0 +1,191 @@ +// UIImageView+AFNetworking.m +// +// Copyright (c) 2011 Gowalla (http://gowalla.com/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#import "UIImageView+AFRKNetworking.h" + +@interface AFRKImageCache : NSCache +- (UIImage *)cachedImageForRequest:(NSURLRequest *)request; +- (void)cacheImage:(UIImage *)image + forRequest:(NSURLRequest *)request; +@end + +#pragma mark - + +static char kAFRKImageRequestOperationObjectKey; + +@interface UIImageView (_AFRKNetworking) +@property (readwrite, nonatomic, strong, setter = afrk_setImageRequestOperation:) AFRKImageRequestOperation *afrk_imageRequestOperation; +@end + +@implementation UIImageView (_AFRKNetworking) +@dynamic afrk_imageRequestOperation; +@end + +#pragma mark - + +@implementation UIImageView (AFRKNetworking) + +- (AFRKHTTPRequestOperation *)afrk_imageRequestOperation { + return (AFRKHTTPRequestOperation *)objc_getAssociatedObject(self, &kAFRKImageRequestOperationObjectKey); +} + +- (void)afrk_setImageRequestOperation:(AFRKImageRequestOperation *)imageRequestOperation { + objc_setAssociatedObject(self, &kAFRKImageRequestOperationObjectKey, imageRequestOperation, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + ++ (NSOperationQueue *)afrk_sharedImageRequestOperationQueue { + static NSOperationQueue *_afrk_imageRequestOperationQueue = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _afrk_imageRequestOperationQueue = [[NSOperationQueue alloc] init]; + [_afrk_imageRequestOperationQueue setMaxConcurrentOperationCount:NSOperationQueueDefaultMaxConcurrentOperationCount]; + }); + + return _afrk_imageRequestOperationQueue; +} + ++ (AFRKImageCache *)afrk_sharedImageCache { + static AFRKImageCache *_afrk_imageCache = nil; + static dispatch_once_t oncePredicate; + dispatch_once(&oncePredicate, ^{ + _afrk_imageCache = [[AFRKImageCache alloc] init]; + }); + + return _afrk_imageCache; +} + +#pragma mark - + +- (void)afrk_setImageWithURL:(NSURL *)url { + [self afrk_setImageWithURL:url placeholderImage:nil]; +} + +- (void)afrk_setImageWithURL:(NSURL *)url + placeholderImage:(UIImage *)placeholderImage +{ + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; + [request addValue:@"image/*" forHTTPHeaderField:@"Accept"]; + + [self afrk_setImageWithURLRequest:request placeholderImage:placeholderImage success:nil failure:nil]; +} + +- (void)afrk_setImageWithURLRequest:(NSURLRequest *)urlRequest + placeholderImage:(UIImage *)placeholderImage + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success + failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error))failure +{ + [self afrk_cancelImageRequestOperation]; + + UIImage *cachedImage = [[[self class] afrk_sharedImageCache] cachedImageForRequest:urlRequest]; + if (cachedImage) { + self.afrk_imageRequestOperation = nil; + + if (success) { + success(urlRequest, nil, cachedImage); + } else { + self.image = cachedImage; + } + } else { + if (placeholderImage) { + self.image = placeholderImage; + } + + AFRKImageRequestOperation *requestOperation = [[AFRKImageRequestOperation alloc] initWithRequest:urlRequest]; + +#ifdef _AFRKNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ + requestOperation.allowsInvalidSSLCertificate = YES; +#endif + + [requestOperation setCompletionBlockWithSuccess:^(AFRKHTTPRequestOperation *operation, id responseObject) { + if ([urlRequest isEqual:[self.afrk_imageRequestOperation request]]) { + if (self.afrk_imageRequestOperation == operation) { + self.afrk_imageRequestOperation = nil; + } + + if (success) { + success(operation.request, operation.response, responseObject); + } else if (responseObject) { + self.image = responseObject; + } + } + + [[[self class] afrk_sharedImageCache] cacheImage:responseObject forRequest:urlRequest]; + } failure:^(AFRKHTTPRequestOperation *operation, NSError *error) { + if ([urlRequest isEqual:[self.afrk_imageRequestOperation request]]) { + if (self.afrk_imageRequestOperation == operation) { + self.afrk_imageRequestOperation = nil; + } + + if (failure) { + failure(operation.request, operation.response, error); + } + } + }]; + + self.afrk_imageRequestOperation = requestOperation; + + [[[self class] afrk_sharedImageRequestOperationQueue] addOperation:self.afrk_imageRequestOperation]; + } +} + +- (void)afrk_cancelImageRequestOperation { + [self.afrk_imageRequestOperation cancel]; + self.afrk_imageRequestOperation = nil; +} + +@end + +#pragma mark - + +static inline NSString * AFRKImageCacheKeyFromURLRequest(NSURLRequest *request) { + return [[request URL] absoluteString]; +} + +@implementation AFRKImageCache + +- (UIImage *)cachedImageForRequest:(NSURLRequest *)request { + switch ([request cachePolicy]) { + case NSURLRequestReloadIgnoringCacheData: + case NSURLRequestReloadIgnoringLocalAndRemoteCacheData: + return nil; + default: + break; + } + + return [self objectForKey:AFRKImageCacheKeyFromURLRequest(request)]; +} + +- (void)cacheImage:(UIImage *)image + forRequest:(NSURLRequest *)request +{ + if (image && request) { + [self setObject:image forKey:AFRKImageCacheKeyFromURLRequest(request)]; + } +} + +@end + +#endif diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKHTTPRequestOperation.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKHTTPRequestOperation.h new file mode 100644 index 0000000..5042449 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKHTTPRequestOperation.h @@ -0,0 +1,60 @@ +// +// RKHTTPRequestOperation.h +// RestKit +// +// Created by Blake Watters on 8/7/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "AFRKHTTPClient.h" +#import "AFRKHTTPRequestOperation.h" + +// Expose the default headers from AFNetworking's AFHTTPClient +@interface AFRKHTTPClient () +@property (readonly, nonatomic) NSDictionary *defaultHeaders; +@end + +/** + The `RKHTTPRequestOperation` class is a subclass of `AFHTTPRequestOperation` for HTTP or HTTPS requests made by RestKit. It provides per-instance configuration of the acceptable status codes and content types and integrates with the `RKLog` system to provide detailed requested and response logging. Instances of `RKHTTPRequest` are created by `RKObjectRequestOperation` and its subclasses to HTTP requests that will be object mapped. When used to make standalone HTTP requests, `RKHTTPRequestOperation` instance behave identically to `AFHTTPRequestOperation` with the exception of emitting logging information. + + ## Determining Request Processability + + The `RKHTTPRequestOperation` class diverges from the behavior of `AFHTTPRequestOperation` in the implementation of `canProcessRequest`, which is used to determine if a request can be processed. Because `RKHTTPRequestOperation` handles Content Type and Status Code acceptability at the instance rather than the class level, it by default returns `YES` when sent a `canProcessRequest:` method. Subclasses are encouraged to implement more specific logic if constraining the type of requests handled is desired. + */ +@interface RKHTTPRequestOperation : AFRKHTTPRequestOperation + +///------------------------------------------------------------ +/// @name Configuring Acceptable Status Codes and Content Types +///------------------------------------------------------------ + +/** + The set of status codes which the operation considers successful. + + When `nil`, the acceptability of status codes is deferred to the superclass implementation. + + **Default**: `nil` + */ +@property (nonatomic, strong) NSIndexSet *acceptableStatusCodes; + +/** + The set of content types which the operation considers successful. + + The set may contain `NSString` or `NSRegularExpression` objects. When `nil`, the acceptability of content types is deferred to the superclass implementation. + + **Default**: `nil` + */ +@property (nonatomic, strong) NSSet *acceptableContentTypes; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKHTTPRequestOperation.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKHTTPRequestOperation.m new file mode 100644 index 0000000..c3169f9 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKHTTPRequestOperation.m @@ -0,0 +1,131 @@ +// +// RKHTTPRequestOperation.m +// RestKit +// +// Created by Blake Watters on 8/7/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKHTTPRequestOperation.h" +#import "RKLog.h" +#import "lcl_RK.h" +#import "RKHTTPUtilities.h" +#import "RKMIMETypes.h" + +extern NSString * const RKErrorDomain; + +// Set Logging Component +#undef RKLogComponent +#define RKLogComponent RKlcl_cRestKitNetwork + +NSString *RKStringFromIndexSet(NSIndexSet *indexSet); // Defined in RKResponseDescriptor.m + +static BOOL RKResponseRequiresContentTypeMatch(NSHTTPURLResponse *response, NSURLRequest *request) +{ + if (RKRequestMethodFromString(request.HTTPMethod) == RKRequestMethodHEAD) return NO; + if ([RKStatusCodesOfResponsesWithOptionalBodies() containsIndex:response.statusCode]) return NO; + return YES; +} + +@interface AFRKURLConnectionOperation () +@property (readwrite, nonatomic, strong) NSRecursiveLock *lock; +@end + +@interface RKHTTPRequestOperation () +@property (readwrite, nonatomic, strong) NSError *rkHTTPError; +@end + +@implementation RKHTTPRequestOperation + ++ (BOOL)canProcessRequest:(NSURLRequest *)request +{ + return YES; +} + +// Disable class level Content/Status Code inspection in our superclass ++ (NSSet *)acceptableContentTypes +{ + return nil; +} + ++ (NSIndexSet *)acceptableStatusCodes +{ + return nil; +} + +- (BOOL)hasAcceptableStatusCode +{ + if (! self.response) return NO; + NSUInteger statusCode = ([self.response isKindOfClass:[NSHTTPURLResponse class]]) ? (NSUInteger)[self.response statusCode] : 200; + return self.acceptableStatusCodes ? [self.acceptableStatusCodes containsIndex:statusCode] : [super hasAcceptableStatusCode]; +} + +- (BOOL)hasAcceptableContentType +{ + if (! self.response) return NO; + if (!RKResponseRequiresContentTypeMatch(self.response, self.request)) return YES; + NSString *contentType = [self.response MIMEType] ?: @"application/octet-stream"; + return self.acceptableContentTypes ? RKMIMETypeInSet(contentType, self.acceptableContentTypes) : [super hasAcceptableContentType]; +} + +// NOTE: We reimplement this because the AFNetworking implementation keeps Acceptable Status Code/MIME Type at class level +- (NSError *)error +{ + [self.lock lock]; + + if (!self.rkHTTPError && self.response) { + if (![self hasAcceptableStatusCode] || ![self hasAcceptableContentType]) { + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + [userInfo setValue:self.responseString forKey:NSLocalizedRecoverySuggestionErrorKey]; + [userInfo setValue:[self.request URL] forKey:NSURLErrorFailingURLErrorKey]; + [userInfo setValue:self.request forKey:AFRKNetworkingOperationFailingURLRequestErrorKey]; + [userInfo setValue:self.response forKey:AFRKNetworkingOperationFailingURLResponseErrorKey]; + + if (![self hasAcceptableStatusCode]) { + NSUInteger statusCode = ([self.response isKindOfClass:[NSHTTPURLResponse class]]) ? (NSUInteger)[self.response statusCode] : 200; + [userInfo setValue:[NSString stringWithFormat:NSLocalizedString(@"Expected status code in (%@), got %d", nil), RKStringFromIndexSet(self.acceptableStatusCodes ?: [NSMutableIndexSet indexSet]), statusCode] forKey:NSLocalizedDescriptionKey]; + self.rkHTTPError = [[NSError alloc] initWithDomain:RKErrorDomain code:NSURLErrorBadServerResponse userInfo:userInfo]; + } else if (![self hasAcceptableContentType] && self.responseData.length > 0) { + [userInfo setValue:[NSString stringWithFormat:NSLocalizedString(@"Expected content type %@, got %@", nil), self.acceptableContentTypes, [self.response MIMEType]] forKey:NSLocalizedDescriptionKey]; + self.rkHTTPError = [[NSError alloc] initWithDomain:RKErrorDomain code:NSURLErrorCannotDecodeContentData userInfo:userInfo]; + } + } + } + + NSError *error = self.rkHTTPError ?: [super error]; + [self.lock unlock]; + return error; +} + +#pragma mark - NSURLConnectionDelegate methods + +- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse +{ + if ([AFRKHTTPRequestOperation instancesRespondToSelector:@selector(connection:willSendRequest:redirectResponse:)]) { + NSURLRequest *returnValue = [super connection:connection willSendRequest:request redirectResponse:redirectResponse]; + if (returnValue) { + if (redirectResponse) RKLogDebug(@"Following redirect request: %@", returnValue); + return returnValue; + } else { + RKLogDebug(@"Not following redirect to %@", request); + return nil; + } + } else { + if (redirectResponse) RKLogDebug(@"Following redirect request: %@", request); + return request; + } +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKHTTPUtilities.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKHTTPUtilities.h new file mode 100644 index 0000000..b1f0553 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKHTTPUtilities.h @@ -0,0 +1,159 @@ +// +// RKHTTPUtilities.h +// RestKit +// +// Created by Blake Watters on 8/24/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import + +#ifdef __cplusplus +extern "C" { +#endif + +/** + HTTP methods for requests + */ +typedef NS_OPTIONS(NSInteger, RKRequestMethod) { + RKRequestMethodGET = 1 << 0, + RKRequestMethodPOST = 1 << 1, + RKRequestMethodPUT = 1 << 2, + RKRequestMethodDELETE = 1 << 3, + RKRequestMethodHEAD = 1 << 4, + RKRequestMethodPATCH = 1 << 5, + RKRequestMethodOPTIONS = 1 << 6, + RKRequestMethodAny = (RKRequestMethodGET | + RKRequestMethodPOST | + RKRequestMethodPUT | + RKRequestMethodDELETE | + RKRequestMethodHEAD | + RKRequestMethodPATCH | + RKRequestMethodOPTIONS) +}; + +/** + Returns YES if the given HTTP request method is an exact match of the RKRequestMethod enum, and NO if it's a bit mask combination. + */ +BOOL RKIsSpecificRequestMethod(RKRequestMethod method); + +/** + Returns the corresponding string for value for a given HTTP request method. + + For example, given `RKRequestMethodGET` would return `@"GET"`. + + @param method The request method to return the corresponding string value for. The given request method must be specific. + */ +NSString *RKStringFromRequestMethod(RKRequestMethod method); + +/** + Returns the corresponding request method value for a given string. + + For example, given `@"PUT"` would return `@"RKRequestMethodPUT"` + */ +RKRequestMethod RKRequestMethodFromString(NSString *); + +/** + The HTTP status code classes + + See http://tools.ietf.org/html/rfc2616#section-10 + */ +typedef NS_ENUM(NSUInteger, RKStatusCodeClass) { + RKStatusCodeClassInformational = 100, + RKStatusCodeClassSuccessful = 200, + RKStatusCodeClassRedirection = 300, + RKStatusCodeClassClientError = 400, + RKStatusCodeClassServerError = 500 +}; + +/** + Creates a new range covering the status codes in the given class. + + @param statusCodeClass The status code class to create a range covering. + @return A new range covering the status codes in the given class. + */ +NSRange RKStatusCodeRangeForClass(RKStatusCodeClass statusCodeClass); + +/** + Creates a new index set covering the status codes in the given class. + + @param statusCodeClass The status code class to create an index set covering. + @return A new index set covering the status codes in the given class. + */ +NSIndexSet *RKStatusCodeIndexSetForClass(RKStatusCodeClass statusCodeClass); + +/** + Creates and returns a new index set including all HTTP response status codes that are cacheable. + + @return A new index set containing all cacheable status codes. + */ +NSIndexSet *RKCacheableStatusCodes(void); + +/** + Returns string representation of a given HTTP status code. + + The list of supported status codes was built from http://en.wikipedia.org/wiki/List_of_HTTP_status_codes + + @param statusCode The HTTP status code to return a string from. + @return A string representation of the given status code. + */ +NSString *RKStringFromStatusCode(NSInteger statusCode); + +/** + Parse HTTP Date: http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 + */ +NSDate *RKDateFromHTTPDateString(NSString *); + +/** + Returns the cache expiration data from a dictionary of HTTP response headers as appropriate for the given status code. If the status code is not cachable, `nil` is returned. + + @param headers The HTTP response headers from which to extract the cache expiration date. + @param statusCode The HTTP response status code of the response. + @return The expiration date as specified by the cache headers or `nil` if none was found. + */ +NSDate *RKHTTPCacheExpirationDateFromHeadersWithStatusCode(NSDictionary *headers, NSInteger statusCode); + +/** + Returns a Boolean value that indicates if a given URL is relative to another URL. + + This method does not rely on the `baseURL` method of `NSURL` as it only indicates a relationship between the initialization of two URL objects. The relativity of the given URL is assessed by evaluating a prefix match of the URL's absolute string value with the absolute string value of the potential base URL. + + @param URL The URL to assess the relativity of. + @param baseURL The base URL to determine if the given URL is relative to. + @return `YES` is URL is relative to the base URL, else `NO`. + */ +BOOL RKURLIsRelativeToURL(NSURL *URL, NSURL *baseURL); + +/** + Returns a string object containing the relative path and query string of a given URL object and a base URL that the given URL is relative to. + + If the given URL is found not to be relative to the baseURL, `nil` is returned. + + @param URL The URL to retrieve the relative path and query string of. + @param baseURL The base URL to be omitted from the returned path and query string. + @return A string containing the relative path and query parameters. + */ +NSString *RKPathAndQueryStringFromURLRelativeToURL(NSURL *URL, NSURL *baseURL); + +/** + * Returns an index set of the status codes with optional response bodies + * + * @return An index set of the status codes with optional response bodies + */ +NSIndexSet *RKStatusCodesOfResponsesWithOptionalBodies(void); + +#ifdef __cplusplus +} +#endif diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKHTTPUtilities.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKHTTPUtilities.m new file mode 100644 index 0000000..ac8eeeb --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKHTTPUtilities.m @@ -0,0 +1,586 @@ +// +// RKHTTPUtilities.m +// RestKit +// +// Created by Blake Watters on 8/24/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKHTTPUtilities.h" + +NSUInteger RKStatusCodeRangeLength = 100; + +NSRange RKStatusCodeRangeForClass(RKStatusCodeClass statusCodeClass) +{ + return NSMakeRange(statusCodeClass, RKStatusCodeRangeLength); +} + +NSIndexSet *RKStatusCodeIndexSetForClass(RKStatusCodeClass statusCodeClass) +{ + return [NSIndexSet indexSetWithIndexesInRange:RKStatusCodeRangeForClass(statusCodeClass)]; +} + +NSIndexSet *RKCacheableStatusCodes(void) +{ + NSMutableIndexSet *cacheableStatusCodes = [NSMutableIndexSet indexSet]; + [cacheableStatusCodes addIndex:200]; + [cacheableStatusCodes addIndex:304]; + [cacheableStatusCodes addIndex:203]; + [cacheableStatusCodes addIndex:300]; + [cacheableStatusCodes addIndex:301]; + [cacheableStatusCodes addIndex:302]; + [cacheableStatusCodes addIndex:307]; + [cacheableStatusCodes addIndex:410]; + return cacheableStatusCodes; +} + +BOOL RKIsSpecificRequestMethod(RKRequestMethod method) +{ + // check for a power of two + return !(method & (method - 1)); +} + +NSString *RKStringFromRequestMethod(RKRequestMethod method) +{ + switch (method) { + case RKRequestMethodGET: return @"GET"; + case RKRequestMethodPOST: return @"POST"; + case RKRequestMethodPUT: return @"PUT"; + case RKRequestMethodPATCH: return @"PATCH"; + case RKRequestMethodDELETE: return @"DELETE"; + case RKRequestMethodHEAD: return @"HEAD"; + case RKRequestMethodOPTIONS: return @"OPTIONS"; + default: break; + } + return nil; +} + +RKRequestMethod RKRequestMethodFromString(NSString *methodName) +{ + if ([methodName isEqualToString:@"GET"]) return RKRequestMethodGET; + else if ([methodName isEqualToString:@"POST"]) return RKRequestMethodPOST; + else if ([methodName isEqualToString:@"PUT"]) return RKRequestMethodPUT; + else if ([methodName isEqualToString:@"DELETE"]) return RKRequestMethodDELETE; + else if ([methodName isEqualToString:@"HEAD"]) return RKRequestMethodHEAD; + else if ([methodName isEqualToString:@"PATCH"]) return RKRequestMethodPATCH; + else if ([methodName isEqualToString:@"OPTIONS"]) return RKRequestMethodOPTIONS; + else @throw [NSException exceptionWithName:NSInvalidArgumentException + reason:[NSString stringWithFormat:@"The given HTTP request method name `%@` does not correspond to any known request methods.", methodName] + userInfo:nil]; +} + +// Built from http://en.wikipedia.org/wiki/List_of_HTTP_status_codes +static NSDictionary *RKStatusCodesToNamesDictionary() +{ + static NSDictionary *statusCodesToNamesDictionary = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + statusCodesToNamesDictionary = @{ + // 1xx (Informational) + @(100): @"Continue", + @(101): @"Switching Protocols", + @(102): @"Processing", + + // 2xx (Success) + @(200): @"OK", + @(201): @"Created", + @(202): @"Accepted", + @(203): @"Non-Authoritative Information", + @(204): @"No Content", + @(205): @"Reset Content", + @(206): @"Partial Content", + @(207): @"Multi-Status", + @(208): @"Already Reported", + @(226): @"IM Used", + + // 3xx (Redirection) + @(300): @"Multiple Choices", + @(301): @"Moved Permanently", + @(302): @"Found", + @(303): @"See Other", + @(304): @"Not Modified", + @(305): @"Use Proxy", + @(306): @"Switch Proxy", + @(307): @"Temporary Redirect", + @(308): @"Permanent Redirect", + + // 4xx (Client Error) + @(400): @"Bad Request", + @(401): @"Unauthorized", + @(402): @"Payment Required", + @(403): @"Forbidden", + @(404): @"Not Found", + @(405): @"Method Not Allowed", + @(406): @"Not Acceptable", + @(407): @"Proxy Authentication Required", + @(408): @"Request Timeout", + @(409): @"Conflict", + @(410): @"Gone", + @(411): @"Length Required", + @(412): @"Precondition Failed", + @(413): @"Request Entity Too Large", + @(414): @"Request-URI Too Long", + @(415): @"Unsupported Media Type", + @(416): @"Requested Range Not Satisfiable", + @(417): @"Expectation Failed", + @(418): @"I'm a teapot", + @(420): @"Enhance Your Calm", + @(422): @"Unprocessable Entity", + @(423): @"Locked", + @(424): @"Failed Dependency", + @(424): @"Method Failure", + @(425): @"Unordered Collection", + @(426): @"Upgrade Required", + @(428): @"Precondition Required", + @(429): @"Too Many Requests", + @(431): @"Request Header Fields Too Large", + @(451): @"Unavailable For Legal Reasons", + + // 5xx (Server Error) + @(500): @"Internal Server Error", + @(501): @"Not Implemented", + @(502): @"Bad Gateway", + @(503): @"Service Unavailable", + @(504): @"Gateway Timeout", + @(505): @"HTTP Version Not Supported", + @(506): @"Variant Also Negotiates", + @(507): @"Insufficient Storage", + @(508): @"Loop Detected", + @(509): @"Bandwidth Limit Exceeded", + @(510): @"Not Extended", + @(511): @"Network Authentication Required", + }; + }); + return statusCodesToNamesDictionary; +} + +NSString * RKStringFromStatusCode(NSInteger statusCode) +{ + return RKStatusCodesToNamesDictionary()[@(statusCode)]; +} + + +/** + Below is ragel source used to compile those tables. The output was polished / pretty-printed and tweaked from ragel. + As the generated code is "hard" to debug, we store the code in http-date.r1 + + shell% ragel -F1 http-date.rl + shell% gcc -o http-date http-date.c + shell% ./http-date 'Sun, 06 Nov 1994 08:49:37 GMT' 'Sunday, 06-Nov-94 08:49:37 GMT' 'Sun Nov 6 08:49:37 1994' 'Sat Dec 24 14:34:26 2037' 'Sunday, 06-Nov-94 08:49:37 GMT' 'Sun, 06 Nov 1994 08:49:37 GMT' + */ +static const char _httpDate_trans_keys[] = { + 0, 0, 70, 87, 114, 114, 105, 105, 32, 100, 65, 83, 112, 117, 114, 114, 32, + 32, 32, 57, 48, 57, 32, 32, 48, 57, 48, 57, 58, 58, 48, 57, 48, 57, + 58, 58, 48, 57, 48, 57, 32, 32, 48, 57, 48, 57, 48, 57, 48, 57, 103, + 103, 101, 101, 99, 99, 101, 101, 98, 98, 97, 117, 110, 110, 108, 110, 97, 97, + 114, 121, 111, 111, 118, 118, 99, 99, 116, 116, 101, 101, 112, 112, 32, 32, 48, + 57, 48, 57, 32, 32, 65, 83, 112, 117, 114, 114, 32, 32, 48, 57, 48, 57, + 48, 57, 48, 57, 32, 32, 48, 57, 48, 57, 58, 58, 48, 57, 48, 57, 58, + 58, 48, 57, 48, 57, 32, 32, 71, 71, 77, 77, 84, 84, 103, 103, 101, 101, + 99, 99, 101, 101, 98, 98, 97, 117, 110, 110, 108, 110, 97, 97, 114, 121, 111, + 111, 118, 118, 99, 99, 116, 116, 101, 101, 112, 112, 97, 97, 121, 121, 44, 44, + 32, 32, 48, 57, 48, 57, 45, 45, 65, 83, 112, 117, 114, 114, 45, 45, 48, + 57, 48, 57, 32, 32, 48, 57, 48, 57, 58, 58, 48, 57, 48, 57, 58, 58, + 48, 57, 48, 57, 32, 32, 71, 71, 77, 77, 84, 84, 103, 103, 101, 101, 99, + 99, 101, 101, 98, 98, 97, 117, 110, 110, 108, 110, 97, 97, 114, 121, 111, 111, + 118, 118, 99, 99, 116, 116, 101, 101, 112, 112, 111, 111, 110, 110, 97, 117, 116, + 116, 32, 117, 114, 114, 100, 100, 104, 117, 117, 117, 32, 114, 115, 115, 101, 101, + 32, 115, 101, 101, 100, 100, 32, 110, 101, 101, 0, 0, 0, 0, 0, 0, 0 +}; + +static const char _httpDate_key_spans[] = { + 0, 18, 1, 1, 69, 19, 6, 1, 1, 26, 10, 1, 10, 10, 1, 10, 10, + 1, 10, 10, 1, 10, 10, 10, 10, 1, 1, 1, 1, 1, 21, 1, 3, 1, + 8, 1, 1, 1, 1, 1, 1, 1, 10, 10, 1, 19, 6, 1, 1, 10, 10, + 10, 10, 1, 10, 10, 1, 10, 10, 1, 10, 10, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 21, 1, 3, 1, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 10, 10, 1, 19, 6, 1, 1, 10, 10, 1, 10, 10, 1, 10, 10, 1, + 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 21, 1, 3, 1, 8, 1, + 1, 1, 1, 1, 1, 1, 1, 21, 1, 86, 1, 1, 14, 1, 83, 1, 1, + 84, 1, 1, 79, 1, 0, 0, 0 +}; + +static const short _httpDate_index_offsets[] = { + 0, 0, 19, 21, 23, 93, 113, 120, 122, 124, 151, 162, 164, 175, 186, 188, 199, + 210, 212, 223, 234, 236, 247, 258, 269, 280, 282, 284, 286, 288, 290, 312, 314, 318, + 320, 329, 331, 333, 335, 337, 339, 341, 343, 354, 365, 367, 387, 394, 396, 398, 409, + 420, 431, 442, 444, 455, 466, 468, 479, 490, 492, 503, 514, 516, 518, 520, 522, 524, + 526, 528, 530, 532, 554, 556, 560, 562, 571, 573, 575, 577, 579, 581, 583, 585, 587, + 589, 591, 602, 613, 615, 635, 642, 644, 646, 657, 668, 670, 681, 692, 694, 705, 716, + 718, 729, 740, 742, 744, 746, 748, 750, 752, 754, 756, 758, 780, 782, 786, 788, 797, + 799, 801, 803, 805, 807, 809, 811, 813, 835, 837, 924, 926, 928, 943, 945, 1029, 1031, + 1033, 1118, 1120, 1122, 1202, 1204, 1205, 1206 +}; + +static const unsigned char _httpDate_indicies[] = { + 0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 3, 4, 1, 1, + 5, 1, 6, 1, 7, 1, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 10, 1, 11, 1, 1, 12, 1, 13, 1, 1, 1, + 14, 1, 1, 15, 16, 17, 1, 1, 1, 18, 1, 19, 1, 1, 1, 1, 20, + 1, 21, 1, 22, 1, 23, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 1, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 1, 26, 1, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 1, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 1, 29, + 1, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 1, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 1, 32, 1, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 1, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 1, 35, 1, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 1, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 1, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 1, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 1, 40, 1, 41, 1, 42, 1, 43, 1, 44, + 1, 45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 46, 1, 47, 1, 48, 1, 49, 1, 50, 1, 51, 1, 1, + 1, 1, 1, 1, 52, 1, 53, 1, 54, 1, 55, 1, 56, 1, 57, 1, 58, + 1, 59, 1, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 1, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 1, 62, 1, 63, 1, 1, 64, 1, 65, 1, + 1, 1, 66, 1, 1, 67, 68, 69, 1, 1, 1, 70, 1, 71, 1, 1, 1, + 1, 72, 1, 73, 1, 74, 1, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 1, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 1, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 1, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 1, + 79, 1, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 1, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 1, 82, 1, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 1, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 1, 85, 1, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 1, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 1, 88, 1, 89, 1, 90, 1, 91, 1, 92, 1, 93, 1, 94, + 1, 95, 1, 96, 1, 97, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 98, 1, 99, 1, 100, 1, 101, 1, 102, + 1, 103, 1, 1, 1, 1, 1, 1, 104, 1, 105, 1, 106, 1, 107, 1, 108, + 1, 109, 1, 110, 1, 111, 1, 112, 1, 113, 1, 114, 1, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 1, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 1, 117, 1, 118, 1, 1, 119, 1, 120, 1, 1, 1, 121, 1, 1, 122, 123, + 124, 1, 1, 1, 125, 1, 126, 1, 1, 1, 1, 127, 1, 128, 1, 129, 1, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 1, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 1, 132, 1, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 1, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 1, 135, 1, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 1, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 1, 138, 1, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 1, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, 1, 141, 1, 142, 1, 143, 1, 144, 1, + 145, 1, 146, 1, 147, 1, 148, 1, 149, 1, 150, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 151, 1, 152, 1, + 153, 1, 154, 1, 155, 1, 156, 1, 1, 1, 1, 1, 1, 157, 1, 158, 1, + 159, 1, 160, 1, 161, 1, 162, 1, 163, 1, 164, 1, 7, 1, 165, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 164, 1, 166, 1, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 167, 1, 168, 1, 10, 1, 169, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 170, 1, 171, 1, 8, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 172, 1, 168, 1, 173, 1, 8, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 168, 1, 174, 1, 175, 1, + 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 176, 1, 172, 1, 1, 1, 1, + 0 +}; + +static const unsigned char _httpDate_trans_targs[] = { + 2, 0, 124, 126, 131, 137, 3, 4, 5, 41, 82, 6, 26, 28, 30, 33, 35, + 37, 39, 7, 25, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 141, 8, 27, 8, 29, 8, 31, 32, 8, 8, 8, 34, + 8, 8, 36, 8, 38, 8, 40, 8, 42, 43, 44, 45, 46, 67, 69, 71, 74, + 76, 78, 80, 47, 66, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 142, 48, 68, 48, 70, 48, 72, 73, 48, 48, 48, + 75, 48, 48, 77, 48, 79, 48, 81, 48, 83, 84, 85, 86, 87, 88, 89, 90, + 109, 111, 113, 116, 118, 120, 122, 91, 108, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 143, 92, 110, 92, 112, 92, 114, 115, 92, + 92, 92, 117, 92, 92, 119, 92, 121, 92, 123, 92, 125, 127, 128, 129, 130, 132, + 135, 133, 134, 136, 138, 139, 140 +}; + +static const char _httpDate_trans_actions[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 2, 2, 0, 3, 3, 0, 4, 4, 0, 5, + 5, 0, 6, 6, 6, 6, 7, 0, 8, 0, 9, 0, 0, 10, 11, 12, 0, + 13, 14, 0, 15, 0, 16, 0, 17, 0, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 6, 6, 6, 6, 0, 3, 3, 0, 4, 4, + 0, 5, 5, 0, 0, 0, 0, 7, 0, 8, 0, 9, 0, 0, 10, 11, 12, + 0, 13, 14, 0, 15, 0, 16, 0, 17, 0, 0, 0, 0, 2, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 6, 18, 0, 3, 3, 0, + 4, 4, 0, 5, 5, 0, 0, 0, 0, 7, 0, 8, 0, 9, 0, 0, 10, + 11, 12, 0, 13, 14, 0, 15, 0, 16, 0, 17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0 +}; + +static const char _httpDate_eof_actions[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 20, 21 +}; + +static NSDate *_parseHTTPDate(const char *buf, size_t bufLen) { + const char *p = buf, *pe = p + bufLen, *eof = pe; + int parsed = 0, cs = 1; + NSDate *date = NULL; + +#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && (__IPHONE_OS_VERSION_MAX_ALLOWED < 70000)) || \ +(defined(MAC_OS_X_VERSION_MAX_ALLOWED) && (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_9)) + CFGregorianDate gdate; + memset(&gdate, 0, sizeof(CFGregorianDate)); +#else + NSDateComponents *gdate = [[NSDateComponents alloc] init]; + gdate.year = 0; + gdate.month = 0; + gdate.day = 0; + gdate.hour = 0; + gdate.minute = 0; + gdate.second = 0; +#endif + + { + int _slen, _trans; + const char *_keys; + const unsigned char *_inds; + if(p == pe) { goto _test_eof; } + _resume: + _keys = _httpDate_trans_keys + (cs << 1); + _inds = _httpDate_indicies + _httpDate_index_offsets[cs]; + _slen = _httpDate_key_spans[cs]; + _trans = _inds[(_slen > 0) && (_keys[0] <= (*p)) && ((*p) <= _keys[1]) ? (*p) - _keys[0] : _slen]; + cs = _httpDate_trans_targs[_trans]; + + if(_httpDate_trans_actions[_trans] == 0) { goto _again; } + + switch(_httpDate_trans_actions[_trans]) { + case 6: gdate.year = gdate.year * 10 + ((*p) - '0'); break; + case 18: gdate.year = gdate.year * 10 + ((*p) - '0'); gdate.year += 1900; break; + case 10: gdate.month = 1; break; + case 9: gdate.month = 2; break; + case 13: gdate.month = 3; break; + case 1: gdate.month = 4; break; + case 14: gdate.month = 5; break; + case 12: gdate.month = 6; break; + case 11: gdate.month = 7; break; + case 7: gdate.month = 8; break; + case 17: gdate.month = 9; break; + case 16: gdate.month = 10; break; + case 15: gdate.month = 11; break; + case 8: gdate.month = 12; break; + case 2: gdate.day = gdate.day * 10 + ((*p) - '0'); break; + case 3: gdate.hour = gdate.hour * 10 + ((*p) - '0'); break; + case 4: gdate.minute = gdate.minute * 10 + ((*p) - '0'); break; + case 5: gdate.second = gdate.second * 10.0 + ((*p) - '0'); break; + } + + _again: + if( cs == 0) { goto _out; } + if(++p != pe) { goto _resume; } + _test_eof: {} + if(p == eof) { + switch(_httpDate_eof_actions[cs]) { + case 19: parsed = 1; break; + case 20: parsed = 1; break; + case 21: parsed = 1; break; + } + } + + _out: {} + } + + static dispatch_once_t onceToken; + +#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && (__IPHONE_OS_VERSION_MAX_ALLOWED < 70000)) || \ +(defined(MAC_OS_X_VERSION_MAX_ALLOWED) && (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_9)) + static CFTimeZoneRef gmtTimeZone; + dispatch_once(&onceToken, ^{ + gmtTimeZone = CFTimeZoneCreateWithTimeIntervalFromGMT(NULL, 0.0); + }); + + if (parsed == 1) { + date = [NSDate dateWithTimeIntervalSinceReferenceDate:CFGregorianDateGetAbsoluteTime(gdate, gmtTimeZone)]; + } +#else + static NSCalendar *gregorian; + dispatch_once(&onceToken, ^{ + gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; + gregorian.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; + }); + + if (parsed == 1) { + date = [gregorian dateFromComponents:gdate]; + } +#endif + + return(date); +} + +/* + * Parse HTTP Date: http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 + */ +NSDate * RKDateFromHTTPDateString(NSString *httpDate) +{ + char stringBuffer[256]; + size_t stringLength = (size_t)CFStringGetLength((__bridge CFStringRef)httpDate); + const char *cStringPtr = (const char *)CFStringGetCStringPtr((__bridge CFStringRef)httpDate, kCFStringEncodingMacRoman); + if(cStringPtr == NULL) { + CFIndex usedBytes = 0L, convertedCount = 0L; + convertedCount = CFStringGetBytes((__bridge CFStringRef)httpDate, CFRangeMake(0L, (CFIndex)stringLength), kCFStringEncodingUTF8, '?', NO, (UInt8 *)stringBuffer, sizeof(stringBuffer) - 1L, &usedBytes); + if(((size_t)convertedCount != stringLength) || (usedBytes < 0L)) { return(NULL); } + stringBuffer[usedBytes] = '\0'; + cStringPtr = (const char *)stringBuffer; + } + return(_parseHTTPDate(cStringPtr, stringLength)); +} + +static float const kRKURLCacheLastModFraction = 0.1f; // 10% since Last-Modified suggested by RFC2616 section 13.2.4 +static float const kRKURLCacheDefault = 3600.0f; // Default cache expiration delay if none defined (1 hour) + +/* + * This method tries to determine the expiration date based on a response headers dictionary. + */ +NSDate * RKHTTPCacheExpirationDateFromHeadersWithStatusCode(NSDictionary *headers, NSInteger statusCode) +{ + if (statusCode != 200 && statusCode != 203 && statusCode != 300 && statusCode != 301 && statusCode != 302 && statusCode != 307 && statusCode != 410) { + // Uncacheable response status code + return nil; + } + + // Check Pragma: no-cache + NSString *pragma = headers[@"Pragma"]; + if (pragma && [pragma isEqualToString:@"no-cache"]) { + // Uncacheable response + return nil; + } + + // Define "now" based on the request + NSString *date = headers[@"Date"]; + // If no Date: header, define now from local clock + NSDate *now = date ? RKDateFromHTTPDateString(date) : [NSDate date]; + + // Look at info from the Cache-Control: max-age=n header + NSString *cacheControl = [headers[@"Cache-Control"] lowercaseString]; + if (cacheControl) + { + NSRange foundRange = [cacheControl rangeOfString:@"no-store"]; + if (foundRange.length > 0) { + // If no-store, the content cannot be cached at all + // See http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.2 + return nil; + } + + foundRange = [cacheControl rangeOfString:@"no-cache"]; + if (foundRange.length > 0) { + // If no-cache, we must revalidate with the origin server + // See http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1 + return nil; + } + + NSInteger maxAge; + foundRange = [cacheControl rangeOfString:@"max-age"]; + if (foundRange.length > 0) { + NSScanner *cacheControlScanner = [NSScanner scannerWithString:cacheControl]; + [cacheControlScanner setScanLocation:foundRange.location + foundRange.length]; + [cacheControlScanner scanString:@"=" intoString:nil]; + if ([cacheControlScanner scanInteger:&maxAge]) { + if(maxAge > 0) + { + const NSInteger age = ((NSString *)headers[@"Age"]).integerValue; + if(age > 0) + return [[NSDate alloc] initWithTimeIntervalSinceNow:(maxAge - age)]; + else + return [[NSDate alloc] initWithTimeInterval:maxAge sinceDate:now]; + } + else + return nil; + } + } + } + + // If not Cache-Control found, look at the Expires header + NSString *expires = headers[@"Expires"]; + if (expires) { + NSTimeInterval expirationInterval = 0; + NSDate *expirationDate = RKDateFromHTTPDateString(expires); + if (expirationDate) { + expirationInterval = [expirationDate timeIntervalSinceDate:now]; + } + if (expirationInterval > 0) { + // Convert remote expiration date to local expiration date + return [NSDate dateWithTimeIntervalSinceNow:expirationInterval]; + } + else { + // If the Expires header can't be parsed or is expired, do not cache + return nil; + } + } + + if (statusCode == 302 || statusCode == 307) { + // If not explict cache control defined, do not cache those status + return nil; + } + + // If no cache control defined, try some heristic to determine an expiration date + NSString *lastModified = headers[@"Last-Modified"]; + if (lastModified) { + NSTimeInterval age = 0; + NSDate *lastModifiedDate = RKDateFromHTTPDateString(lastModified); + if (lastModifiedDate) { + // Define the age of the document by comparing the Date header with the Last-Modified header + age = [now timeIntervalSinceDate:lastModifiedDate]; + } + return age > 0 ? [NSDate dateWithTimeIntervalSinceNow:(age * kRKURLCacheLastModFraction)] : nil; + } + + // If nothing permitted to define the cache expiration delay nor to restrict its cacheability, use a default cache expiration delay + return [[NSDate alloc] initWithTimeInterval:kRKURLCacheDefault sinceDate:now]; +} + +BOOL RKURLIsRelativeToURL(NSURL *URL, NSURL *baseURL) +{ + return [[URL absoluteString] hasPrefix:[baseURL absoluteString]]; +} + +NSString *RKPathAndQueryStringFromURLRelativeToURL(NSURL *URL, NSURL *baseURL) +{ + if (baseURL) { + if (! RKURLIsRelativeToURL(URL, baseURL)) return nil; + return [[URL absoluteString] substringFromIndex:[[baseURL absoluteString] length]]; + } else { + // NOTE: [URL relativeString] would return the same value as `absoluteString` if URL is not relative to a baseURL + NSString *query = [URL query]; + NSString *pathWithPrevervedTrailingSlash = [CFBridgingRelease(CFURLCopyPath((CFURLRef)URL)) stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + return (query && [query length]) ? [NSString stringWithFormat:@"%@?%@", pathWithPrevervedTrailingSlash, query] : pathWithPrevervedTrailingSlash; + } +} + +NSIndexSet *RKStatusCodesOfResponsesWithOptionalBodies() +{ + NSMutableIndexSet *statusCodes = [NSMutableIndexSet indexSet]; + [statusCodes addIndex:201]; + [statusCodes addIndex:202]; + [statusCodes addIndex:204]; + [statusCodes addIndex:205]; + [statusCodes addIndex:304]; + return statusCodes; +} diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKManagedObjectRequestOperation.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKManagedObjectRequestOperation.h new file mode 100644 index 0000000..c76886e --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKManagedObjectRequestOperation.h @@ -0,0 +1,209 @@ +// +// RKManagedObjectRequestOperation.h +// RestKit +// +// Created by Blake Watters on 8/9/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#if __has_include("CoreData.h") +#if __has_include("RKManagedObjectCaching.h") + +#import "RKObjectRequestOperation.h" +#import "RKManagedObjectCaching.h" + +/** + `RKManagedObjectRequestOperation` is a subclass of `RKObjectRequestOperation` that implements object mapping on the response body of an `NSHTTPResponse` loaded via an `RKHTTPRequestOperation` in which the mapping targets `NSManagedObject` objects managed by Core Data. + + The `RKManagedObjectRequestOperation` class extends the basic behavior of an `RKObjectRequestOperation` to meet the constraints imposed by Core Data. In particular, managed object request operations observe the threading requirements by making use of `NSManagedObjectContext` concurrency types, leverage the support for parent/child contexts, and handle obtaining a permanent `NSManagedObjectID` for objects being mapped so that they are addressable across contexts. Object mapping is internally performed within a block provided to the target context via `performBlockAndWait:`, ensuring execution on the appropriate queue. + + Aside from providing the basic infrastructure for successful object mapping into Core Data, a number of additional Core Data specific features are provided by the `RKManagedObjectRequestOperation` class that warrant discussion in detail. + + ## Parent Context + + Every `RKManagedObjectRequestOperation` object must be assigned an `NSManagedObjectContext` in which to persist the results of the underlying object mapping operation. This context is used as the parent context for a new, private `NSManagedObjectContext` with a concurrency type of `NSPrivateQueueConcurrencyType` in which the object mapping is actually performed. The use of this parent context has a number of benefits: + + 1. If the context that was assigned to the managed object request operation has a concurrency type of `NSMainQueueConcurrencyType`, then directly mapping into the context would block the execution of the main thread for the duration of the mapping process. The use of the private child context isolates the mapping process from the main thread. + 1. In the event of an error, the private context can be discarded, leaving the state of the parent context unchanged. On successful completion, the private context is saved and 'pushes' its changes up one level into the parent context. + + ## Permanent Managed Object IDs + + One of the confounding factors when working with asycnhronous processes interacting with Core Data is the addressability of managed objects that have not been saved to the persistent store across contexts. Unpersisted `NSManagedObject` instances have an `objectID` that is temporary and unsuitable for use in uniquely addressing a given object across two managed object contexts, even if they have common ancestry and share a persistent store coordinator. To mitigate this addressability issue without requiring objects to be saved to the persistent store, managed object request operations invoke `obtainPermanentIDsForObjects:` on the operation's target object (if any) and all managed objects that were inserted into the context during the mapping process. By the time the operation finishes, all managed objects in the mapping result can be referenced by `objectID` across contexts with no further action. + + ## Identification Attributes & Managed Object Caching + + When object mapping managed objects it is necessary to differentiate between objects that already exist in the local store and those that are being created as part of the mapping process. This ensures that the local store does not become populated with duplicate records. To make this differentiation, RestKit requires that each `RKEntityMapping` be configured with one or more identification attributes. Each identification attribute must correspond to a static attribute assigned by the remote backend system. During mapping, these attributes are used to search the managed object context for an existing managed object. If one is found, the object is updated else a new object is created. Identification attributes are configured on the `[RKEntityMapping identificationAttributes]` property. + + Identification attributes are used in conjunction with the `RKManagedObjectCaching` protocol. Each managed object request operation is associated with an object conforming to the `RKManagedObjectCaching` protocol via the `managedObjectCache` proeprty. This cache is consulted during mapping to find existing objects and when establishing relationships between entities by one or more attributes. Please see the documentation accompanying `RKManagedObjectCaching` and `RKConnectionDescription` classes for more information. + + ## Deleting Managed Objects for `DELETE` requests + + `RKManagedObjectRequestOperation` adds special behavior to `DELETE` requests. Upon retrieving a successful (2xx status code) response for a `DELETE`, the operation will invoke `deleteObject:` with the operations `targetObject` on the managed object context. This will delete the target object from the local store in conjunction the successfully deleted remote representation. + + ## Fetch Request Blocks and Deleting Orphaned Objects + + A common problem when accessing remote resources representing collections of objects is the problem of deletion of remote objects. The `RKManagedObjectRequestOperation` class provides support for the cleanup of such orphaned objects. In order to utilize the functionality, the operation must be able to compare a set of reference objects to the retrieved payload in order to determine which objects exist in the local store, but are no longer being returned by the server. This reference set of objects is built by executing an `NSFetchRequest` that corresponds to the URL being loaded. Configuration of this fetch request is done via an `RKFetchRequestBlock` block object. This block takes a single `NSURL` argument and returns an `NSFetchRequest` object. An array of these blocks can be provided to the managed object request operation and the array will be searched in reverse order until a non-nil value is returned by a block. Any block that cannot build a fetch request for the given URL is expected to return `nil` to indicate that it does not match the given URL. Processing of the URL is typically performed using an `RKPathMatcher` object against the value returned from the `relativePath` or `relativeString` methods of `NSURL`. + + To illustrate this concept, please consider the following real-world example which builds a fetch request for retrieving the Terminals that exist in an Airport: + + RKObjectManager *manager = [RKObjectManager managerWithBaseURL:@"http://restkit.org"]; + [manager addFetchRequestBlock:^NSFetchRequest *(NSURL *URL) { + RKPathMatcher *pathMatcher = [RKPathMatcher pathMatcherWithPattern:@"/airports/:airport_id/terminals.json"]; + + NSDictionary *argsDict = nil; + BOOL match = [pathMatcher matchesPath:[URL relativePath] tokenizeQueryStrings:NO parsedArguments:&argsDict]; + NSString *airportID; + if (match) { + airportID = [argsDict objectForKey:@"airport_id"]; + NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Terminal"]; + fetchRequest.predicate = [NSPredicate predicateWithFormat:@"airportID = %@", @([airportID integerValue])]; // NOTE: Coerced from string to number + fetchRequest.sortDescriptors = @[ [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES] ]; + return fetchRequest; + } + + return nil; + }]; + + The above example code defines an `RKFetchRequestBlock` block object that will match an `NSURL` with a relative path matching the pattern `@"/airports/:airport_id/terminals.json"`. If a match is found, the block extracts the `airport_id` key from the matched arguments, coerces its value into a number, and uses it to construct an `NSPredicate` for the primary key attribute of `GGAirport` entity. Take note that the value of the 'airport_id' was coerced from an `NSString` to an `NSNumber` -- failure to so would result in a predicate whose value is equal to `airportID == '1234'` vs. `airportID == 1234`, which will prevent fetch requests from evaluating correctly. Once coerced, the value is used to construct a `NSFetchRequest` object for the `GGTerminal` entity that will retrieve all the managed objects with an airport ID attribute whose value is equal to `airport_id` encoded within the URL's path. + + In more concrete terms, given the URL `http://restkit.org/airports/1234/terminals.json` the block would return an `NSFetchRequest` equal to: + + NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Terminal"]; + fetchRequest.predicate = [NSPredicate predicateWithFormat:@"airportID = 1234"]; + fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]]; + + Once configured and registered with the object manager, any `RKManagedObjectRequestOperation` created through the manager will automatically consult the fetch request blocks and perform orphaned object cleanup. No cleanup is performed if no block in the `fetchRequestBlocks` property is found to match the URL of the request. + + ## Managed Object Context Save Behaviors + + The results of the operation can either be 'pushed' to the parent context or saved to the persistent store. Configuration is available via the `savesToPersistentStore` property. If an error is encountered while saving the managed object context, then the operation is considered to have failed and the `error` property will be set to the `NSError` object returned by the failed save. + + ## 304 'Not Modified' Responses + + In the event that a managed object request operation loads a 304 'Not Modified' response for an HTTP request no object mapping is performed as Core Data is assumed to contain a managed object representation of the resource requested. No object mapping is performed on the cached response body, making a cache hit for a managed object request operation a very lightweight operation. To build the mapping result returned to the caller, all of the fetch request blocks matching the request URL will be invoked and each fetch request returned is executed against the managed object context and the objects returned are added to the mapping result. Please note that all managed objects returned in the mapping result for a 'Not Modified' response will be returned under the `[NSNull null]` key path. + + Note that `NSURLConnection` supports conditional GET transparently when the cache policy is set to `NSURLRequestUseProtocolCachePolicy`. Because of this the `NSHTTPURLResponse` loaded does not have the 304 (Not Modified) status code. In order to determine if a 304 response has resulted in the loading of an existing response from `NSURLCache`, the managed object request operation evaluates the following heuristic on the response: + + 1. Before the HTTP request is loaded, a reference to any existing `NSCachedURLResponse` is obtained. + 1. When the response is loaded, the request is evaluated for cacheability. A request is considered cacheable if and only if its HTTP method is either "GET" or "HEAD" and its status code is 200, 304, 203, 300, 301, 302, 307, or 410. + 1. If the request is found to be cacheable, the Etag of the current response is matched against the reference to the existing cache entry obtained before the request was loaded. + 1. If the Etags match, the response data of the loaded response is matched against the cache entry reference. + 1. If the data is found to match, then the `userInfo` dictionary of the cache entry for the current request is checked for the existence of Boolean value under the `RKResponseHasBeenMappedCacheUserInfoKey` key. If the value of this key is `YES`, it indicates that the response was previously mapped to completion by an object request operation. + + If this heuristic evaluates positively, then the response is determined to have been loaded from the cache and no mapping or managed object deletion cleanup is performed. This optimization greatly improves performance in applications where HTTP caching is leveraged. + + ## Subclassing Notes + + This class relies on the following `RKMapperOperationDelegate` method methods to do its work: + + 1. `mapperDidFinishMapping:` + + If you subclass `RKManagedObjectRequestOperation` and implement any of the above methods then you must call the superclass implementation. + + ## Limitations and Caveats + + 1. `RKManagedObjectRequestOperation` **does NOT** support object mapping that targets an `NSManagedObjectContext` with a `concurrencyType` of `NSConfinementConcurrencyType`. + + @see `RKObjectRequestOperation` + @see `RKEntityMapping` + @see `RKManagedObjectResponseMapperOperation` + */ +@interface RKManagedObjectRequestOperation : RKObjectRequestOperation + +///---------------------------------------- +/// @name Configuring Core Data Integration +///---------------------------------------- + +/** + The managed object context associated with the managed object request operation. + + This context acts as the parent context for a private managed object context in which the object mapping is performed and changes will be saved to this context upon successful completion of the operation. + + Please see the above discussion about 'Parent Context' for details. + */ +@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext; + +/** + The managed object cache associated with the managed object request operation. + + The cache is used to look up existing objects by primary key to prevent the creation of duplicate objects during mapping. Please see the above discussion of 'Managed Object Caching' for more details. + + @warning A `nil` value for the `managedObjectCache` property is valid, but may result in the creation of duplicate objects. + */ +@property (nonatomic, strong) id managedObjectCache; + +/** + An array of `RKFetchRequestBlock` block objects used to map `NSURL` objects into corresponding `NSFetchRequest` objects. + + Fetch requests corresponding to URL's are used when deleting orphaned objects and completing object request operations in which `avoidsNetworkAccess` has been set to `YES`. Please see the above discussion of 'Fetch Request Blocks' for more details. + */ +@property (nonatomic, copy) NSArray *fetchRequestBlocks; + +///------------------------------------ +/// @name Managing Completion Behaviors +///------------------------------------ + +/** + A Boolean value that determines if the receiver will delete orphaned objects upon completion of the operation. + + Please see the above discussion of 'Deleting Managed Objects for `DELETE` requests' for more details. + + **Default**: `YES` + */ +@property (nonatomic, assign) BOOL deletesOrphanedObjects; + +/** + A Boolean value that determines if the operation saves the mapping results to the persistent store upon successful completion. If the network transport or mapping portions of the operation fail the operation then this option has no effect. + + When `YES`, the receiver will invoke `saveToPersistentStore:` on its private managed object context to persist the mapping results all the way back to the persistent store coordinator. If `NO`, the private mapping context will be saved causing the mapped objects to be 'pushed' to the parent context as represented by the `managedObjectContext` property. + + **Default**: `YES` + */ +@property (nonatomic, assign) BOOL savesToPersistentStore; + +/** + Sets a block to be invoked just before the operation saves the private mapping context. + + The mapping context is saved just before the object request operation completes its work and transitions into the finished state. All managed objects mapped during the operation will have permanent object ID's. The `mappingResult` will contain managed object instances local to the context yielded to the block. The block will be invoked synchronously on the private queue of the context. After the block is executed, the save operation will take place, optionally saving the mapping results back to the persistent store. + + @param block The block to execute just before the context is saved. + */ +- (void)setWillSaveMappingContextBlock:(void (^)(NSManagedObjectContext *mappingContext))block; + +@end + +/** + A block object for returning an `NSFetchRequest` suitable for fetching the managed objects that corresponds to the contents of the resource at the given URL. It accepts a single `NSURL` argument and returns an `NSFetchRequest`. + + `RKFetchRequestBlock` objects are used to identify objects that exist in the local persistent store, but have been removed from the server-side. Such orphaned objects can optionally be auto-removed by `RKManagedObjectRequestOperation` objects. + + A block that returns `nil` is considered not to match the given URL. + + @param URL The URL object to build a fetch request for. + @return An `NSFetchRequest` object corresponding to the given URL, or nil if the URL could not be processed. + */ +typedef NSFetchRequest *(^RKFetchRequestBlock)(NSURL *URL); + +/** + Returns an array of fetch request objects from an array of `RKFetchRequestBlock` objects given a URL. + + @param fetchRequestBlocks An array of `RKFetchRequestBlock` blocks to + @param URL The URL for which to return a fetch request. + @return An array of fetch requests from all blocks that match the given URL. + */ +NSArray *RKArrayOfFetchRequestFromBlocksWithURL(NSArray *fetchRequestBlocks, NSURL *URL); + +#endif +#endif diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKManagedObjectRequestOperation.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKManagedObjectRequestOperation.m new file mode 100644 index 0000000..0525ae0 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKManagedObjectRequestOperation.m @@ -0,0 +1,946 @@ +// +// RKManagedObjectRequestOperation.m +// RestKit +// +// Created by Blake Watters on 8/9/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#if __has_include("CoreData.h") +#if __has_include("RKManagedObjectCaching.h") + +#import "RKManagedObjectRequestOperation.h" +#import "RKLog.h" +#import "RKHTTPUtilities.h" +#import "RKResponseMapperOperation.h" +#import "RKObjectRequestOperationSubclass.h" +#import "NSManagedObjectContext+RKAdditions.h" +#import "NSManagedObject+RKAdditions.h" +#import "RKObjectUtilities.h" + +// Graph visitor +#import "RKResponseDescriptor.h" +#import "RKEntityMapping.h" +#import "RKDynamicMapping.h" +#import "RKRelationshipMapping.h" + +// Set Logging Component +#undef RKLogComponent +#define RKLogComponent RKlcl_cRestKitNetworkCoreData + +@interface RKEntityMappingEvent : NSObject +@property (nonatomic, copy) id rootKey; +@property (nonatomic, copy) NSString *keyPath; +@property (nonatomic, strong) RKEntityMapping *entityMapping; + ++ (NSArray *)entityMappingEventsForMappingInfo:(NSDictionary *)mappingInfo; ++ (instancetype)eventWithRootKey:(id)rootKey keyPath:(NSString *)keyPath entityMapping:(RKEntityMapping *)entityMapping; +@end + +@implementation RKEntityMappingEvent + ++ (NSArray *)entityMappingEventsForMappingInfo:(NSDictionary *)mappingInfo +{ + NSMutableArray *entityMappingEvents = [NSMutableArray array]; + for (id rootKey in mappingInfo) { + NSArray *mappingInfoArray = mappingInfo[rootKey]; + for (RKMappingInfo *mappingInfo in mappingInfoArray) { + [entityMappingEvents addObjectsFromArray:[self entityMappingEventsWithMappingInfo:mappingInfo rootKey:rootKey keyPath:nil]]; + } + } + return entityMappingEvents; +} + ++ (NSArray *)entityMappingEventsWithMappingInfo:(RKMappingInfo *)mappingInfo rootKey:(id)rootKey keyPath:(NSString *)keyPath +{ + NSMutableArray *entityMappingEvents = [NSMutableArray array]; + if ([mappingInfo.objectMapping isKindOfClass:[RKEntityMapping class]]) { + [entityMappingEvents addObject:[RKEntityMappingEvent eventWithRootKey:rootKey + keyPath:keyPath + entityMapping:(RKEntityMapping *)mappingInfo.objectMapping]]; + } + + for (NSString *destinationKeyPath in mappingInfo.relationshipMappingInfo) { + NSString *nestedKeyPath = keyPath ? [@[ keyPath, destinationKeyPath] componentsJoinedByString:@"."] : destinationKeyPath; + NSArray *arrayOfMappingInfoForRelationship = (mappingInfo.relationshipMappingInfo)[destinationKeyPath]; + for (RKMappingInfo *mappingInfo in arrayOfMappingInfoForRelationship) { + [entityMappingEvents addObjectsFromArray:[self entityMappingEventsWithMappingInfo:mappingInfo rootKey:rootKey keyPath:nestedKeyPath]]; + } + } + return entityMappingEvents; +} + ++ (instancetype)eventWithRootKey:(id)rootKey keyPath:(NSString *)keyPath entityMapping:(RKEntityMapping *)entityMapping +{ + RKEntityMappingEvent *event = [RKEntityMappingEvent new]; + event.rootKey = rootKey; + event.keyPath = keyPath; + event.entityMapping = entityMapping; + return event; +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@: %p rootKey=%@ keyPath=%@ entityMapping=%@>", + [self class], self, self.rootKey, self.keyPath, self.entityMapping]; +} +@end + +/** + Returns the set of keys containing the outermost nesting keypath for all children. + For example, given a set containing: 'this', 'this.that', 'another.one.test', 'another.two.test', 'another.one.test.nested' + would return: 'this, 'another.one', 'another.two' + */ +NSSet *RKSetByRemovingSubkeypathsFromSet(NSSet *setOfKeyPaths); +NSSet *RKSetByRemovingSubkeypathsFromSet(NSSet *setOfKeyPaths) +{ + return [setOfKeyPaths objectsPassingTest:^BOOL(NSString *keyPath, BOOL *stop) { + if ([keyPath isEqual:[NSNull null]]) return YES; // Special case the root key path + NSArray *keyPathComponents = [keyPath componentsSeparatedByString:@"."]; + NSMutableSet *parentKeyPaths = [NSMutableSet set]; + for (NSUInteger index = 0; index < [keyPathComponents count] - 1; index++) { + [parentKeyPaths addObject:[[keyPathComponents subarrayWithRange:NSMakeRange(0, index + 1)] componentsJoinedByString:@"."]]; + } + for (NSString *parentKeyPath in parentKeyPaths) { + if ([setOfKeyPaths containsObject:parentKeyPath]) return NO; + } + return YES; + }]; +} + +// Precondition: Must be called from within the correct context +static NSManagedObject *RKRefetchManagedObjectInContext(NSManagedObject *managedObject, NSManagedObjectContext *managedObjectContext) +{ + NSManagedObjectID *managedObjectID = [managedObject objectID]; + if ([managedObjectID isTemporaryID]) { + RKLogWarning(@"Unable to refetch managed object %@: the object has a temporary managed object ID.", managedObject); + return nil; + } + NSError *error = nil; + NSManagedObject *refetchedObject = [managedObjectContext existingObjectWithID:managedObjectID error:&error]; + if (! refetchedObject) { + RKLogWarning(@"Failed to refetch managed object with ID %@: %@", managedObjectID, error); + } + return refetchedObject; +} + +static id RKRefetchedValueInManagedObjectContext(id value, NSManagedObjectContext *managedObjectContext) +{ + if (! value) { + return value; + } else if ([value isKindOfClass:[NSArray class]]) { + NSMutableArray *newValue = [[NSMutableArray alloc] initWithCapacity:[value count]]; + for (__strong id object in value) { + if ([object isKindOfClass:[NSManagedObject class]]) object = RKRefetchManagedObjectInContext(object, managedObjectContext); + if (object) [newValue addObject:object]; + } + return newValue; + } else if ([value isKindOfClass:[NSSet class]]) { + NSMutableSet *newValue = [[NSMutableSet alloc] initWithCapacity:[value count]]; + for (__strong id object in value) { + if ([object isKindOfClass:[NSManagedObject class]]) object = RKRefetchManagedObjectInContext(object, managedObjectContext); + if (object) [newValue addObject:object]; + } + return newValue; + } else if ([value isKindOfClass:[NSOrderedSet class]]) { + NSMutableOrderedSet *newValue = [NSMutableOrderedSet orderedSet]; + [(NSOrderedSet *)value enumerateObjectsUsingBlock:^(id object, NSUInteger index, BOOL *stop) { + if ([object isKindOfClass:[NSManagedObject class]]) object = RKRefetchManagedObjectInContext(object, managedObjectContext); + if (object) [newValue setObject:object atIndex:index]; + }]; + return newValue; + } else if ([value isKindOfClass:[NSManagedObject class]]) { + return RKRefetchManagedObjectInContext(value, managedObjectContext); + } + + return value; +} + +/** + This is an NSProxy object that stands in for the mapping result and provides support for refetching the results on demand. This enables us to defer the refetching until someone accesses the results directly. For managed object request operations that do not use the mapping result (such as those used in conjunction with a NSFetchedResultsController), the refetching will be skipped entirely. + */ +@interface RKRefetchingMappingResult : NSProxy + +- (instancetype)initWithMappingResult:(RKMappingResult *)mappingResult + managedObjectContext:(NSManagedObjectContext *)managedObjectContext + mappingInfo:(NSDictionary *)mappingInfo; +@end + +@interface RKRefetchingMappingResult () +@property (nonatomic, strong) RKMappingResult *mappingResult; +@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext; +@property (nonatomic, strong) NSDictionary *mappingInfo; +@property (nonatomic, assign) BOOL refetched; +@end + +@implementation RKRefetchingMappingResult + ++ (NSString *)description +{ + return [[super description] stringByAppendingString:@"_RKRefetchingMappingResult"]; +} + +/** + Add explicit ordering of deallocations to fight `cxx_destruct` crashes + */ +- (void)dealloc +{ + _mappingResult = nil; + _mappingInfo = nil; + _managedObjectContext = nil; +} + +- (instancetype)initWithMappingResult:(RKMappingResult *)mappingResult + managedObjectContext:(NSManagedObjectContext *)managedObjectContext + mappingInfo:(NSDictionary *)mappingInfo; +{ + self.mappingResult = mappingResult; + self.managedObjectContext = managedObjectContext; + self.mappingInfo = mappingInfo; + return self; +} + +- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector +{ + return [self.mappingResult methodSignatureForSelector:selector]; +} + +- (void)forwardInvocation:(NSInvocation *)invocation +{ + if (! self.refetched) { + self.mappingResult = [self refetchedMappingResult]; + self.refetched = YES; + } + [invocation invokeWithTarget:self.mappingResult]; +} + +- (NSString *)description +{ + return [self.mappingResult description]; +} + +- (NSUInteger)count +{ + return [self.mappingResult count]; +} + +- (RKMappingResult *)refetchedMappingResult +{ + NSAssert(!self.refetched, @"Mapping result should only be refetched once"); + if (! [self.mappingResult count]) return self.mappingResult; + + NSMutableDictionary *newDictionary = [self.mappingResult.dictionary mutableCopy]; + [self.managedObjectContext performBlockAndWait:^{ + NSArray *entityMappingEvents = [RKEntityMappingEvent entityMappingEventsForMappingInfo:self.mappingInfo]; + NSSet *rootKeys = [NSSet setWithArray:[entityMappingEvents valueForKey:@"rootKey"]]; + for (id rootKey in rootKeys) { + NSArray *eventsForRootKey = [entityMappingEvents filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"rootKey = %@", rootKey]]; + NSSet *keyPaths = [NSSet setWithArray:[eventsForRootKey valueForKey:@"keyPath"]]; + // If keyPaths contains null, then the root object is a managed object and we only need to refetch it + NSSet *nonNestedKeyPaths = ([keyPaths containsObject:[NSNull null]]) ? [NSSet setWithObject:[NSNull null]] : RKSetByRemovingSubkeypathsFromSet(keyPaths); + + NSDictionary *mappingResultsAtRootKey = newDictionary[rootKey]; + for (NSString *keyPath in nonNestedKeyPaths) { + id value = nil; + if ([keyPath isEqual:[NSNull null]]) { + value = RKRefetchedValueInManagedObjectContext(mappingResultsAtRootKey, self.managedObjectContext); + if (value) { + newDictionary[rootKey] = value; + } + // else there's no object on the correct context + else { + // ensure newDictionary doesn't have an object on an incorrect context + [newDictionary removeObjectForKey:rootKey]; + } + } else { + NSMutableArray *keyPathComponents = [[keyPath componentsSeparatedByString:@"."] mutableCopy]; + NSString *destinationKey = [keyPathComponents lastObject]; + [keyPathComponents removeLastObject]; + id sourceObject = [keyPathComponents count] ? [mappingResultsAtRootKey valueForKeyPath:[keyPathComponents componentsJoinedByString:@"."]] : mappingResultsAtRootKey; + [self refetchSourceObject:sourceObject atDestinationKey:destinationKey]; + } + } + } + }]; + + return [[RKMappingResult alloc] initWithDictionary:newDictionary]; +} + +- (void) refetchSourceObject:(id) sourceObject atDestinationKey:(NSString *)destinationKey { + if (RKObjectIsCollection(sourceObject)) { + // This is a to-many relationship, we want to refetch each item at the keyPath + for (id nestedObject in sourceObject) { + [self refetchSourceObject:nestedObject atDestinationKey:destinationKey]; + } + } else { + // NOTE: If this collection was mapped with a dynamic mapping then each instance may not respond to the key + if ([sourceObject respondsToSelector:NSSelectorFromString(destinationKey)]) { + id valueToRefetch = [sourceObject valueForKey:destinationKey]; + [sourceObject setValue:RKRefetchedValueInManagedObjectContext(valueToRefetch, self.managedObjectContext) forKey:destinationKey]; + } + } +} + +@end + +NSArray *RKArrayOfFetchRequestFromBlocksWithURL(NSArray *fetchRequestBlocks, NSURL *URL) +{ + NSMutableArray *fetchRequests = [NSMutableArray array]; + NSFetchRequest *fetchRequest = nil; + for (RKFetchRequestBlock block in [fetchRequestBlocks reverseObjectEnumerator]) { + fetchRequest = block(URL); + if (fetchRequest) [fetchRequests addObject:fetchRequest]; + } + return fetchRequests; +} + +static NSSet *RKFlattenCollectionToSet(id collection) +{ + NSMutableSet *mutableSet = [NSMutableSet set]; + if ([collection conformsToProtocol:@protocol(NSFastEnumeration)]) { + for (id nestedObject in collection) { + if ([nestedObject conformsToProtocol:@protocol(NSFastEnumeration)]) { + if ([nestedObject isKindOfClass:[NSArray class]]) { + [mutableSet unionSet:RKFlattenCollectionToSet([NSSet setWithArray:nestedObject])]; + } else if ([nestedObject isKindOfClass:[NSSet class]]) { + [mutableSet unionSet:RKFlattenCollectionToSet(nestedObject)]; + } else if ([nestedObject isKindOfClass:[NSOrderedSet class]]) { + [mutableSet unionSet:RKFlattenCollectionToSet([(NSOrderedSet *)nestedObject set])]; + } + } else { + [mutableSet addObject:nestedObject]; + } + } + } else if (collection) { + [mutableSet addObject:collection]; + } + + return mutableSet; +} + +static NSURL *RKRelativeURLFromURLAndResponseDescriptors(NSURL *URL, NSArray *responseDescriptors) +{ + NSCParameterAssert(URL); + NSCParameterAssert(responseDescriptors); + NSArray *baseURLs = [responseDescriptors valueForKeyPath:@"@distinctUnionOfObjects.baseURL"]; + if ([baseURLs count] == 1) { + NSURL *baseURL = baseURLs[0]; + NSString *pathAndQueryString = RKPathAndQueryStringFromURLRelativeToURL(URL, baseURL); + URL = [NSURL URLWithString:pathAndQueryString relativeToURL:baseURL]; + } + + return URL; +} + +static void RKGatherManagedObjectsFromObjectWithRelationshipMapping(id object, RKRelationshipMapping *relationshipMapping, NSMutableSet *managedObjects) +{ + NSSet *relationshipValue = RKFlattenCollectionToSet([object valueForKeyPath:relationshipMapping.destinationKeyPath]); + for (id relatedObject in relationshipValue) { + if ([managedObjects containsObject:relatedObject]) continue; + if ([relatedObject isKindOfClass:[NSManagedObject class]]) [managedObjects addObject:relatedObject]; + + if ([relationshipMapping.mapping isKindOfClass:[RKObjectMapping class]]) { + for (RKRelationshipMapping *childRelationshipMapping in [(RKObjectMapping *)relationshipMapping.mapping relationshipMappings]) { + RKGatherManagedObjectsFromObjectWithRelationshipMapping(relatedObject, childRelationshipMapping, managedObjects); + } + } else if ([relationshipMapping.mapping isKindOfClass:[RKDynamicMapping class]]) { + for (RKObjectMapping *objectMapping in [(RKDynamicMapping *)relationshipMapping.mapping objectMappings]) { + @try { + for (RKRelationshipMapping *childRelationshipMapping in objectMapping.relationshipMappings) { + RKGatherManagedObjectsFromObjectWithRelationshipMapping(relatedObject, childRelationshipMapping, managedObjects); + } + } + @catch (NSException *exception) { + continue; + } + } + } + } +} + +static NSSet *RKManagedObjectsFromObjectWithMappingInfo(id object, RKMappingInfo *mappingInfo) +{ + NSMutableSet *managedObjects = [NSMutableSet set]; + + if ([mappingInfo.objectMapping isKindOfClass:[RKEntityMapping class]]) { + [managedObjects unionSet:RKFlattenCollectionToSet(object)]; + } + + if ([[mappingInfo propertyMappings] count] == 0) { + // This object was matched, but no changes were made. Gather all related objects + for (RKRelationshipMapping *relationshipMapping in [mappingInfo.objectMapping relationshipMappings]) { + RKGatherManagedObjectsFromObjectWithRelationshipMapping(object, relationshipMapping, managedObjects); + } + } else { + for (NSString *destinationKeyPath in mappingInfo.relationshipMappingInfo) { + id relationshipValue = nil; + // Objects in collection may have different types, so destination keypath may be not applicable to each of them + if([object conformsToProtocol:@protocol(NSFastEnumeration)]) { + NSMutableSet* results = [NSMutableSet set]; + for (id item in object) { + id value = nil; + @try { + value = [item valueForKeyPath:destinationKeyPath]; + } @catch(NSException*) { + continue; + } + if (value != nil) { + [results addObject:value]; + } + } + + relationshipValue = results; + } else { + relationshipValue = [object valueForKeyPath:destinationKeyPath]; + } + + NSArray *mappingInfos = (mappingInfo.relationshipMappingInfo)[destinationKeyPath]; + for (RKMappingInfo *relationshipMappingInfo in mappingInfos) { + NSUInteger index = [mappingInfos indexOfObject:relationshipMappingInfo]; + id mappedObjectAtIndex = ([relationshipValue respondsToSelector:@selector(objectAtIndex:)]) ? relationshipValue[index] : relationshipValue; + [managedObjects unionSet:RKFlattenCollectionToSet(RKManagedObjectsFromObjectWithMappingInfo(mappedObjectAtIndex, relationshipMappingInfo))]; + } + } + } + + return ([managedObjects count]) ? managedObjects : nil; +} + +static NSSet *RKManagedObjectsFromMappingResultWithMappingInfo(RKMappingResult *mappingResult, NSDictionary *mappingInfo) +{ + NSMutableSet *managedObjectsInMappingResult = nil; + NSDictionary *mappingResultDictionary = [mappingResult dictionary]; + + for (id rootKey in mappingInfo) { + NSArray *mappingInfoArray = mappingInfo[rootKey]; + id objectsAtRoot = mappingResultDictionary[rootKey]; + for (RKMappingInfo *mappingInfo in mappingInfoArray) { + NSUInteger index = [mappingInfoArray indexOfObject:mappingInfo]; + id mappedObjectAtIndex = ([objectsAtRoot respondsToSelector:@selector(objectAtIndex:)]) ? objectsAtRoot[index] : objectsAtRoot; + + NSSet *managedObjects = RKManagedObjectsFromObjectWithMappingInfo(mappedObjectAtIndex, mappingInfo); + if (managedObjects) { + if (! managedObjectsInMappingResult) managedObjectsInMappingResult = [NSMutableSet set]; + [managedObjectsInMappingResult unionSet:managedObjects]; + } + } + }; + + return managedObjectsInMappingResult; +} + +// Defined in RKObjectManager.h +BOOL RKDoesArrayOfResponseDescriptorsContainOnlyEntityMappings(NSArray *responseDescriptors); + +@interface RKObjectRequestOperation () +@property (nonatomic, strong, readwrite) NSError *error; +@property (nonatomic, strong, readwrite) RKMappingResult *mappingResult; +@end + +@interface RKManagedObjectRequestOperation () +// Core Data specific +@property (nonatomic, strong) NSManagedObjectContext *privateContext; +@property (nonatomic, copy) NSManagedObjectID *targetObjectID; +@property (nonatomic, strong) RKManagedObjectResponseMapperOperation *responseMapperOperation; +@property (nonatomic, copy) id (^willMapDeserializedResponseBlock)(id deserializedResponseBody); +@property (nonatomic, strong) NSDictionary *mappingInfo; +@property (nonatomic, strong) NSCachedURLResponse *cachedResponse; +@property (nonatomic, readonly) BOOL canSkipMapping; +@property (nonatomic, assign) BOOL hasMemoizedCanSkipMapping; +@property (nonatomic, copy) void (^willSaveMappingContextBlock)(NSManagedObjectContext *mappingContext); +@end + +@implementation RKManagedObjectRequestOperation + +@dynamic willMapDeserializedResponseBlock; +@synthesize canSkipMapping = _canSkipMapping; + +// Designated initializer +- (instancetype)initWithHTTPRequestOperation:(RKHTTPRequestOperation *)requestOperation responseDescriptors:(NSArray *)responseDescriptors +{ + self = [super initWithHTTPRequestOperation:requestOperation responseDescriptors:responseDescriptors]; + if (self) { + self.savesToPersistentStore = YES; + self.deletesOrphanedObjects = YES; + self.cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:requestOperation.request]; + } + return self; +} + +/** + NOTE: This dealloc implementation attempts to avoid crashes coming from Core Data due to the ordering of deallocations under ARC. If the MOC is deallocated before its managed objects, it can trigger a crash. We dispose of the mapping result and reset the private context to avoid this situation. The crash manifests itself in `cxx_destruct` + [sbw - 2/25/2013] + */ +- (void)dealloc +{ + _mappingResult = nil; + _responseMapperOperation = nil; + _privateContext = nil; +} + +- (void)setTargetObject:(id)targetObject +{ + [super setTargetObject:targetObject]; + + if ([targetObject isKindOfClass:[NSManagedObject class]]) { + if ([[targetObject objectID] isTemporaryID]) { + [[targetObject managedObjectContext] performBlockAndWait:^{ + NSError *error = nil; + BOOL success = [[targetObject managedObjectContext] obtainPermanentIDsForObjects:@[ targetObject ] error:&error]; + if (! success) RKLogWarning(@"Failed to obtain permanent objectID for targetObject: %@ (%ld)", [error localizedDescription], (long) error.code); + }]; + } + self.targetObjectID = [targetObject objectID]; + } else { + self.targetObjectID = nil; + } +} + +- (void)setManagedObjectContext:(NSManagedObjectContext *)managedObjectContext +{ + _managedObjectContext = managedObjectContext; + + if (managedObjectContext) { + [managedObjectContext performBlockAndWait:^{ + if ([managedObjectContext hasChanges]) { + if ([managedObjectContext.insertedObjects count] && [self.managedObjectCache respondsToSelector:@selector(didCreateObject:)]) { + for (NSManagedObject *managedObject in managedObjectContext.insertedObjects) { + [self.managedObjectCache didCreateObject:managedObject]; + } + } + + if ([managedObjectContext.updatedObjects count] && [self.managedObjectCache respondsToSelector:@selector(didFetchObject:)]) { + for (NSManagedObject *managedObject in managedObjectContext.updatedObjects) { + [self.managedObjectCache didFetchObject:managedObject]; + } + } + + if ([managedObjectContext.deletedObjects count] && [self.managedObjectCache respondsToSelector:@selector(didDeleteObject:)]) { + for (NSManagedObject *managedObject in managedObjectContext.deletedObjects) { + [self.managedObjectCache didDeleteObject:managedObject]; + } + } + } + }]; + + // Create a private context + NSManagedObjectContext *privateContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; + [privateContext setParentContext:managedObjectContext]; + [privateContext setMergePolicy:NSMergeByPropertyStoreTrumpMergePolicy]; + + self.privateContext = privateContext; + } else { + self.privateContext = nil; + } +} + +#pragma mark - RKObjectRequestOperation Overrides + +- (void)cancel +{ + [super cancel]; + [self.responseMapperOperation cancel]; +} + +// RKResponseHasBeenMappedCacheUserInfoKey is stored by RKObjectRequestOperation +- (BOOL)canSkipMapping +{ + BOOL (^shouldSkipMapping)(void) = ^{ + // Is the request cacheable + if (!self.cachedResponse) return NO; + if (!self.managedObjectCache) return NO; + NSURLRequest *request = self.HTTPRequestOperation.request; + if (! [[request HTTPMethod] isEqualToString:@"GET"] && ! [[request HTTPMethod] isEqualToString:@"HEAD"]) return NO; + NSHTTPURLResponse *response = (NSHTTPURLResponse *)self.HTTPRequestOperation.response; + if (! [RKCacheableStatusCodes() containsIndex:response.statusCode]) return NO; + + // Check if all the response descriptors are backed by Core Data + NSMutableArray *matchingResponseDescriptors = [NSMutableArray array]; + for (RKResponseDescriptor *responseDescriptor in self.responseDescriptors) { + if ([responseDescriptor matchesResponse:response]) [matchingResponseDescriptors addObject:responseDescriptor]; + } + if (! RKDoesArrayOfResponseDescriptorsContainOnlyEntityMappings(matchingResponseDescriptors)) return NO; + + // Check for a change in the Etag + NSString *cachedEtag = [(NSHTTPURLResponse *)[self.cachedResponse response] allHeaderFields][@"ETag"]; + NSString *responseEtag = [response allHeaderFields][@"ETag"]; + if (!(cachedEtag && responseEtag && [cachedEtag isEqualToString:responseEtag])) return NO; + + // Response data has changed + NSData *responseData = self.HTTPRequestOperation.responseData; + if (! [responseData isEqualToData:[self.cachedResponse data]]) return NO; + + // Check that we have mapped this response previously + NSCachedURLResponse *cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:request]; + return [(cachedResponse.userInfo)[RKResponseHasBeenMappedCacheUserInfoKey] boolValue]; + }; + + if (! self.hasMemoizedCanSkipMapping) { + _canSkipMapping = shouldSkipMapping(); + self.hasMemoizedCanSkipMapping = YES; + } + return _canSkipMapping; +} + +- (void)performMappingOnResponseWithCompletionBlock:(void(^)(RKMappingResult *mappingResult, NSError *error))completionBlock +{ + NSArray *fetchRequests = [self fetchRequestsMatchingResponseURL]; + if ([fetchRequests count] && [self canSkipMapping]) { + RKLogDebug(@"Managed object mapping requested for cached response which was previously mapped: skipping..."); + NSMutableArray *managedObjects = [NSMutableArray array]; + [self.privateContext performBlockAndWait:^{ + NSError *error = nil; + for (NSFetchRequest *fetchRequest in fetchRequests) { + NSArray *fetchedObjects = [self.privateContext executeFetchRequest:fetchRequest error:&error]; + if (fetchedObjects) { + [managedObjects addObjectsFromArray:fetchedObjects]; + } else { + RKLogError(@"Failed to execute fetch request %@: %@", fetchRequest, error); + } + } + }]; + RKMappingResult *mappingResult = [[RKMappingResult alloc] initWithDictionary:@{ [NSNull null]: managedObjects }]; + completionBlock(mappingResult, nil); + return; + } + + self.responseMapperOperation = [[RKManagedObjectResponseMapperOperation alloc] initWithRequest:self.HTTPRequestOperation.request + response:self.HTTPRequestOperation.response + data:self.HTTPRequestOperation.responseData + responseDescriptors:self.responseDescriptors]; + self.responseMapperOperation.mapperDelegate = self; + self.responseMapperOperation.mappingMetadata = self.mappingMetadata; + self.responseMapperOperation.targetObject = self.targetObject; + self.responseMapperOperation.targetObjectID = self.targetObjectID; + self.responseMapperOperation.managedObjectContext = self.privateContext; + self.responseMapperOperation.managedObjectCache = self.managedObjectCache; + [self.responseMapperOperation setWillMapDeserializedResponseBlock:self.willMapDeserializedResponseBlock]; + [self.responseMapperOperation setQueuePriority:[self queuePriority]]; + __weak __typeof(self)weakSelf = self; + [self.responseMapperOperation setDidFinishMappingBlock:^(RKMappingResult *mappingResult, NSError *responseMappingError) { + if ([weakSelf isCancelled]) return completionBlock(mappingResult, responseMappingError); + + BOOL success; + NSError *error = nil; + + // Handle any cleanup + if (weakSelf.targetObjectID + && NSLocationInRange(weakSelf.HTTPRequestOperation.response.statusCode, RKStatusCodeRangeForClass(RKStatusCodeClassSuccessful)) + && [[[weakSelf.HTTPRequestOperation.request HTTPMethod] uppercaseString] isEqualToString:@"DELETE"]) { + success = [weakSelf deleteTargetObject:&error]; + if (! success || [weakSelf isCancelled]) { + return completionBlock(nil, error); + } + } + + if (!responseMappingError) { + success = [weakSelf deleteLocalObjectsMissingFromMappingResult:mappingResult error:&error]; + if (! success || [weakSelf isCancelled]) { + return completionBlock(nil, error); + } + + // Persist our mapped objects + success = [weakSelf obtainPermanentObjectIDsForInsertedObjects:&error]; + if (! success || [weakSelf isCancelled]) { + return completionBlock(nil, error); + } + + success = [weakSelf saveContext:&error]; + if (! success || [weakSelf isCancelled]) { + return completionBlock(nil, error); + } + } + + // Refetch all managed objects nested at key paths within the results dictionary before returning + if (mappingResult) { + RKRefetchingMappingResult *refetchingMappingResult = [[RKRefetchingMappingResult alloc] initWithMappingResult:mappingResult + managedObjectContext:weakSelf.managedObjectContext + mappingInfo:weakSelf.mappingInfo]; + return completionBlock((RKMappingResult *)refetchingMappingResult, nil); + } + completionBlock(nil, responseMappingError); + }]; + [[RKObjectRequestOperation responseMappingQueue] addOperation:self.responseMapperOperation]; +} + +- (BOOL)deleteTargetObject:(NSError * __autoreleasing *)error +{ + __block BOOL _blockSuccess = YES; + + if (self.targetObjectID) { + // 2xx/404/410 DELETE request, proceed with deletion from the MOC + __block NSError *_blockError = nil; + [self.privateContext performBlockAndWait:^{ + NSManagedObject *backgroundThreadObject = [self.privateContext existingObjectWithID:self.targetObjectID error:&_blockError]; + if (backgroundThreadObject) { + RKLogInfo(@"Deleting local object %@ due to `DELETE` request", backgroundThreadObject); + [self.privateContext deleteObject:backgroundThreadObject]; + } else { + RKLogWarning(@"Unable to delete object sent with `DELETE` request: Failed to retrieve object with objectID %@", self.targetObjectID); + RKLogCoreDataError(_blockError); + _blockSuccess = NO; + *error = _blockError; + } + }]; + } + + return _blockSuccess; +} + +- (NSSet *)localObjectsFromFetchRequests:(NSArray *)fetchRequests matchingRequestURL:(NSError **)error +{ + NSMutableSet *localObjects = [NSMutableSet set]; + __block NSError *_blockError; + __block NSArray *_blockObjects; + + for (NSFetchRequest *fetchRequest in fetchRequests) { + [self.privateContext performBlockAndWait:^{ + _blockObjects = [self.privateContext executeFetchRequest:fetchRequest error:&_blockError]; + }]; + + if (_blockObjects == nil) { + if (error) *error = _blockError; + return nil; + } + RKLogTrace(@"Fetched local objects matching URL with fetch request '%@': %@", fetchRequest, _blockObjects); + [localObjects addObjectsFromArray:_blockObjects]; + + } + + return localObjects; +} + +- (NSArray *)fetchRequestsMatchingResponseURL +{ + // Pass the fetch request blocks a relative `NSURL` object if possible + NSMutableArray *fetchRequests = [NSMutableArray array]; + NSURL *URL = RKRelativeURLFromURLAndResponseDescriptors(self.HTTPRequestOperation.response.URL, self.responseDescriptors); + for (RKFetchRequestBlock fetchRequestBlock in [self.fetchRequestBlocks reverseObjectEnumerator]) { + NSFetchRequest *fetchRequest = fetchRequestBlock(URL); + if (fetchRequest) { + // Workaround for iOS 5 -- The log statement crashes if the entity is not assigned before logging + [fetchRequest setEntity:[[[self.privateContext persistentStoreCoordinator] managedObjectModel] entitiesByName][[fetchRequest entityName]]]; + RKLogDebug(@"Found fetch request matching URL '%@': %@", URL, fetchRequest); + [fetchRequests addObject:fetchRequest]; + } + } + return fetchRequests; +} + +- (BOOL)deleteLocalObjectsMissingFromMappingResult:(RKMappingResult *)mappingResult error:(NSError **)error +{ + if (! self.deletesOrphanedObjects) { + RKLogDebug(@"Skipping deletion of orphaned objects: disabled as deletesOrphanedObjects=NO"); + return YES; + } + + if (! [[self.HTTPRequestOperation.request.HTTPMethod uppercaseString] isEqualToString:@"GET"]) { + RKLogDebug(@"Skipping deletion of orphaned objects: only performed for GET requests."); + return YES; + } + + if ([self canSkipMapping]) { + RKLogDebug(@"Skipping deletion of orphaned objects: 304 (Not Modified) status code encountered"); + return YES; + } + + // Determine if there are any fetch request blocks to use for orphaned object cleanup + NSArray *fetchRequests = [self fetchRequestsMatchingResponseURL]; + if (! [fetchRequests count]) return YES; + + // Proceed with cleanup + __block NSSet *managedObjectsInMappingResult; + [self.privateContext performBlockAndWait:^{ + managedObjectsInMappingResult = RKManagedObjectsFromMappingResultWithMappingInfo(mappingResult, self.mappingInfo) ?: [NSSet set]; + }]; + NSSet *localObjects = [self localObjectsFromFetchRequests:fetchRequests matchingRequestURL:error]; + if (! localObjects) { + RKLogError(@"Failed when attempting to fetch local candidate objects for orphan cleanup: %@", error ? *error : nil); + return NO; + } + RKLogDebug(@"Checking mappings result of %ld objects for %ld potentially orphaned local objects...", (long) [managedObjectsInMappingResult count], (long) [localObjects count]); + + NSMutableSet *orphanedObjects = [localObjects mutableCopy]; + [orphanedObjects minusSet:managedObjectsInMappingResult]; + RKLogDebug(@"Deleting %lu orphaned objects found in local database, but missing from mapping result", (unsigned long) [orphanedObjects count]); + + if ([orphanedObjects count]) { + [self.privateContext performBlockAndWait:^{ + for (NSManagedObject *orphanedObject in orphanedObjects) { + [self.privateContext deleteObject:orphanedObject]; + } + }]; + } + + return YES; +} + +/** + NOTE: This is more or less a direct port of the functionality provided by `[NSManagedObjectContext saveToPersistentStore:]` in the `RKAdditions` category. We have duplicated the logic here to add in support for checking if the operation has been cancelled since we began cascading up the MOC chain. Because each `performBlockAndWait:` invocation essentially jumps threads and is subject to the availability of the context, it is very possible for the operation to be cancelled during this part of the operation's lifecycle. + */ +- (BOOL)saveContextToPersistentStore:(NSManagedObjectContext *)contextToSave failedContext:(NSManagedObjectContext **)failedContext error:(NSError **)error +{ + __block NSError *localError = nil; + while (contextToSave) { + __block BOOL success; + [contextToSave performBlockAndWait:^{ + if (! [self isCancelled]) { + success = [contextToSave save:&localError]; + if (! success && localError == nil) RKLogWarning(@"Saving of managed object context failed, but a `nil` value for the `error` argument was returned. This typically indicates an invalid implementation of a key-value validation method exists within your model. This violation of the API contract may result in the save operation being mis-interpretted by callers that rely on the availability of the error."); + } else { + // We have been cancelled while the save is in progress -- bail + success = NO; + } + }]; + + if (! success) { + if (error) *error = localError; + *failedContext = contextToSave; + return NO; + } + + if (! contextToSave.parentContext && contextToSave.persistentStoreCoordinator == nil) { + RKLogWarning(@"Reached the end of the chain of nested managed object contexts without encountering a persistent store coordinator. Objects are not fully persisted."); + *failedContext = contextToSave; + return NO; + } + contextToSave = contextToSave.parentContext; + } + + return YES; +} + +- (BOOL)saveContext:(NSManagedObjectContext *)context error:(NSError **)error +{ + __block BOOL success = YES; + __block NSError *localError = nil; + __block NSManagedObjectContext *failedContext = nil; + if (self.savesToPersistentStore) { + success = [self saveContextToPersistentStore:context failedContext:&failedContext error:&localError]; + } else { + [context performBlockAndWait:^{ + success = ([self isCancelled]) ? NO : [context save:&localError]; + if (!success) { + failedContext = context; + } + }]; + } + if (success) { + if ([self.targetObject isKindOfClass:[NSManagedObject class]]) { + [self.managedObjectContext performBlock:^{ + RKLogDebug(@"Refreshing mapped target object %@ in context %@", self.targetObject, self.managedObjectContext); + if (! [self isCancelled]) [self.managedObjectContext refreshObject:self.targetObject mergeChanges:YES]; + }]; + } + } else { + if (error) *error = localError; + // Logging the error requires calling -[NSManagedObject description] which + // can only be done on the context's queue + [failedContext performBlock:^{ + RKLogError(@"Failed saving managed object context %@ %@: %@", (self.savesToPersistentStore ? @"to the persistent store" : @""), context, localError); + RKLogCoreDataError(localError); + }]; + } + + return success; +} + +- (BOOL)saveContext:(NSError **)error +{ + if (self.willSaveMappingContextBlock) { + self.mappingResult = _responseMapperOperation.mappingResult; + [self.privateContext performBlockAndWait:^{ + self.willSaveMappingContextBlock(self.privateContext); + }]; + } + + __block BOOL hasChanges; + [self.privateContext performBlockAndWait:^{ + hasChanges = [self.privateContext hasChanges]; + }]; + if (hasChanges) { + return [self saveContext:self.privateContext error:error]; + } else if ([self.targetObject isKindOfClass:[NSManagedObject class]]) { + NSManagedObjectContext *context = [(NSManagedObject *)self.targetObject managedObjectContext]; + __block BOOL isNew = NO; + [context performBlockAndWait:^{ + isNew = [(NSManagedObject *)self.targetObject isNew]; + }]; + // Object was like POST'd in an unsaved state and we wish to persist + if (isNew) [self saveContext:context error:error]; + } + + return YES; +} + +- (BOOL)obtainPermanentObjectIDsForInsertedObjects:(NSError **)error +{ + __block BOOL _blockSuccess = YES; + __block NSError *localError = nil; + [self.privateContext performBlockAndWait:^{ + NSArray *insertedObjects = [[self.privateContext insertedObjects] allObjects]; + RKLogDebug(@"Obtaining permanent ID's for %ld managed objects", (unsigned long) [insertedObjects count]); + _blockSuccess = [self.privateContext obtainPermanentIDsForObjects:insertedObjects error:&localError]; + }]; + if (!_blockSuccess && error) *error = localError; + + return _blockSuccess;; +} + +- (void)mapperDidFinishMapping:(RKMapperOperation *)mapper +{ + self.mappingInfo = mapper.mappingInfo; +} + +- (void)willFinish +{ + NSMutableIndexSet *deleteableStatusCodes = [NSMutableIndexSet indexSet]; + [deleteableStatusCodes addIndex:404]; // Not Found + [deleteableStatusCodes addIndex:410]; // Gone + if (self.error && self.targetObjectID + && [[[self.HTTPRequestOperation.request HTTPMethod] uppercaseString] isEqualToString:@"DELETE"] + && [deleteableStatusCodes containsIndex:self.HTTPRequestOperation.response.statusCode]) { + NSError *error = nil; + if (! [self deleteTargetObject:&error]) { + RKLogWarning(@"Secondary error encountered while attempting to delete target object in response to 404 (Not Found) or 410 (Gone) status code: %@", error); + self.error = error; + } else { + if (! [self saveContext:&error]) { + + } else { + // All good, clear any errors + self.error = nil; + } + } + } +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + RKManagedObjectRequestOperation *operation = (RKManagedObjectRequestOperation *)[super copyWithZone:zone]; + operation.managedObjectContext = self.managedObjectContext; + operation.managedObjectCache = self.managedObjectCache; + operation.fetchRequestBlocks = self.fetchRequestBlocks; + operation.deletesOrphanedObjects = self.deletesOrphanedObjects; + operation.savesToPersistentStore = self.savesToPersistentStore; + + return operation; +} + +@end + +#endif +#endif diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKObjectManager.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKObjectManager.h new file mode 100644 index 0000000..de3ddad --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKObjectManager.h @@ -0,0 +1,891 @@ +// +// RKObjectManager.h +// RestKit +// +// Created by Jeremy Ellison on 8/14/09. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKRouter.h" +#import "RKPaginator.h" +#import "RKMacros.h" + +#import "AFRKNetworking.h" + +#if __has_include("CoreData.h") +# define RKCoreDataIncluded +#endif + +@protocol RKSerialization; +@class RKManagedObjectStore, RKObjectRequestOperation, RKManagedObjectRequestOperation, +RKMappingResult, RKRequestDescriptor, RKResponseDescriptor; + +/** + The `RKObjectManager` class provides a centralized interface for performing object mapping based HTTP request and response operations. It encapsulates common configuration such as request/response descriptors and routing, provides for the creation of `NSURLRequest` and `RKObjectRequestOperation` objects, and one-line methods to enqueue object request operations for the basic HTTP request methods (GET, POST, PUT, DELETE, etc). + + ## Object Request Operations + + Object request operations model the lifecycle of an object mapped HTTP request from start to finish. They are initialized with a fully configured `NSURLRequest` object and a set of `RKResponseDescriptor` objects that specify how an HTTP response is to be mapped into local domain objects. Object request operations may be constructed as standalone objects, but are often constructed through an `RKObjectManager` object. The object request operation encapsulates the functionality of two underlying operations that perform the bulk of the work. The HTTP request and response loading is handled by an `RKHTTPRequestOperation`, which is responsible for the HTTP transport details. Once a response has been successfully loaded, the object request operation starts an `RKResponseMapperOperation` that is responsible for handling the mapping of the response body. When working with Core Data, the `RKManagedObjectRequestOperation` class is used. The object manager encapsulates the Core Data configuration details and provides an interface that will return the appropriate object request operation for a request through the `appropriateObjectRequestOperationWithObject:method:path:parameters:` method. + + ## Base URL, Relative Paths and Path Patterns + + Each object manager is configured with a base URL that defines the URL that all request sent through the manager will be relative to. The base URL is configured directly through the `managerWithBaseURL:` method or is inherited from an AFNetworking `AFHTTPClient` object if the manager is initialized via the `initWithHTTPClient:` method. The base URL can point directly at the root of a URL or may include a path. + + Many of the methods of the object manager accept a path argument, either directly or in the form of a path pattern. Whenever a path is provided to the object manager directly, as part of a request or response descriptor (see "Request and Response Descriptors"), or via a route (see the "Routing" section), the path is used to construct an `NSURL` object with `[NSURL URLWithString:relativeToURL:]`. The rules for the evaluation of a relative URL can at times be surprising and many configuration errors result from incorrectly configuring the `baseURL` and relative paths thereof. For reference, here are some examples borrowed from the AFNetworking documentation detailing how base URL's and relative paths interact: + + NSURL *baseURL = [NSURL URLWithString:@"http://example.com/v1/"]; + [NSURL URLWithString:@"foo" relativeToURL:baseURL]; // http://example.com/v1/foo + [NSURL URLWithString:@"foo?bar=baz" relativeToURL:baseURL]; // http://example.com/v1/foo?bar=baz + [NSURL URLWithString:@"/foo" relativeToURL:baseURL]; // http://example.com/foo + [NSURL URLWithString:@"foo/" relativeToURL:baseURL]; // http://example.com/v1/foo + [NSURL URLWithString:@"/foo/" relativeToURL:baseURL]; // http://example.com/foo/ + [NSURL URLWithString:@"http://example2.com/" relativeToURL:baseURL]; // http://example2.com/ + + Keep these rules in mind when providing relative paths to the object manager. + + Path patterns are a common unit of abstraction in RestKit for describing the path portion of URL's. When working with API's, there is typically one or more dynamic portions of the URL that correspond to primary keys or other identifying resource attributes. For example, a blogging application may represent articles in a URL structure such as '/articles/1234' and comments about an article might appear at '/articles/1234/comments'. These path structures could be represented as the path patterns '/articles/:articleID' and '/articles/:articleID/comments', substituing the dynamic key ':articleID' in place of the primary key of in the path. These keys can be used to interpolate a path with an object's property values using key-value coding or be used to match a string. + + Path patterns appear throughout RestKit, but the most fundamental uses are for the dynamic generation of URL paths from objects and the matching of request and response URLs for mapping configuration. When generating a URL, a path pattern is interpolated with the value of an object. Consider this example: + + // Set object attributes + RKArticle *article = [RKArticle new]; + article.articleID = @12345; + + // Interpolate with the object + NSString *path = RKPathFromPatternWithObject(@"/articles/:articleID", article); + NSLog(@"The path is %@", path); // prints /articles/12345 + + This may at first glance appear to provide only a small syntactic improvement over using `[NSString stringWithFormat:]`, but it becomes more interesting once you consider that the dynamic key can include key path: + + RKCategory *category = [RKCategory new]; + comment.name = @"RestKit; + article.category = category; + + NSString *path = RKPathFromPatternWithObject(@"/categories/:comment.name/articles/:articleID/comments/", article); + NSLog(@"The path is %@", path); // prints /categories/RestKit/articles/12345 + + These path patterns can then be registered with the manager via an `RKRoute` object (discussed in detail below), enabling one to perform object request operations like so: + + RKObjectManager *manager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://restkit.org"]]; + [manager.router.routeSet addRoute:[RKRoute routeWithClass:[RKArticle class] pathPattern:@"/categories/:comment.name/articles/:articleID/comments/" method:RKRequestMethodGET]]; + + // Now GET our article object... sending a GET to '/categories/RestKit/articles/12345' + [manager getObject:article path:nil parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *result) { + NSLog(@"Loading mapping result: %@", result); + } failure:nil]; + + Once a path pattern has been registered via the routing system, the manager can automatically build full request URL's when given nothing but the object to be sent. + + The second use case of path patterns is in the matching of path into a dictionary of attributes. In this case, the path pattern is evaluatd against a string and used to construct an `NSDictionary` object containing the matched key paths, optionally including the values of a query string. This functionality is provided via the `RKPathMatcher` class and is discussed in detail in the accompanying documentation. + + ### Escaping Path Patterns + + Note that path patterns will by default interpret anything prefixed with a period that follows a dynamic path segment as a key path. This can cause an issue if you have a dynamic path segment that is followed by a file extension. For example, a path pattern of '/categories/:categoryID.json' would be erroneously interpretted as containing a dynamic path segment whose value is interpolated from the 'categoryID.json' key path. This key path evaluation behavior can be suppressed by escaping the period preceding the non-dynamic part of the pattern with two leading slashes, as in '/categories/:categoryID\\.json'. + + ## Request and Response Descriptors + + RestKit centralizes configuration for object mapping configurations into the object manager through `RKRequestDescriptor` and `RKResponseDescriptor` objects. A collection of each of these object types are maintained by the manager and used to initialize all `RKObjectRequestOperation` objects created by the manager. + + Request descriptors describe how `NSURLRequest` objects constructed by the manager will be built by specifying how the attributes and relationships for a given class will be object mapped to construct request parameters and what, if any, root key path the parameters will be nested under. Request descriptor objects can also be used with the `RKObjectParameterization` class to map an object into an `NSDictionary` representation that is suitable for use as the parameters of a request. + + Response descriptors describe how `NSHTTPURLResponse` objects loaded by object request operations sent by the manager are to be object mapped into local domain objects. Response descriptors are matched against a given response via URL path matching, parsed content key path matching, or both. The `RKMapping` object associated from a matched `RKResponseDescriptor` is given to an instance of `RKMapperOperation` with the parsed response body to perform object mapping on the response. + + To better illustrate these concepts, consider the following example for an imaginary Wiki client application: + + @interface RKWikiPage : NSObject + @property (nonatomic, copy) NSString *title; + @property (nonatomic, copy) NSString *body; + @end + + // Construct a request mapping for our class + RKObjectMapping *requestMapping = [RKObjectMapping requestMapping]; + [requestMapping addAttributeMappingsFromDictionary:@{ @"title": @"title", @"body": @"body" }]; + + // We wish to generate parameters of the format: + // @{ @"page": @{ @"title": @"An Example Page", @"body": @"Some example content" } } + RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping + objectClass:[RKWikiPage class] + rootKeyPath:@"page"]; + + // Construct an object mapping for the response + // We are expecting JSON in the format: + // {"page": {"title": "", "body": "<body value>"} + RKObjectMapping *responseMapping = [RKObjectMapping mappingForClass:[RKWikiPage class]]; + [responseMapping addAttributeMappingsFromArray:@[ @"title", @"body" ]]; + + // Construct a response descriptor that matches any URL (the pathPattern is nil), when the response payload + // contains content nested under the `@"page"` key path, if the response status code is 200 (OK) + RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:responseMapping + pathPattern:nil + keyPath:@"page" + statusCodes:[NSIndexSet indexSetWithIndex:200]]; + + // Register our descriptors with a manager + RKObjectManager *manager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://restkit.org/"]]; + [manager addRequestDescriptor:requestDescriptor]; + [manager addResponseDescriptor:responseDescriptor]; + + // Work with the object + RKWikiPage *page = [RKWikiPage new]; + page.title = @"An Example Page"; + page.body = @"Some example content"; + + // POST the parameterized representation of the `page` object to `/posts` and map the response + [manager postObject:page path:@"/pages" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *result) { + NSLog(@"We object mapped the response with the following result: %@", result); + } failure:nil]; + + In the above example, request and response mapping configurations were described for a simple data model and then used to perform a basic POST operation and map the results. An arbitrary number of request and response descriptors may be added to the manager to accommodate your application's needs. + + ## Multi-object Parameterization + + The object manager provides support for the parameterization of multiple objects provided as an array. The `requestWithObject:method:path:parameters:` and `multipartFormRequestWithObject:method:path:parameters:constructingBodyWithBlock:` methods can parameterize an array of objects for you provided that the `RKRequestDescriptor` objects are configured in a compatible way. The rules for multi-object parameterization are simple: + + 1. If a `nil` root key path is used, then it must be used for all objects in the array. This is because the objects will be parameterized into a dictionary and then each dictionary will be added to an array. This array is then serialized for transport, so objects parameterized to a non-nil key path cannot be merged with the array. + 1. If a `nil` root key path is used to parameterize the array of objects, then you cannot provide additional parameters to be merged with the request. This is again because you cannot merge a dictionary with an array. + + If non-nil key paths are used, then each object will be set in the parameters dictionary at the specified key path. If more than one object uses the same root key path, then the parameters will be combined into an array for transport. + + ## MIME Types + + MIME Types serve an important function to the object manager. They are used to identify how content is to be serialized when constructing request bodies and also used to set the 'Accept' header for content negotiation. RestKit aspires to be content type agnostic by leveraging the pluggable `RKMIMESerialization` class to handle content serialization and deserialization. + + ## Routing + + Routing is the process of generating an `NSURL` appropriate for a particular HTTP server request interaction. Using routing instead of hard-coding paths enables centralization of configuration and allows the developer to focus on what they want done rather than the details of how to do it. Changes to the URL structure in the application can be made in one place. Routes can also be useful in testing, as they permit for the changing of paths at run-time. + + Routing interfaces are provided by the `RKRouter` class. Each object manager is in initialized with an `RKRouter` object with a baseURL equal to the baseURL of the underlying `AFHTTPClient` object. Each `RKRouter` instance maintains an `RKRouteSet` object that manages a collection of `RKRoute` objects. Routes are defined in terms of a path pattern. + + There are three types of routes currently supported: + + 1. Class Routes. Class routes are configured to target a given object class and HTTP request method. For example, we might route the HTTP `GET` for a `User` class to the path pattern `@"/users/:userID"`. + 1. Relationship Routes. Relationship routes identify the path appropriate for performing a request for an object that is related to another object. For example, each `User` may have many friends. This might be routed as a relationship route for the `User` class with the name `@"friends"` to the path pattern `@"/users/:userID/friends"`. + 1. Named Routes. Names routes bind an arbitrary name to a path. For example, there might be an action to follow another user that could be added as a named route with the name `@"follow_user"` that generates a `POST` to the path pattern `@"/users/:userID/follow"`. + + To better understand these concepts, please consider the following example code for configuring the above routing examples: + + RKObjectManager *manager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://restkit.org"]]; + + // Class Route + [manager.router.routeSet addRoute:[RKRoute routeWithClass:[User class] pathPattern:@"/users/:userID" method:RKRequestMethodGET]]; + + // Relationship Route + [manager.router.routeSet addRoute:[RKRoute routeWithRelationshipName:@"friends" objectClass:[User class] pathPattern:@"/users/:userID/friends" method:RKRequestMethodGET]]; + + // Named Route + [manager.router.routeSet addRoute:[RKRoute routeWithName:@"follow_user" pathPattern:@"/users/:userID/follow" method:RKRequestMethodPOST]]; + + Once configured, routes will be consulted by the object manager whenever the path parameter provided to a method is given as nil. For example, invoking the following code would result in a `GET` to the path `@"/users/1234"`: + + User *user = [User new]; + user.userID = 1234; + [manager getObject:user path:nil parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *result) { + // Request + } failure:nil]; + + Routes can also be explicitly used to construct `NSMutableURLRequest` objects and are referenced explicitly in a few object request operation methods: + + 1. `requestWithObject:method:path:parameters:` - Consults routing when path is nil. + 1. `multipartFormRequestWithObject:method:path:parameters:constructingBodyWithBlock:` - Consults routing when path is nil. + 1. `requestWithPathForRouteNamed:object:parameters:` - Explicitly retrieves the route with the given name. + 1. `getObjectsAtPathForRelationship:ofObject:parameters:success:failure:` - Explicitly retrieves the route for the given name and object class. + 1. `getObjectsAtPathForRouteNamed:object:parameters:success:failure:` - Explicitly retrieves the route for the given name. + + Please see the documentation for `RKRouter`, `RKRouteSet`, and `RKRoute` for more details about the routing classes. + + ## Metadata Mapping + + The `RKObjectManager` class has integrated support for metadata mapping. Metdata mapping enables the object mapping of supplemental information external to the object representation loaded via an HTTP response. Object request operations constructed by the manager make the following metadata key paths available for mapping: + + 1. `@metadata.routing.parameters` - A dictionary whose keys are the key paths matched from the path pattern of the `RKRoute` object used to construct the request URL and whose values are taken by evaluating the key path against the object interpolated with the route. Only available when routing was used to construct the request URL. + 1. `@metadata.routing.route` - The route object used to construct the request URL. + + Please refer to the documentation accompanying `RKMappingOperation` for more details on metadata mapping. + + ## Core Data + + RestKit features deep integration with Apple's Core Data persistence framework. The object manager provides access to this integration by creating `RKManagedObjectRequestOperation` objects when an attempt is made to interact with a resource that has been mapped using an `RKEntityMapping`. To utilize the Core Data integration, the object manager must be provided with a fully configured `RKManagedObjectStore` object. The `RKManagedObjectStore` provides access to the `NSManagedObjectModel` and `NSManagedObjectContext` objects required to peform object mapping that targets a Core Data entity. + + Please see the documentation for `RKManagedObjectStore`, `RKEntityMapping`, and `RKManagedObjectRequestOperation` for in depth information about Core Data in RestKit. + + ## Customization & Subclassing Notes + + The object manager is designed to support subclassing. The default behaviors can be altered and tailored to the specific needs of your application easily by manipulating a few core methods: + + * `requestWithObject:method:path:parameters:` - Used to construct all `NSMutableURLRequest` objects used by the manager. + * `objectRequestOperationWithRequest:success:failure:` - Used to construct all non-managed object request operations for the manager. Provide a subclass implementation if you wish to alter the behavior of all unmanaged object request operations. + * `managedObjectRequestOperationWithRequest:managedObjectContext:success:failure:` - Used to construct all managed object request operations for the manager. Provide a subclass implementation if you wish to alter the behavior of all managed object request operations. + * `appropriateObjectRequestOperationWithObject:method:path:parameters:` - Used to construct all object request operations for the manager, both managed and unmanaged. Invokes either `objectRequestOperationWithRequest:success:failure:` or `managedObjectRequestOperationWithRequest:managedObjectContext:success:failure:` to construct the actual request. Provide a subclass implementation to alter behaviors for all object request operations constructed by the manager. + * `enqueueObjectRequestOperation:` - Invoked to enqueue all operations constructed by the manager that are to be started as soon as possible. Provide a subclass implementation if you wish to work with object request operations as they are be enqueued. + + If you wish to more specifically customize the behavior of the lower level HTTP details, you have several options. All HTTP requests made by the `RKObjectManager` class are made with an instance of the `RKHTTPRequestOperation` class, which is a subclass of the `AFHTTPRequestOperation` class from AFNetworking. This operation class implements the `NSURLConnectionDelegate` and `NSURLConnectionDataDelegate` protocols and as such, has full access to all details of the HTTP request/response cycle exposed by `NSURLConnection`. You can provide the object manager with your own custom subclass of `RKHTTPRequestOperation` to the manager via the `registerRequestOperationClass:` method and all HTTP requests made through the manager will pass through your operation. + + You can also customize the HTTP details at the AFNetworking level by subclassing `AFHTTPClient` and using an instance of your subclassed client to initialize the manager. + + @warning Note that when subclassing `AFHTTPClient` to change object manager behaviors it is not possible to alter the paramters of requests that are constructed on behalf of the manager. This is because the object manager handles its own serialization and construction of the request body, but defers to the `AFHTTPClient` for all other details (such as default HTTP headers, etc). + + @see `RKObjectRequestOperation` + @see `RKRouter` + @see `RKPathMatcher` + @see `RKMIMETypeSerialization` + */ +@interface RKObjectManager : NSObject + +///---------------------------------------------- +/// @name Configuring the Shared Manager Instance +///---------------------------------------------- + +/** + Return the shared instance of the object manager + + @return The shared manager instance. + */ ++ (instancetype)sharedManager; + +/** + Set the shared instance of the object manager + + @param manager The new shared manager instance. + */ ++ (void)setSharedManager:(RKObjectManager *)manager; + +///------------------------------------- +/// @name Initializing an Object Manager +///------------------------------------- + +/** + Creates and returns a new `RKObjectManager` object initialized with a new `AFHTTPClient` object that was in turn initialized with the given base URL. The RestKit defaults are applied to the object manager. + + When initialized with a base URL, the returned object manager will have a `requestSerializationMIMEType` with the value of `RKMIMETypeFormURLEncoded` and the underlying `HTTPClient` will have a default value for the 'Accept' header set to `RKMIMETypeJSON`, and the `AFJSONRequestOperation` class will be registered. + + @param baseURL The base URL with which to initialize the `AFHTTPClient` object + @return A new `RKObjectManager` initialized with an `AFHTTPClient` that was initialized with the given baseURL. + */ ++ (instancetype)managerWithBaseURL:(NSURL *)baseURL; + +/** + Initializes the receiver with the given AFNetworking HTTP client object, adopting the network configuration from the client. + + This is the designated initializer. If the `sharedManager` instance is `nil`, the receiver will be set as the `sharedManager`. The default headers and parameter encoding of the given HTTP client are adopted by the receiver to initialize the values of the `defaultHeaders` and `requestSerializationMIMEType` properties. + + @param client The AFNetworking HTTP client with which to initialize the receiver. + @return The receiver, initialized with the given client. + */ +- (instancetype)initWithHTTPClient:(AFRKHTTPClient *)client NS_DESIGNATED_INITIALIZER; + +///------------------------------------------ +/// @name Accessing Object Manager Properties +///------------------------------------------ + +/** + The AFNetworking HTTP client with which the receiver makes requests. + */ +@property (nonatomic, strong, readwrite) AFRKHTTPClient *HTTPClient; + +/** + The base URL of the underlying HTTP client. + */ +@property (nonatomic, readonly) NSURL *baseURL; + +/** + The default HTTP headers for all `NSURLRequest` objects constructed by the object manager. + + The returned dictionary contains all of the default headers set on the underlying `AFHTTPClient` object and the value of the 'Accept' header set on the object manager, if any. + + @see `setAcceptHeaderWithMIMEType:` + */ +@property (nonatomic, readonly) NSDictionary *defaultHeaders; + +/** + The operation queue which manages operations enqueued by the object manager. + */ +@property (nonatomic, strong) NSOperationQueue *operationQueue; + +/** + The router used to generate URL objects for routable requests created by the manager. + + @see `RKRouter` + @see `RKRoute` + */ +@property (nonatomic, strong) RKRouter *router; + +///-------------------------------------------------- +/// @name Configuring Request and Response MIME Types +///-------------------------------------------------- + +/** + The MIME Type to serialize request parameters into when constructing request objects. + + The value of the `requestSerializationMIMEType` is used to obtain an appropriate `RKSerialization` conforming class from the `RKMIMESerialization` interface. Parameterized objects and dictionaries of parameters are then serialized for transport using the class registered for the MIME Type. By default, the value is `RKMIMETypeFormURLEncoded` which means that the request body of all `POST`, `PUT`, and `PATCH` requests will be sent in the URL encoded format. This is analagous to submitting an HTML form via a web browser. Other common formats include `RKMIMETypeJSON`, which will cause request bodies to be encoded as JSON. + + The value given for the `requestSerializationMIMEType` must correspond to a MIME Type registered via `[RKMIMETypeSerialization registerClass:forMIMEType:]`. Implementations are provided by default for `RKMIMETypeFormURLEncoded` and `RKMIMETypeJSON`. + + **Default**: `RKMIMETypeFormURLEncoded` or the value of the parameter encoding for the underlying `AFHTTPClient`. + */ +@property (nonatomic, strong) NSString *requestSerializationMIMEType; + +/** + Sets a default header on the HTTP client for the HTTP "Accept" header to specify the preferred serialization format for retrieved data. + + This method is a convenience method whose implementation is equivalent to the following example code: + + [manager.HTTPClient setDefaultHeader:@"Accept" value:MIMEType]; + + @param MIMEType The MIME Type to set as the value for the HTTP "Accept" header. + */ +- (void)setAcceptHeaderWithMIMEType:(NSString *)MIMEType; + +///------------------------------- +/// @name Creating Request Objects +///------------------------------- + +/** + Creates and returns an `NSMutableURLRequest` object with a given object, method, path, and parameters. + + The manager is searched for an `RKRequestDescriptor` object with an objectClass that matches the class of the given object. If found, the matching request descriptor and object are used to build a parameterization of the object's attributes using the `RKObjectParameterization` class if the request method is a `POST`, `PUT`, or `PATCH`. The parameterized representation of the object is reverse merged with the given parameters dictionary, if any, and then serialized and set as the request body. If the HTTP method is `GET` or `DELETE`, the object will not be parameterized and the given parameters, if any, will be used to construct a url-encoded query string that is appended to the request's URL. + + If the given path is nil, the router is searched for a class route with the class of the object andthe method. The path pattern of the retrieved route is interpolated with the object and the resulting path is appended to the HTTP client's base URL and used as the request URL. + + @param object The object with which to construct the request. For the `POST`, `PUT`, and `PATCH` request methods, the object will parameterized using the `RKRequestDescriptor` for the object. + @param method The HTTP method for the request, such as `GET`, `POST`, `PUT`, or `DELETE`. + @param path The path to be appended to the HTTP client's base URL and used as the request URL. If nil, the router is consulted. + @param parameters The parameters to be either set as a query string for `GET` requests, or reverse merged with the parameterization of the object and set as the request HTTP body. + + @return An `NSMutableURLRequest` object. + @see RKObjectParameterization + @see RKRouter + */ +- (NSMutableURLRequest *)requestWithObject:(id)object + method:(RKRequestMethod)method + path:(NSString *)path + parameters:(NSDictionary *)parameters; + +/** + Creates an `NSMutableURLRequest` object with the specified HTTP method and path, and constructs a `multipart/form-data` HTTP body, using the specified parameters and multipart form data block. See http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.2 + + This method wraps the underlying `AFHTTPClient` method `multipartFormRequestWithMethod:path:parameters:constructingBodyWithBlock` and adds routing and object parameterization. + + @param object The object with which to construct the request. For the `POST`, `PUT`, and `PATCH` request methods, the object will parameterized using the `RKRequestDescriptor` for the object. + @param method The HTTP method for the request, such as `GET`, `POST`, `PUT`, or `DELETE`. + @param path The path to be appended to the HTTP client's base URL and used as the request URL. If nil, the router is consulted. + @param parameters The parameters to be either set as a query string for `GET` requests, or reverse merged with the parameterization of the object and set as the request HTTP body. + @param block A block that takes a single argument and appends data to the HTTP body. The block argument is an object adopting the `AFMultipartFormData` protocol. This can be used to upload files, encode HTTP body as JSON or XML, or specify multiple values for the same parameter, as one might for array values. + @return An `NSMutableURLRequest` object. + @warning An exception will be raised if the specified method is not `POST`, `PUT` or `DELETE`. + @see [AFHTTPClient multipartFormRequestWithMethod:path:parameters:constructingBodyWithBlock] + */ +- (NSMutableURLRequest *)multipartFormRequestWithObject:(id)object + method:(RKRequestMethod)method + path:(NSString *)path + parameters:(NSDictionary *)parameters + constructingBodyWithBlock:(void (^)(id <AFRKMultipartFormData> formData))block; + +/** + Creates an `NSMutableURLRequest` object with the `NSURL` returned by the router for the given route name and object and the given parameters. + + The implementation invokes `requestWithObject:method:path:parameters:` after constructing the path with the given route. + + @param routeName The name of the route object containing the path pattern which is to be interpolated against the given object, appended to the HTTP client's base URL and used as the request URL. + @param object The object with which to interpolate the path pattern of the named route. Can be nil. + @param parameters The parameters to be either set as a query string for `GET` requests, or the request HTTP body. + @return An `NSMutableRequest` object. + + @see `requestWithObject:method:path:parameters` + */ +- (NSMutableURLRequest *)requestWithPathForRouteNamed:(NSString *)routeName + object:(id)object + parameters:(NSDictionary *)parameters; +/** + Creates an `NSMutableURLRequest` object with the `NSURL` returned by the router for the relationship of the given object and the given parameters. + + The implementation invokes `requestWithObject:method:path:parameters:` after constructing the path with the given route. + + Creates an `RKObjectRequestOperation` with a `GET` request for the relationship with the given name of the given object, and enqueues it to the manager's operation queue. + + @param relationship The name of the relationship being loaded. Used to retrieve the `RKRoute` object from the router for the given object's class and the relationship name. Cannot be nil. + @param object The object for which related objects are being loaded. Evaluated against the `RKRoute` for the relationship for the object's class with the given name to compute the path. Cannot be nil. + @param method The HTTP method for the request. + @param parameters The parameters to be encoded and appended as the query string for the request URL, or parameterized and set as the request body. May be nil. + @return An `NSMutableURLRequest` object for the specified relationship. + + @raises NSInvalidArgumentException Raised if no route is configured for a relationship of the given object's class with the given name. + @see `requestWithObject:method:path:parameters` + */ +- (NSMutableURLRequest *)requestWithPathForRelationship:(NSString *)relationship + ofObject:(id)object + method:(RKRequestMethod)method + parameters:(NSDictionary *)parameters; + +///----------------------------------------- +/// @name Creating Object Request Operations +///----------------------------------------- + +/** + Attempts to register a subclass of `RKHTTPRequestOperation` or `RKObjectRequestOperation`, adding it to a list of classes that are consulted each time the receiver needs to construct an HTTP or object request operation with a URL request. + + When `objectRequestOperationWithRequest:success:failure:` or `managedObjectRequestOperationWithRequest:managedObjectContext:success:failure:` is invoked, each registered subclass is consulted to see if it can handle the request. The first class to return `YES` when sent a `+ canProcessRequest:` message is used to create an operation using `initWithHTTPRequestOperation:responseDescriptors:`. The type of HTTP request operation used to initialize the object request operation is determined by evaluating the subclasses of `RKHTTPRequestOperation` registered via `registerRequestOperationClass:` and defaults to `RKHTTPRequestOperation`. + + There is no guarantee that all registered classes will be consulted. The object manager will only consider direct subclasses of `RKObjectRequestOperation` when `objectRequestOperationWithRequest:success:failure` is called and will only consider subclasses of `RKManagedObjectRequestOperation` when `managedObjectRequestOperationWithRequest:managedObjectContext:success:failure:` is called. If you wish to map a mixture of managed and unmanaged objects within the same object request operation you must register a `RKManagedObjectRequestOperation` subclass. Classes are consulted in the reverse order of their registration. Attempting to register an already-registered class will move it to the top of the list. + + @param operationClass The subclass of `RKHTTPRequestOperation` or `RKObjectRequestOperation` to register. + @return `YES` if the given class was registered successfully, else `NO`. The only failure condition is if `operationClass` is not a subclass of `RKHTTPRequestOperation` or `RKObjectRequestOperation`. + */ +- (BOOL)registerRequestOperationClass:(Class)operationClass; + +/** + Unregisters the specified subclass of `RKHTTPRequestOperation` or `RKObjectRequestOperation` from the list of classes consulted when `objectRequestOperationWithRequest:success:failure:` or `managedObjectRequestOperationWithRequest:managedObjectContext:success:failure:` is called. + + @param operationClass The subclass of `RKHTTPRequestOperation` or `RKObjectRequestOperation` to unregister. + */ +- (void)unregisterRequestOperationClass:(Class)operationClass; + +/** + Creates an `RKObjectRequestOperation` operation with the given request and sets the completion block with the given success and failure blocks. + + In order to determine what kind of operation is created, each registered `RKObjectRequestOperation` subclass is consulted (in reverse order of when they were specified) to see if it can handle the specific request. The first class to return `YES` when sent a `canProcessRequest:` message is used to create an operation using `initWithHTTPRequestOperation:responseDescriptors:`. The type of HTTP request operation used to initialize the object request operation is determined by evaluating the subclasses of `RKHTTPRequestOperation` registered via `registerRequestOperationClass:` and defaults to `RKHTTPRequestOperation`. + + @param request The request object to be loaded asynchronously during execution of the operation. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the created object request operation and the `RKMappingResult` object created by object mapping the response data of request. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the resonse data. This block has no return value and takes two arguments:, the created request operation and the `NSError` object describing the network or parsing error that occurred. + @return An `RKObjectRequestOperation` object that is ready to be sent. + + @warning Instances of `RKObjectRequestOperation` are not capable of mapping the loaded `NSHTTPURLResponse` into a Core Data entity. Use an instance of `RKManagedObjectRequestOperation` if the response is to be mapped using an `RKEntityMapping`. + */ +- (RKObjectRequestOperation *)objectRequestOperationWithRequest:(NSURLRequest *)request + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure; + +/** + Creates an `RKManagedObjectRequestOperation` operation with the given request and managed object context, and sets the completion block with the given success and failure blocks. + + The given managed object context given will be used as the parent context of the private managed context in which the response is mapped and will be used to fetch the results upon invocation of the success completion block. + + In order to determine what kind of operation is created, each registered `RKManagedObjectRequestOperation` subclass is consulted (in reverse order of when they were specified) to see if it can handle the specific request. The first class to return `YES` when sent a `canProcessRequest:` message is used to create an operation using `initWithHTTPRequestOperation:responseDescriptors:`. The type of HTTP request operation used to initialize the object request operation is determined by evaluating the subclasses of `RKHTTPRequestOperation` registered via `registerRequestOperationClass:` and defaults to `RKHTTPRequestOperation`. + + @param request The request object to be loaded asynchronously during execution of the operation. + @param managedObjectContext The managed object context with which to associate the operation. This context will be used as the parent context of a new operation local `NSManagedObjectContext` with the `NSPrivateQueueConcurrencyType` concurrency type. Upon success, the private context will be saved and changes resulting from the object mapping will be 'pushed' to the given context. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the created object request operation and the `RKMappingResult` object created by object mapping the response data of request. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the resonse data. This block has no return value and takes two arguments:, the created request operation and the `NSError` object describing the network or parsing error that occurred. + @return An `RKObjectRequestOperation` object that is ready to be sent. + + @see `RKManagedObjectRequestOperation` + */ +#ifdef RKCoreDataIncluded +- (RKManagedObjectRequestOperation *)managedObjectRequestOperationWithRequest:(NSURLRequest *)request + managedObjectContext:(NSManagedObjectContext *)managedObjectContext + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure; +#endif + +/** + Creates and returns an object request operation of the appropriate type for the given object, request method, path, and parameters. + + The type of object request operation created is determined by evaluating the type of the object given and examining the list of `RKResponseDescriptor` objects added to the manager. + + If the given object is non-nil and inherits from `NSManagedObject`, then an instance of `RKManagedObjectRequestOperation` is returned. + + If the given object is nil, then the `RKResponseDescriptor` objects added to the manager are evaluated to determine the type of operation created. In this case, the path of the operation is used to filter the set of `RKResponseDescriptor` objects to those that may be used to map the response. If the path is nil, the router is consulted to determine an appropriate path with which to perform the matching. If the filtered array of matching response descriptors defines a mapping configuration with an `RKEntityMapping` object, then an `RKManagedObjectRequestOperation` is returned; otherwise an `RKObjectRequestOperation` is returned. + + If an `RKManagedObjectRequestOperation` operation is created, the managed object context used will be the `mainQueueManagedObjectContext` of the manager's `managedObjectStore`. + + @param object The object with which to construct the object request operation. May be nil. + @param method The request method for the request. + @param path The path to be appended to the HTTP client's baseURL and set as the URL of the request. If nil, the router is consulted. + @param parameters The parameters to be either set as a query string for `GET` requests, or reverse merged with the parameterization of the object and set as the request HTTP body. + + @return A newly created `RKObjectRequestOperation` or `RKManagedObjectRequest` operation as deemed appropriate by the manager for the given parameters. + @warning The given object must be a single object instance. Collections are not yet supported. + + @see `requestWithObject:method:path:parameters` + */ +- (id)appropriateObjectRequestOperationWithObject:(id)object + method:(RKRequestMethod)method + path:(NSString *)path + parameters:(NSDictionary *)parameters; + +///-------------------------------------------------- +/// @name Managing Enqueued Object Request Operations +///-------------------------------------------------- + +/** + Enqueues an `RKObjectRequestOperation` to the object manager's operation queue. + + @param objectRequestOperation The object request operation to be enqueued. + */ +- (void)enqueueObjectRequestOperation:(RKObjectRequestOperation *)objectRequestOperation; + +/** + Returns an array of operations in the object manager's operation queue whose requests match the specified HTTP method and path pattern. + + Paths are matches against the `path` of the `NSURL` of the `NSURLRequest` of each `RKObjectRequestOperation` contained in the receiver's operation queue using a `RKPathMatcher` object. + + @param method The HTTP method to match for the cancelled requests, such as `RKRequestMethodGET`, `RKRequestMethodPOST`, `RKRequestMethodPUT`, `RKRequestMethodPatch`, or `RKRequestMethodDELETE`. If `RKRequestMethodAny`, all object request operations with URLs matching the given path pattern will be cancelled. Multiple methods may be specified by using a bitwise OR operation. + @param pathPattern The pattern to match against the path of the request URL for executing object request operations considered for cancellation. + @return A new array containing all enqueued `RKObjectRequestOperation` objects that match the given HTTP method and path pattern. + @see `RKPathMatcher` + */ +- (NSArray *)enqueuedObjectRequestOperationsWithMethod:(RKRequestMethod)method matchingPathPattern:(NSString *)pathPattern; + +/** + Cancels all operations in the object manager's operation queue whose requests match the specified HTTP method and path pattern. + + Paths are matches against the `path` of the `NSURL` of the `NSURLRequest` of each `RKObjectRequestOperation` contained in the receiver's operation queue using a `RKPathMatcher` object. + + @param method The HTTP method to match for the cancelled requests, such as `RKRequestMethodGET`, `RKRequestMethodPOST`, `RKRequestMethodPUT`, `RKRequestMethodPatch`, or `RKRequestMethodDELETE`. If `RKRequestMethodAny`, all object request operations with URLs matching the given path pattern will be cancelled. + @param pathPattern The pattern to match against the path of the request URL for executing object request operations considered for cancellation. + + @see `RKPathMatcher` + */ +- (void)cancelAllObjectRequestOperationsWithMethod:(RKRequestMethod)method matchingPathPattern:(NSString *)pathPattern; + +///----------------------------------------- +/// @name Batching Object Request Operations +///----------------------------------------- + +/** + Creates and enqueues an `RKObjectRequestOperation` to the object manager's operation queue for each specified object into a batch. Each object request operation is built by evaluating the object against the given route to construct a request path and then invoking `appropriateObjectRequestOperationWithObject:method:path:parameters:`. When each object request operation finishes, the specified progress block is executed, until all of the request operations have finished, at which point the completion block also executes. + + @warning Note that the route type is significant in how that the object request operation is constructed. If the given route is a class route, then the `targetObject` of the operation will be set to the object for which the operation is being constructed. For named routes and relationship routes, the target object is `nil`. + + @param route The route specifying the request method and the path pattern with which to construct the request for each object object request operation in the batch. + @param objects The set of objects for which to enqueue a batch of object request operations. + @param progress A block object to be executed when an object request operation completes. This block has no return value and takes two arguments: the number of finished operations and the total number of operations initially executed. + @param completion A block object to be executed when the object request operations complete. This block has no return value and takes one argument: the list of operations executed. + + @see `[RKObjectManager enqueueBatchOfObjectRequestOperations:progress:completion]` + @see `RKRoute` + */ +- (void)enqueueBatchOfObjectRequestOperationsWithRoute:(RKRoute *)route + objects:(NSArray *)objects + progress:(void (^)(NSUInteger numberOfFinishedOperations, + NSUInteger totalNumberOfOperations))progress + completion:(void (^)(NSArray *operations))completion; + +/** + Enqueues a set of `RKObjectRequestOperation` to the object manager's operation queue. + + @param operations The set of object request operations to be enqueued. + @param progress A block object to be executed when an object request operation completes. This block has no return value and takes two arguments: the number of finished operations and the total number of operations initially executed. + @param completion A block object to be executed when the object request operations complete. This block has no return value and takes one argument: the list of operations executed. + + */ +- (void)enqueueBatchOfObjectRequestOperations:(NSArray *)operations + progress:(void (^)(NSUInteger numberOfFinishedOperations, + NSUInteger totalNumberOfOperations))progress + completion:(void (^)(NSArray *operations))completion; + +///------------------------------------- +/// @name Making Object Requests by Path +///------------------------------------- + +/** + Creates an `RKObjectRequestOperation` with a `GET` request with a URL for the given path, and enqueues it to the manager's operation queue. + + The type of object request operation created is determined by invoking `appropriateObjectRequestOperationWithObject:method:path:parameters:`. + + @param path The path to be appended to the HTTP client's base URL and used as the request URL. + @param parameters The parameters to be encoded and appended as the query string for the request URL. + @param success A block object to be executed when the object request operation finishes successfully. This block has no return value and takes two arguments: the created object request operation and the `RKMappingResult` object created by object mapping the response data of request. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the resonse data. This block has no return value and takes two arguments:, the created request operation and the `NSError` object describing the network or parsing error that occurred. + + @see [RKObjectManager appropriateObjectRequestOperationWithObject:method:path:parameters:] + */ +- (void)getObjectsAtPath:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure; + +/** + Creates an `RKObjectRequestOperation` with a `GET` request for the relationship with the given name of the given object, and enqueues it to the manager's operation queue. + + The type of object request operation created is determined by invoking `appropriateObjectRequestOperationWithObject:method:path:parameters:`. + + @param relationshipName The name of the relationship being loaded. Used to retrieve the `RKRoute` object from the router for the given object's class and the relationship name. Cannot be nil. + @param object The object for which related objects are being loaded. Evaluated against the `RKRoute` for the relationship for the object's class with the given name to compute the path. Cannot be nil. + @param parameters The parameters to be encoded and appended as the query string for the request URL. May be nil. + @param success A block object to be executed when the object request operation finishes successfully. This block has no return value and takes two arguments: the created object request operation and the mapped result created from object mapping the response data of request. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the resonse data. This block has no return value and takes two arguments:, the created request operation and the `NSError` object describing the network or parsing error that occurred. + + @raises NSInvalidArgumentException Raised if no route is configured for a relationship of the given object's class with the given name. + @see [RKRouter URLForRelationship:ofObject:method:] + @see [RKObjectManager appropriateObjectRequestOperationWithObject:method:path:parameters:] + */ +- (void)getObjectsAtPathForRelationship:(NSString *)relationshipName + ofObject:(id)object + parameters:(NSDictionary *)parameters + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure; + +/** + Creates an `RKObjectRequestOperation` with a `GET` request for the URL returned by the router for the given route name, and enqueues it to the manager's operation queue. + + The type of object request operation created is determined by invoking `appropriateObjectRequestOperationWithObject:method:path:parameters:`. + + @param routeName The name of the route being loaded. Used to retrieve the `RKRoute` object from the router with the given name. Cannot be nil. + @param object The object to be interpolated against the path pattern of the `RKRoute` object retrieved with the given name. Used to compute the path to be appended to the HTTP client's base URL and used as the request URL. May be nil. + @param parameters The parameters to be encoded and appended as the query string for the request URL. May be nil. + @param success A block object to be executed when the object request operation finishes successfully. This block has no return value and takes two arguments: the created object request operation and the mapped result created from object mapping the response data of request. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the resonse data. This block has no return value and takes two arguments:, the created request operation and the `NSError` object describing the network or parsing error that occurred. + + @raises NSInvalidArgumentException Raised if no route is configured with the given name or the route returned specifies an HTTP method other than `GET`. + @see [RKRouter URLForRouteNamed:method:object:] + @see [RKObjectManager appropriateObjectRequestOperationWithObject:method:path:parameters:] + */ +- (void)getObjectsAtPathForRouteNamed:(NSString *)routeName + object:(id)object + parameters:(NSDictionary *)parameters + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure; + +///------------------------------------------- +/// @name Making Object Requests for an Object +///------------------------------------------- + +/** + Creates an `RKObjectRequestOperation` with a `GET` request for the given object, and enqueues it to the manager's operation queue. + + The type of object request operation created is determined by invoking `appropriateObjectRequestOperationWithObject:method:path:parameters:`. + + @param object The object with which to construct the object request operation. If `nil`, then the path must be provided. + @param path The path to be appended to the HTTP client's base URL and used as the request URL. If nil, the request URL will be obtained by consulting the router for a route registered for the given object's class and the `RKRequestMethodGET` request method. + @param parameters The parameters to be encoded and appended as the query string for the request URL. + @param success A block object to be executed when the object request operation finishes successfully. This block has no return value and takes two arguments: the created object request operation and the `RKMappingResult` object created by object mapping the response data of request. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the resonse data. This block has no return value and takes two arguments:, the created request operation and the `NSError` object describing the network or parsing error that occurred. + + @see [RKRouter URLForObject:method:] + @see [RKObjectManager appropriateObjectRequestOperationWithObject:method:path:parameters:] + */ +- (void)getObject:(id)object + path:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure; + +/** + Creates an `RKObjectRequestOperation` with a `POST` request for the given object, and enqueues it to the manager's operation queue. + + @param object The object with which to construct the object request operation. If `nil`, then the path must be provided. + @param path The path to be appended to the HTTP client's base URL and used as the request URL. If nil, the request URL will be obtained by consulting the router for a route registered for the given object's class and the `RKRequestMethodPOST` method. + @param parameters The parameters to be reverse merged with the parameterization of the given object and set as the request body. + @param success A block object to be executed when the object request operation finishes successfully. This block has no return value and takes two arguments: the created object request operation and the `RKMappingResult` object created by object mapping the response data of request. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the resonse data. This block has no return value and takes two arguments:, the created request operation and the `NSError` object describing the network or parsing error that occurred. + + @see [RKRouter URLForObject:method:] + @see [RKObjectManager appropriateObjectRequestOperationWithObject:method:path:parameters:] + */ +- (void)postObject:(id)object + path:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure; + +/** + Creates an `RKObjectRequestOperation` with a `PUT` request for the given object, and enqueues it to the manager's operation queue. + + @param object The object with which to construct the object request operation. If `nil`, then the path must be provided. + @param path The path to be appended to the HTTP client's base URL and used as the request URL. If nil, the request URL will be obtained by consulting the router for a route registered for the given object's class and the `RKRequestMethodPUT` method. + @param parameters The parameters to be reverse merged with the parameterization of the given object and set as the request body. + @param success A block object to be executed when the object request operation finishes successfully. This block has no return value and takes two arguments: the created object request operation and the `RKMappingResult` object created by object mapping the response data of request. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the resonse data. This block has no return value and takes two arguments:, the created request operation and the `NSError` object describing the network or parsing error that occurred. + + @see [RKRouter URLForObject:method:] + @see [RKObjectManager appropriateObjectRequestOperationWithObject:method:path:parameters:] + */ +- (void)putObject:(id)object + path:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure; + +/** + Creates an `RKObjectRequestOperation` with a `PATCH` request for the given object, and enqueues it to the manager's operation queue. + + @param object The object with which to construct the object request operation. If `nil`, then the path must be provided. + @param path The path to be appended to the HTTP client's base URL and used as the request URL. If nil, the request URL will be obtained by consulting the router for a route registered for the given object's class and the `RKRequestMethodPATCH` method. + @param parameters The parameters to be reverse merged with the parameterization of the given object and set as the request body. + @param success A block object to be executed when the object request operation finishes successfully. This block has no return value and takes two arguments: the created object request operation and the `RKMappingResult` object created by object mapping the response data of request. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the resonse data. This block has no return value and takes two arguments:, the created request operation and the `NSError` object describing the network or parsing error that occurred. + + @see [RKRouter URLForObject:method:] + @see [RKObjectManager appropriateObjectRequestOperationWithObject:method:path:parameters:] + */ +- (void)patchObject:(id)object + path:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure; + +/** + Creates an `RKObjectRequestOperation` with a `DELETE` request for the given object, and enqueues it to the manager's operation queue. + + The type of object request operation created is determined by invoking `appropriateObjectRequestOperationWithObject:method:path:parameters:`. + + @param object The object with which to construct the object request operation. If `nil`, then the path must be provided. + @param path The path to be appended to the HTTP client's base URL and used as the request URL. If nil, the request URL will be obtained by consulting the router for a route registered for the given object's class and the `RKRequestMethodDELETE` request method. + @param parameters The parameters to be encoded and appended as the query string for the request URL. + @param success A block object to be executed when the object request operation finishes successfully. This block has no return value and takes two arguments: the created object request operation and the `RKMappingResult` object created by object mapping the response data of request. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the resonse data. This block has no return value and takes two arguments:, the created request operation and the `NSError` object describing the network or parsing error that occurred. + + @see [RKRouter URLForObject:method:] + @see [RKObjectManager appropriateObjectRequestOperationWithObject:method:path:parameters:] + */ +- (void)deleteObject:(id)object + path:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure; + +///------------------------------------------------ +/// @name Managing Request and Response Descriptors +///------------------------------------------------ + +/** + Returns an array containing the `RKRequestDescriptor` objects added to the manager. + + @return An array containing the request descriptors of the receiver. The elements of the array are instances of `RKRequestDescriptor`. + + @see RKRequestDescriptor + */ +@property (nonatomic, readonly) NSArray *requestDescriptors; + +/** + Adds a request descriptor to the manager. + + @param requestDescriptor The request descriptor object to the be added to the manager. + */ +- (void)addRequestDescriptor:(RKRequestDescriptor *)requestDescriptor; + +/** + Adds the `RKRequestDescriptor` objects contained in a given array to the manager. + + @param requestDescriptors An array of `RKRequestDescriptor` objects to be added to the manager. + @exception NSInvalidArgumentException Raised if any element of the given array is not an `RKRequestDescriptor` object. + */ +- (void)addRequestDescriptorsFromArray:(NSArray *)requestDescriptors; + +/** + Removes a given request descriptor from the manager. + + @param requestDescriptor An `RKRequestDescriptor` object to be removed from the manager. + */ +- (void)removeRequestDescriptor:(RKRequestDescriptor *)requestDescriptor; + +/** + Returns an array containing the `RKResponseDescriptor` objects added to the manager. + + @return An array containing the request descriptors of the receiver. The elements of the array are instances of `RKRequestDescriptor`. + + @see RKResponseDescriptor + */ +@property (nonatomic, readonly) NSArray *responseDescriptors; + +/** + Adds a response descriptor to the manager. + + Adding a response descriptor to the manager sets the `baseURL` of the descriptor to the `baseURL` of the manager, causing it to evaluate URL objects relatively. + + @param responseDescriptor The response descriptor object to the be added to the manager. + */ +- (void)addResponseDescriptor:(RKResponseDescriptor *)responseDescriptor; + +/** + Adds the `RKResponseDescriptor` objects contained in a given array to the manager. + + @param responseDescriptors An array of `RKResponseDescriptor` objects to be added to the manager. + @exception NSInvalidArgumentException Raised if any element of the given array is not an `RKResponseDescriptor` object. + */ +- (void)addResponseDescriptorsFromArray:(NSArray *)responseDescriptors; + +/** + Removes a given response descriptor from the manager. + + @param responseDescriptor An `RKResponseDescriptor` object to be removed from the manager. + */ +- (void)removeResponseDescriptor:(RKResponseDescriptor *)responseDescriptor; + +///---------------------------------------- +/// @name Configuring Core Data Integration +///---------------------------------------- + +#ifdef RKCoreDataIncluded +/** + A Core Data backed object store for persisting objects that have been fetched from the Web + */ +@property (nonatomic, strong) RKManagedObjectStore *managedObjectStore; + +/** + An array of `RKFetchRequestBlock` blocks used to map `NSURL` objects into corresponding `NSFetchRequest` objects. + + When searched, the blocks are iterated in the reverse-order of their registration and the first block with a non-nil return value halts the search. + */ +@property (nonatomic, readonly) NSArray *fetchRequestBlocks; + +/** + Adds the given `RKFetchRequestBlock` block to the manager. + + @param block A block object to be executed when constructing an `NSFetchRequest` object from a given `NSURL`. The block has a return type of `NSFetchRequest` and accepts a single `NSURL` argument. + */ +- (void)addFetchRequestBlock:(NSFetchRequest *(^)(NSURL *URL))block; +#endif + +///------------------------------------ +/// @name Accessing Paginated Resources +///------------------------------------ + +/** + The object mapping describing how to map pagination metadata from paginated responses. + + The object mapping must have an object class of `RKPaginator`. + + @see [RKPaginator initWithRequest:paginationMapping:responseDescriptors] + */ +@property (nonatomic, strong) RKObjectMapping *paginationMapping; + +/** + Creates and returns a paginator object configured to paginate the collection resource accessible at the specified path pattern. + + The paginator instantiated will be initialized with a URL built by appending the given pathPattern to the baseURL of the client. The response descriptors and Core Data configuration, if any, are inherited from the receiver. + + @param pathPattern A patterned URL fragment to be appended to the baseURL of the receiver in order to construct the pattern URL with which to access the paginated collection. + @return The newly created paginator instance. + @see RKPaginator + @warning Will raise an exception if the value of the `paginationMapping` property is nil. + */ +- (RKPaginator *)paginatorWithPathPattern:(NSString *)pathPattern; + +/** + Creates and returns a paginator object configured to paginate the collection resource accessible at the specified path pattern and the given parameters. + + The paginator instantiated will be initialized with a URL built by appending the given pathPattern to the baseURL of the client and the given parameters if any. The response descriptors and Core Data configuration, if any, are inherited from the receiver. + + @param pathPattern A patterned URL fragment to be appended to the baseURL of the receiver in order to construct the pattern URL with which to access the paginated collection. + @param parameters The parameters to be encoded and appended as the query string for the request URL. May be nil. + @return The newly created paginator instance. + @see RKPaginator + @warning Will raise an exception if the value of the `paginationMapping` property is nil. + */ +- (RKPaginator *)paginatorWithPathPattern:(NSString *)pathPattern parameters:(NSDictionary *)parameters; + +@end + +#ifdef _SYSTEMCONFIGURATION_H +/** + Returns a string description of the given network status. + + @param networkReachabilityStatus The network reachability status. + @return A string describing the reachability status. + */ +NSString *RKStringFromNetworkReachabilityStatus(AFRKNetworkReachabilityStatus networkReachabilityStatus); +#endif diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKObjectManager.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKObjectManager.m new file mode 100644 index 0000000..693edb0 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKObjectManager.m @@ -0,0 +1,1035 @@ +// +// RKObjectManager.m +// RestKit +// +// Created by Jeremy Ellison on 8/14/09. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <objc/runtime.h> +#import "AFRKNetworking.h" + +#import "RKObjectManager.h" +#import "RKObjectParameterization.h" +#import "RKRequestDescriptor.h" +#import "RKResponseDescriptor.h" +#import "RKDictionaryUtilities.h" +#import "RKMIMETypes.h" +#import "RKLog.h" +#import "RKMIMETypeSerialization.h" +#import "RKPathMatcher.h" +#import "RKMappingErrors.h" +#import "RKPaginator.h" +#import "RKDynamicMapping.h" +#import "RKRelationshipMapping.h" +#import "RKObjectRequestOperation.h" +#import "RKRouter.h" +#import "RKRoute.h" +#import "RKRouteSet.h" + +#if __has_include("CoreData.h") +# define RKCoreDataIncluded +# import "RKManagedObjectStore.h" +# import "RKManagedObjectRequestOperation.h" +#endif + +#if !__has_feature(objc_arc) +#error RestKit must be built with ARC. \ +You can turn on ARC for only RestKit files by adding "-fobjc-arc" to the build phase for each of its files. +#endif + +////////////////////////////////// +// Shared Instance + +static RKObjectManager *sharedManager = nil; + +////////////////////////////////// +// Utility Functions + +/** + Returns the subset of the given array of `RKResponseDescriptor` objects that match the given path. + + @param responseDescriptors An array of `RKResponseDescriptor` objects. + @param path The path for which to select matching response descriptors. + @param method The method for which to select matching response descriptors. + @return An `NSArray` object whose elements are `RKResponseDescriptor` objects matching the given path and method. + */ +#ifdef RKCoreDataIncluded +static NSArray *RKFilteredArrayOfResponseDescriptorsMatchingPathAndMethod(NSArray *responseDescriptors, NSString *path, RKRequestMethod method) +{ + NSIndexSet *indexSet = [responseDescriptors indexesOfObjectsPassingTest:^BOOL(RKResponseDescriptor *responseDescriptor, NSUInteger idx, BOOL *stop) { + return [responseDescriptor matchesPath:path] && (method & responseDescriptor.method); + }]; + return [responseDescriptors objectsAtIndexes:indexSet]; +} +#endif + +/** + Returns the first `RKRequestDescriptor` object from the given array that matches the given object. + + @param requestDescriptors An array of `RKRequestDescriptor` objects. + @param object The object to find a matching request descriptor for. + @return An `RKRequestDescriptor` object matching the given object, or `nil` if none could be found. + */ +RKRequestDescriptor *RKRequestDescriptorFromArrayMatchingObjectAndRequestMethod(NSArray *requestDescriptors, id object, RKRequestMethod requestMethod); +RKRequestDescriptor *RKRequestDescriptorFromArrayMatchingObjectAndRequestMethod(NSArray *requestDescriptors, id object, RKRequestMethod requestMethod) +{ + Class searchClass = [object class]; + do { + for (RKRequestDescriptor *requestDescriptor in requestDescriptors) { + if ([requestDescriptor.objectClass isEqual:searchClass] && (requestMethod == requestDescriptor.method)) return requestDescriptor; + } + + for (RKRequestDescriptor *requestDescriptor in requestDescriptors) { + if ([requestDescriptor.objectClass isEqual:searchClass] && (requestMethod & requestDescriptor.method)) return requestDescriptor; + } + searchClass = [searchClass superclass]; + } while (searchClass); + + return nil; +} + +extern NSString *RKStringDescribingRequestMethod(RKRequestMethod method); + +@interface RKObjectParameters : NSObject + +@property (nonatomic, strong) NSMutableDictionary *parameters; +- (void)addParameters:(NSDictionary *)serialization atRootKeyPath:(NSString *)rootKeyPath inArray:(BOOL)inArray; + +@end + +@implementation RKObjectParameters + +- (instancetype)init +{ + self = [super init]; + if (self) { + self.parameters = [NSMutableDictionary new]; + } + return self; +} + +- (void)addParameters:(NSDictionary *)parameters atRootKeyPath:(NSString *)rootKeyPath inArray:(BOOL)inArray +{ + id rootKey = rootKeyPath ?: [NSNull null]; + id nonNestedParameters = rootKeyPath ? parameters[rootKeyPath] : parameters; + id value = (self.parameters)[rootKey]; + if (value) { + if ([value isKindOfClass:[NSMutableArray class]]) { + [value addObject:nonNestedParameters]; + } else if ([value isKindOfClass:[NSDictionary class]]) { + NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:value, nonNestedParameters, nil]; + (self.parameters)[rootKey] = mutableArray; + } else { + [NSException raise:NSInvalidArgumentException format:@"Unexpected argument of type '%@': expected an NSDictionary or NSArray.", [value class]]; + } + } else { + (self.parameters)[rootKey] = (inArray ? @[ nonNestedParameters ] : nonNestedParameters); + } +} + +- (id)requestParameters +{ + if ([self.parameters count] == 0) return nil; + id valueAtNullKey = (self.parameters)[[NSNull null]]; + if (valueAtNullKey) { + if ([self.parameters count] == 1) return valueAtNullKey; + + // If we have values at `[NSNull null]` and other key paths, we have an invalid configuration + [NSException raise:NSInvalidArgumentException format:@"Invalid request descriptor configuration: The request descriptors specify that multiple objects be serialized at incompatible key paths. Cannot serialize objects at the `nil` root key path in the same request as objects with a non-nil root key path. Please check your request descriptors and try again."]; + } + return self.parameters; +} + +@end + +/** + Visits all mappings accessible via relationships or dynamic mapping in an object graph starting from a given mapping. + */ +@interface RKMappingGraphVisitor : NSObject + +@property (nonatomic, readonly) NSSet *mappings; + +- (instancetype)initWithMapping:(RKMapping *)mapping NS_DESIGNATED_INITIALIZER; + +@end + +@interface RKMappingGraphVisitor () +@property (nonatomic, readwrite) NSMutableSet *mutableMappings; +@end + +@implementation RKMappingGraphVisitor + +- (instancetype)init +{ + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"-init is not a valid initializer for the class %@, use designated initilizer -initWithMapping:", NSStringFromClass([self class])] + userInfo:nil]; + return [self init]; +} + +- (instancetype)initWithMapping:(RKMapping *)mapping +{ + self = [super init]; + if (self) { + self.mutableMappings = [NSMutableSet set]; + [self visitMapping:mapping]; + } + return self; +} + +- (NSSet *)mappings +{ + return self.mutableMappings; +} + +- (void)visitMapping:(RKMapping *)mapping +{ + if ([self.mappings containsObject:mapping]) return; + [self.mutableMappings addObject:mapping]; + + if ([mapping isKindOfClass:[RKDynamicMapping class]]) { + RKDynamicMapping *dynamicMapping = (RKDynamicMapping *)mapping; + for (RKMapping *nestedMapping in dynamicMapping.objectMappings) { + [self visitMapping:nestedMapping]; + } + } else if ([mapping isKindOfClass:[RKObjectMapping class]]) { + RKObjectMapping *objectMapping = (RKObjectMapping *)mapping; + for (RKRelationshipMapping *relationshipMapping in objectMapping.relationshipMappings) { + [self visitMapping:relationshipMapping.mapping]; + } + } +} + +@end + +/** + Returns `YES` if the given array of `RKResponseDescriptor` objects contains an `RKEntityMapping` anywhere in its object graph. + + @param responseDescriptors An array of `RKResponseDescriptor` objects. + @return `YES` if the `mapping` property of any of the response descriptor objects in the given array is an instance of `RKEntityMapping`, else `NO`. + */ +#ifdef RKCoreDataIncluded +static BOOL RKDoesArrayOfResponseDescriptorsContainEntityMapping(NSArray *responseDescriptors) +{ + // Visit all mappings accessible from the object graphs of all response descriptors + NSMutableSet *accessibleMappings = [NSMutableSet set]; + for (RKResponseDescriptor *responseDescriptor in responseDescriptors) { + if (! [accessibleMappings containsObject:responseDescriptor.mapping]) { + RKMappingGraphVisitor *graphVisitor = [[RKMappingGraphVisitor alloc] initWithMapping:responseDescriptor.mapping]; + [accessibleMappings unionSet:graphVisitor.mappings]; + } + } + + // Enumerate all mappings and search for an `RKEntityMapping` + for (RKMapping *mapping in accessibleMappings) { + if ([mapping isKindOfClass:[RKEntityMapping class]]) { + return YES; + } + + if ([mapping isKindOfClass:[RKDynamicMapping class]]) { + RKDynamicMapping *dynamicMapping = (RKDynamicMapping *)mapping; + if ([dynamicMapping.objectMappings count] == 0) { + // Likely means that there is a representation block, assume `YES` + return YES; + } + } + } + + return NO; +} +#endif + +BOOL RKDoesArrayOfResponseDescriptorsContainOnlyEntityMappings(NSArray *responseDescriptors); +BOOL RKDoesArrayOfResponseDescriptorsContainOnlyEntityMappings(NSArray *responseDescriptors) +{ +#ifdef RKCoreDataIncluded + // Visit all mappings accessible from the object graphs of all response descriptors + NSMutableSet *accessibleMappings = [NSMutableSet set]; + for (RKResponseDescriptor *responseDescriptor in responseDescriptors) { + if (! [accessibleMappings containsObject:responseDescriptor.mapping]) { + RKMappingGraphVisitor *graphVisitor = [[RKMappingGraphVisitor alloc] initWithMapping:responseDescriptor.mapping]; + [accessibleMappings unionSet:graphVisitor.mappings]; + } + } + + NSMutableSet *mappingClasses = [NSMutableSet set]; + // Enumerate all mappings and search for an `RKEntityMapping` + for (RKMapping *mapping in accessibleMappings) { + if ([mapping isKindOfClass:[RKDynamicMapping class]]) { + [mappingClasses addObjectsFromArray:[[(RKDynamicMapping *)mapping objectMappings] valueForKey:@"class"]]; + } else { + [mappingClasses addObject:mapping.class]; + } + } + + if ([mappingClasses count]) { + for (Class mappingClass in mappingClasses) { + if (! [mappingClass isSubclassOfClass:[RKEntityMapping class]]) { + return NO; + } + } + return YES; + } +#endif + + return NO; +} + +static BOOL RKDoesArrayOfResponseDescriptorsContainMappingForClass(NSArray *responseDescriptors, Class classToBeMapped) +{ + // Visit all mappings accessible from the object graphs of all response descriptors + NSMutableSet *accessibleMappings = [NSMutableSet set]; + for (RKResponseDescriptor *responseDescriptor in responseDescriptors) { + if (! [accessibleMappings containsObject:responseDescriptor.mapping]) { + RKMappingGraphVisitor *graphVisitor = [[RKMappingGraphVisitor alloc] initWithMapping:responseDescriptor.mapping]; + [accessibleMappings unionSet:graphVisitor.mappings]; + } + } + + // Enumerate all mappings and search for a mapping matching the class + for (RKMapping *mapping in accessibleMappings) { + if ([mapping isKindOfClass:[RKObjectMapping class]]) { + if ([[(RKObjectMapping *)mapping objectClass] isSubclassOfClass:classToBeMapped]) return YES; + } + + if ([mapping isKindOfClass:[RKDynamicMapping class]]) { + RKDynamicMapping *dynamicMapping = (RKDynamicMapping *)mapping; + for (RKObjectMapping *mapping in dynamicMapping.objectMappings) { + if ([[(RKObjectMapping *)mapping objectClass] isSubclassOfClass:classToBeMapped]) return YES; + } + } + } + + return NO; +} + +static NSString *RKMIMETypeFromAFHTTPClientParameterEncoding(AFRKHTTPClientParameterEncoding encoding) +{ + switch (encoding) { + case AFRKFormURLParameterEncoding: + return RKMIMETypeFormURLEncoded; + break; + + case AFRKJSONParameterEncoding: + return RKMIMETypeJSON; + break; + + case AFRKPropertyListParameterEncoding: + break; + + default: + RKLogWarning(@"RestKit is unable to infer the appropriate request serialization MIME Type from an `AFHTTPClientParameterEncoding` value of %d: defaulting to `RKMIMETypeFormURLEncoded`", encoding); + break; + } + + return RKMIMETypeFormURLEncoded; +} + +@interface AFRKHTTPClient () +@property (readonly, nonatomic, strong) NSURLCredential *defaultCredential; +@end + +/////////////////////////////////// + +@interface RKObjectManager () +@property (nonatomic, strong) NSMutableArray *mutableRequestDescriptors; +@property (nonatomic, strong) NSMutableArray *mutableResponseDescriptors; +@property (nonatomic, strong) NSMutableArray *mutableFetchRequestBlocks; +@property (nonatomic, strong) NSMutableArray *registeredHTTPRequestOperationClasses; +@property (nonatomic, strong) NSMutableArray *registeredObjectRequestOperationClasses; +@property (nonatomic, strong) NSMutableArray *registeredManagedObjectRequestOperationClasses; + +@end + +@implementation RKObjectManager + +- (instancetype)init +{ + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"-init is not a valid initializer for the class %@, use designated initilizer -initWithHTTPClient:", NSStringFromClass([self class])] + userInfo:nil]; + return [self init]; +} + +- (instancetype)initWithHTTPClient:(AFRKHTTPClient *)client +{ + self = [super init]; + if (self) { + self.HTTPClient = client; + self.router = [[RKRouter alloc] initWithBaseURL:client.baseURL]; + self.operationQueue = [NSOperationQueue new]; + self.mutableRequestDescriptors = [NSMutableArray new]; + self.mutableResponseDescriptors = [NSMutableArray new]; + self.mutableFetchRequestBlocks = [NSMutableArray new]; + self.registeredHTTPRequestOperationClasses = [NSMutableArray new]; + self.registeredManagedObjectRequestOperationClasses = [NSMutableArray new]; + self.registeredObjectRequestOperationClasses = [NSMutableArray new]; + self.requestSerializationMIMEType = RKMIMETypeFromAFHTTPClientParameterEncoding(client.parameterEncoding); + + // Set shared manager if nil + if (nil == sharedManager) { + [RKObjectManager setSharedManager:self]; + } + } + + return self; +} + ++ (instancetype)sharedManager +{ + return sharedManager; +} + ++ (void)setSharedManager:(RKObjectManager *)manager +{ + sharedManager = manager; +} + ++ (RKObjectManager *)managerWithBaseURL:(NSURL *)baseURL +{ + RKObjectManager *manager = [[self alloc] initWithHTTPClient:[AFRKHTTPClient clientWithBaseURL:baseURL]]; + [manager.HTTPClient registerHTTPOperationClass:[AFRKJSONRequestOperation class]]; + [manager setAcceptHeaderWithMIMEType:RKMIMETypeJSON]; + manager.requestSerializationMIMEType = RKMIMETypeFormURLEncoded; + return manager; +} + +- (void)setAcceptHeaderWithMIMEType:(NSString *)MIMEType; +{ + [self.HTTPClient setDefaultHeader:@"Accept" value:MIMEType]; +} + +- (NSURL *)baseURL +{ + return self.HTTPClient.baseURL; +} + +- (NSDictionary *)defaultHeaders +{ + return self.HTTPClient.defaultHeaders; +} + +#pragma mark - Building Requests + +/** + This method is the `RKObjectManager` analog for the method of the same name on `AFHTTPClient`. + */ +- (NSMutableURLRequest *)requestWithMethod:(NSString *)method + path:(NSString *)path + parameters:(NSDictionary *)parameters +{ + NSMutableURLRequest* request; + if (parameters && !([method isEqualToString:@"GET"] || [method isEqualToString:@"HEAD"] || [method isEqualToString:@"DELETE"])) { + // NOTE: If the HTTP client has been subclasses, then the developer may be trying to perform signing on the request + NSDictionary *parametersForClient = [self.HTTPClient isMemberOfClass:[AFRKHTTPClient class]] ? nil : parameters; + request = [self.HTTPClient requestWithMethod:method path:path parameters:parametersForClient]; + + NSError *error = nil; + NSString *charset = (__bridge NSString *)CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(self.HTTPClient.stringEncoding)); + [request setValue:[NSString stringWithFormat:@"%@; charset=%@", self.requestSerializationMIMEType, charset] forHTTPHeaderField:@"Content-Type"]; + NSData *requestBody = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:self.requestSerializationMIMEType error:&error]; + [request setHTTPBody:requestBody]; + } else { + request = [self.HTTPClient requestWithMethod:method path:path parameters:parameters]; + } + + return request; +} + +- (NSMutableURLRequest *)requestWithPathForRouteNamed:(NSString *)routeName + object:(id)object + parameters:(NSDictionary *)parameters +{ + RKRequestMethod method; + NSURL *URL = [self.router URLForRouteNamed:routeName method:&method object:object]; + NSAssert(URL, @"No route found named '%@'", routeName); + return [self requestWithMethod:RKStringFromRequestMethod(method) path:[URL relativeString] parameters:parameters]; +} + +- (NSMutableURLRequest *)requestWithPathForRelationship:(NSString *)relationship + ofObject:(id)object + method:(RKRequestMethod)method + parameters:(NSDictionary *)parameters +{ + NSURL *URL = [self.router URLForRelationship:relationship ofObject:object method:method]; + NSAssert(URL, @"No relationship route found for the '%@' class with the name '%@'", NSStringFromClass([object class]), relationship); + return [self requestWithMethod:RKStringFromRequestMethod(method) path:[URL relativeString] parameters:parameters]; +} + +- (id)mergedParametersWithObject:(id)object method:(RKRequestMethod)method parameters:(NSDictionary *)parameters +{ + NSArray *objectsToParameterize = ([object isKindOfClass:[NSArray class]] || object == nil) ? object : @[ object ]; + RKObjectParameters *objectParameters = [RKObjectParameters new]; + for (id objectToParameterize in objectsToParameterize) { + RKRequestDescriptor *requestDescriptor = RKRequestDescriptorFromArrayMatchingObjectAndRequestMethod(self.requestDescriptors, objectToParameterize, method); + if ((method != RKRequestMethodGET && method != RKRequestMethodDELETE) && requestDescriptor) { + NSError *error = nil; + NSDictionary *parametersForObject = [RKObjectParameterization parametersWithObject:objectToParameterize requestDescriptor:requestDescriptor error:&error]; + if (error) { + RKLogError(@"Object parameterization failed while building %@ request for object '%@': %@", RKStringFromRequestMethod(method), objectToParameterize, error); + return nil; + } + // Ensure that a single object inputted as an array is emitted as an array when serialized + BOOL inArray = ([object isKindOfClass:[NSArray class]] && [object count] == 1); + [objectParameters addParameters:parametersForObject atRootKeyPath:requestDescriptor.rootKeyPath inArray:inArray]; + } + } + id requestParameters = [objectParameters requestParameters]; + + // Merge the extra parameters if possible + if ([requestParameters isKindOfClass:[NSArray class]] && parameters) { + [NSException raise:NSInvalidArgumentException format:@"Cannot merge parameters with array of object representations serialized with a nil root key path."]; + } else if (requestParameters && parameters) { + requestParameters = RKDictionaryByMergingDictionaryWithDictionary(requestParameters, parameters); + } else if (parameters && !requestParameters) { + requestParameters = parameters; + } + + return requestParameters; +} + +- (NSMutableURLRequest *)requestWithObject:(id)object + method:(RKRequestMethod)method + path:(NSString *)path + parameters:(NSDictionary *)parameters; +{ + NSString *requestPath = (path) ? path : [[self.router URLForObject:object method:method] relativeString]; + id requestParameters = [self mergedParametersWithObject:object method:method parameters:parameters]; + return [self requestWithMethod:RKStringFromRequestMethod(method) path:requestPath parameters:requestParameters]; +} + +- (NSMutableURLRequest *)multipartFormRequestWithObject:(id)object + method:(RKRequestMethod)method + path:(NSString *)path + parameters:(NSDictionary *)parameters + constructingBodyWithBlock:(void (^)(id <AFRKMultipartFormData> formData))block +{ + NSString *requestPath = (path) ? path : [[self.router URLForObject:object method:method] relativeString]; + id requestParameters = [self mergedParametersWithObject:object method:method parameters:parameters]; + NSMutableURLRequest *multipartRequest = [self.HTTPClient multipartFormRequestWithMethod:RKStringFromRequestMethod(method) + path:requestPath + parameters:requestParameters + constructingBodyWithBlock:block]; + return multipartRequest; +} + +#pragma mark - Registering Subclasses + +- (BOOL)registerRequestOperationClass:(Class)operationClass +{ + Class managedObjectRequestOperationClass = NSClassFromString(@"RKManagedObjectRequestOperation"); + if (managedObjectRequestOperationClass && [operationClass isSubclassOfClass:managedObjectRequestOperationClass]) { + [self.registeredManagedObjectRequestOperationClasses removeObject:operationClass]; + [self.registeredManagedObjectRequestOperationClasses insertObject:operationClass atIndex:0]; + return YES; + } else if ([operationClass isSubclassOfClass:[RKObjectRequestOperation class]]) { + [self.registeredObjectRequestOperationClasses removeObject:operationClass]; + [self.registeredObjectRequestOperationClasses insertObject:operationClass atIndex:0]; + return YES; + } else if ([operationClass isSubclassOfClass:[RKHTTPRequestOperation class]]) { + [self.registeredHTTPRequestOperationClasses removeObject:operationClass]; + [self.registeredHTTPRequestOperationClasses insertObject:operationClass atIndex:0]; + return YES; + } + + return NO; +} + +- (void)unregisterRequestOperationClass:(Class)operationClass +{ + [self.registeredHTTPRequestOperationClasses removeObject:operationClass]; + [self.registeredObjectRequestOperationClasses removeObject:operationClass]; + [self.registeredManagedObjectRequestOperationClasses removeObject:operationClass]; +} + +- (Class)requestOperationClassForRequest:(NSURLRequest *)request fromRegisteredClasses:(NSArray *)registeredClasses +{ + Class requestOperationClass = nil; + NSEnumerator *enumerator = [registeredClasses reverseObjectEnumerator]; + while (requestOperationClass = [enumerator nextObject]) { + if ([requestOperationClass canProcessRequest:request]) break; + requestOperationClass = nil; + } + return requestOperationClass; +} + +#pragma mark - Object Request Operations + +- (void)copyStateFromHTTPClientToHTTPRequestOperation:(AFRKHTTPRequestOperation *)operation +{ + operation.credential = self.HTTPClient.defaultCredential; + operation.allowsInvalidSSLCertificate = self.HTTPClient.allowsInvalidSSLCertificate; +#ifdef _AFRKNETWORKING_PIN_SSL_CERTIFICATES_ + operation.SSLPinningMode = self.HTTPClient.defaultSSLPinningMode; +#endif +} + +- (RKObjectRequestOperation *)objectRequestOperationWithRequest:(NSURLRequest *)request + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure +{ + return [self objectRequestOperationWithRequest:request responseDescriptors:self.responseDescriptors success:success failure:failure]; +} + +- (RKObjectRequestOperation *)objectRequestOperationWithRequest:(NSURLRequest *)request + responseDescriptors:(NSArray *)responseDescriptors + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure +{ + Class HTTPRequestOperationClass = [self requestOperationClassForRequest:request fromRegisteredClasses:self.registeredHTTPRequestOperationClasses] ?: [RKHTTPRequestOperation class]; + RKHTTPRequestOperation *HTTPRequestOperation = [[HTTPRequestOperationClass alloc] initWithRequest:request]; + [self copyStateFromHTTPClientToHTTPRequestOperation:HTTPRequestOperation]; + Class objectRequestOperationClass = [self requestOperationClassForRequest:request fromRegisteredClasses:self.registeredObjectRequestOperationClasses] ?: [RKObjectRequestOperation class]; + RKObjectRequestOperation *operation = [[objectRequestOperationClass alloc] initWithHTTPRequestOperation:HTTPRequestOperation responseDescriptors:responseDescriptors]; + [operation setCompletionBlockWithSuccess:success failure:failure]; + return operation; +} + +#ifdef RKCoreDataIncluded +- (RKManagedObjectRequestOperation *)managedObjectRequestOperationWithRequest:(NSURLRequest *)request + managedObjectContext:(NSManagedObjectContext *)managedObjectContext + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure +{ + return [self managedObjectRequestOperationWithRequest:request responseDescriptors:self.responseDescriptors managedObjectContext:managedObjectContext success:success failure:failure]; +} + +- (RKManagedObjectRequestOperation *)managedObjectRequestOperationWithRequest:(NSURLRequest *)request + responseDescriptors:(NSArray *)responseDescriptors + managedObjectContext:(NSManagedObjectContext *)managedObjectContext + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure +{ + Class HTTPRequestOperationClass = [self requestOperationClassForRequest:request fromRegisteredClasses:self.registeredHTTPRequestOperationClasses] ?: [RKHTTPRequestOperation class]; + RKHTTPRequestOperation *HTTPRequestOperation = [[HTTPRequestOperationClass alloc] initWithRequest:request]; + [self copyStateFromHTTPClientToHTTPRequestOperation:HTTPRequestOperation]; + Class objectRequestOperationClass = [self requestOperationClassForRequest:request fromRegisteredClasses:self.registeredManagedObjectRequestOperationClasses] ?: [RKManagedObjectRequestOperation class]; + RKManagedObjectRequestOperation *operation = (RKManagedObjectRequestOperation *)[[objectRequestOperationClass alloc] initWithHTTPRequestOperation:HTTPRequestOperation responseDescriptors:responseDescriptors]; + [operation setCompletionBlockWithSuccess:success failure:failure]; + operation.managedObjectContext = managedObjectContext ?: self.managedObjectStore.mainQueueManagedObjectContext; + operation.managedObjectCache = self.managedObjectStore.managedObjectCache; + operation.fetchRequestBlocks = self.fetchRequestBlocks; + return operation; +} +#endif + +- (id)appropriateObjectRequestOperationWithObject:(id)object + method:(RKRequestMethod)method + path:(NSString *)path + parameters:(NSDictionary *)parameters +{ + RKObjectRequestOperation *operation = nil; + NSURLRequest *request = [self requestWithObject:object method:method path:path parameters:parameters]; + NSDictionary *routingMetadata = nil; + if (! path) { + RKRoute *route = [self.router.routeSet routeForObject:object method:method]; + NSDictionary *interpolatedParameters = nil; + NSURL *URL = [self URLWithRoute:route object:object interpolatedParameters:&interpolatedParameters]; + if (! URL) { + RKLogError(@"Failed to construct a URL from the provided object. Returning nil."); + return operation; + } + path = [URL relativeString]; + + routingMetadata = @{ @"routing": @{ @"parameters": interpolatedParameters, @"route": route }, + @"query": @{ @"parameters": parameters ?: @{} } }; + } else if (parameters) { + routingMetadata = @{ @"query": @{ @"parameters": parameters } }; + } + +#ifdef RKCoreDataIncluded + NSArray *matchingDescriptors = RKFilteredArrayOfResponseDescriptorsMatchingPathAndMethod(self.responseDescriptors, path, method); + BOOL containsEntityMapping = RKDoesArrayOfResponseDescriptorsContainEntityMapping(matchingDescriptors); + BOOL isManagedObjectRequestOperation = (containsEntityMapping || [object isKindOfClass:[NSManagedObject class]]); + + if (isManagedObjectRequestOperation && !self.managedObjectStore) RKLogWarning(@"Asked to create an `RKManagedObjectRequestOperation` object, but managedObjectStore is nil."); + if (isManagedObjectRequestOperation && self.managedObjectStore) { + // Construct a Core Data operation + NSManagedObjectContext *managedObjectContext = [object respondsToSelector:@selector(managedObjectContext)] ? [object managedObjectContext] : self.managedObjectStore.mainQueueManagedObjectContext; + operation = [self managedObjectRequestOperationWithRequest:request responseDescriptors:matchingDescriptors managedObjectContext:managedObjectContext success:nil failure:nil]; + + if ([object isKindOfClass:[NSManagedObject class]]) { + static NSPredicate *temporaryObjectsPredicate = nil; + if (! temporaryObjectsPredicate) temporaryObjectsPredicate = [NSPredicate predicateWithFormat:@"objectID.isTemporaryID == YES"]; + [managedObjectContext performBlockAndWait:^{ + NSSet *temporaryObjects = [[managedObjectContext insertedObjects] filteredSetUsingPredicate:temporaryObjectsPredicate]; + if ([temporaryObjects count]) { + RKLogInfo(@"Asked to perform object request for NSManagedObject with temporary object IDs: Obtaining permanent ID before proceeding."); + BOOL success; + NSError *error; + + success = [managedObjectContext obtainPermanentIDsForObjects:[temporaryObjects allObjects] error:&error]; + + if (! success) RKLogWarning(@"Failed to obtain permanent ID for object %@: %@", object, error); + } + }]; + } + } else { + // Non-Core Data operation + operation = [self objectRequestOperationWithRequest:request responseDescriptors:matchingDescriptors success:nil failure:nil]; + } +#else + // Non-Core Data operation + operation = [self objectRequestOperationWithRequest:request success:nil failure:nil]; +#endif + + if (RKDoesArrayOfResponseDescriptorsContainMappingForClass(self.responseDescriptors, [object class])) operation.targetObject = object; + operation.mappingMetadata = routingMetadata; + return operation; +} + +- (NSURL *)URLWithRoute:(RKRoute *)route object:(id)object interpolatedParameters:(NSDictionary **)interpolatedParameters +{ + NSString *path = nil; + if (object) { + RKPathMatcher *pathMatcher = [RKPathMatcher pathMatcherWithPattern:route.pathPattern]; + path = [pathMatcher pathFromObject:object addingEscapes:route.shouldEscapePath interpolatedParameters:interpolatedParameters]; + } else { + // When there is no object, the path pattern is our complete path + path = route.pathPattern; + if (interpolatedParameters) *interpolatedParameters = @{}; + } + return [NSURL URLWithString:path relativeToURL:self.baseURL]; +} + +- (void)getObjectsAtPathForRelationship:(NSString *)relationshipName + ofObject:(id)object + parameters:(NSDictionary *)parameters + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure +{ + RKRoute *route = [self.router.routeSet routeForRelationship:relationshipName ofClass:[object class] method:RKRequestMethodGET]; + NSDictionary *interpolatedParameters = nil; + NSURL *URL = [self URLWithRoute:route object:object interpolatedParameters:&interpolatedParameters]; + NSAssert(URL, @"Failed to generate URL for relationship named '%@' for object: %@", relationshipName, object); + RKObjectRequestOperation *operation = [self appropriateObjectRequestOperationWithObject:nil method:RKRequestMethodGET path:[URL relativeString] parameters:parameters]; + + operation.mappingMetadata = @{ @"routing": @{ @"parameters": interpolatedParameters, @"route": route }, + @"query": @{ @"parameters": parameters ?: @{} } }; + + [operation setCompletionBlockWithSuccess:success failure:failure]; + [self enqueueObjectRequestOperation:operation]; +} + +- (void)getObjectsAtPathForRouteNamed:(NSString *)routeName + object:(id)object + parameters:(NSDictionary *)parameters + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure +{ + NSParameterAssert(routeName); + RKRoute *route = [self.router.routeSet routeForName:routeName]; + NSDictionary *interpolatedParameters = nil; + NSURL *URL = [self URLWithRoute:route object:object interpolatedParameters:&interpolatedParameters]; + NSAssert(URL, @"No route found named '%@'", routeName); + NSAssert(route.method & RKRequestMethodGET, @"Expected route named '%@' to specify a GET, but it does not", routeName); + + RKObjectRequestOperation *operation = [self appropriateObjectRequestOperationWithObject:nil method:RKRequestMethodGET path:[URL relativeString] parameters:parameters]; + + operation.mappingMetadata = @{ @"routing": @{ @"parameters": interpolatedParameters, @"route": route }, + @"query": @{ @"parameters": parameters ?: @{} } }; + + [operation setCompletionBlockWithSuccess:success failure:failure]; + [self enqueueObjectRequestOperation:operation]; +} + +- (void)getObjectsAtPath:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure +{ + NSParameterAssert(path); + RKObjectRequestOperation *operation = [self appropriateObjectRequestOperationWithObject:nil method:RKRequestMethodGET path:path parameters:parameters]; + [operation setCompletionBlockWithSuccess:success failure:failure]; + [self enqueueObjectRequestOperation:operation]; +} + +- (void)getObject:(id)object + path:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure +{ + NSAssert(object || path, @"Cannot make a request without an object or a path."); + RKObjectRequestOperation *operation = [self appropriateObjectRequestOperationWithObject:object method:RKRequestMethodGET path:path parameters:parameters]; + [operation setCompletionBlockWithSuccess:success failure:failure]; + [self enqueueObjectRequestOperation:operation]; +} + +- (void)postObject:(id)object + path:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure +{ + NSAssert(object || path, @"Cannot make a request without an object or a path."); + RKObjectRequestOperation *operation = [self appropriateObjectRequestOperationWithObject:object method:RKRequestMethodPOST path:path parameters:parameters]; + [operation setCompletionBlockWithSuccess:success failure:failure]; + [self enqueueObjectRequestOperation:operation]; +} + +- (void)putObject:(id)object + path:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure +{ + NSAssert(object || path, @"Cannot make a request without an object or a path."); + RKObjectRequestOperation *operation = [self appropriateObjectRequestOperationWithObject:object method:RKRequestMethodPUT path:path parameters:parameters]; + [operation setCompletionBlockWithSuccess:success failure:failure]; + [self enqueueObjectRequestOperation:operation]; +} + +- (void)patchObject:(id)object + path:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure +{ + NSAssert(object || path, @"Cannot make a request without an object or a path."); + RKObjectRequestOperation *operation = [self appropriateObjectRequestOperationWithObject:object method:RKRequestMethodPATCH path:path parameters:parameters]; + [operation setCompletionBlockWithSuccess:success failure:failure]; + [self enqueueObjectRequestOperation:operation]; +} + +- (void)deleteObject:(id)object + path:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure +{ + NSAssert(object || path, @"Cannot make a request without an object or a path."); + RKObjectRequestOperation *operation = [self appropriateObjectRequestOperationWithObject:object method:RKRequestMethodDELETE path:path parameters:parameters]; + [operation setCompletionBlockWithSuccess:success failure:failure]; + [self enqueueObjectRequestOperation:operation]; +} + +- (RKPaginator *)paginatorWithPathPattern:(NSString *)pathPattern +{ + return [self paginatorWithPathPattern:pathPattern parameters:nil]; +} + +- (RKPaginator *)paginatorWithPathPattern:(NSString *)pathPattern parameters:(NSDictionary *)parameters +{ + NSAssert(self.paginationMapping, @"Cannot instantiate a paginator when `paginationMapping` is nil."); + NSMutableURLRequest *request = [self requestWithMethod:@"GET" path:pathPattern parameters:parameters]; + RKPaginator *paginator = [[self.paginationMapping.objectClass alloc] initWithRequest:request paginationMapping:self.paginationMapping responseDescriptors:self.responseDescriptors]; +#ifdef RKCoreDataIncluded + paginator.managedObjectContext = self.managedObjectStore.mainQueueManagedObjectContext; + paginator.managedObjectCache = self.managedObjectStore.managedObjectCache; + paginator.fetchRequestBlocks = self.fetchRequestBlocks; +#endif + paginator.operationQueue = self.operationQueue; + Class HTTPOperationClass = [self requestOperationClassForRequest:request fromRegisteredClasses:self.registeredHTTPRequestOperationClasses]; + if (HTTPOperationClass) [paginator setHTTPOperationClass:HTTPOperationClass]; + return paginator; +} + +#pragma mark - Request & Response Descriptors + +- (NSArray *)requestDescriptors +{ + return [NSArray arrayWithArray:self.mutableRequestDescriptors]; +} + +- (void)addRequestDescriptor:(RKRequestDescriptor *)requestDescriptor +{ + NSParameterAssert(requestDescriptor); + if ([self.requestDescriptors containsObject:requestDescriptor]) return; + NSAssert([requestDescriptor isKindOfClass:[RKRequestDescriptor class]], @"Expected an object of type RKRequestDescriptor, got '%@'", [requestDescriptor class]); + [self.requestDescriptors enumerateObjectsUsingBlock:^(RKRequestDescriptor *registeredDescriptor, NSUInteger idx, BOOL *stop) { + NSAssert(!([registeredDescriptor.objectClass isEqual:requestDescriptor.objectClass] && (requestDescriptor.method == registeredDescriptor.method)), @"Cannot add request descriptor: An existing descriptor is already registered for the class '%@' and HTTP method'%@'.", requestDescriptor.objectClass, RKStringDescribingRequestMethod(requestDescriptor.method)); + }]; + [self.mutableRequestDescriptors addObject:requestDescriptor]; +} + +- (void)addRequestDescriptorsFromArray:(NSArray *)requestDescriptors +{ + for (RKRequestDescriptor *requestDescriptor in requestDescriptors) { + [self addRequestDescriptor:requestDescriptor]; + } +} + +- (void)removeRequestDescriptor:(RKRequestDescriptor *)requestDescriptor +{ + NSParameterAssert(requestDescriptor); + NSAssert([requestDescriptor isKindOfClass:[RKRequestDescriptor class]], @"Expected an object of type RKRequestDescriptor, got '%@'", [requestDescriptor class]); + [self.mutableRequestDescriptors removeObject:requestDescriptor]; +} + +- (NSArray *)responseDescriptors +{ + return [NSArray arrayWithArray:self.mutableResponseDescriptors]; +} + +- (void)addResponseDescriptor:(RKResponseDescriptor *)responseDescriptor +{ + NSParameterAssert(responseDescriptor); + NSAssert([responseDescriptor isKindOfClass:[RKResponseDescriptor class]], @"Expected an object of type RKResponseDescriptor, got '%@'", [responseDescriptor class]); + responseDescriptor.baseURL = self.baseURL; + [self.mutableResponseDescriptors addObject:responseDescriptor]; +} + +- (void)addResponseDescriptorsFromArray:(NSArray *)responseDescriptors +{ + for (RKResponseDescriptor *responseDescriptor in responseDescriptors) { + [self addResponseDescriptor:responseDescriptor]; + } +} + +- (void)removeResponseDescriptor:(RKResponseDescriptor *)responseDescriptor +{ + NSParameterAssert(responseDescriptor); + NSAssert([responseDescriptor isKindOfClass:[RKResponseDescriptor class]], @"Expected an object of type RKResponseDescriptor, got '%@'", [responseDescriptor class]); + [self.mutableResponseDescriptors removeObject:responseDescriptor]; +} + +#pragma mark - Fetch Request Blocks + +#ifdef RKCoreDataIncluded + +- (NSArray *)fetchRequestBlocks +{ + return [NSArray arrayWithArray:self.mutableFetchRequestBlocks]; +} + +- (void)addFetchRequestBlock:(NSFetchRequest *(^)(NSURL *URL))block +{ + NSParameterAssert(block); + [self.mutableFetchRequestBlocks addObject:block]; +} + +#endif + +#pragma mark - Queue Management + +- (void)enqueueObjectRequestOperation:(RKObjectRequestOperation *)objectRequestOperation +{ + [self.operationQueue addOperation:objectRequestOperation]; +} + +- (NSArray *)enqueuedObjectRequestOperationsWithMethod:(RKRequestMethod)method matchingPathPattern:(NSString *)pathPattern +{ + NSMutableArray *matches = [NSMutableArray array]; + RKPathMatcher *pathMatcher = [RKPathMatcher pathMatcherWithPattern:pathPattern]; + for (NSOperation *operation in [self.operationQueue operations]) { + if (![operation isKindOfClass:[RKObjectRequestOperation class]]) { + continue; + } + NSURLRequest *request = [(RKObjectRequestOperation *)operation HTTPRequestOperation].request; + NSString *pathAndQueryString = RKPathAndQueryStringFromURLRelativeToURL([request URL], self.baseURL); + + RKRequestMethod operationMethod = RKRequestMethodFromString([request HTTPMethod]); + if ((method & operationMethod) && [pathMatcher matchesPath:pathAndQueryString tokenizeQueryStrings:NO parsedArguments:nil]) { + [matches addObject:operation]; + } + } + return [matches copy]; +} + +- (void)cancelAllObjectRequestOperationsWithMethod:(RKRequestMethod)method matchingPathPattern:(NSString *)pathPattern +{ + for (RKObjectRequestOperation *operation in [self enqueuedObjectRequestOperationsWithMethod:method matchingPathPattern:pathPattern]) { + [operation cancel]; + } +} + +- (void)enqueueBatchOfObjectRequestOperationsWithRoute:(RKRoute *)route + objects:(NSArray *)objects + progress:(void (^)(NSUInteger numberOfFinishedOperations, + NSUInteger totalNumberOfOperations))progress + completion:(void (^)(NSArray *operations))completion { + NSMutableArray *operations = [[NSMutableArray alloc] initWithCapacity:objects.count]; + for (id object in objects) { + RKObjectRequestOperation *operation = nil; + NSDictionary *interpolatedParameters = nil; + NSURL *URL = [self URLWithRoute:route object:object interpolatedParameters:&interpolatedParameters]; + NSAssert(URL, @"Failed to generate URL for route %@ with object %@", route, object); + if ([route isClassRoute]) { + operation = [self appropriateObjectRequestOperationWithObject:object method:route.method path:[URL relativeString] parameters:nil]; + } else { + operation = [self appropriateObjectRequestOperationWithObject:nil method:route.method path:[URL relativeString] parameters:nil]; + } + operation.mappingMetadata = @{ @"routing": interpolatedParameters, @"route": route }; + [operations addObject:operation]; + } + return [self enqueueBatchOfObjectRequestOperations:operations progress:progress completion:completion]; +} + +- (void)enqueueBatchOfObjectRequestOperations:(NSArray *)operations + progress:(void (^)(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations))progress + completion:(void (^)(NSArray *operations))completion { + + __block dispatch_group_t dispatchGroup = dispatch_group_create(); + NSBlockOperation *batchedOperation = [NSBlockOperation blockOperationWithBlock:^{ + dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^{ + if (completion) { + completion(operations); + } + }); +#if !OS_OBJECT_USE_OBJC + dispatch_release(dispatchGroup); +#endif + }]; + + for (RKObjectRequestOperation *operation in operations) { + void (^originalCompletionBlock)(void) = [operation.completionBlock copy]; + __weak RKObjectRequestOperation *weakOperation = operation; + [operation setCompletionBlock:^{ + dispatch_queue_t queue = weakOperation.successCallbackQueue ?: dispatch_get_main_queue(); + dispatch_group_async(dispatchGroup, queue, ^{ + if (originalCompletionBlock) { + originalCompletionBlock(); + } + + __block NSUInteger numberOfFinishedOperations = 0; + [operations enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { + if ([(NSOperation *)obj isFinished]) { + numberOfFinishedOperations++; + } + }]; + + if (progress) { + progress(numberOfFinishedOperations, [operations count]); + } + + dispatch_group_leave(dispatchGroup); + }); + }]; + + dispatch_group_enter(dispatchGroup); + [batchedOperation addDependency:operation]; + + [self enqueueObjectRequestOperation:operation]; + } + [self.operationQueue addOperation:batchedOperation]; +} + +@end + +#ifdef _SYSTEMCONFIGURATION_H +NSString *RKStringFromNetworkReachabilityStatus(AFRKNetworkReachabilityStatus networkReachabilityStatus) +{ + switch (networkReachabilityStatus) { + case AFRKNetworkReachabilityStatusNotReachable: return @"Not Reachable"; + case AFRKNetworkReachabilityStatusReachableViaWiFi: return @"Reachable via WiFi"; + case AFRKNetworkReachabilityStatusReachableViaWWAN: return @"Reachable via WWAN"; + case AFRKNetworkReachabilityStatusUnknown: return @"Reachability Unknown"; + default: break; + } + return nil; +} +#endif diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKObjectParameterization.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKObjectParameterization.h new file mode 100644 index 0000000..5e9c68f --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKObjectParameterization.h @@ -0,0 +1,44 @@ +// +// RKObjectParameterization.h +// RestKit +// +// Created by Blake Watters on 5/2/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKRequestDescriptor.h" + +/** + The `RKObjectParameterization` class provides an interface for mapping a local domain object into an `NSDictionary` representation suitable for use as the parameters of an HTTP request. + */ +@interface RKObjectParameterization : NSObject + +///------------------------------- +/// @name Parameterizing an Object +///------------------------------- + +/** + Returns a dictionary representation of the given object by performing object mapping using the mapping + from the given request descriptor. If the request descriptor specifies a root key path, the mapped parameters + will be nested within the dictionary under the specified root key path. + + @param object The object to be parameterized. + @param requestDescriptor The request descriptor describing how the object is to be mapped into an `NSDictionary` of parameters. + @param error If there is a problem mapping the parameters, upon return contains a pointer to an instance of `NSError` that describes the problem. + @return A new dictionary containing the mapped parameters or nil if an error has occurred. + */ ++ (NSDictionary *)parametersWithObject:(id)object requestDescriptor:(RKRequestDescriptor *)requestDescriptor error:(NSError **)error; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKObjectParameterization.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKObjectParameterization.m new file mode 100644 index 0000000..56b549b --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKObjectParameterization.m @@ -0,0 +1,152 @@ +// +// RKObjectParameterization.m +// RestKit +// +// Created by Blake Watters on 5/2/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKMIMETypes.h" +#import "RKSerialization.h" +#import "RKObjectParameterization.h" +#import "RKMIMETypeSerialization.h" +#import "RKLog.h" +#import "RKObjectMappingOperationDataSource.h" +#import "RKObjectMapping.h" +#import "RKMappingOperation.h" +#import "RKMappingErrors.h" +#import "RKPropertyInspector.h" +#import "RKValueTransformers.h" +#import "RKBooleanClass.h" + +// Set Logging Component +#undef RKLogComponent +#define RKLogComponent RKlcl_cRestKitNetwork + +@interface RKObjectParameterization () <RKMappingOperationDelegate> +@property (nonatomic, strong) id object; +@property (nonatomic, strong) RKRequestDescriptor *requestDescriptor; + +- (instancetype)initWithObject:(id)object requestDescriptor:(RKRequestDescriptor *)requestDescriptor; +- (NSDictionary *)mapObjectToParameters:(NSError **)error; + +// Convenience methods +@property (nonatomic, readonly) RKObjectMapping *mapping; +@property (nonatomic, readonly) NSString *rootKeyPath; +@end + +@implementation RKObjectParameterization + ++ (NSDictionary *)parametersWithObject:(id)object requestDescriptor:(RKRequestDescriptor *)requestDescriptor error:(NSError **)error +{ + RKObjectParameterization *parameterization = [[self alloc] initWithObject:object requestDescriptor:requestDescriptor]; + return [parameterization mapObjectToParameters:error]; +} + +- (instancetype)initWithObject:(id)object requestDescriptor:(RKRequestDescriptor *)requestDescriptor +{ + NSParameterAssert(object); + NSParameterAssert(requestDescriptor); + + self = [super init]; + if (self) { + self.object = object; + self.requestDescriptor = requestDescriptor; + } + return self; +} + +- (RKMapping *)mapping +{ + return self.requestDescriptor.mapping; +} + +- (NSString *)rootKeyPath +{ + return self.requestDescriptor.rootKeyPath; +} + +- (NSDictionary *)mapObjectToParameters:(NSError **)error +{ + RKObjectMappingOperationDataSource *dataSource = [RKObjectMappingOperationDataSource new]; + NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; + RKMappingOperation *operation = [[RKMappingOperation alloc] initWithSourceObject:self.object destinationObject:dictionary mapping:self.mapping]; + operation.dataSource = dataSource; + operation.delegate = self; + [operation start]; + if (operation.error) { + if (operation.error.code == RKMappingErrorUnmappableRepresentation) { + // If the mapped object is empty, return an empty dictionary and no error + return self.rootKeyPath ? @{ self.rootKeyPath: @{} } : @{}; + } + + if (error) *error = operation.error; + return nil; + } + + // Optionally enclose the serialized object within a container... + return self.rootKeyPath ? [NSMutableDictionary dictionaryWithObject:dictionary forKey:self.rootKeyPath] : dictionary; +} + +#pragma mark - RKMappingOperationDelegate + +- (void)mappingOperation:(RKMappingOperation *)operation didSetValue:(id)value forKeyPath:(NSString *)keyPath usingMapping:(RKAttributeMapping *)mapping +{ + id transformedValue = nil; + if (value == nil) { + if (mapping.objectMapping.assignsDefaultValueForMissingAttributes) { + // Serialize nil values as null + transformedValue = [NSNull null]; + } + } else if ([value isKindOfClass:[NSDate class]]) { + [mapping.valueTransformer transformValue:value toValue:&transformedValue ofClass:[NSString class] error:nil]; + } else if ([value isKindOfClass:[NSDecimalNumber class]]) { + // Precision numbers are serialized as strings to work around Javascript notation limits + transformedValue = [(NSDecimalNumber *)value stringValue]; + } else if ([value isKindOfClass:[NSSet class]]) { + // NSSets are not natively serializable, so let's just turn it into an NSArray + transformedValue = [value allObjects]; + } else if ([value isKindOfClass:[NSOrderedSet class]]) { + // NSOrderedSets are not natively serializable, so let's just turn it into an NSArray + transformedValue = [value array]; + } else { + Class propertyClass = RKPropertyInspectorGetClassForPropertyAtKeyPathOfObject(mapping.sourceKeyPath, operation.sourceObject); + if ([propertyClass isSubclassOfClass:RK_BOOLEAN_CLASS]) { + transformedValue = @([value boolValue]); + } + } + + if (transformedValue) { + RKLogDebug(@"Serialized %@ value at keyPath to %@ (%@)", NSStringFromClass([value class]), NSStringFromClass([transformedValue class]), value); + [operation.destinationObject setValue:transformedValue forKeyPath:keyPath]; + } +} + +- (BOOL)mappingOperation:(RKMappingOperation *)operation shouldSetValue:(id)value forKeyPath:(NSString *)keyPath usingMapping:(RKPropertyMapping *)propertyMapping +{ + NSArray *keyPathComponents = [keyPath componentsSeparatedByString:@"."]; + id currentValue = operation.destinationObject; + for (NSString *key in keyPathComponents) { + id value = [currentValue valueForKey:key]; + if (value == nil) { + value = [NSMutableDictionary new]; + [currentValue setValue:value forKey:key]; + } + currentValue = value; + } + return YES; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKObjectRequestOperation.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKObjectRequestOperation.h new file mode 100644 index 0000000..aaaeef9 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKObjectRequestOperation.h @@ -0,0 +1,238 @@ +// +// RKObjectRequestOperation.h +// RestKit +// +// Created by Blake Watters on 8/9/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKHTTPRequestOperation.h" +#import "RKMappingResult.h" +#import "RKMapperOperation.h" + +/** + The key for a Boolean NSNumber value that indicates if a `NSCachedURLResponse` stored in the `NSURLCache` has been object mapped to completion. This key is stored on the `userInfo` of the cached response, if any, just before an `RKObjectRequestOperation` transitions to the finished state. + */ +extern NSString * const RKResponseHasBeenMappedCacheUserInfoKey; + +/** + `RKObjectRequestOperation` is an `NSOperation` subclass that implements object mapping on the response body of an `NSHTTPResponse` loaded via an `RKHTTPRequestOperation`. + + Object request operations are initialized with a fully configured `NSURLRequest` object and an array of `RKResponseDescriptor` objects. `RKObjectRequestOperation` is internally implemented as an aggregate operation that constructs and starts an `RKHTTPRequestOperation` to perform the network access and retrieve the mappable data. If an error occurs during HTTP transport, the object request operation is failed with the transport error. Once response data is loaded for the request, the object request operation creates and starts an `RKObjectResponseMapperOperation` to perform the object mapping on the response body. If the mapping operation fails, then object request operation is failed and the `error` property is set. If mapping is successful, then the `mappingResult` property is set and the operation is finished successfully. + + ## Acceptable Content Types and Status Codes + + Instances of `RKObjectRequestOperation` determine the acceptability of status codes and content types differently than is typical for `AFNetworking` derived network opertations. The `RKHTTPRequestOperation` (which is a subclass of the AFNetworking `AFHTTPRequestOperation` class) supports the dynamic assignment of acceptable status codes and content types. This facility is utilized during the configuration of the network operation for an object request operation. The set of acceptable content types is determined by consulting the `RKMIMETypeSerialization` via an invocation of `[RKMIMETypeSerialization registeredMIMETypes]`. The `registeredMIMETypes` method returns an `NSSet` containing either `NSString` or `NSRegularExpression` objects that specify the content types for which `RKSerialization` classes have been registered to handle. The set of acceptable status codes is determined by aggregating the value of the `statusCodes` property from all registered `RKResponseDescriptor` objects. + + ## Error Mapping + + If the HTTP request returned a response in the Client Error (400-499 range) or Server Error (500-599 range) class and an appropriate `RKResponseDescriptor` is provided to perform mapping on the response, then the object mapping result is considered to contain a server returned error. In this case, an `NSError` object is created in the `RKErrorDomain` with an error code of `RKMappingErrorFromMappingResult` and the object request operation is failed. In the event that an a response is returned in an error class and no `RKResponseDescriptor` has been provided to the operation to handle it, then an `NSError` object in the `AFNetworkingErrorDomain` with an error code of `NSURLErrorBadServerResponse` will be returned by the underlying `RKHTTPRequestOperation` indicating that an unexpected status code was returned. + + ## Metadata Mapping + + The `RKObjectRequestOperation` class provides support for metadata mapping via the `mappingMetadata` property. This optional dictionary of user supplied information is made available to the mapping operations executed when processing the HTTP response loaded by an object request operation. More details about the metadata mapping architecture is available on the `RKMappingOperation` documentation. + + ## Prioritization and Cancellation + + Object request operations support prioritization and cancellation of the underlying `RKHTTPRequestOperation` and `RKResponseMapperOperation` operations that perform the network transport and object mapping duties on their behalf. The queue priority of the object request operation, as set via the `[NSOperation setQueuePriority:]` method, is applied to the underlying response mapping operation when it is enqueued onto the `responseMappingQueue`. If the object request operation is cancelled, then the underlying HTTP request operation and response mapping operation are also cancelled. + + ## Caching + + Instances of `RKObjectRequestOperation` support all the HTTP caching facilities available via the `NSURLConnection` family of API's. For caching to be enabled, the remote web server that the application is communicating with must emit the appropriate `Cache-Control`, `Expires`, and/or `ETag` headers. When the response headers include the appropriate caching information, the shared `NSURLCache` instance will manage responses and transparently add conditional GET support to cachable requests. HTTP caching is a deep topic explored in depth across the web and detailed in RFC 2616: http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html + + The `RKObjectRequestOperation` class also provides support for utilizing the `NSURLCache` to satisfy requests without hitting the network. This support enables applications to display views presenting data retrieved via a cachable `GET` request without revalidating with the server and incurring any overhead. The optimization is controlled via `avoidsNetworkAccess` property. When enabled, the operation will skip the network transport portion of the object request operation and proceed directly to object mapping the cached response data. When the object request operation is an instance of `RKManagedObjectRequestOperation`, the deserialization and mapping portion of the process can be skipped entirely and the operation will fetch the appropriate object directly from Core Data, falling back to network transport once the cache entry has expired. Please refer to the documentation accompanying `RKManagedObjectRequestOperation` for more details. + + ## Core Data + + `RKObjectRequestOperation` is not able to perform object mapping that targets Core Data destination entities. Please refer to the `RKManagedObjectRequestOperation` subclass for details regarding performing a Core Data object request operation. + + ## Subclassing Notes + + The `RKObjectRequestOperation` is a non-current `NSOperation` subclass and can be extended by subclassing and providing an implementation of the `main` method. It conforms to the `RKMapperOperationDelegate` protocol, providing access to the lifecycle of the mapping process to subclasses. + + @see `RKResponseDescriptor` + @see `RKHTTPRequestOperation` + @see `RKMIMETypeSerialization` + @see `RKManagedObjectRequestOperation` + */ +@interface RKObjectRequestOperation : NSOperation <NSCopying, RKMapperOperationDelegate> { + @protected + RKMappingResult *_mappingResult; +} + +///----------------------------------------------- +/// @name Initializing an Object Request Operation +///----------------------------------------------- + +/** + Initializes an object request operation with an HTTP request operation and a set of response descriptors. + + This is the designated initializer. + + @param requestOperation The request object to be used with the underlying network operation. + @param responseDescriptors An array of `RKResponseDescriptor` objects specifying how object mapping is to be performed on the response loaded by the network operation. + @return The receiver, initialized with the given request and response descriptors. + */ +- (instancetype)initWithHTTPRequestOperation:(RKHTTPRequestOperation *)requestOperation responseDescriptors:(NSArray *)responseDescriptors NS_DESIGNATED_INITIALIZER; + +/** + Initializes an object request operation with a request object and a set of response descriptors. + + This method is a convenience initializer for initializing an object request operation from a URL request with the default HTTP operation class `RKHTTPRequestOperation`. This method is functionally equivalent to the following example code: + + RKHTTPRequestOperation *requestOperation = [[RKHTTPRequestOperation alloc] initWithRequest:request]; + RKObjectRequestOperation *objectRequestOperation = [[RKObjectRequestOperation alloc] initWithHTTPRequestOperation:requestOperation responseDescriptors:responseDescriptors]; + + @param request The request object to be used with the underlying network operation. + @param responseDescriptors An array of `RKResponseDescriptor` objects specifying how object mapping is to be performed on the response loaded by the network operation. + @return The receiver, initialized with the given request and response descriptors. + */ +- (instancetype)initWithRequest:(NSURLRequest *)request responseDescriptors:(NSArray *)responseDescriptors; + +///--------------------------------- +/// @name Configuring Object Mapping +///--------------------------------- + +/** + The array of `RKResponseDescriptor` objects that specify how the deserialized `responseData` is to be object mapped. + + The response descriptors define the acceptable HTTP Status Codes of the receiver. + */ +@property (nonatomic, strong, readonly) NSArray *responseDescriptors; + +/** + The target object for the object mapping operation. + + @see `[RKObjectResponseMapperOperation targetObject]` + */ +@property (nonatomic, strong) id targetObject; + +/** + An optional dictionary of metadata to make available to mapping operations executed while processing the HTTP response loaded by the receiver. + */ +@property (nonatomic, copy) NSDictionary *mappingMetadata; + +///---------------------------------- +/// @name Accessing Operation Results +///---------------------------------- + +/** + The mapping result returned by the underlying `RKObjectResponseMapperOperation`. + + This property is `nil` if the operation is failed due to a network transport error or no mapping was peformed on the response. + */ +@property (nonatomic, strong, readonly) RKMappingResult *mappingResult; + +/** + The error, if any, that occurred during execution of the operation. + + Errors may originate during the network transport or object mapping phases of the object request operation. A `nil` error value indicates that the operation completed successfully. + */ +@property (nonatomic, strong, readonly) NSError *error; + +///------------------------------------------- +/// @name Accessing the HTTP Request Operation +///------------------------------------------- + +/** + The underlying `RKHTTPRequestOperation` object used to manage the HTTP request/response lifecycle of the object request operation. + */ +@property (nonatomic, strong, readonly) RKHTTPRequestOperation *HTTPRequestOperation; + +///------------------------------------------------------- +/// @name Setting the Completion Block and Callback Queues +///------------------------------------------------------- + +/** + Sets the `completionBlock` property with a block that executes either the specified success or failure block, depending on the state of the object request on completion. If `error` returns a value, which can be set during HTTP transport by the underlying `HTTPRequestOperation` or during object mapping by the `RKResponseMapperOperation` object, then `failure` is executed. If the object request operation is cancelled, then the failure block will be executed with either a `RKOperationCancelledError` or a `NSURLErrorCancelled`, depending on the internal state of the operation at time of cancellation. Otherwise, `success` is executed. + + @param success The block to be executed on the completion of a successful operation. This block has no return value and takes two arguments: the receiver operation and the mapping result from object mapping the response data of the request. + @param failure The block to be executed on the completion of an unsuccessful operation. This block has no return value and takes two arguments: the receiver operation and the error that occurred during the execution of the operation. + */ +- (void)setCompletionBlockWithSuccess:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure; + +/** + The callback dispatch queue on success. If `NULL` (default), the main queue is used. + + The queue is retained while this operation is living + */ +@property (nonatomic, assign) dispatch_queue_t successCallbackQueue; + +/** + The callback dispatch queue on failure. If `NULL` (default), the main queue is used. + + The queue is retained while this operation is living + */ +@property (nonatomic, assign) dispatch_queue_t failureCallbackQueue; + +/** + Sets a block to be executed before the object request operation begins mapping the deserialized response body, providing an opportunity to manipulate the mappable representation input that will be passed to the response mapper. + + @param block A block object to be executed before the deserialized response is passed to the response mapper. The block has an `id` return type and must return a dictionary or array of dictionaries corresponding to the object representations that are to be mapped. The block accepts a single argument: the deserialized response data that was loaded via HTTP. If you do not wish to make any chances to the response body before mapping begins, the block should return the value passed in the `deserializedResponseBody` block argument. Returning `nil` will decline the mapping from proceeding and fail the operation with an error with the `RKMappingErrorMappingDeclined` code. + @see [RKResponseMapperOperation setWillMapDeserializedResponseBlock:] + @warning The deserialized response body may or may not be immutable depending on the implementation details of the `RKSerialization` class that deserialized the response. If you wish to make changes to the mappable object representations, you must obtain a mutable copy of the response body input. + */ +- (void)setWillMapDeserializedResponseBlock:(id (^)(id deserializedResponseBody))block; + +///----------------------------------------------------- +/// @name Determining Whether a Request Can Be Processed +///----------------------------------------------------- + +/** + Returns a Boolean value determining whether or not the class can process the specified request. + + @param request The request that is determined to be supported or not supported for this class. + */ ++ (BOOL)canProcessRequest:(NSURLRequest *)request; + +///------------------------------------------- +/// @name Accessing the Response Mapping Queue +///------------------------------------------- + +/** + Returns the operation queue used by all object request operations when object mapping the body of a response loaded via HTTP. + + By default, the response mapping queue is configured with a maximum concurrent operation count of 1, ensuring that only one HTTP response is mapped at a time. + + @return The response mapping queue. + */ ++ (NSOperationQueue *)responseMappingQueue; + +@end + +///-------------------- +/// @name Notifications +///-------------------- + +/** + Posted when an object request operation begin executing. + */ +extern NSString *const RKObjectRequestOperationDidStartNotification; + +/** + Posted when an object request operation finishes. + */ +extern NSString *const RKObjectRequestOperationDidFinishNotification; + +/** + The key for an `NSDate` object specifying the time at which object mapping started for object request operation. Available in the user info dictionary of an `RKObjectRequestOperationDidFinishNotification` + */ +extern NSString *const RKObjectRequestOperationMappingDidStartUserInfoKey; + +/** + The key for an `NSDate` object specifying the time at which object mapping finished for object request operation. Available in the user info dictionary of an `RKObjectRequestOperationDidFinishNotification` + */ +extern NSString *const RKObjectRequestOperationMappingDidFinishUserInfoKey; diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKObjectRequestOperation.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKObjectRequestOperation.m new file mode 100644 index 0000000..991420f --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKObjectRequestOperation.m @@ -0,0 +1,609 @@ +// +// RKObjectRequestOperation.m +// RestKit +// +// Created by Blake Watters on 8/9/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <objc/runtime.h> +#import "RKObjectRequestOperation.h" +#import "RKResponseMapperOperation.h" +#import "RKResponseDescriptor.h" +#import "RKMIMETypeSerialization.h" +#import "RKHTTPUtilities.h" +#import "RKLog.h" +#import "RKMappingErrors.h" +#import "RKOperationStateMachine.h" + +#import <Availability.h> + +#if __IPHONE_OS_VERSION_MIN_REQUIRED +#import "AFRKNetworkActivityIndicatorManager.h" +#endif + +// Set Logging Component +#undef RKLogComponent +#define RKLogComponent RKlcl_cRestKitNetwork + +#define RKLogIsTrace() (_RKlcl_component_level[(__RKlcl_log_symbol(RKlcl_cRestKitNetwork))]) >= (__RKlcl_log_symbol(RKlcl_vTrace)) + +static BOOL RKLogIsStringBlank(NSString *string) +{ + return ([[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0); +} + +static NSString *RKLogTruncateString(NSString *string) +{ + static NSInteger maxMessageLength; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSDictionary *envVars = [[NSProcessInfo processInfo] environment]; + maxMessageLength = RKLogIsStringBlank(envVars[@"RKLogMaxLength"]) ? NSIntegerMax : [envVars[@"RKLogMaxLength"] integerValue]; + }); + + return ([string length] <= maxMessageLength) + ? string + : [NSString stringWithFormat:@"%@... (truncated at %ld characters)", + [string substringToIndex:maxMessageLength], + (long) maxMessageLength]; +} + +@interface NSCachedURLResponse (RKLeakFix) + +@property (NS_NONATOMIC_IOSONLY, readonly, copy) NSData *rkData; + +@end + +@interface RKObjectRequestOperationLogger : NSObject + ++ (RKObjectRequestOperationLogger*)sharedLogger; + +@end + +@implementation RKObjectRequestOperationLogger + ++ (RKObjectRequestOperationLogger*)sharedLogger +{ + static RKObjectRequestOperationLogger *sharedInstance = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedInstance = [[self alloc] init]; + }); + return sharedInstance; +} + ++ (void)load +{ + @autoreleasepool { + [self sharedLogger]; + }; +} + +- (instancetype)init +{ + self = [super init]; + if (self) { + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(objectRequestOperationDidStart:) + name:RKObjectRequestOperationDidStartNotification + object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(objectRequestOperationDidFinish:) + name:RKObjectRequestOperationDidFinishNotification + object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(HTTPOperationDidStart:) + name:AFRKNetworkingOperationDidStartNotification + object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(HTTPOperationDidFinish:) + name:AFRKNetworkingOperationDidFinishNotification + object:nil]; + } + + return self; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +static void *RKOperationStartDate = &RKOperationStartDate; +static void *RKOperationFinishDate = &RKOperationFinishDate; + +- (void)objectRequestOperationDidStart:(NSNotification *)notification +{ + RKObjectRequestOperation *objectRequestOperation = [notification object]; + objc_setAssociatedObject(objectRequestOperation, RKOperationStartDate, [NSDate date], OBJC_ASSOCIATION_RETAIN_NONATOMIC); + + NSURLRequest *request = objectRequestOperation.HTTPRequestOperation.request; + RKLogInfo(@"%@ '%@'", request.HTTPMethod, request.URL.absoluteString); + RKLogDebug(@"request.headers=%@", request.allHTTPHeaderFields); + if (request.HTTPBody && RKLogIsTrace()) { + RKLogTrace(@"request.body=%@", RKLogTruncateString([[NSString alloc] initWithData:request.HTTPBody encoding:NSUTF8StringEncoding])); + } +} + +- (void)HTTPOperationDidStart:(NSNotification *)notification +{ + objc_setAssociatedObject(notification.object, RKOperationStartDate, [NSDate date], OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +- (void)HTTPOperationDidFinish:(NSNotification *)notification +{ + objc_setAssociatedObject(notification.object, RKOperationFinishDate, [NSDate date], OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +- (void)objectRequestOperationDidFinish:(NSNotification *)notification +{ + RKObjectRequestOperation *objectRequestOperation = [notification object]; + if (![objectRequestOperation isKindOfClass:[RKObjectRequestOperation class]]) return; + + RKHTTPRequestOperation *HTTPRequestOperation = objectRequestOperation.HTTPRequestOperation; + NSTimeInterval objectRequestExecutionDuration = [[NSDate date] timeIntervalSinceDate:objc_getAssociatedObject(objectRequestOperation, RKOperationStartDate)]; + NSTimeInterval httpRequestExecutionDuration = [objc_getAssociatedObject(HTTPRequestOperation, RKOperationFinishDate) timeIntervalSinceDate:objc_getAssociatedObject(HTTPRequestOperation, RKOperationStartDate)]; + NSDate *mappingDidStartTime = (notification.userInfo)[RKObjectRequestOperationMappingDidFinishUserInfoKey]; + NSTimeInterval mappingDuration = [mappingDidStartTime isEqual:[NSNull null]] ? 0.0 : [mappingDidStartTime timeIntervalSinceDate:(notification.userInfo)[RKObjectRequestOperationMappingDidStartUserInfoKey]]; + + NSURLRequest *request = HTTPRequestOperation.request; + NSHTTPURLResponse *response = HTTPRequestOperation.response; + NSString *statusCodeString = RKStringFromStatusCode(response.statusCode); + NSString *statusCodeDescription = statusCodeString ? [NSString stringWithFormat:@" %@ ", statusCodeString] : @" "; + NSString *elapsedTimeString = [NSString stringWithFormat:@"[request=%.04fs mapping=%.04fs total=%.04fs]", httpRequestExecutionDuration, mappingDuration, objectRequestExecutionDuration]; + NSString *statusCodeAndElapsedTime = [NSString stringWithFormat:@"(%ld%@/ %lu objects) %@", (long)response.statusCode, statusCodeDescription, (unsigned long) [objectRequestOperation.mappingResult count], elapsedTimeString]; + if (objectRequestOperation.error) { + if (objectRequestOperation.error.code == NSURLErrorCancelled) { + RKLogDebug(@"%@ '%@' %@: Cancelled", request.HTTPMethod, request.URL.absoluteString, statusCodeAndElapsedTime); + } else { + RKLogError(@"%@ '%@' %@: %@", request.HTTPMethod, request.URL.absoluteString, statusCodeAndElapsedTime, objectRequestOperation.error); + } + } else { + RKLogInfo(@"%@ '%@' %@", request.HTTPMethod, request.URL.absoluteString, statusCodeAndElapsedTime); + RKLogDebug(@"response.headers=%@", response.allHeaderFields); + } + if (RKLogIsTrace()) { + RKLogTrace(@"response.body=%@", RKLogTruncateString(HTTPRequestOperation.responseString)); + } +} + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +NSString *const RKObjectRequestOperationDidStartNotification = @"RKObjectRequestOperationDidStartNotification"; +NSString *const RKObjectRequestOperationDidFinishNotification = @"RKObjectRequestOperationDidFinishNotification"; +NSString *const RKResponseHasBeenMappedCacheUserInfoKey = @"RKResponseHasBeenMapped"; +NSString *const RKObjectRequestOperationMappingDidStartUserInfoKey = @"mappingStartedAt"; +NSString *const RKObjectRequestOperationMappingDidFinishUserInfoKey = @"mappingFinishedAt"; + +static void RKIncrementNetworkActivityIndicator() +{ + #if __IPHONE_OS_VERSION_MIN_REQUIRED + [[AFRKNetworkActivityIndicatorManager sharedManager] incrementActivityCount]; + #endif +} + +static void RKDecrementNetworkAcitivityIndicator() +{ + #if __IPHONE_OS_VERSION_MIN_REQUIRED + [[AFRKNetworkActivityIndicatorManager sharedManager] decrementActivityCount]; + #endif +} + +static NSIndexSet *RKAcceptableStatusCodesFromResponseDescriptors(NSArray *responseDescriptors) +{ + // If there are no response descriptors or any descriptor matches any status code (expressed by `statusCodes` == `nil`) then we want to accept anything + if ([responseDescriptors count] == 0 || [[responseDescriptors valueForKey:@"statusCodes"] containsObject:[NSNull null]]) return nil; + + NSMutableIndexSet *acceptableStatusCodes = [NSMutableIndexSet indexSet]; + [responseDescriptors enumerateObjectsUsingBlock:^(RKResponseDescriptor *responseDescriptor, NSUInteger idx, BOOL *stop) { + [acceptableStatusCodes addIndexes:responseDescriptor.statusCodes]; + }]; + return acceptableStatusCodes; +} + +static NSString *RKStringForStateOfObjectRequestOperation(RKObjectRequestOperation *operation) +{ + if ([operation isExecuting]) { + return @"Executing"; + } else if ([operation isFinished]) { + if (operation.error) { + return @"Failed"; + } else { + return @"Successful"; + } + } else { + return @"Ready"; + } +} + +static NSString *RKStringDescribingURLResponseWithData(NSURLResponse *response, NSData *data) +{ + if ([response isKindOfClass:[NSHTTPURLResponse class]]) { + NSHTTPURLResponse *HTTPResponse = (NSHTTPURLResponse *)response; + return [NSString stringWithFormat:@"<%@: %p statusCode=%ld MIMEType=%@ length=%ld>", [response class], response, (long) [HTTPResponse statusCode], [HTTPResponse MIMEType], (long) [data length]]; + } else { + return [response description]; + } +} + +@interface RKObjectRequestOperation () +@property (nonatomic, strong) RKOperationStateMachine *stateMachine; +@property (nonatomic, strong, readwrite) RKHTTPRequestOperation *HTTPRequestOperation; +@property (nonatomic, strong, readwrite) NSArray *responseDescriptors; +@property (nonatomic, strong, readwrite) RKMappingResult *mappingResult; +@property (nonatomic, strong, readwrite) NSError *error; +@property (nonatomic, strong) RKObjectResponseMapperOperation *responseMapperOperation; +@property (nonatomic, copy) id (^willMapDeserializedResponseBlock)(id deserializedResponseBody); +@property (nonatomic, strong) NSDate *mappingDidStartDate; +@property (nonatomic, strong) NSDate *mappingDidFinishDate; +@property (nonatomic, copy) void (^successBlock)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult); +@property (nonatomic, copy) void (^failureBlock)(RKObjectRequestOperation *operation, NSError *error); +@end + +@implementation RKObjectRequestOperation + ++ (NSOperationQueue *)responseMappingQueue +{ + static NSOperationQueue *responseMappingQueue = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + responseMappingQueue = [NSOperationQueue new]; + [responseMappingQueue setName:@"RKObjectRequestOperation Response Mapping Queue" ]; + [responseMappingQueue setMaxConcurrentOperationCount:1]; + }); + + return responseMappingQueue; +} + ++ (dispatch_queue_t)dispatchQueue +{ + static dispatch_queue_t dispatchQueue; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + dispatchQueue = dispatch_queue_create("org.restkit.network.object-request-operation-queue", DISPATCH_QUEUE_CONCURRENT); + }); + + return dispatchQueue; +} + ++ (BOOL)canProcessRequest:(NSURLRequest *)request +{ + return YES; +} + +- (void)dealloc +{ +#if !OS_OBJECT_USE_OBJC + if (_failureCallbackQueue) dispatch_release(_failureCallbackQueue); + if (_successCallbackQueue) dispatch_release(_successCallbackQueue); +#endif + _failureCallbackQueue = NULL; + _successCallbackQueue = NULL; +} + +// Compiler requires that we override this. +- (instancetype)init +{ + self = [self initWithHTTPRequestOperation:nil responseDescriptors:nil]; + NSAssert(NO, @"Failed to call designated initializer on %@.", self); + return self; +} + +// Designated initializer +- (instancetype)initWithHTTPRequestOperation:(RKHTTPRequestOperation *)requestOperation responseDescriptors:(NSArray *)responseDescriptors +{ + NSParameterAssert(requestOperation); + NSParameterAssert(responseDescriptors); + + self = [super init]; + if (self) { + self.responseDescriptors = responseDescriptors; + self.HTTPRequestOperation = requestOperation; + self.HTTPRequestOperation.acceptableContentTypes = [RKMIMETypeSerialization registeredMIMETypes]; + self.HTTPRequestOperation.acceptableStatusCodes = RKAcceptableStatusCodesFromResponseDescriptors(responseDescriptors); + self.HTTPRequestOperation.successCallbackQueue = [[self class] dispatchQueue]; + self.HTTPRequestOperation.failureCallbackQueue = [[self class] dispatchQueue]; + + __weak __typeof(self)weakSelf = self; + self.stateMachine = [[RKOperationStateMachine alloc] initWithOperation:self dispatchQueue:[[self class] dispatchQueue]]; + [self.stateMachine setExecutionBlock:^{ + [[NSNotificationCenter defaultCenter] postNotificationName:RKObjectRequestOperationDidStartNotification object:weakSelf]; + RKIncrementNetworkActivityIndicator(); + if (weakSelf.isCancelled) { + [weakSelf.stateMachine finish]; + } else { + [weakSelf execute]; + } + }]; + [self.stateMachine setFinalizationBlock:^{ + [weakSelf willFinish]; + RKDecrementNetworkAcitivityIndicator(); + [[NSNotificationCenter defaultCenter] postNotificationName:RKObjectRequestOperationDidFinishNotification object:weakSelf userInfo:@{ RKObjectRequestOperationMappingDidStartUserInfoKey: weakSelf.mappingDidStartDate ?: [NSNull null], RKObjectRequestOperationMappingDidFinishUserInfoKey: weakSelf.mappingDidFinishDate ?: [NSNull null] }]; + }]; + [self.stateMachine setCancellationBlock:^{ + [weakSelf.HTTPRequestOperation cancel]; + [weakSelf.responseMapperOperation cancel]; + }]; + } + + return self; +} + +- (instancetype)initWithRequest:(NSURLRequest *)request responseDescriptors:(NSArray *)responseDescriptors +{ + NSParameterAssert(request); + NSParameterAssert(responseDescriptors); + return [self initWithHTTPRequestOperation:[[RKHTTPRequestOperation alloc] initWithRequest:request] responseDescriptors:responseDescriptors]; +} + +- (void)setSuccessCallbackQueue:(dispatch_queue_t)successCallbackQueue +{ + if (successCallbackQueue != _successCallbackQueue) { + if (_successCallbackQueue) { +#if !OS_OBJECT_USE_OBJC + dispatch_release(_successCallbackQueue); +#endif + _successCallbackQueue = NULL; + } + + if (successCallbackQueue) { +#if !OS_OBJECT_USE_OBJC + dispatch_retain(successCallbackQueue); +#endif + _successCallbackQueue = successCallbackQueue; + } + } +} + +- (void)setFailureCallbackQueue:(dispatch_queue_t)failureCallbackQueue +{ + if (failureCallbackQueue != _failureCallbackQueue) { + if (_failureCallbackQueue) { +#if !OS_OBJECT_USE_OBJC + dispatch_release(_failureCallbackQueue); +#endif + _failureCallbackQueue = NULL; + } + + if (failureCallbackQueue) { +#if !OS_OBJECT_USE_OBJC + dispatch_retain(failureCallbackQueue); +#endif + _failureCallbackQueue = failureCallbackQueue; + } + } +} + +// Adopted fix for "The Deallocation Problem" from AFN +- (void)setCompletionBlock:(void (^)(void))block +{ + if (!block) { + [super setCompletionBlock:nil]; + } else { + __unsafe_unretained id weakSelf = self; + [super setCompletionBlock:^ { + block(); + [weakSelf setCompletionBlock:nil]; + }]; + } +} + +- (void)setWillMapDeserializedResponseBlock:(id (^)(id))block +{ + if (!block) { + _willMapDeserializedResponseBlock = nil; + } else { + __unsafe_unretained id weakSelf = self; + _willMapDeserializedResponseBlock = ^id (id deserializedResponse) { + id result = block(deserializedResponse); + [weakSelf setWillMapDeserializedResponseBlock:nil]; + return result; + }; + } +} + +- (void)setCompletionBlockWithSuccess:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure +{ + //Keep blocks for copyWithZone + self.successBlock = success; + self.failureBlock = failure; + + __weak __typeof(self) const weakSelf = self; + self.completionBlock = ^ { + __typeof(self) const strongSelf = weakSelf; // Retain object, so we for sure have something to pass to the success and/or failure blocks. + if(strongSelf) + { + if ([strongSelf isCancelled] && !strongSelf.error) { + strongSelf.error = [NSError errorWithDomain:RKErrorDomain code:RKOperationCancelledError userInfo:nil]; + } + + if (strongSelf.error) { + if (failure) { + dispatch_async(strongSelf.failureCallbackQueue ?: dispatch_get_main_queue(), ^{ + failure(strongSelf, strongSelf.error); + }); + } + } else { + if (success) { + dispatch_async(strongSelf.successCallbackQueue ?: dispatch_get_main_queue(), ^{ + success(strongSelf, strongSelf.mappingResult); + }); + } + } + } + }; +} + +- (void)performMappingOnResponseWithCompletionBlock:(void(^)(RKMappingResult *mappingResult, NSError *error))completionBlock +{ + self.responseMapperOperation = [[RKObjectResponseMapperOperation alloc] initWithRequest:self.HTTPRequestOperation.request + response:self.HTTPRequestOperation.response + data:self.HTTPRequestOperation.responseData + responseDescriptors:self.responseDescriptors]; + self.responseMapperOperation.targetObject = self.targetObject; + self.responseMapperOperation.mappingMetadata = self.mappingMetadata; + self.responseMapperOperation.mapperDelegate = self; + [self.responseMapperOperation setQueuePriority:[self queuePriority]]; + [self.responseMapperOperation setWillMapDeserializedResponseBlock:self.willMapDeserializedResponseBlock]; + [self.responseMapperOperation setDidFinishMappingBlock:^(RKMappingResult *mappingResult, NSError *error) { + completionBlock(mappingResult, error); + }]; + [[RKObjectRequestOperation responseMappingQueue] addOperation:self.responseMapperOperation]; +} + +- (void)execute +{ + __weak __typeof(self)weakSelf = self; + + [self.HTTPRequestOperation setCompletionBlockWithSuccess:^(AFRKHTTPRequestOperation *operation, id responseObject) { + if (weakSelf.isCancelled) { + [weakSelf.stateMachine finish]; + return; + } + + weakSelf.mappingDidStartDate = [NSDate date]; + [weakSelf performMappingOnResponseWithCompletionBlock:^(RKMappingResult *mappingResult, NSError *error) { + if (weakSelf.isCancelled) { + [weakSelf.stateMachine finish]; + return; + } + + // If there is no mapping result but no error, there was no mapping to be performed, + // which we do not treat as an error condition + if (error && !([weakSelf.HTTPRequestOperation.request.HTTPMethod isEqualToString:@"DELETE"] && error.code == RKMappingErrorNotFound)) { + weakSelf.error = error; + [weakSelf.stateMachine finish]; + return; + } + weakSelf.mappingResult = mappingResult; + + if (weakSelf.error) { + weakSelf.mappingResult = nil; + } else { + NSCachedURLResponse *cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:weakSelf.HTTPRequestOperation.request]; + if (cachedResponse) { + // We're all done mapping this request. Now we set a flag on the cache entry's userInfo dictionary to indicate that the request + // corresponding to the cache entry completed successfully, and we can reliably skip mapping if a subsequent request results + // in the use of this cachedResponse. + NSMutableDictionary *userInfo = cachedResponse.userInfo ? [cachedResponse.userInfo mutableCopy] : [NSMutableDictionary dictionary]; + userInfo[RKResponseHasBeenMappedCacheUserInfoKey] = @YES; + NSCachedURLResponse *newCachedResponse = [[NSCachedURLResponse alloc] initWithResponse:cachedResponse.response data:cachedResponse.rkData userInfo:userInfo storagePolicy:cachedResponse.storagePolicy]; + [[NSURLCache sharedURLCache] storeCachedResponse:newCachedResponse forRequest:weakSelf.HTTPRequestOperation.request]; + } + } + + weakSelf.mappingDidFinishDate = [NSDate date]; + [weakSelf.stateMachine finish]; + }]; + } failure:^(AFRKHTTPRequestOperation *operation, NSError *error) { + RKLogError(@"Object request failed: Underlying HTTP request operation failed with error: %@", weakSelf.HTTPRequestOperation.error); + weakSelf.error = weakSelf.HTTPRequestOperation.error; + [weakSelf.stateMachine finish]; + }]; + + // Send the request + [self.HTTPRequestOperation start]; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p, state: %@, isCancelled=%@, request: %@, response: %@>", + NSStringFromClass([self class]), self, RKStringForStateOfObjectRequestOperation(self), [self isCancelled] ? @"YES" : @"NO", + self.HTTPRequestOperation.request, RKStringDescribingURLResponseWithData(self.HTTPRequestOperation.response, self.HTTPRequestOperation.responseData)]; +} + +- (void)willFinish +{ + // Default implementation does nothing +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + RKObjectRequestOperation *operation = [(RKObjectRequestOperation *)[[self class] allocWithZone:zone] initWithHTTPRequestOperation:[self.HTTPRequestOperation copyWithZone:zone] responseDescriptors:self.responseDescriptors]; + operation.targetObject = self.targetObject; + operation.mappingMetadata = self.mappingMetadata; + operation.successCallbackQueue = self.successCallbackQueue; + operation.failureCallbackQueue = self.failureCallbackQueue; + operation.willMapDeserializedResponseBlock = self.willMapDeserializedResponseBlock; + [operation setCompletionBlockWithSuccess:self.successBlock failure:self.failureBlock]; + + return operation; +} + +#pragma mark - NSOperation + +- (BOOL)isConcurrent +{ + return YES; +} + +- (BOOL)isReady +{ + return [self.stateMachine isReady] && [super isReady]; +} + +- (BOOL)isExecuting +{ + return [self.stateMachine isExecuting]; +} + +- (BOOL)isFinished +{ + return [self.stateMachine isFinished]; +} + +- (void)start +{ + [self.stateMachine start]; +} + +- (void)cancel +{ + [super cancel]; + [self.stateMachine cancel]; +} + +@end + +#pragma mark - Fix for leak in iOS 5/6 "- [NSCachedURLResponse data]" message + +@implementation NSCachedURLResponse (RKLeakFix) + +- (NSData *)rkData +{ + @synchronized(self) { + NSData *result; + CFIndex count; + + @autoreleasepool { + result = [self data]; + count = CFGetRetainCount((__bridge CFTypeRef)result); + } + + if (CFGetRetainCount((__bridge CFTypeRef)result) == count) { +#ifndef __clang_analyzer__ + CFRelease((__bridge CFTypeRef)result); // Leak detected, manually release +#endif + } + + return result; + } +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKObjectRequestOperationSubclass.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKObjectRequestOperationSubclass.h new file mode 100644 index 0000000..65a91d7 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKObjectRequestOperationSubclass.h @@ -0,0 +1,44 @@ +// +// RKObjectRequestOperationSubclass.h +// RestKit +// +// Created by Blake Watters on 9/16/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/* + The extensions to the `RKObjectRequestOperation` class declared in the `ForSubclassEyesOnly` category are to be used by subclasses implementations only. Code that uses `RKObjectRequestOperation` objects must never call these methods. + */ +@interface RKObjectRequestOperation (ForSubclassEyesOnly) + +///---------------------------- +/// @name Subclassing Overrides +///---------------------------- + +/** + Performs object mapping using the `response` and `responseData` properties. + + The `RKObjectRequestOperation` superclass is responsible for the invocation of this method and the subsequent handling of the mapping result or error. + + @param completionBlock A mapping result or `nil` if an error has occurred. + */ +- (void)performMappingOnResponseWithCompletionBlock:(void(^)(RKMappingResult *mappingResult, NSError *error))completionBlock; + +/** + Invoked to tell the receiver that the object request operation is finishing its work and is about to transition into the finished state. Used to perform any necessary cleanup before the operation is finished. + */ +- (void)willFinish; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKPaginator.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKPaginator.h new file mode 100644 index 0000000..269d1ba --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKPaginator.h @@ -0,0 +1,280 @@ +// +// RKPaginator.h +// RestKit +// +// Created by Blake Watters on 12/29/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKHTTPRequestOperation.h" +#import "RKObjectRequestOperation.h" +#import "RKObjectMapping.h" +#import "RKMappingResult.h" + +@protocol RKManagedObjectCaching; + +/** + Instances of `RKPaginator` retrieve paginated collections of mappable data from remote systems via HTTP. Paginators perform GET requests and use a patterned URL to construct a full URL reflecting the state of the paginator. Paginators rely on an instance of RKObjectMappingProvider to determine how to perform object mapping on the retrieved data. Paginators can load Core Data backed models provided that an instance of RKManagedObjectStore is assigned to the paginator. + + ## Configuring Pagination Mapping + + The paginator must be configured with a `paginationMapping` specifying how configuration metadata is to be mapped out of the response payload. The configured mapping must have an `objectClass` of `RKPaginator` and should include attribute mappings for the `currentPage`, `pageCount`, `perPage`, and `objectCount`. For example, given a paginated resource loaded from '/articles?page=1' with the followibg JSON: + + { "pagination": { "per_page": 10, "total_pages": 25, "total_objects": 250 }, "articles": [ // Array of articles ] } + + The pagination mapping would be configured as: + + RKObjectMapping *paginationMapping = [RKObjectMapping mappingForClass:[RKPaginator class]]; + [paginationMapping addAttributeMappingsFromDictionary:@{ + @"pagination.per_page": @"perPage", + @"pagination.total_pages": @"pageCount", + @"pagination.total_objects": @"objectCount", + }]; + + ## iOS 5 Compatibility Caveats + + The paginator is compatible with iOS 5.x through the use of proxy attributes. In iOS 6.0 and greater, key-value coding supports the automatic boxing and unboxing of primitive values. This enables direct mapping configuration for the `currentPage`, `pageCount`, `perPage`, and `objectCount` attributes. Under iOS 5, where autoboxing is not available, mapping configuration must target special proxy attributes instead. For each of the above properties, a private `NSNumber` property is implemented by the class. Each proxy property has 'Number' appended as a suffix to the property name: `currentPageNumber`, `pageCountNumber`, `perPageNumber`, and `objectCountNumber`. + + */ +@interface RKPaginator : NSObject + +///------------------------------------- +/// @name Initializing Paginator Objects +///------------------------------------- + +/** + Initializes a RKPaginator object with the a provided patternURL and mappingProvider. + + @param request A request with a URL containing a dynamic pattern specifying how paginated resources are to be accessed. + @param paginationMapping The pagination mapping specifying how pagination metadata is to be mapped from responses. + @param responseDescriptors An array of response descriptors describing how to map object representations loaded by object request operations dispatched by the paginator. + @return The receiver, initialized with the request, pagination mapping, and response descriptors. + */ +- (instancetype)initWithRequest:(NSURLRequest *)request + paginationMapping:(RKObjectMapping *)paginationMapping + responseDescriptors:(NSArray *)responseDescriptors; + +///----------------------------- +/// @name Configuring Networking +///----------------------------- + +/** + A URL with a path pattern for building a complete URL from + which to load the paginated resource collection. The patterned resource + path will be evaluated against the state of the paginator object itself. + + For example, given a paginated collection of data at the /articles path, + the path portion of the pattern URL may look like: + + /articles?per_page=:perPage&page_number=:currentPage + + When the pattern is evaluated against the state of the paginator, this will + yield a complete path that can be used to load the specified page. Given + a paginator configured with 100 objects per page and a current page number of 3, + the path portion of the pagination URL would become: + + /articles?per_page=100&page_number=3 + */ +@property (nonatomic, readonly) NSURL *patternURL; + +/** + Returns a complete URL to the paginated resource collection by interpolating the state of the paginator object against the patternURL. + */ +@property (nonatomic, readonly) NSURL *URL; + +/** + An optional operation queue on which object request operations constructed by the paginator are to be enqueued for processing. + */ +@property (nonatomic, strong) NSOperationQueue *operationQueue; + +/** + Returns the last object request operation used by the paginator to load a page of objects. + */ +@property (nonatomic, strong, readonly) RKObjectRequestOperation *objectRequestOperation; + +/** + Sets the `RKHTTPRequestOperation` subclass to be used when constructing HTTP request operations for requests dispatched by the paginator. + + **Default**: `[RKHTTPRequestOperation class]` + */ +- (void)setHTTPOperationClass:(Class)operationClass; + +///----------------------------------- +/// @name Setting the Completion Block +///----------------------------------- + +/** + Sets the completion block to be invoked when the paginator finishes loading a page of results. + + @param success A block to be executed upon a successful load of a page of objects. The block has no return value and takes three arguments: the paginator object, an array containing the paginated objects, and an integer indicating the page that was loaded. + @param failure A block to be exected upon a failed load. The block has no return value and takes two arguments: the paginator object and an error indicating the nature of the failure. + */ +- (void)setCompletionBlockWithSuccess:(void (^)(RKPaginator *paginator, NSArray *objects, NSUInteger page))success + failure:(void (^)(RKPaginator *paginator, NSError *error))failure; + + +///----------------------------------- +/// @name Accessing Pagination Results +///----------------------------------- + +/** + The mapping result containing the last set of paginated objects or `nil` if an error was encountered. + */ +@property (nonatomic, strong, readonly) RKMappingResult *mappingResult; + +/** + The error, if any, that occured during the last load of the paginator. + */ +@property (nonatomic, strong, readonly) NSError *error; + +///----------------------------------- +/// @name Object Mapping Configuration +///----------------------------------- + +/** + The object mapping defining how pagination metadata is to be mapped from a paginated response onto the paginator object. + + See the documentation in the "Configuring Pagination Mapping" section for details about the pagination mapping. + + @warning The `objectClass` of the given mapping must be `RKPaginator`. + */ +@property (nonatomic, strong) RKObjectMapping *paginationMapping; + +///------------------------------ +/// @name Core Data Configuration +///------------------------------ + +#if __has_include("CoreData.h") +/** + The managed object context in which paginated managed objects are to be persisted. + */ +@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext; + +/** + The managed object cache used to find existing managed object instances in the persistent store. + */ +@property (nonatomic, strong) id<RKManagedObjectCaching> managedObjectCache; + +/** + An array of fetch request blocks. + */ +@property (nonatomic, copy) NSArray *fetchRequestBlocks; +#endif + +///------------------------------------ +/// @name Accessing Pagination Metadata +///------------------------------------ + +/** + The number of objects to load per page + */ +@property (nonatomic, assign) NSUInteger perPage; + +/** + A Boolean value indicating if the paginator has loaded a page of objects + + @returns YES when the paginator has loaded a page of objects + */ +@property (nonatomic, readonly, getter = isLoaded) BOOL loaded; + +/** + Returns the page number for the most recently loaded page of objects. + + @return The page number for the current page of objects. + @exception NSInternalInconsistencyException Raised if `isLoaded` is equal to `NO`. + */ +@property (nonatomic, readonly) NSUInteger currentPage; + +/** + Returns the offset based off the page for the most recently loaded objects. + + @return The offset for the current page of objects. + @exception NSInternalInconsistencyException Raised if `isLoaded` is equal to `NO`. + */ +@property (nonatomic, readonly) NSUInteger offset; + +/** + Returns the number of pages in the total resource collection. + + @return A count of the number of pages in the resource collection. + @exception NSInternalInconsistencyException Raised if `hasPageCount` is `NO`. + */ +@property (nonatomic, readonly) NSUInteger pageCount; + +/** + Returns the total number of objects in the collection + + @return A count of the number of objects in the resource collection. + @exception NSInternalInconsistencyException Raised if `hasObjectCount` is `NO`. + */ +@property (nonatomic, readonly) NSUInteger objectCount; + +/** + Returns a Boolean value indicating if the total number of pages in the collection is known by the paginator. + + @return `YES` if the paginator knows the page count, otherwise `NO`. + */ +@property (nonatomic, readonly) BOOL hasPageCount; + +/** + Returns a Boolean value indicating if the total number of objects in the collection is known by the paginator. + + @return `YES` if the paginator knows the number of objects in the paginated collection, otherwise `NO`. + */ +@property (nonatomic, readonly) BOOL hasObjectCount; + +/** + Returns a Boolean value indicating if there is a next page in the collection. + + @return `YES` if there is a next page, otherwise `NO`. + @exception NSInternalInconsistencyException Raised if isLoaded or hasPageCount is `NO`. + */ +@property (nonatomic, readonly) BOOL hasNextPage; + +/** + Returns a Boolean value indicating if there is a previous page in the collection. + + @return `YES` if there is a previous page, otherwise `NO`. + @exception NSInternalInconsistencyException Raised if isLoaded is `NO`. + */ +@property (nonatomic, readonly) BOOL hasPreviousPage; + +///------------------------ +/// @name Paginator Actions +///------------------------ + +/** + Loads the next page of data by incrementing the current page, constructing an object loader to fetch the data, and object mapping the results. + */ +- (void)loadNextPage; + +/** + Loads the previous page of data by decrementing the current page, constructing an object loader to fetch the data, and object mapping the results. + */ +- (void)loadPreviousPage; + +/** + Loads a specific page of data by mutating the current page, constructing an object loader to fetch the data, and object mapping the results. + + @param pageNumber The page of objects to load from the remote backend + */ +- (void)loadPage:(NSUInteger)pageNumber; + +/** + Cancels an in-progress pagination request. + */ +- (void)cancel; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKPaginator.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKPaginator.m new file mode 100644 index 0000000..0f9222a --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKPaginator.m @@ -0,0 +1,328 @@ +// +// RKPaginator.m +// RestKit +// +// Created by Blake Watters on 12/29/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKPaginator.h" +#import "RKMappingOperation.h" +#import "SOCKit.h" +#import "RKLog.h" +#import "RKPathMatcher.h" +#import "RKHTTPUtilities.h" + +#if __has_include("CoreData.h") +#define RKCoreDataIncluded +#import "RKManagedObjectRequestOperation.h" +#endif + +static NSUInteger RKPaginatorDefaultPerPage = 25; + +// Private interface +@interface RKPaginator () +@property (nonatomic, copy) NSURLRequest *request; +@property (nonatomic, strong) Class HTTPOperationClass; +@property (nonatomic, copy) NSArray *responseDescriptors; +@property (nonatomic, assign, readwrite) NSUInteger currentPage; +@property (nonatomic, assign, readwrite) NSUInteger offset; +@property (nonatomic, assign, readwrite) NSUInteger pageCount; +@property (nonatomic, assign, readwrite) NSUInteger objectCount; +@property (nonatomic, assign, readwrite) BOOL loaded; +@property (nonatomic, strong, readwrite) RKMappingResult *mappingResult; +@property (nonatomic, strong, readwrite) NSError *error; +@property (nonatomic, strong, readwrite) RKObjectRequestOperation *objectRequestOperation; + +// iOS 5.x compatible proxy attributes +@property (nonatomic, assign, readwrite) NSNumber *perPageNumber; +@property (nonatomic, assign, readwrite) NSNumber *currentPageNumber; +@property (nonatomic, assign, readwrite) NSNumber *pageCountNumber; +@property (nonatomic, assign, readwrite) NSNumber *objectCountNumber; + +@property (nonatomic, copy) void (^successBlock)(RKPaginator *paginator, NSArray *objects, NSUInteger page); +@property (nonatomic, copy) void (^failureBlock)(RKPaginator *paginator, NSError *error); +@end + +@implementation RKPaginator + + +- (instancetype)initWithRequest:(NSURLRequest *)request + paginationMapping:(RKObjectMapping *)paginationMapping + responseDescriptors:(NSArray *)responseDescriptors; +{ + NSParameterAssert(request); + NSParameterAssert(paginationMapping); + NSParameterAssert(responseDescriptors); + NSAssert([paginationMapping.objectClass isSubclassOfClass:[RKPaginator class]], @"The paginationMapping must have a target object class of `RKPaginator`"); + self = [super init]; + if (self) { + self.HTTPOperationClass = [RKHTTPRequestOperation class]; + self.request = request; + self.paginationMapping = paginationMapping; + self.responseDescriptors = responseDescriptors; + self.currentPage = NSNotFound; + self.pageCount = NSNotFound; + self.objectCount = NSNotFound; + self.offset = NSNotFound; + self.perPage = RKPaginatorDefaultPerPage; + self.loaded = NO; + } + + return self; +} + +- (void)dealloc +{ + [self.objectRequestOperation cancel]; +} + +- (NSURL *)patternURL +{ + return self.request.URL; +} + +- (NSURL *)URL +{ + NSString *pathAndQueryString = RKPathAndQueryStringFromURLRelativeToURL(self.patternURL, nil); + NSString *interpolatedString = RKPathFromPatternWithObject(pathAndQueryString, self); + return [NSURL URLWithString:interpolatedString relativeToURL:self.request.URL]; +} + +- (void)setHTTPOperationClass:(Class)operationClass +{ + NSAssert(operationClass == nil || [operationClass isSubclassOfClass:[RKHTTPRequestOperation class]], @"The HTTP operation class must be a subclass of `RKHTTPRequestOperation`"); + _HTTPOperationClass = operationClass; +} + +- (void)setCompletionBlockWithSuccess:(void (^)(RKPaginator *paginator, NSArray *objects, NSUInteger page))success + failure:(void (^)(RKPaginator *paginator, NSError *error))failure +{ + self.successBlock = success; + self.failureBlock = failure; +} + +// Private. Public consumers can rely on isLoaded +- (BOOL)hasCurrentPage +{ + return _currentPage != NSNotFound; +} + +- (BOOL)hasOffset +{ + return _offset != NSNotFound; +} + +- (BOOL)hasPageCount +{ + return _pageCount != NSNotFound; +} + +- (BOOL)hasObjectCount +{ + return _objectCount != NSNotFound; +} + +- (NSUInteger)currentPage +{ + // Referenced during initial load, so we don't rely on isLoaded. + NSAssert([self hasCurrentPage], @"Current page has not been initialized."); + return _currentPage; +} + +- (NSUInteger)offset +{ + if ([self hasOffset]) return _offset; + return [self hasCurrentPage] ? ((_currentPage - 1) * _perPage) : 0; +} + +- (BOOL)hasNextPage +{ + NSAssert(self.isLoaded, @"Cannot determine hasNextPage: paginator is not loaded."); + NSAssert([self hasPageCount], @"Cannot determine hasNextPage: page count is not known."); + + return self.currentPage < self.pageCount; +} + +- (BOOL)hasPreviousPage +{ + NSAssert(self.isLoaded, @"Cannot determine hasPreviousPage: paginator is not loaded."); + return self.currentPage > 1; +} + +#pragma mark - Action methods + +- (void)loadNextPage +{ + [self loadPage:self.currentPage + 1]; +} + +- (void)loadPreviousPage +{ + [self loadPage:self.currentPage - 1]; +} + +- (void)loadPage:(NSUInteger)pageNumber +{ + if (self.objectRequestOperation.HTTPRequestOperation.response) { + // The user by calling loadPage is ready to perform the next request so invalidate objectRequestOperation + self.objectRequestOperation = nil; + } + + NSAssert(self.responseDescriptors, @"Cannot perform a load with nil response descriptors."); + NSAssert(! self.objectRequestOperation, @"Cannot perform a load while one is already in progress."); + self.currentPage = pageNumber; + + NSMutableURLRequest *mutableRequest = [self.request mutableCopy]; + mutableRequest.URL = self.URL; + +#ifdef RKCoreDataIncluded + if (self.managedObjectContext) { + RKHTTPRequestOperation *requestOperation = [[self.HTTPOperationClass alloc] initWithRequest:mutableRequest]; + RKManagedObjectRequestOperation *managedObjectRequestOperation = [[RKManagedObjectRequestOperation alloc] initWithHTTPRequestOperation:requestOperation responseDescriptors:self.responseDescriptors]; + managedObjectRequestOperation.managedObjectContext = self.managedObjectContext; + managedObjectRequestOperation.managedObjectCache = self.managedObjectCache; + managedObjectRequestOperation.fetchRequestBlocks = self.fetchRequestBlocks; + managedObjectRequestOperation.deletesOrphanedObjects = NO; + + self.objectRequestOperation = managedObjectRequestOperation; + } else { + self.objectRequestOperation = [[RKObjectRequestOperation alloc] initWithRequest:mutableRequest responseDescriptors:self.responseDescriptors]; + } +#else + self.objectRequestOperation = [[RKObjectRequestOperation alloc] initWithRequest:mutableRequest responseDescriptors:self.responseDescriptors]; +#endif + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-retain-cycles" + [self.objectRequestOperation setWillMapDeserializedResponseBlock:^id(id deserializedResponseBody) { + NSError *error = nil; + RKMappingOperation *mappingOperation = [[RKMappingOperation alloc] initWithSourceObject:deserializedResponseBody destinationObject:self mapping:self.paginationMapping]; + BOOL success = [mappingOperation performMapping:&error]; + if (!success) { + self.pageCount = 0; + self.currentPage = 0; + RKLogError(@"Paginator didn't map info to compute page count. Assuming no pages."); + } else if (self.perPage && [self hasObjectCount]) { + float objectCountFloat = self.objectCount; + self.pageCount = ceilf(objectCountFloat / self.perPage); + RKLogInfo(@"Paginator objectCount: %ld pageCount: %ld", (long)self.objectCount, (long)self.pageCount); + } else { + RKLogError(@"Paginator perPage set is 0."); + } + + return deserializedResponseBody; + }]; + [self.objectRequestOperation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { + [self finish]; + if (self.successBlock) { + self.successBlock(self, [mappingResult array], self.currentPage); + } + } failure:^(RKObjectRequestOperation *operation, NSError *error) { + [self finish]; + if (self.failureBlock) { + self.failureBlock(self, error); + } + }]; +#pragma clang diagnostic pop + + if (self.operationQueue) { + [self.operationQueue addOperation:self.objectRequestOperation]; + } else { + [self.objectRequestOperation start]; + } +} + +- (void)waitUntilFinished +{ + [self.objectRequestOperation waitUntilFinished]; +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@: %p patternURL=%@ isLoaded=%@ perPage=%ld currentPage=%@ offset=%@ pageCount=%@ objectCount=%@>", + NSStringFromClass([self class]), self, self.patternURL, self.isLoaded ? @"YES" : @"NO", (long) self.perPage, + [self hasCurrentPage] ? @(self.currentPage) : @"???", + [self hasOffset] ? @(self.offset) : @"???", + [self hasPageCount] ? @(self.pageCount) : @"???", + [self hasObjectCount] ? @(self.objectCount) : @"???"]; +} + +- (void)finish +{ + self.loaded = (self.objectRequestOperation.mappingResult != nil); + self.mappingResult = self.objectRequestOperation.mappingResult; + self.error = self.objectRequestOperation.error; +} + +- (void)cancel +{ + [self.objectRequestOperation cancel]; + self.objectRequestOperation = nil; +} + +#pragma mark - iOS 5 proxy attributes + +- (NSNumber *)perPageNumber +{ + return @(self.perPage); +} + +- (void)setPerPageNumber:(NSNumber *)perPageNumber +{ + self.perPage = [perPageNumber unsignedIntegerValue]; +} + +- (NSNumber *)currentPageNumber +{ + return @(self.currentPage); +} + +- (void)setCurrentPageNumber:(NSNumber *)currentPageNumber +{ + self.currentPage = [currentPageNumber unsignedIntegerValue]; +} + +- (NSNumber *)pageCountNumber +{ + return @(self.pageCount); +} + +- (void)setPageCountNumber:(NSNumber *)pageCountNumber +{ + self.pageCount = [pageCountNumber unsignedIntegerValue]; +} + +- (NSNumber *)objectCountNumber +{ + return @(self.objectCount); +} + +- (void)setObjectCountNumber:(NSNumber *)objectCountNumber +{ + self.objectCount = [objectCountNumber unsignedIntegerValue]; +} + +- (NSNumber *)offsetNumber +{ + return @(self.offset); +} + +- (void)setOffsetNumber:(NSNumber *)offsetNumber +{ + self.offset = [offsetNumber unsignedIntegerValue]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKPathMatcher.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKPathMatcher.h new file mode 100644 index 0000000..fb1cee9 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKPathMatcher.h @@ -0,0 +1,132 @@ +// +// RKPathMatcher.h +// RestKit +// +// Created by Greg Combs on 9/2/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <Foundation/Foundation.h> +@class SOCPattern; + +/** + Convenience method for generating a path against the properties of an object. Takes an `NSString` with property names prefixed with a colon and interpolates the values of the properties specified and returns the generated path. + + For example, given an `article` object with an `articleID` property whose value is `@12345`, `RKPathFromPatternWithObject(@"articles/:articleID", article)` would return `@"articles/12345"`. + + This functionality is the basis for path generation in the `RKRouter` class. + + @param pathPattern An `SOCPattern` string containing zero or more colon-prefixed property names. + @param object The object to interpolate the properties against + @return A new `NSString` object with the values of the given object interpolated for the colon-prefixed properties name in the given pattern string. + @see `RKPathMatcher` + @see `SOCPattern` + */ +NSString *RKPathFromPatternWithObject(NSString *pathPattern, id object); + +/** + The `RKPathMatcher` class performs pattern matching and parameter parsing of strings, typically representing the path portion of an `NSURL` object. It provides much of the necessary tools to map a given path to local objects (the inverse of RKRouter's function). This makes it easier to implement the `RKManagedObjectCaching` protocol and generate `NSFetchRequest` objects from a given path. There are two means of instantiating and using a matcher object in order to provide more flexibility in implementations, and to improve efficiency by eliminating repetitive and costly pattern initializations. + + @see `RKManagedObjectCaching` + @see `RKPathFromPatternWithObject` + @see `RKRouter` + */ +@interface RKPathMatcher : NSObject <NSCopying> + +///--------------------------------- +/// @name Matching Paths to Patterns +///--------------------------------- + +/** + Creates a path match object starting from a path string. This method should be followed by `matchesPattern:tokenizeQueryStrings:parsedArguments:` + + @param pathString The string to evaluate and parse, such as `/districts/tx/upper/?apikey=GC5512354` + @return An instantiated `RKPathMatcher` without an established pattern. + */ ++ (instancetype)pathMatcherWithPath:(NSString *)pathString; + +/** + Determines if the path string matches the provided pattern, and yields a dictionary with the resulting matched key/value pairs. Use of this method should be preceded by `pathMatcherWithPath:` Pattern strings should include encoded parameter keys, delimited by a single colon at the beginning of the key name. + + *NOTE 1 *- Numerous colon-encoded parameter keys can be joined in a long pattern, but each key must be separated by at least one unmapped character. For instance, `/:key1:key2:key3/` is invalid, whereas `/:key1/:key2/:key3/` is acceptable. + + *NOTE 2 *- The pattern matcher supports KVM, so `:key1.otherKey` normally resolves as it would in any other KVM + situation, ... otherKey is a sub-key on a the object represented by key1. This presents problems in circumstances where + you might want to build a pattern like /:filename.json, where the dot isn't intended as a sub-key on the filename, but rather + part of the json static string. In these instances, you need to escape the dot with two backslashes, like so: + /:filename\\.json + + @param patternString The pattern to use for evaluating, such as `/:entityName/:stateID/:chamber/` + @param shouldTokenize If YES, any query parameters will be tokenized and inserted into the parsed argument dictionary. + @param arguments A pointer to a dictionary that contains the key/values from the pattern (and parameter) matching. + @return A boolean value indicating if the path string successfully matched the pattern. + */ +- (BOOL)matchesPattern:(NSString *)patternString tokenizeQueryStrings:(BOOL)shouldTokenize parsedArguments:(NSDictionary **)arguments; + +///--------------------------------- +/// @name Matching Patterns to Paths +///--------------------------------- + +/** + Creates a path matcher object starting from a pattern string. This method should be followed by `matchesPath:tokenizeQueryStrings:parsedArguments:`. Patterns should include encoded parameter keys, delimited by a single colon at the beginning of the key name. + + *NOTE 1 *- Numerous colon-encoded parameter keys can be joined in a long pattern, but each key must be separated by at least one unmapped character. For instance, `/:key1:key2:key3/` is invalid, whereas `/:key1/:key2/:key3/` is acceptable. + + *NOTE 2 *- The pattern matcher supports KVM, so `:key1.otherKey` normally resolves as it would in any other KVM situation, ... otherKey is a sub-key on a the object represented by key1. This presents problems in circumstances where you might want to build a pattern like `/:filename.json`, where the dot isn't intended as a sub-key on the filename, but rather part of the json static string. In these instances, you need to escape the dot with two backslashes, like so: `/:filename\\.json` + + @param patternString The pattern to use for evaluating, such as `/:entityName/:stateID/:chamber/` + @return An instantiated `RKPathMatcher` with an established pattern. + */ ++ (instancetype)pathMatcherWithPattern:(NSString *)patternString; + +/** + Determines if the given path string matches a pattern, and yields a dictionary with the resulting matched key/value pairs. Use of this method should be preceded by `pathMatcherWithPattern:`. + + @param pathString The string to evaluate and parse, such as `/districts/tx/upper/?apikey=GC5512354` + @param shouldTokenize If YES, any query parameters will be tokenized and inserted into the parsed argument dictionary. + @param arguments A pointer to a dictionary that contains the key/values from the pattern (and parameter) matching. + @return A boolean value indicating if the path string successfully matched the pattern. + */ +- (BOOL)matchesPath:(NSString *)pathString tokenizeQueryStrings:(BOOL)shouldTokenize parsedArguments:(NSDictionary **)arguments; + +///---------------------------------- +/// @name Creating Paths from Objects +///---------------------------------- + +/** + Generates a path by interpolating the properties of the 'object' argument, assuming the existence of a previously specified pattern established via `pathMatcherWithPattern:`. Otherwise, this method is identical in function to `RKPathFromPatternWithObject` (in fact it is a shortcut for this method). + + For example, given an 'article' object with an 'articleID' property value of 12345 and a code of "This/That"... + + RKPathMatcher *matcher = [RKPathMatcher pathMatcherWithPattern:@"/articles/:articleID/:code"]; + NSString *path = [matcher pathFromObject:article addingEscapes:YES interpolatedParameters:nil]; + + ... will produce a 'path' containing the string `@"/articles/12345/This%2FThat"` + + @param object The object containing the properties to interpolate. + @param addEscapes Conditionally add percent escapes to the interpolated property values + @param interpolatedParameters On input, a pointer for a dictionary object. When the path pattern of the receiver is interpolated, this pointer is set to a new dictionary object in which the keys correspond to the named parameters within the path pattern and the values are taken from the corresponding keypaths of the interpolated object . + @return A string with the object's interpolated property values inserted into the receiver's established pattern. + @see `RKRouter` + */ +- (NSString *)pathFromObject:(id)object addingEscapes:(BOOL)addEscapes interpolatedParameters:(NSDictionary **)interpolatedParameters; + +///------------------------------------------- +/// @name Accessing Tokenized Query Parameters +///------------------------------------------- + +@property (copy, readonly) NSDictionary *queryParameters; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKPathMatcher.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKPathMatcher.m new file mode 100644 index 0000000..a8ce9bc --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKPathMatcher.m @@ -0,0 +1,154 @@ +// +// RKPathMatcher.m +// RestKit +// +// Created by Greg Combs on 9/2/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKPathMatcher.h" +#import "SOCKit.h" +#import "RKLog.h" +#import "RKDictionaryUtilities.h" + +static NSString *RKEncodeURLString(NSString *unencodedString); +extern NSDictionary *RKQueryParametersFromStringWithEncoding(NSString *string, NSStringEncoding stringEncoding); + +// NSString's stringByAddingPercentEscapes doesn't do a complete job (it ignores "/?&", among others) +static NSString *RKEncodeURLString(NSString *unencodedString) +{ + NSString *encodedString = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes( + NULL, + (__bridge CFStringRef)unencodedString, + NULL, + (CFStringRef)@"!*'();:@&=+$,/?%#[]", + kCFStringEncodingUTF8)); + return encodedString; +} + +static NSUInteger RKNumberOfSlashesInString(NSString *string) +{ + static NSRegularExpression *regex = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + regex = [NSRegularExpression regularExpressionWithPattern:@"/" options:NSRegularExpressionCaseInsensitive error:nil]; + }); + return [regex numberOfMatchesInString:string options:0 range:NSMakeRange(0, [string length])]; +} + +NSString *RKPathFromPatternWithObject(NSString *pathPattern, id object) +{ + NSCAssert(object != NULL, @"Object provided is invalid; cannot create a path from a NULL object"); + RKPathMatcher *matcher = [RKPathMatcher pathMatcherWithPattern:pathPattern]; + return [matcher pathFromObject:object addingEscapes:NO interpolatedParameters:nil]; +} + +@interface RKPathMatcher () +@property (nonatomic, strong) SOCPattern *socPattern; +@property (nonatomic, copy) NSString *patternString; // SOCPattern keeps it private +@property (nonatomic, copy) NSString *sourcePath; +@end + +@implementation RKPathMatcher + +- (id)copyWithZone:(NSZone *)zone +{ + RKPathMatcher *copy = [[[self class] allocWithZone:zone] init]; + copy.socPattern = self.socPattern; + copy.patternString = self.patternString; + copy.sourcePath = self.sourcePath; + return copy; +} + ++ (instancetype)pathMatcherWithPattern:(NSString *)patternString +{ + NSAssert(patternString != NULL, @"Pattern string must not be empty in order to perform pattern matching."); + RKPathMatcher *matcher = [self new]; + matcher.socPattern = [SOCPattern patternWithString:patternString]; + matcher.patternString = patternString; + return matcher; +} + ++ (instancetype)pathMatcherWithPath:(NSString *)pathString +{ + RKPathMatcher *matcher = [self new]; + matcher.sourcePath = pathString; + return matcher; +} + +- (BOOL)itMatchesAndHasParsedArguments:(NSDictionary **)arguments andPattern:(NSString*)pattern andSourcePath:(NSString*)sourcePath tokenizeQueryStrings:(BOOL)shouldTokenize +{ + NSMutableDictionary *argumentsCollection = [NSMutableDictionary dictionary]; + NSString *rootPath = [sourcePath copy]; + NSArray *components = [sourcePath componentsSeparatedByString:@"?"]; + SOCPattern *socPattern = [SOCPattern patternWithString:pattern]; + + // Bifurcate Source Path From Query Parameters + + if ([components count] > 1) { + rootPath = [components objectAtIndex:0]; + NSDictionary *queryParameters = RKQueryParametersFromStringWithEncoding([components objectAtIndex:1], NSUTF8StringEncoding); + if (shouldTokenize) { + [argumentsCollection addEntriesFromDictionary:queryParameters]; + } + } + + bool rootPathMatchesPattern = RKNumberOfSlashesInString(pattern) == RKNumberOfSlashesInString(rootPath); + + if (![socPattern stringMatches:rootPath]) return NO; + if (!arguments) return YES && rootPathMatchesPattern; + NSDictionary *extracted = [socPattern parameterDictionaryFromSourceString:rootPath]; + if (extracted) [argumentsCollection addEntriesFromDictionary:RKDictionaryByReplacingPercentEscapesInEntriesFromDictionary(extracted)]; + *arguments = argumentsCollection; + return YES && rootPathMatchesPattern; +} + +- (BOOL)matchesPattern:(NSString *)patternString tokenizeQueryStrings:(BOOL)shouldTokenize parsedArguments:(NSDictionary **)arguments +{ + NSAssert(self.sourcePath != NULL, @"Matcher is not configured correctly. Instantiate it using pathMatcherWithPath: to use matchesPattern:tokenizeQueryStrings:parsedArguments"); + NSAssert(patternString != NULL, @"Pattern string must not be empty in order to perform patterm matching."); + return [self itMatchesAndHasParsedArguments:arguments andPattern:patternString andSourcePath:self.sourcePath tokenizeQueryStrings:shouldTokenize]; +} + +- (BOOL)matchesPath:(NSString *)sourceString tokenizeQueryStrings:(BOOL)shouldTokenize parsedArguments:(NSDictionary **)arguments +{ + return [self itMatchesAndHasParsedArguments:arguments andPattern:self.patternString andSourcePath:sourceString tokenizeQueryStrings:shouldTokenize]; +} + +- (NSString *)pathFromObject:(id)object addingEscapes:(BOOL)addEscapes interpolatedParameters:(NSDictionary **)interpolatedParameters +{ + NSAssert(self.socPattern != NULL, @"Matcher has no established pattern. Instantiate it using pathMatcherWithPattern: before calling pathFromObject:"); + NSAssert(object != NULL, @"Object provided is invalid; cannot create a path from a NULL object"); + NSString *(^encoderBlock)(NSString *interpolatedString) = nil; + if (addEscapes) { + encoderBlock = ^NSString *(NSString *interpolatedString) { + return RKEncodeURLString(interpolatedString); + }; + } + NSString *path = [self.socPattern stringFromObject:object withBlock:encoderBlock]; + if (interpolatedParameters) { + NSMutableDictionary *parsedParameters = [[self.socPattern parameterDictionaryFromSourceString:path] mutableCopy]; + if (addEscapes) { + for (NSString *key in [parsedParameters allKeys]) { + NSString *unescapedParameter = [parsedParameters[key] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + [parsedParameters setValue:unescapedParameter forKey:key]; + } + } + *interpolatedParameters = parsedParameters; + } + return path; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKRequestDescriptor.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKRequestDescriptor.h new file mode 100644 index 0000000..3b45e17 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKRequestDescriptor.h @@ -0,0 +1,110 @@ +// +// RKRequestDescriptor.h +// RestKit +// +// Created by Blake Watters on 8/24/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <Foundation/Foundation.h> +#import "RKHTTPUtilities.h" + +@class RKMapping; + +/** + An `RKRequestDescriptor` object describes an object mapping configuration that is used to construct the parameters of an HTTP request for an object. Request descriptors are defined by specifying the `RKMapping` object (whose `objectClass` must be `NSMutableDictionary`) that is to be used when object mapping an object into an `NSDictionary` of parameters, the class of the type of object for which the mapping is to be applied, and an optional root key path under which the paramters are to be nested. Response descriptors are only utilized when construct parameters for an `NSURLRequest` with an HTTP method of `POST`, `PUT`, or `PATCH`. + + @see RKObjectParameterization + @see [RKObjectMapping requestMapping] + @see [RKObjectManager requestWithObject:method:path:parameters:] + */ +@interface RKRequestDescriptor : NSObject + +///------------------------------------ +/// @name Creating a Request Descriptor +///------------------------------------ + +/** + Creates and returns a new `RKRequestDescriptor` object. + + This method is deprecated. Use `+ (instancetype)requestDescriptorWithMapping:(RKMapping *)mapping + objectClass:(Class)objectClass + rootKeyPath:(NSString *)rootKeyPath + method:(RKRequestMethod)method` instead. + + @param mapping The mapping to be used when parameterizing an object using the request descriptor. Cannot be nil and must have an objectClass equal to `[NSMutableDictionary class]`. + @param objectClass The class of objects for which the request descriptor should be used. Cannot be nil. + @param rootKeyPath The root key path under which paramters constructed using the response descriptor will be nested. If nil, the parameters will not be nested and returned as a flat dictionary object. + @return A new `RKRequestDescriptor` object. + + @see [RKObjectMapping requestMapping] + @warning An exception will be raised if the objectClass of the given mapping is not `[NSMutableDictionary class]`. + */ ++ (instancetype)requestDescriptorWithMapping:(RKMapping *)mapping + objectClass:(Class)objectClass + rootKeyPath:(NSString *)rootKeyPath DEPRECATED_ATTRIBUTE; + +/** +Creates and returns a new `RKRequestDescriptor` object. + +@param mapping The mapping to be used when parameterizing an object using the request descriptor. Cannot be nil and must have an objectClass equal to `[NSMutableDictionary class]`. +@param objectClass The class of objects for which the request descriptor should be used. Cannot be nil. +@param rootKeyPath The root key path under which paramters constructed using the response descriptor will be nested. If nil, the parameters will not be nested and returned as a flat dictionary object. +@param method The HTTP method(s) for which the mapping is to be used. +@return A new `RKRequestDescriptor` object. + +@see [RKObjectMapping requestMapping] +@warning An exception will be raised if the objectClass of the given mapping is not `[NSMutableDictionary class]`. +*/ ++ (instancetype)requestDescriptorWithMapping:(RKMapping *)mapping + objectClass:(Class)objectClass + rootKeyPath:(NSString *)rootKeyPath + method:(RKRequestMethod)method; + +///----------------------------------------------------- +/// @name Getting Information About a Request Descriptor +///----------------------------------------------------- + +/** + The mapping specifying how the object being parameterized is to be mapped into an `NSDictionary` representation. The mapping must have an objectClass equal to `[NSMutableDictionary class]`. + */ +@property (nonatomic, strong, readonly) RKMapping *mapping; + +/** + The class of objects that the request descriptor is appropriate for use in parameterizing. + */ +@property (nonatomic, strong, readonly) Class objectClass; + +/** + The root key path that the paramters for the object are to be nested under. May be nil. + */ +@property (nonatomic, copy, readonly) NSString *rootKeyPath; + +/** + The HTTP method(s) for which the mapping is to be used. + */ +@property (nonatomic, assign, readonly) RKRequestMethod method; + +///------------------------- +/// @name Comparing Request Descriptors +///------------------------- + +/** + Returns `YES` if the receiver and the specified request descriptor are considered equivalent. + + */ +- (BOOL)isEqualToRequestDescriptor:(RKRequestDescriptor *)otherDescriptor; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKRequestDescriptor.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKRequestDescriptor.m new file mode 100644 index 0000000..0a1ddd5 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKRequestDescriptor.m @@ -0,0 +1,118 @@ +// +// RKRequestDescriptor.m +// RestKit +// +// Created by Blake Watters on 8/24/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Created by Blake Watters on 8/24/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKRequestDescriptor.h" +#import "RKObjectMapping.h" +#import "RKDynamicMapping.h" + +static void RKAssertValidMappingForRequestDescriptor(RKMapping *mapping) +{ + if ([mapping isKindOfClass:[RKObjectMapping class]]) { + if (! [[(RKObjectMapping *)mapping objectClass] isEqual:[NSMutableDictionary class]]) { + [NSException raise:NSInvalidArgumentException format:@"`RKRequestDescriptor` objects must be initialized with a mapping whose target class is `NSMutableDictionary`, got '%@' (see `[RKObjectMapping requestMapping]`)", [(RKObjectMapping *)mapping objectClass]]; + } + } else if ([mapping isKindOfClass:[RKDynamicMapping class]]) { + [[(RKDynamicMapping *)mapping objectMappings] enumerateObjectsUsingBlock:^(RKObjectMapping *objectMapping, NSUInteger idx, BOOL *stop) { + if (! [objectMapping.objectClass isEqual:[NSMutableDictionary class]]) { + [NSException raise:NSInvalidArgumentException format:@"`RKRequestDescriptor` objects may only be initialized with `RKDynamicMapping` objects containing `RKObjectMapping` objects whose target class is `NSMutableDictionary`, got '%@' (see `[RKObjectMapping requestMapping]`)", objectMapping.objectClass]; + } + }]; + } else { + [NSException raise:NSInvalidArgumentException format:@"Expected an instance of `RKObjectMapping` or `RKDynamicMapping`, instead got '%@'", [mapping class]]; + } +} + +extern NSString *RKStringDescribingRequestMethod(RKRequestMethod method); + +@interface RKRequestDescriptor () + +@property (nonatomic, strong, readwrite) RKMapping *mapping; +@property (nonatomic, strong, readwrite) Class objectClass; +@property (nonatomic, copy, readwrite) NSString *rootKeyPath; +@property (nonatomic, assign, readwrite) RKRequestMethod method; + +@end + +@implementation RKRequestDescriptor + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-implementations" ++ (instancetype)requestDescriptorWithMapping:(RKMapping *)mapping objectClass:(Class)objectClass rootKeyPath:(NSString *)rootKeyPath +{ + return [self requestDescriptorWithMapping:mapping objectClass:objectClass rootKeyPath:rootKeyPath method:RKRequestMethodAny]; +} +#pragma clang diagnostic pop + ++ (instancetype)requestDescriptorWithMapping:(RKMapping *)mapping objectClass:(Class)objectClass rootKeyPath:(NSString *)rootKeyPath method:(RKRequestMethod)method +{ + NSParameterAssert(mapping); + NSParameterAssert(objectClass); + RKAssertValidMappingForRequestDescriptor(mapping); + + RKRequestDescriptor *requestDescriptor = [self new]; + requestDescriptor.mapping = mapping; + requestDescriptor.objectClass = objectClass; + requestDescriptor.rootKeyPath = rootKeyPath; + requestDescriptor.method = method; + return requestDescriptor; +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@: %p method=%@ objectClass=%@ rootKeyPath=%@ : %@>", + NSStringFromClass([self class]), self, RKStringDescribingRequestMethod(self.method), NSStringFromClass(self.objectClass), self.rootKeyPath, self.mapping]; +} + +- (BOOL)isEqual:(id)object +{ + if (self == object) { + return YES; + } + if ([self class] != [object class]) { + return NO; + } + return [self isEqualToRequestDescriptor:object]; +} + +#define NSUINT_BIT (CHAR_BIT * sizeof(NSUInteger)) +#define NSUINTROTATE(val, howmuch) ((((NSUInteger)val) << howmuch) | (((NSUInteger)val) >> (NSUINT_BIT - howmuch))) + +- (NSUInteger)hash +{ + return NSUINTROTATE(NSUINTROTATE([self.mapping hash], NSUINT_BIT / 3) ^ [self.objectClass hash], NSUINT_BIT / 3) ^ [self.rootKeyPath hash]; +} + +- (BOOL)isEqualToRequestDescriptor:(RKRequestDescriptor *)otherDescriptor +{ + if (![otherDescriptor isKindOfClass:[RKRequestDescriptor class]]) { + return NO; + } + + return + [self.mapping isEqualToMapping:otherDescriptor.mapping] && + self.objectClass == otherDescriptor.objectClass && + self.method == otherDescriptor.method && + ((self.rootKeyPath == otherDescriptor.rootKeyPath) || [self.rootKeyPath isEqualToString:otherDescriptor.rootKeyPath]); +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKResponseDescriptor.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKResponseDescriptor.h new file mode 100644 index 0000000..d2d9928 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKResponseDescriptor.h @@ -0,0 +1,181 @@ +// +// RKResponseDescriptor.h +// RestKit +// +// Created by Blake Watters on 8/16/12. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKHTTPUtilities.h" + +@class RKMapping; + +/** + An `RKResponseDescriptor` object describes an object mapping configuration that is applicable to an HTTP response. Response descriptors are defined by specifying the `RKMapping` object that is to be used when performing object mapping on the deserialized response body and the URL path pattern, key path, and status codes for which the mapping is appropriate. The path pattern is a SOCKit `SOCPattern` string that will be matched against the URL of the request that loaded the response being mapped. If the path pattern is nil, the response descriptor is considered to be appropriate for a response loaded from any URL. The key path specifies the location of data within the deserialized response body for which the mapping is appropriate. If nil, the mapping is considered to apply to the entire response body. The status codes specify a set of HTTP response status codes for which the mapping is appropriate. It is common to constrain a response descriptor to the HTTP Successful status code class (status codes in the 200-299 range). Object mapping for error responses can be configured by configuring a response descriptor to handle the Client Error status code class (status codes in the 400-499 range). Instances of `RKResponseDescriptor` are immutable. + + @see RKPathMatcher + @see RKStatusCodeIndexSetFromClass + */ +@interface RKResponseDescriptor : NSObject + +///------------------------------------- +/// @name Creating a Response Descriptor +///------------------------------------- + +/** + Creates and returns a new `RKResponseDescriptor` object. + + This method is deprecated. Use `+ (instancetype)responseDescriptorWithMapping:(RKMapping *)mapping + method:(RKRequestMethod)method + pathPattern:(NSString *)pathPattern + keyPath:(NSString *)keyPath + statusCodes:(NSIndexSet *)statusCodes` instead. + + @param mapping The mapping for the response descriptor. + @param pathPattern A path pattern that matches against URLs for which the mapping should be used. + @param keyPath A key path specifying the subset of the parsed response for which the mapping is to be used. + @param statusCodes A set of HTTP status codes for which the mapping is to be used. + @return A new `RKResponseDescriptor` object. + */ ++ (instancetype)responseDescriptorWithMapping:(RKMapping *)mapping + pathPattern:(NSString *)pathPattern + keyPath:(NSString *)keyPath + statusCodes:(NSIndexSet *)statusCodes DEPRECATED_ATTRIBUTE; + +/** + Creates and returns a new `RKResponseDescriptor` object. + + @param mapping The mapping for the response descriptor. + @param method The HTTP method(s) for which the mapping is to be used. + @param pathPattern A path pattern that matches against URLs for which the mapping should be used. + @param keyPath A key path specifying the subset of the parsed response for which the mapping is to be used. + @param statusCodes A set of HTTP status codes for which the mapping is to be used. + @return A new `RKResponseDescriptor` object. + */ ++ (instancetype)responseDescriptorWithMapping:(RKMapping *)mapping + method:(RKRequestMethod)method + pathPattern:(NSString *)pathPattern + keyPath:(NSString *)keyPath + statusCodes:(NSIndexSet *)statusCodes; + +///------------------------------------------------------ +/// @name Getting Information About a Response Descriptor +///------------------------------------------------------ + +/** + The mapping to be used when object mapping the deserialized HTTP response body. Cannot be nil. + */ +@property (nonatomic, strong, readonly) RKMapping *mapping; + +/** + The HTTP method(s) for which the mapping is to be used. + */ +@property (nonatomic, assign, readonly) RKRequestMethod method; + +/** + The path pattern to match against the request URL. If nil, the response descriptor matches any URL. + + @see `RKPathMatcher` + */ +@property (nonatomic, copy, readonly) NSString *pathPattern; + +/** + The key path to match against the deserialized response body. If nil, the response descriptor matches the entire response body. + + When evaluating a key path match, the Foundation object parsed from the response body is sent `valueForKeyPath:` with the keyPath of the receiver. If the value returned is non-nil, object mapping is performed using the response descriptor's mapping. + */ +@property (nonatomic, copy, readonly) NSString *keyPath; + +/** + The set of status codes for which response descriptor matches. If nil, the the response descriptor matches any status code. + + @see RKStatusCodeClass + */ +@property (nonatomic, copy, readonly) NSIndexSet *statusCodes; + +///--------------------------- +/// @name Setting the Base URL +///--------------------------- + +/** + The base URL that the `pathPattern` is to be evaluated relative to. + + The base URL is set to the base URL of the object manager when a response descriptor is added to an object manager. + + @see `matchesURL:` + */ +@property (nonatomic, copy) NSURL *baseURL; + +///--------------------------------- +/// @name Using Response Descriptors +///--------------------------------- + +/** + Returns a Boolean value that indicates if the receiver's path pattern matches the given path. + + Path matching is performed using an `RKPathMatcher` object. If the receiver has a `nil` path pattern or the given path is `nil`, `YES` is returned. + + @param path The path to compare with the path pattern of the receiver. + @return `YES` if the path matches the receiver's pattern, else `NO`. + @see `RKPathMatcher` + */ +- (BOOL)matchesPath:(NSString *)path; + +/** + Returns a Boolean value that indicates if the given URL object matches the base URL and path pattern of the receiver. + + This method considers both the `baseURL` and `pathPattern` of the receiver when evaluating the given URL object. The results evaluate in the following ways: + + 1. If the `baseURL` and `pathPattern` of the receiver are both `nil`, then `YES` is returned. + 1. If the `baseURL` of the receiver is `nil`, but the path pattern is not, then the entire path and query string of the given URL will be evaluated against the path pattern of the receiver using `matchesPath:`. + 1. If the `baseURL` and the `pathPattern` are both non-nil, then the given URL is first checked to verify that it is relative to the base URL using a string prefix comparison. If the absolute string value of the given URL is prefixed with the string value of the base URL, then the URL is considered relative. If the given URL is found not to be relative to the receiver's baseURL, then `NO` is returned. If the URL is found to be relative to the base URL, then the path and query string of the URL are evaluated against the path pattern of the receiver using `matchesPath:`. + + @param URL The URL to compare with the base URL and path pattern of the receiver. + @return `YES` if the URL matches the base URL and path pattern of the receiver, else `NO`. + */ +- (BOOL)matchesURL:(NSURL *)URL; + +/** + Returns a Boolean value that indicates if the given URL response object matches the receiver. + + The match is evaluated by checking if the URL of the response matches the base URL and path pattern of the receiver via the `matchesURL:` method. If the URL is found to match, then the status code of the response is checked for inclusion in the receiver's set of status codes. + + @param response The HTTP response object to compare with the base URL, path pattern, and status codes set of the receiver. + @return `YES` if the response matches the base URL, path pattern, and status codes set of the receiver, else `NO`. + @see `matchesURL:` + */ +- (BOOL)matchesResponse:(NSHTTPURLResponse *)response; + +/** + Returns a dictionary of parsed arguments extracted from the URL of the given response object. + + @param response The HTTP response object to compare with the base URL, path pattern, and status codes set of the receiver. + @return A dictionary of parsed arguments if the response matches the base URL, path pattern, and status codes set of the receiver, else `nil`. + @see `matchesResponse:` + + */ +- (NSDictionary *)parsedArgumentsFromResponse:(NSHTTPURLResponse *)response; + +///------------------------- +/// @name Comparing Response Descriptors +///------------------------- + +/** + Returns `YES` if the receiver and the specified response descriptor are considered equivalent. + + */ +- (BOOL)isEqualToResponseDescriptor:(RKResponseDescriptor *)otherDescriptor; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKResponseDescriptor.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKResponseDescriptor.m new file mode 100644 index 0000000..9c6bc0c --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKResponseDescriptor.m @@ -0,0 +1,211 @@ +// +// RKResponseDescriptor.m +// RestKit +// +// Created by Blake Watters on 8/16/12. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKPathMatcher.h" +#import "RKResponseDescriptor.h" +#import "RKHTTPUtilities.h" +#import "RKMapping.h" + +// Cloned from AFStringFromIndexSet -- method should be non-static for reuse +NSString *RKStringFromIndexSet(NSIndexSet *indexSet); +NSString *RKStringFromIndexSet(NSIndexSet *indexSet) +{ + NSCParameterAssert(indexSet); + NSMutableString *string = [NSMutableString string]; + + NSRange range = NSMakeRange([indexSet firstIndex], 1); + while (range.location != NSNotFound) { + NSUInteger nextIndex = [indexSet indexGreaterThanIndex:range.location]; + while (nextIndex == range.location + range.length) { + range.length++; + nextIndex = [indexSet indexGreaterThanIndex:nextIndex]; + } + + if (string.length) { + [string appendString:@","]; + } + + if (range.length == 1) { + [string appendFormat:@"%lu", (unsigned long) range.location]; + } else { + NSUInteger firstIndex = range.location; + NSUInteger lastIndex = firstIndex + range.length - 1; + [string appendFormat:@"%lu-%lu", (unsigned long) firstIndex, (unsigned long) lastIndex]; + } + + range.location = nextIndex; + range.length = 1; + } + + return string; +} + +extern NSString *RKStringDescribingRequestMethod(RKRequestMethod method); + +@interface RKResponseDescriptor () +@property (nonatomic, strong, readwrite) RKMapping *mapping; +@property (nonatomic, assign, readwrite) RKRequestMethod method; +@property (nonatomic, copy, readwrite) NSString *pathPattern; +@property (nonatomic, strong, readwrite) RKPathMatcher *pathPatternMatcher; +@property (nonatomic, copy, readwrite) NSString *keyPath; +@property (nonatomic, copy, readwrite) NSIndexSet *statusCodes; +@end + +@implementation RKResponseDescriptor + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-implementations" ++ (instancetype)responseDescriptorWithMapping:(RKMapping *)mapping + pathPattern:(NSString *)pathPattern + keyPath:(NSString *)keyPath + statusCodes:(NSIndexSet *)statusCodes +{ + return [self responseDescriptorWithMapping:mapping method:RKRequestMethodAny pathPattern:pathPattern keyPath:keyPath statusCodes:statusCodes]; +} +#pragma clang diagnostic pop + ++ (instancetype)responseDescriptorWithMapping:(RKMapping *)mapping + method:(RKRequestMethod)method + pathPattern:(NSString *)pathPattern + keyPath:(NSString *)keyPath + statusCodes:(NSIndexSet *)statusCodes +{ + NSParameterAssert(mapping); + RKResponseDescriptor *mappingDescriptor = [self new]; + mappingDescriptor.mapping = mapping; + mappingDescriptor.method = method; + mappingDescriptor.pathPattern = pathPattern; + mappingDescriptor.keyPath = keyPath; + mappingDescriptor.statusCodes = statusCodes; + + return mappingDescriptor; +} + +- (void)setPathPattern:(NSString *)pathPattern +{ + _pathPattern = pathPattern; + if (pathPattern) { + self.pathPatternMatcher = [RKPathMatcher pathMatcherWithPattern:pathPattern]; + } else { + self.pathPatternMatcher = nil; + } +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@: %p method=%@ pathPattern=%@ keyPath=%@ statusCodes=%@ : %@>", + NSStringFromClass([self class]), self, RKStringDescribingRequestMethod(self.method), self.pathPattern, self.keyPath, self.statusCodes ? RKStringFromIndexSet(self.statusCodes) : self.statusCodes, self.mapping]; +} + +- (BOOL)matchesPath:(NSString *)path +{ + return [self matchesPath:path parsedArguments:nil]; +} + +- (BOOL)matchesPath:(NSString *)path parsedArguments:(NSDictionary **)outParsedArguments +{ + if (!self.pathPattern || !path) return YES; + RKPathMatcher *pathMatcher = [RKPathMatcher pathMatcherWithPattern:self.pathPattern]; + return [pathMatcher matchesPath:path tokenizeQueryStrings:NO parsedArguments:outParsedArguments]; +} + +- (BOOL)matchesURL:(NSURL *)URL +{ + return [self matchesURL:URL parsedArguments:nil]; +} + +- (BOOL)matchesURL:(NSURL *)URL parsedArguments:(NSDictionary **)outParsedArguments +{ + NSString *pathAndQueryString = RKPathAndQueryStringFromURLRelativeToURL(URL, self.baseURL); + if (self.baseURL) { + if (! RKURLIsRelativeToURL(URL, self.baseURL)) return NO; + return [self matchesPath:pathAndQueryString parsedArguments:outParsedArguments]; + } else { + return [self matchesPath:pathAndQueryString parsedArguments:outParsedArguments]; + } +} + +- (BOOL)matchesResponse:(NSHTTPURLResponse *)response +{ + return [self matchesResponse:response parsedArguments:nil]; +} + +- (BOOL)matchesResponse:(NSHTTPURLResponse *)response parsedArguments:(NSDictionary **)outParsedArguments +{ + if (![self matchesURL:response.URL parsedArguments:outParsedArguments]) return NO; + + if (self.statusCodes) { + if (! [self.statusCodes containsIndex:response.statusCode]) { + return NO; + } + } + return YES; +} + +- (BOOL)matchesMethod:(RKRequestMethod)method +{ + return self.method & method; +} + +- (NSDictionary *)parsedArgumentsFromResponse:(NSHTTPURLResponse *)response +{ + NSDictionary *parsedArguments = nil; + if ([self matchesResponse:response parsedArguments:&parsedArguments]) + { + return parsedArguments; + } + + return nil; +} + +- (BOOL)isEqual:(id)object +{ + if (self == object) { + return YES; + } + if ([self class] != [object class]) { + return NO; + } + return [self isEqualToResponseDescriptor:object]; +} + +#define NSUINT_BIT (CHAR_BIT * sizeof(NSUInteger)) +#define NSUINTROTATE(val, howmuch) ((((NSUInteger)val) << howmuch) | (((NSUInteger)val) >> (NSUINT_BIT - howmuch))) + +- (NSUInteger)hash +{ + return NSUINTROTATE(NSUINTROTATE(NSUINTROTATE([self.mapping hash], NSUINT_BIT / 4) ^ [self.pathPattern hash], NSUINT_BIT / 4) ^ [self.keyPath hash], NSUINT_BIT / 4) ^ [self.statusCodes hash]; +} + +- (BOOL)isEqualToResponseDescriptor:(RKResponseDescriptor *)otherDescriptor +{ + if (![otherDescriptor isKindOfClass:[RKResponseDescriptor class]]) { + return NO; + } + + return + [self.mapping isEqualToMapping:otherDescriptor.mapping] && + self.method == otherDescriptor.method && + ((self.pathPattern == otherDescriptor.pathPattern) || [self.pathPattern isEqualToString:otherDescriptor.pathPattern]) && + ((self.keyPath == otherDescriptor.keyPath) || [self.keyPath isEqualToString:otherDescriptor.keyPath]) && + [self.statusCodes isEqualToIndexSet:otherDescriptor.statusCodes]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKResponseMapperOperation.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKResponseMapperOperation.h new file mode 100644 index 0000000..48b46fb --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKResponseMapperOperation.h @@ -0,0 +1,265 @@ +// +// RKResponseMapperOperation.h +// RestKit +// +// Created by Blake Watters on 8/16/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKMappingOperationDataSource.h" +#import "RKMapperOperation.h" +#import "RKMappingResult.h" + +#if __has_include("CoreData.h") +@protocol RKManagedObjectCaching; +#endif + +/** + `RKResponseMapperOperation` is an `NSOperation` that provides support for performing object mapping on an `NSHTTPURLResponse` and its associated response data. + + This is an abstract base class encapsulating the common interface API for its concrete subclasses `RKObjectResponseMapperOperation` and `RKManagedObjectResponseMapperOperation`. + + The common behaviors encapsulated within `RKResponseMapperOperation` include: + + 1. **Handling Empty Responses**: Empty response data (see note below) requires special handling depending on the status code of the HTTP response. If an empty response is loaded with a status code in 4xx (Client Error) range, an `NSError` in the `RKErrorDomain` is created with the `NSURLErrorBadServerResponse` code to indicate that the response was not processable. If an empty response is loaded with a status code in 2xx (Successful) range, the interpretation of the response is dependent on the value of `treatsEmptyResponseAsSuccess`. When `YES`, empty responses result in the successful completion of the operation with an `RKMappingResult` containing the targetObject of the operation, if any. + 1. **Deserializing Response Data**: When started, the operation attempts to deserialize the response data into a Foundation object representation using the `RKMIMETypeSerialization` class. This deserialized representation is then made available to subclass implementations that perform the actual object mapping work. + + ## How 'Empty' Responses are Evaluated + + Any `nil` response or `NSData` object with a length equal to zero is considered empty. To support a common behavior of the widely deployed Ruby on Rails Framework, `RKResponseMapperOperation` also considers a response containing a single space character to be empty. This type of response is generated by Rails whe `render :nothing => true` is invoked. + + ## Metadata Mapping + + The `RKResponseMapperOperation` class integrates with the metadata mapping architecture. Clients of the response mapper can provide a dictionary of metadata via the `mappingMetadata` property and it will be made available to the underlying `RKMapperOperation` executed to process the response body. In addition to any user supplied metadata, the response mapper makes the following metadata key paths available for mapping: + + 1. `@metadata.HTTP.request.URL` - The `NSURL` object identifying the URL of the request that loaded the response. + 1. `@metadata.HTTP.request.method` - An `NSString` specifying the HTTP method of the request that loaded the response. + 1. `@metadata.HTTP.request.headers` - An `NSDictionary` object containing all HTTP headers and values for the request that loaded the response. + 1. `@metadata.HTTP.response.URL` - The `NSURL` object identifying the URL of the response. + 1. `@metadata.HTTP.response.headers` - An `NSDictionary` object containing all HTTP headers and values for the response. + + Please refer to the documentation accompanying `RKMappingOperation` for more details on metadata mapping. + + @see `RKMapperOperation` + */ +@interface RKResponseMapperOperation : NSOperation + +///------------------------------------------------ +/// @name Initializing a Response Mapping Operation +///------------------------------------------------ + +/** + Initializes and returns a newly created response mapper operation with the given request, HTTP response, response data, and an array of `RKResponseDescriptor` objects. + + @param request The request object for which the response was loaded. + @param response The HTTP response object to be used for object mapping. + @param data The data loaded for the response body. + @param responseDescriptors An array whose elements are `RKResponseDescriptor` objects specifying object mapping configurations that may be applied to the response. + @return The receiver, initialized with the response, data, and response descriptor objects. + */ +- (instancetype)initWithRequest:(NSURLRequest *)request + response:(NSHTTPURLResponse *)response + data:(NSData *)data + responseDescriptors:(NSArray *)responseDescriptors NS_DESIGNATED_INITIALIZER; + +///----------------------------------------------- +/// @name Accessing HTTP Request and Response Data +///----------------------------------------------- + +/** + An request object for which the response was loaded. + */ +@property (nonatomic, strong, readonly) NSURLRequest *request; + +/** + The response object that loaded the data that is to be object mapped by the operation. Cannot be `nil`. + */ +@property (nonatomic, strong, readonly) NSHTTPURLResponse *response; + +/** + The response data that is to be deserialized and mapped by the operation. May be `nil`. + */ +@property (nonatomic, strong, readonly) NSData *data; + +///--------------------------------- +/// @name Configuring Object Mapping +///--------------------------------- + +/** + An array of `RKResponseDescriptor` objects that specify object mapping configurations that may be applied to the deserialized response data if they are found to match the response. + + @see `RKResponseDescriptor` + */ +@property (nonatomic, strong, readonly) NSArray *responseDescriptors; + +/** + The target object for the object mapping operation performed on the deserialized response data. May be `nil`. + + When object mapping is being performed against a known object, the targetObject is set to ensure that the mapping is applied to the appropriate object reference. When `nil`, the mapping operation will result in the fetching or creation of new objects as necessary to satisfy the mapping configuration. + */ +@property (nonatomic, strong) id targetObject; + +/** + The delegate for the `RKMapperOperation` created by the receiver to perform object mapping on the deserialized response data. May be `nil`. + + The delegate provides access to the details of the mapping process as it is executing. Be aware that the delegate will be invoked from the thread on which the mapping is executing. + */ +@property (nonatomic, weak) id<RKMapperOperationDelegate> mapperDelegate; + +/** + An optional dictionary of metadata to make available to mapping operations executed by the receiver. + */ +@property (nonatomic, copy) NSDictionary *mappingMetadata; + +/** + A Boolean value that indicates if the receiver should consider empty responses as being successfully mapped even though no mapping is actually performed. + + When `YES` and the response data is empty (see below), a mapping result will be returned containing the target object (if any). Otherwise, the response data will be pass through to the parser which may generate an error. + + **Default:** `YES` + + @warning To support the Ruby on Rails behavior of rendering a single space character on invocation of `render :nothing => true`, a response body's containing only a single space is treated as empty. + */ +@property (nonatomic, assign) BOOL treatsEmptyResponseAsSuccess; + +/** + Returns a dictionary of key path to `RKMapping` objects that are applicable to mapping the response. This is determined by evaluating the URL and status codes of the response against the set of `responseDescriptors`. + + @see `RKResponseDescriptor` + */ +@property (nonatomic, strong, readonly) NSDictionary *responseMappingsDictionary; + +/** + Returns an array containing all `RKResponseDescriptor` objects in the configured `responseDescriptors` array that were found to match the response. + + @see `responseDescriptors` + @see `RKResponseDescriptor` + */ +@property (nonatomic, strong, readonly) NSArray *matchingResponseDescriptors; + +///-------------------------------- +/// @name Accessing Mapping Results +///-------------------------------- + +/** + The results of performing object mapping on the deserialized response data. In the event that the operation has failed, the value will is `nil`. + + The `keyPath` of each `RKResponseDescriptor` from the `responseDescriptors` set that was successfully mapped from the response data will appear as an entry in the mapping result. + */ +@property (nonatomic, strong, readonly) RKMappingResult *mappingResult; + +/** + The error, if any, that occured during execution of the operation. + */ +@property (nonatomic, strong, readonly) NSError *error; + +///---------------------------- +/// @name Configuring Callbacks +///---------------------------- + +/** + Sets a block to be executed before the response mapper operation begins mapping the deserialized response body, providing an opportunity to manipulate the mappable representation input before mapping begins. + + @param block A block object to be executed before the deserialized response is passed to the response mapper. The block has an `id` return type and must return a dictionary or array of dictionaries corresponding to the object representations that are to be mapped. The block accepts a single argument: the deserialized response data that was loaded via HTTP. If you do not wish to make any chances to the response body before mapping begins, the block should return the value passed in the `deserializedResponseBody` block argument. Returning `nil` will decline the mapping from proceeding and fail the operation with an error with the `RKMappingErrorMappingDeclined` code. + @warning The deserialized response body may or may not be immutable depending on the implementation details of the `RKSerialization` class that deserialized the response. If you wish to make changes to the mappable object representations, you must obtain a mutable copy of the response body input. + */ +- (void)setWillMapDeserializedResponseBlock:(id (^)(id deserializedResponseBody))block; + +/** + Sets a block to be executed when the response mapper operation has completed its mapping activities. This method is distinct from the `completionBlock` because it is invoked while the operation is still executing. This block is guaranteed to be called even if the receiver is cancelled before it has been started. + + @param block A block object to be executed when the response mapping is finished. The block has no return value and accepts two arguments: an `RKNappingResult` object that was mapped from the response or an `NSError` error indicating that the mapping has failed. + */ +- (void)setDidFinishMappingBlock:(void(^)(RKMappingResult *mappingResult, NSError *error))block; + +///-------------------------------------------------------- +/// @name Registering a Mapping Operation Data Source Class +///-------------------------------------------------------- + +/** + Registers the given data source class to to be used for mapper operations constructed by instances of the receiver. + + **NOTE**: The receiver class is significant to the registration: `[RKObjectResponseMapperOperation registerMappingOperationDataSourceClass:[MyDataSourceClass class]]` registers a data source for use with instances of `RKObjectResponseMapperOperation` exclusively. When registering a data source for `RKManagedObjectResponseMapperOperation` the given class must inherit from `RKManagedObjectMappingOperationDataSource`. + + @param dataSourceClass The class conforming to the RKMappingOperationDataSource protocol to be registered for use with mapper operations. + */ ++ (void)registerMappingOperationDataSourceClass:(Class<RKMappingOperationDataSource>)dataSourceClass; + +@end + +/** + `RKObjectResponseMapperOperation` is an `RKResponseMapperOperation` subclass that provides support for performing object mapping for mappings that target `NSObject` derived classes. It does not require a data source to perform its work. + */ +@interface RKObjectResponseMapperOperation : RKResponseMapperOperation +@end + +#if __has_include("CoreData.h") +/** + `RKManagedObjectResponseMapperOperation` is an `RKResponseMapperOperation` subclass that provides support for performing object mapping using `RKEntityMapping` objects that target `NSManagedObject` derived classes. It requires an `NSManagedObjectContext` and a configured `RKManagedObjectMappingOperationDataSource` data source to execute successfully. + + Performing response mapping that targets Core Data managed objects imposes some additional constraints on the process that the developer should understand thoroughly: + + 1. **Permanent Managed Object IDs**: When using managed object contexts in a parent-child configuration, it is important to obtain a permanent `NSManagedObjectID` for any existing objects that are to be mapped. Mapping that occur against objecs with temporary managedObjectID's cannot be retrieved across contexts by ID. If executing an `RKManagedObjectResponseMapperOperation` against a `NSManagedObject` targetObject with a temporary ID. + 1. **Persisting Mapped Objects**: Instances of `RKManagedObjectResponseMapperOperation` do **NOT** perform any persistence on the `NSManagedObject` in which the mapping occurs. This is by design and ensures that the operation can be used to compose higher level components that handle persistence. It is the developer's responsibility to ensure that the mapped managed objects are eventually persisted. + + @see `RKManagedObjectMappingOperationDataSource` + @see `[NSManagedObjectContext obtainPermanentIDsForObjects:error:]` + */ +@interface RKManagedObjectResponseMapperOperation : RKResponseMapperOperation + +///---------------------------- +/// @name Configuring Core Data +///---------------------------- + +/** + The managed object context in which the mapping will be performed. + + @warning The `NSManagedObjectContext` given **must** have a `concurrencyType` of either `NSPrivateQueueConcurrencyType` or `NSMainQueueConcurrencyType`. Thread confined contexts are not supported. + */ +@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext; + +/** + An object implementing the `RKManagedObjectCaching` protocol to be used for retrieving existing `NSManagedObject` instances by identification attributes. If `nil`, existing object cannot be retrieved and new objects will be created for all mappable content within the response data, likely resulting in the creation of duplicate objects. + + @see `RKManagedObjectCaching` + */ +@property (nonatomic, weak) id<RKManagedObjectCaching> managedObjectCache; + +/** + The permanent `NSManagedObjectID` for the target object of the mapping operation. During mapping, an instance local to the `managedObjectContext` is fetched and used to perform the mapping operation. + + If `nil` and the `targetObject` is a managed object, the `objectID` of the target object will be used. + */ +@property (nonatomic, copy) NSManagedObjectID *targetObjectID; + +@end + +#endif + +///---------------- +/// @name Functions +///---------------- + +/** + Returns a representation of a mapping result as an `NSError` value. + + The returned `NSError` object is in the `RKErrorDomain` domain and has the `RKMappingErrorFromMappingResult` code. The value for the `NSLocalizedDescriptionKey` is computed by retrieving the objects in the mapping result as an array, evaluating `valueForKeyPath:@"description"` against the array, and joining the returned error messages by comma to form a single string value. The source error objects are returned with the `NSError` in the `userInfo` dictionary under the `RKObjectMapperErrorObjectsKey` key. + + This implementation assumes that the class used to represent the response error will return a string description of the client side error when sent the `description` message. + + @return An error object representing the objects contained in the mapping result. + @see `RKErrorMessage` + */ +NSError *RKErrorFromMappingResult(RKMappingResult *mappingResult); diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKResponseMapperOperation.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKResponseMapperOperation.m new file mode 100644 index 0000000..d44b306 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKResponseMapperOperation.m @@ -0,0 +1,539 @@ +// +// RKResponseMapperOperation.m +// RestKit +// +// Created by Blake Watters on 8/16/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKObjectMappingOperationDataSource.h" +#import "RKLog.h" +#import "RKResponseDescriptor.h" +#import "RKPathMatcher.h" +#import "RKHTTPUtilities.h" +#import "RKResponseMapperOperation.h" +#import "RKMappingErrors.h" +#import "RKMIMETypeSerialization.h" +#import "RKDictionaryUtilities.h" + +#if __has_include("CoreData.h") +#define RKCoreDataIncluded +#import "RKManagedObjectMappingOperationDataSource.h" +#endif + +// Set Logging Component +#undef RKLogComponent +#define RKLogComponent RKlcl_cRestKitNetwork + +NSError *RKErrorFromMappingResult(RKMappingResult *mappingResult) +{ + NSArray *collection = [mappingResult array]; + NSString *description = nil; + if ([collection count] > 0) { + description = [[collection valueForKeyPath:@"description"] componentsJoinedByString:@", "]; + } else { + description = @"Expected mapping result to contain at least one object to construct an error"; + RKLogWarning(@"%@", description); + } + NSDictionary *userInfo = @{RKObjectMapperErrorObjectsKey: collection, + NSLocalizedDescriptionKey: description}; + + NSError *error = [NSError errorWithDomain:RKErrorDomain code:RKMappingErrorFromMappingResult userInfo:userInfo]; + return error; +} + +static NSIndexSet *RKErrorStatusCodes() +{ + static NSIndexSet *errorStatusCodes = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + errorStatusCodes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(400, 200)]; + }); + + return errorStatusCodes; +} + +static NSError *RKUnprocessableErrorFromResponse(NSHTTPURLResponse *response) +{ + NSCAssert([RKErrorStatusCodes() containsIndex:response.statusCode], @"Expected response status code to be in the 400-599 range, instead got %ld", (long) response.statusCode); + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + [userInfo setValue:[NSString stringWithFormat:@"Loaded an unprocessable error response (%ld)", (long) response.statusCode] forKey:NSLocalizedDescriptionKey]; + [userInfo setValue:[response URL] forKey:NSURLErrorFailingURLErrorKey]; + + return [[NSError alloc] initWithDomain:RKErrorDomain code:NSURLErrorBadServerResponse userInfo:userInfo]; +} + +NSString *RKStringFromIndexSet(NSIndexSet *indexSet); // Defined in RKResponseDescriptor.m +static NSString *RKMatchFailureDescriptionForResponseDescriptorWithResponse(RKResponseDescriptor *responseDescriptor, NSHTTPURLResponse *response) +{ + if (responseDescriptor.statusCodes && ![responseDescriptor.statusCodes containsIndex:response.statusCode]) { + return [NSString stringWithFormat:@"response status code %ld is not within the range %@", (long) response.statusCode, RKStringFromIndexSet(responseDescriptor.statusCodes)]; + } + + NSString *pathAndQueryString = RKPathAndQueryStringFromURLRelativeToURL(response.URL, responseDescriptor.baseURL); + if (responseDescriptor.baseURL && !RKURLIsRelativeToURL(response.URL, responseDescriptor.baseURL)) { + // Not relative to the baseURL + return [NSString stringWithFormat:@"response URL '%@' is not relative to the baseURL '%@'.", response.URL, responseDescriptor.baseURL]; + } + + // Must be a path pattern mismatch + return [NSString stringWithFormat:@"response path '%@' did not match the path pattern '%@'.", pathAndQueryString, responseDescriptor.pathPattern]; +} + +static NSString *RKFailureReasonErrorStringForResponseDescriptorsMismatchWithResponse(NSArray *responseDescriptors, NSHTTPURLResponse *response) +{ + NSMutableString *failureReason = [NSMutableString string]; + [failureReason appendFormat:@"A %ld response was loaded from the URL '%@', which failed to match all (%ld) response descriptors:", + (long) response.statusCode, response.URL, (long) [responseDescriptors count]]; + + for (RKResponseDescriptor *responseDescriptor in responseDescriptors) { + [failureReason appendFormat:@"\n <RKResponseDescriptor: %p baseURL=%@ pathPattern=%@ statusCodes=%@> failed to match: %@", + responseDescriptor, responseDescriptor.baseURL, responseDescriptor.pathPattern, + responseDescriptor.statusCodes ? RKStringFromIndexSet(responseDescriptor.statusCodes) : responseDescriptor.statusCodes, + RKMatchFailureDescriptionForResponseDescriptorWithResponse(responseDescriptor, response)]; + } + + return failureReason; +} + +/** + A serial dispatch queue used for all deserialization of response bodies + */ +static dispatch_queue_t RKResponseMapperSerializationQueue() { + static dispatch_queue_t serializationQueue; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + serializationQueue = dispatch_queue_create("org.restkit.response-mapper.serialization", DISPATCH_QUEUE_SERIAL); + }); + + return serializationQueue; +} + +@interface RKResponseMapperOperation () +@property (nonatomic, strong, readwrite) NSURLRequest *request; +@property (nonatomic, strong, readwrite) NSHTTPURLResponse *response; +@property (nonatomic, strong, readwrite) NSData *data; +@property (nonatomic, strong, readwrite) NSArray *responseDescriptors; +@property (nonatomic, strong, readwrite) RKMappingResult *mappingResult; +@property (nonatomic, strong, readwrite) NSError *error; +@property (nonatomic, strong, readwrite) NSArray *matchingResponseDescriptors; +@property (nonatomic, strong, readwrite) NSDictionary *responseMappingsDictionary; +@property (nonatomic, strong, readwrite) NSDictionary *responseMappingArgumentsDictionary; +@property (nonatomic, strong) RKMapperOperation *mapperOperation; +@property (nonatomic, copy) id (^willMapDeserializedResponseBlock)(id); +@property (nonatomic, copy) void(^didFinishMappingBlock)(RKMappingResult *, NSError *); +@end + +@interface RKResponseMapperOperation (ForSubclassEyesOnly) +- (id)parseResponseData:(NSError **)error; +- (RKMappingResult *)performMappingWithObject:(id)sourceObject error:(NSError **)error; +@property (NS_NONATOMIC_IOSONLY, readonly) BOOL hasEmptyResponse; +@end + +@implementation RKResponseMapperOperation + +#pragma mark Data Source Registration + +static NSMutableDictionary *RKRegisteredResponseMapperOperationDataSourceClasses = nil; + ++ (void)initialize +{ + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + RKRegisteredResponseMapperOperationDataSourceClasses = [NSMutableDictionary new]; + }); +} + ++ (void)registerMappingOperationDataSourceClass:(Class<RKMappingOperationDataSource>)dataSourceClass +{ + if (dataSourceClass && ![(Class)dataSourceClass conformsToProtocol:@protocol(RKMappingOperationDataSource)]) { + [NSException raise:NSInvalidArgumentException format:@"Registered data source class '%@' does not conform to the `RKMappingOperationDataSource` protocol.", NSStringFromClass(dataSourceClass)]; + } + + if (dataSourceClass) { + RKRegisteredResponseMapperOperationDataSourceClasses[(id<NSCopying>)self] = dataSourceClass; + } else { + [RKRegisteredResponseMapperOperationDataSourceClasses removeObjectForKey:(id<NSCopying>)self]; + } +} + +#pragma mark + +- (instancetype)init +{ + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"-init is not a valid initializer for the class %@, use designated initilizer -initWithRequest:response:data:responseDescriptors:", NSStringFromClass([self class])] + userInfo:nil]; + return [self init]; +} + +- (instancetype)initWithRequest:(NSURLRequest *)request + response:(NSHTTPURLResponse *)response + data:(NSData *)data + responseDescriptors:(NSArray *)responseDescriptors; +{ + NSParameterAssert(request); + NSParameterAssert(response); + NSParameterAssert(responseDescriptors); + + self = [super init]; + if (self) { + self.request = request; + self.response = response; + self.data = data; + self.responseDescriptors = responseDescriptors; + self.matchingResponseDescriptors = [self buildMatchingResponseDescriptors]; + self.responseMappingsDictionary = [self buildResponseMappingsDictionary]; + self.responseMappingArgumentsDictionary = [self buildResponseMappingArgumentsDictionary]; + self.treatsEmptyResponseAsSuccess = YES; + self.mappingMetadata = @{}; // Initialize the metadata + } + + return self; +} + +- (id)parseResponseData:(NSError **)error +{ + NSString *MIMEType = [self.response MIMEType]; + __block NSError *underlyingError = nil; + __block id object; + dispatch_sync(RKResponseMapperSerializationQueue(), ^{ + object = [RKMIMETypeSerialization objectFromData:self.data MIMEType:MIMEType error:&underlyingError]; + }); + if (! object) { + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + [userInfo setValue:[NSString stringWithFormat:@"Loaded an unprocessable response (%ld) with content type '%@'", (long) self.response.statusCode, MIMEType] + forKey:NSLocalizedDescriptionKey]; + [userInfo setValue:[self.response URL] forKey:NSURLErrorFailingURLErrorKey]; + [userInfo setValue:underlyingError forKey:NSUnderlyingErrorKey]; + NSError *HTTPError = [[NSError alloc] initWithDomain:RKErrorDomain code:NSURLErrorCannotParseResponse userInfo:userInfo]; + + if (error) *error = HTTPError; + + return nil; + } + return object; +} + +- (NSArray *)buildMatchingResponseDescriptors +{ + NSIndexSet *indexSet = [self.responseDescriptors indexesOfObjectsPassingTest:^BOOL(RKResponseDescriptor *responseDescriptor, NSUInteger idx, BOOL *stop) { + return [responseDescriptor matchesResponse:self.response] && (RKRequestMethodFromString(self.request.HTTPMethod) & responseDescriptor.method); + }]; + return [self.responseDescriptors objectsAtIndexes:indexSet]; +} + +- (NSDictionary *)buildResponseMappingsDictionary +{ + NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; + for (RKResponseDescriptor *responseDescriptor in self.matchingResponseDescriptors) { + dictionary[(responseDescriptor.keyPath ?: [NSNull null])] = responseDescriptor.mapping; + } + + return dictionary; +} + +- (NSDictionary *)buildResponseMappingArgumentsDictionary +{ + NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; + for (RKResponseDescriptor *responseDescriptor in self.matchingResponseDescriptors) { + + NSDictionary *arguments = [responseDescriptor parsedArgumentsFromResponse:self.response]; + if (arguments) + { + // We don't add nil keypath at an [NSNull null] key, because that causes a crash later + // in RKDictionaryByMergingDictionaryWithDictionary + if (responseDescriptor.keyPath) + { + [dictionary setObject:arguments forKey:responseDescriptor.keyPath]; + } + else + { + [dictionary addEntriesFromDictionary:arguments]; + } + } + } + + return dictionary; +} + +- (RKMappingResult *)performMappingWithObject:(id)sourceObject error:(NSError **)error +{ + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"%@ is an abstract operation.", + NSStringFromClass([self class])] + userInfo:nil]; +} + +- (BOOL)hasEmptyResponse +{ + // NOTE: Comparison to single string whitespace character to support Ruby on Rails `render :nothing => true` + static NSData *whitespaceData = nil; + if (! whitespaceData) whitespaceData = [[NSData alloc] initWithBytes:" " length:1]; + + NSUInteger length = [self.data length]; + return (length == 0 || (length == 1 && [self.data isEqualToData:whitespaceData])); +} + +- (void)setMappingMetadata:(NSDictionary *)mappingMetadata +{ + NSDictionary *HTTPMetadata = @{ @"HTTP": @{ @"request": @{ @"URL": self.request.URL, @"method": self.request.HTTPMethod, @"headers": [self.request allHTTPHeaderFields] ?: @{} }, + @"response": @{ @"URL": self.response.URL, @"headers": [self.response allHeaderFields] ?: @{} } } }; + _mappingMetadata = RKDictionaryByMergingDictionaryWithDictionary(HTTPMetadata, mappingMetadata); + + if (self.responseMappingArgumentsDictionary) + { + NSDictionary *argumentsMetadata = @{ @"network" : @{ @"arguments" : self.responseMappingArgumentsDictionary } }; + _mappingMetadata = RKDictionaryByMergingDictionaryWithDictionary(argumentsMetadata, _mappingMetadata); + } +} + +- (void)cancel +{ + BOOL cancelledBeforeExecution = ![self isExecuting] && ![self isCancelled]; + + [super cancel]; + [self.mapperOperation cancel]; + + // NOTE: If we are cancelled before being started, then `main` and the `completionBlock` are never executed. We must ensure that we invoke `didFinishMappingBlock`, see Github issue #1494 + if (cancelledBeforeExecution) { + [self willFinish]; + } +} + +- (void)willFinish +{ + if (self.isCancelled && !self.error) self.error = [NSError errorWithDomain:RKErrorDomain code:RKOperationCancelledError userInfo:@{ NSLocalizedDescriptionKey: @"The operation was cancelled." }]; + + @synchronized(self) { + if (self.didFinishMappingBlock) { + if (self.error) self.didFinishMappingBlock(nil, self.error); + else self.didFinishMappingBlock(self.mappingResult, nil); + [self setDidFinishMappingBlock:nil]; + } + } +} + +- (void)main +{ + if (self.isCancelled) return [self willFinish]; + + BOOL isErrorStatusCode = [RKErrorStatusCodes() containsIndex:self.response.statusCode]; + + // If we are an error response and empty, we emit an error that the content is unmappable + if (isErrorStatusCode && [self hasEmptyResponse]) { + self.error = RKUnprocessableErrorFromResponse(self.response); + [self willFinish]; + return; + } + + // If we are successful and empty, we may optionally consider the response mappable (i.e. 204 response or 201 with no body) + if ([self hasEmptyResponse] && self.treatsEmptyResponseAsSuccess) { + if (self.targetObject) { + self.mappingResult = [[RKMappingResult alloc] initWithDictionary:@{[NSNull null]: self.targetObject}]; + } else { + // NOTE: For alignment with the behavior of loading an empty array or empty dictionary, if there is a nil targetObject we return a nil mappingResult. + // This informs the caller that operation succeeded, but performed no mapping. + self.mappingResult = nil; + } + + [self willFinish]; + return; + } + + // Parse the response + NSError *error; + id parsedBody = [self parseResponseData:&error]; + if (self.isCancelled) return [self willFinish]; + if (! parsedBody) { + RKLogError(@"Failed to parse response data: %@", [error localizedDescription]); + self.error = error; + [self willFinish]; + return; + } + if (self.isCancelled) return [self willFinish]; + + // Invoke the will map deserialized response block + if (self.willMapDeserializedResponseBlock) { + parsedBody = self.willMapDeserializedResponseBlock(parsedBody); + if (! parsedBody) { + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: @"Mapping was declined due to a `willMapDeserializedResponseBlock` returning nil." }; + self.error = [NSError errorWithDomain:RKErrorDomain code:RKMappingErrorMappingDeclined userInfo:userInfo]; + RKLogError(@"Failed to parse response data: %@", [error localizedDescription]); + [self willFinish]; + return; + } + } + + // Object map the response + self.mappingResult = [self performMappingWithObject:parsedBody error:&error]; + + // If the response is a client error return either the mapping error or the mapped result to the caller as the error + if (isErrorStatusCode) { + if ([self.mappingResult count] > 0) { + error = RKErrorFromMappingResult(self.mappingResult); + } else { + // We encountered a client error that we could not map, throw unprocessable error + if (! error) error = RKUnprocessableErrorFromResponse(self.response); + } + self.error = error; + [self willFinish]; + return; + } + + // Fail if no response descriptors matched + if (error.code == RKMappingErrorNotFound && [self.responseMappingsDictionary count] == 0) { + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: NSLocalizedString(@"No response descriptors match the response loaded.", nil), + NSLocalizedFailureReasonErrorKey: RKFailureReasonErrorStringForResponseDescriptorsMismatchWithResponse(self.responseDescriptors, self.response), + RKMappingErrorKeyPathErrorKey: [NSNull null], + NSURLErrorFailingURLErrorKey: self.response.URL, + NSURLErrorFailingURLStringErrorKey: [self.response.URL absoluteString], + NSUnderlyingErrorKey: error}; + self.error = [[NSError alloc] initWithDomain:RKErrorDomain code:RKMappingErrorNotFound userInfo:userInfo]; + [self willFinish]; + return; + } + + if (! self.mappingResult) self.error = error; + [self willFinish]; +} + +@end + +@implementation RKObjectResponseMapperOperation + +- (RKMappingResult *)performMappingWithObject:(id)sourceObject error:(NSError **)error +{ + Class dataSourceClass = RKRegisteredResponseMapperOperationDataSourceClasses[[self class]] ?: [RKObjectMappingOperationDataSource class]; + id<RKMappingOperationDataSource> dataSource = [dataSourceClass new]; + self.mapperOperation = [[RKMapperOperation alloc] initWithRepresentation:sourceObject mappingsDictionary:self.responseMappingsDictionary]; + self.mapperOperation.mappingOperationDataSource = dataSource; + self.mapperOperation.delegate = self.mapperDelegate; + self.mapperOperation.metadata = self.mappingMetadata; + if (NSLocationInRange(self.response.statusCode, RKStatusCodeRangeForClass(RKStatusCodeClassSuccessful))) { + self.mapperOperation.targetObject = self.targetObject; + } else { + RKLogInfo(@"Non-successful status code encountered: performing mapping with nil target object."); + } + [self.mapperOperation start]; + if (error) *error = self.mapperOperation.error; + return self.mapperOperation.mappingResult; +} + +@end + +#ifdef RKCoreDataIncluded + +static inline NSManagedObjectID *RKObjectIDFromObjectIfManaged(id object) +{ + return [object isKindOfClass:[NSManagedObject class]] ? [object objectID] : nil; +} + +@interface RKManagedObjectResponseMapperOperation () +@property (nonatomic, strong) NSOperationQueue *operationQueue; +@end + +@implementation RKManagedObjectResponseMapperOperation + ++ (void)registerMappingOperationDataSourceClass:(Class<RKMappingOperationDataSource>)dataSourceClass +{ + if (dataSourceClass && ![(Class)dataSourceClass isSubclassOfClass:[RKManagedObjectMappingOperationDataSource class]]) { + [NSException raise:NSInvalidArgumentException format:@"Registered data source class '%@' does not inherit from the `RKManagedObjectMappingOperationDataSource` class: You must subclass `RKManagedObjectMappingOperationDataSource` in order to register a data source class for `RKManagedObjectResponseMapperOperation`.", NSStringFromClass(dataSourceClass)]; + } + [super registerMappingOperationDataSourceClass:dataSourceClass]; +} + +- (void)cancel +{ + [super cancel]; + [self.operationQueue cancelAllOperations]; +} + +- (RKMappingResult *)performMappingWithObject:(id)sourceObject error:(NSError **)error +{ + NSAssert(self.managedObjectContext, @"Unable to perform mapping: No `managedObjectContext` assigned. (Mapping response.URL = %@)", self.response.URL); + + __block NSError *blockError = nil; + __block RKMappingResult *mappingResult = nil; + self.operationQueue = [NSOperationQueue new]; + [self.managedObjectContext performBlockAndWait:^{ + // We may have been cancelled before we made it onto the MOC's queue + if ([self isCancelled]) return; + + // Configure the mapper + self.mapperOperation = [[RKMapperOperation alloc] initWithRepresentation:sourceObject mappingsDictionary:self.responseMappingsDictionary]; + self.mapperOperation.delegate = self.mapperDelegate; + self.mapperOperation.metadata = self.mappingMetadata; + + // Configure a data source to defer execution of connection operations until mapping is complete + Class dataSourceClass = RKRegisteredResponseMapperOperationDataSourceClasses[[self class]] ?: [RKManagedObjectMappingOperationDataSource class]; + RKManagedObjectMappingOperationDataSource *dataSource = [[dataSourceClass alloc] initWithManagedObjectContext:self.managedObjectContext + cache:self.managedObjectCache]; + dataSource.operationQueue = self.operationQueue; + dataSource.parentOperation = self.mapperOperation; + + [self.operationQueue setMaxConcurrentOperationCount:1]; + [self.operationQueue setName:[NSString stringWithFormat:@"Relationship Connection Queue for '%@'", self.mapperOperation]]; + self.mapperOperation.mappingOperationDataSource = dataSource; + + if (NSLocationInRange(self.response.statusCode, RKStatusCodeRangeForClass(RKStatusCodeClassSuccessful))) { + self.mapperOperation.targetObject = self.targetObject; + + if (self.targetObjectID || self.targetObject) { + NSManagedObjectID *objectID = self.targetObjectID ?: RKObjectIDFromObjectIfManaged(self.targetObject); + if (objectID) { + if ([objectID isTemporaryID]) RKLogWarning(@"Performing object mapping to temporary target objectID. Results may not be accessible without obtaining a permanent object ID."); + NSManagedObject *localObject = [self.managedObjectContext existingObjectWithID:objectID error:&blockError]; + NSAssert(localObject == nil || localObject.managedObjectContext == nil || [localObject.managedObjectContext isEqual:self.managedObjectContext], @"Serious Core Data error: requested existing object with ID %@ in context %@, instead got an object reference in context %@. This may indicate that the objectID for your target managed object was obtained using `obtainPermanentIDsForObjects:error:` in the wrong context.", objectID, self.managedObjectContext, [localObject managedObjectContext]); + if (! localObject) { + RKLogWarning(@"Failed to retrieve existing object with ID: %@", objectID); + RKLogCoreDataError(blockError); + return; + } + self.mapperOperation.targetObject = localObject; + } else { + if (self.mapperOperation.targetObject) RKLogDebug(@"Mapping HTTP response to unmanaged target object with `RKManagedObjectResponseMapperOperation`: %@", self.mapperOperation.targetObject); + } + } else { + RKLogTrace(@"Mapping HTTP response to nil target object..."); + } + } else { + RKLogInfo(@"Non-successful status code encountered: performing mapping with nil target object."); + } + + [self.mapperOperation start]; + blockError = self.mapperOperation.error; + mappingResult = self.mapperOperation.mappingResult; + }]; + + if (self.isCancelled) return nil; + + if (! mappingResult) { + if (error) *error = blockError; + return nil; + } + + // Mapping completed without error, allow the connection operations to execute + if ([self.operationQueue operationCount]) { + RKLogTrace(@"Awaiting execution of %ld enqueued connection operations: %@", (long) [self.operationQueue operationCount], [self.operationQueue operations]); + [self.operationQueue waitUntilAllOperationsAreFinished]; + } + + return mappingResult; +} + +@end + +#endif diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKRoute.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKRoute.h new file mode 100644 index 0000000..66f8f91 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKRoute.h @@ -0,0 +1,141 @@ +// +// RKRoute.h +// RestKit +// +// Created by Blake Watters on 5/31/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKHTTPUtilities.h" + +/** + The `RKRoute` class models a single routable path pattern in use by the application. A route can be combined with an `NSURL` base URL and interpolated with an object to produce a new fully hydrated URL object. Routes are always instantiated with a path pattern and metadata to provide for the subsequent identification of the defined route. + + There are three types of routes modeled by the RKRoute class: + + 1. **Named Routes**: A named route represents a single path and optional request method within the application. The route is not affiliated with any particular class. For example, one might define a route with the name `@"airlines_list"` as a GET to the path '/airlines.json'. + 1. **Class Routes**: An class route represents a single path that is identified by object class and request method for which it is appropriate. For example, one might define a route for the class `RKArticle` for a POST to the path '/articles.json'. + 1. **Relationship Routes**: A relationship route represents a single path through which the relationship of a parent object can be manipulated. For example, given an `RKArticle` and `RKComment` class, one might define a relationship route for the `RKArticle` class's `@"comments"` relationship as pointing to a GET to the path `@"/articles/:articleID/comments". + + The RKRoute class is internally implemented as a class cluster and is not to be directly instantiated via alloc and init. + + @see RKRouter + @see RKRouteSet + */ +@interface RKRoute : NSObject + +///--------------------------- +/// @name Instantiating Routes +///--------------------------- + +/** + Creates and returns a new named route object with the given name, path pattern and method. + + @param name A unique identifying name for the route. + @param pathPattern A SOCKit pattern describing the format of URL paths generated from the route. + @param method The request method of the route. The method given must specify a single HTTP method to be used for requests using the route. + @return A new named route object with the given name, path pattern and request method. + @raise NSInvalidArgumentException Raised if the given HTTP request method is not an exact match of the RKRequestMethod enum + */ ++ (instancetype)routeWithName:(NSString *)name pathPattern:(NSString *)pathPattern method:(RKRequestMethod)method; + +/** + Creates and returns a new class route object with the given object class, path pattern and method. + + @param objectClass The class that is represented by the route. + @param pathPattern A SOCKit pattern describing the format of URL paths generated from the route. + @param method The request method of the route. More than one method may be specified via a bitwise OR. + @return A new class route object with the given object class, path pattern and request method. + */ ++ (instancetype)routeWithClass:(Class)objectClass pathPattern:(NSString *)pathPattern method:(RKRequestMethod)method; + +/** + Creates and returns a new relationship route object with the given relationship name, object class, path pattern and method. + + @param name The name of the relationship represented by the route. + @param objectClass The class containing the relationship represented by the route. + @param pathPattern A SOCKit pattern describing the format of URL paths generated from the route. + @param method The request method of the route. More than one method may be specified via a bitwise OR. + @return A new class route object with the given object class, path pattern and request method. + */ ++ (instancetype)routeWithRelationshipName:(NSString *)name objectClass:(Class)objectClass pathPattern:(NSString *)pathPattern method:(RKRequestMethod)method; + +///--------------------------------- +/// @name Accessing Route Attributes +///--------------------------------- + +/** + The name of the receiver. + + The name is used to identify named and relationship routes and is always `nil` for object routes. + */ +@property (nonatomic, strong, readonly) NSString *name; + +/** + The object class of the receiver. + + Defines the class for which the route is appropriate. Always returns `nil` for named routes. + */ +@property (nonatomic, strong, readonly) Class objectClass; + +/** + The request method of the receiver. + + Appropriate for all route types. If the route is appropriate for any HTTP request method, then the `RKRequestMethodAny` value is used. + */ +@property (nonatomic, assign, readonly) RKRequestMethod method; + +/** + The path pattern of the receiver. + + A SOCKit pattern that describes the format of the path portion of URL's generated from the receiver. Required and used by all route types. + + @see `SOCPattern` + */ +@property (nonatomic, strong, readonly) NSString *pathPattern; + +/** + A Boolean value that determines if the path pattern should be escaped when evaluated. + + *Default*: `NO` + */ +@property (nonatomic, assign) BOOL shouldEscapePath; + +///----------------------------- +/// @name Inspecting Route Types +///----------------------------- + +/** + Determines if the receiver is a named route. + + @return YES if the receiver is a named route, else NO. + */ +@property (nonatomic, getter=isNamedRoute, readonly) BOOL namedRoute; + +/** + Determines if the receiver is a class route. + + @return YES if the receiver is a class route, else NO. + */ +@property (nonatomic, getter=isClassRoute, readonly) BOOL classRoute; + +/** + Determines if the receiver is a relationship route. + + @return YES if the receiver is a relationship route, else NO. + */ +@property (nonatomic, getter=isRelationshipRoute, readonly) BOOL relationshipRoute; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKRoute.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKRoute.m new file mode 100644 index 0000000..8dbc9eb --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKRoute.m @@ -0,0 +1,169 @@ +// +// RKRoute.m +// RestKit +// +// Created by Blake Watters on 5/31/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKRoute.h" + +NSString *RKStringDescribingRequestMethod(RKRequestMethod method); +NSString *RKStringDescribingRequestMethod(RKRequestMethod method) +{ + if (method == RKRequestMethodAny) return @"*"; + NSMutableArray *methods = [NSMutableArray array]; + if (method & RKRequestMethodGET) [methods addObject:@"GET"]; + if (method & RKRequestMethodPOST) [methods addObject:@"POST"]; + if (method & RKRequestMethodPUT) [methods addObject:@"PUT"]; + if (method & RKRequestMethodDELETE) [methods addObject:@"DELETE"]; + if (method & RKRequestMethodHEAD) [methods addObject:@"HEAD"]; + if (method & RKRequestMethodPATCH) [methods addObject:@"PATCH"]; + if (method & RKRequestMethodOPTIONS) [methods addObject:@"OPTIONS"]; + return [NSString stringWithFormat:@"(%@)", [methods componentsJoinedByString:@"|"]]; +} + +@interface RKRoute () +@property (nonatomic, strong, readwrite) NSString *name; +@property (nonatomic, strong, readwrite) Class objectClass; +@property (nonatomic, assign, readwrite) RKRequestMethod method; +@property (nonatomic, strong, readwrite) NSString *pathPattern; +@end + +@interface RKNamedRoute : RKRoute +@end + +@interface RKClassRoute : RKRoute +@end + +@interface RKRelationshipRoute : RKRoute +@end + +@implementation RKRoute + ++ (instancetype)routeWithName:(NSString *)name pathPattern:(NSString *)pathPattern method:(RKRequestMethod)method +{ + NSParameterAssert(name); + NSParameterAssert(pathPattern); + if (!RKIsSpecificRequestMethod(method)) [NSException raise:NSInvalidArgumentException format:@"The `method` parameter must specify a single, non-ambiguous HTTP method. Bitmask values and `RKRequestMethodAny` are invalid arguments."]; + RKNamedRoute *route = [RKNamedRoute new]; + route.name = name; + route.pathPattern = pathPattern; + route.method = method; + return route; +} + ++ (instancetype)routeWithClass:(Class)objectClass pathPattern:(NSString *)pathPattern method:(RKRequestMethod)method +{ + NSParameterAssert(objectClass); + NSParameterAssert(pathPattern); + RKClassRoute *route = [RKClassRoute new]; + route.objectClass = objectClass; + route.pathPattern = pathPattern; + route.method = method; + return route; +} + ++ (instancetype)routeWithRelationshipName:(NSString *)relationshipName objectClass:(Class)objectClass pathPattern:(NSString *)pathPattern method:(RKRequestMethod)method +{ + NSParameterAssert(relationshipName); + NSParameterAssert(objectClass); + NSParameterAssert(pathPattern); + RKRelationshipRoute *route = [RKRelationshipRoute new]; + route.name = relationshipName; + route.objectClass = objectClass; + route.pathPattern = pathPattern; + route.method = method; + return route; +} + +- (instancetype)init +{ + self = [super init]; + if (self) { + if ([self isMemberOfClass:[RKRoute class]]) { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"%@ is not meant to be directly instantiated. Use one of the initializer methods instead.", + NSStringFromClass([self class])] + userInfo:nil]; + } + } + + return self; +} + +- (BOOL)isNamedRoute +{ + return NO; +} + +- (BOOL)isClassRoute +{ + return NO; +} + +- (BOOL)isRelationshipRoute +{ + return NO; +} + +@end + +@implementation RKNamedRoute + +- (BOOL)isNamedRoute +{ + return YES; +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@: %p name=%@ method=%@ pathPattern=%@>", + NSStringFromClass([self class]), self, self.name, RKStringDescribingRequestMethod(self.method), self.pathPattern]; +} + +@end + +@implementation RKClassRoute + +- (BOOL)isClassRoute +{ + return YES; +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@: %p objectClass=%@ method=%@ pathPattern=%@>", + NSStringFromClass([self class]), self, NSStringFromClass(self.objectClass), + RKStringDescribingRequestMethod(self.method), self.pathPattern]; +} + +@end + +@implementation RKRelationshipRoute + +- (BOOL)isRelationshipRoute +{ + return YES; +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@: %p relationshipName=%@ objectClass=%@ method=%@ pathPattern=%@>", + NSStringFromClass([self class]), self, self.name, NSStringFromClass(self.objectClass), + RKStringDescribingRequestMethod(self.method), self.pathPattern]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKRouteSet.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKRouteSet.h new file mode 100644 index 0000000..6cb3502 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKRouteSet.h @@ -0,0 +1,159 @@ +// +// RKRouteSet.h +// RestKit +// +// Created by Blake Watters on 5/31/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKRoute.h" + +/** + The `RKRouteSet` class provides for the storage and retrieval of `RKRoute` objects. Route objects are added and removed the route set to manipulate the routing table of the application. + + @see `RKRouter` + */ +@interface RKRouteSet : NSObject + +///--------------------------------- +/// @name Adding and Removing Routes +///--------------------------------- + +/** + Adds a route to the receiver. + + @param route The route to be added. + @raises NSInvalidArgumentException Raised if the route already exists in the receiver or overlaps an existing name. + */ +- (void)addRoute:(RKRoute *)route; + +/** + Adds all routes from the given array to the receiver. All objects within the given array must be an instance of `RKRoute` or else an `NSInvalidArgumentException` will be raised. + + @param routes An array of `RKRoute` objects to be added to the receiver. + */ +- (void)addRoutes:(NSArray *)routes; + +/** + Removes a route from the receiver. + + @param route The route to be removed. + @raises NSInvalidArgumentException Raised if the route does not exist in the receiver. + */ +- (void)removeRoute:(RKRoute *)route; + +///--------------------------- +/// @name Querying a Route Set +///--------------------------- + +/** + Determines if a given route exists within the receiver. + + @param route The route to be tested for containement. + @return `YES` if the route is contained within the route set, else `NO`. + */ +- (BOOL)containsRoute:(RKRoute *)route; + +/** + Returns all routes from the receiver in an array. + + @return An array containing all the routes in the receiver. + */ +@property (nonatomic, readonly, copy) NSArray *allRoutes; + +/** + Returns all named routes from the receiver in an array. + + @return An array containing all the named routes in the receiver. + */ +@property (nonatomic, readonly, copy) NSArray *namedRoutes; + +/** + Returns all class routes from the receiver in an array. + + @return An array containing all the class routes in the receiver. + */ +@property (nonatomic, readonly, copy) NSArray *classRoutes; + +/** + Returns all relationship routes from the receiver in an array. + + @return An array containing all the relationship routes in the receiver. + */ +@property (nonatomic, readonly, copy) NSArray *relationshipRoutes; + +/** + Retrieves a route with the given name. + + @param name The name of the named route to be found. + @return A route with the given name or nil if none was found. + */ +- (RKRoute *)routeForName:(NSString *)name; + +/** + Retrieves a route for the given object class and request method. + + @param objectClass The object class of the route to be retrieved. + @param method The request method of the route to be retrieved. + @return A route with the given object class and method or nil if none was found. + */ +- (RKRoute *)routeForClass:(Class)objectClass method:(RKRequestMethod)method; + +/** + Retrieves a route for a given relationship of a class with a given request method. + + @param relationship The name of the relationship of the route to be retrieved. + @param method The request method of the route to be retrieved. + @return A route with the given relationship name, object class and method or nil if none was found. + */ +- (RKRoute *)routeForRelationship:(NSString *)relationship ofClass:(Class)objectClass method:(RKRequestMethod)method; + +/** + Retrieves all class routes with a given object class. + + Class matches are determined by direct comparison of the class objects. The inheritance hierarchy is not consulted. + + @param objectClass The object class of the routes to be retrieved. + @return An array containing all class routes with the given class. + */ +- (NSArray *)routesForClass:(Class)objectClass; + +/** + Retrieves all object routes for a given object. + + All object routes are searched and returned if they target a class or superclass of the given object (using `- [NSObject isKindOfClass:]`). + + @param object An object for which all object routes are to be retrieved. + @return An array containing all object routes where the target class is included in the given object's class hierarchy. + */ +- (NSArray *)routesForObject:(id)object; + +/** + Retrieves all routes for a given relationship name and object class. + + @param relationshipName The name of the relationship of the routes to be retrieved. + @param objectClass The object class of the routes to be retrieved. + @return An array containing all relationship routes with the given relationship name and object class. + */ +- (NSArray *)routesForRelationship:(NSString *)relationshipName ofClass:(Class)objectClass; + +/** + Retrieves a route for a given object and request method. + + The object routes are first searched for an exact match with the given object's class and request method. If no exact match is found for the given request method, but a route is found for the `RKRequestMethodAny` method, it is returned. If neither are found, the search process begins again and traverses up the inheritance hierarchy. + */ +- (RKRoute *)routeForObject:(id)object method:(RKRequestMethod)method; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKRouteSet.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKRouteSet.m new file mode 100644 index 0000000..1038b61 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKRouteSet.m @@ -0,0 +1,212 @@ +// +// RKRouteSet.m +// RestKit +// +// Created by Blake Watters on 5/31/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKRouteSet.h" +#import "RKPathMatcher.h" + +@interface RKRouteSet () + +@property (nonatomic, strong) NSMutableArray *routes; + +@end + +@implementation RKRouteSet + + +- (instancetype)init +{ + self = [super init]; + if (self) { + self.routes = [NSMutableArray array]; + } + + return self; +} + + +- (NSArray *)allRoutes +{ + return [NSArray arrayWithArray:self.routes]; +} + +- (NSArray *)namedRoutes +{ + NSMutableArray *routes = [NSMutableArray array]; + for (RKRoute *route in self.routes) { + if ([route isNamedRoute]) [routes addObject:route]; + } + + return [NSArray arrayWithArray:routes]; +} + +- (NSArray *)classRoutes +{ + NSMutableArray *routes = [NSMutableArray array]; + for (RKRoute *route in self.routes) { + if ([route isClassRoute]) [routes addObject:route]; + } + + return [NSArray arrayWithArray:routes]; +} + +- (NSArray *)relationshipRoutes +{ + NSMutableArray *routes = [NSMutableArray array]; + for (RKRoute *route in self.routes) { + if ([route isRelationshipRoute]) [routes addObject:route]; + } + + return [NSArray arrayWithArray:routes]; +} + +- (void)addRoute:(RKRoute *)route +{ + NSAssert(![self containsRoute:route], @"Cannot add a route that is already added to the router."); + NSAssert(![route isNamedRoute] || [self routeForName:route.name] == nil, @"Cannot add a route with the same name as an existing route."); + if ([route isClassRoute]) { + RKRoute *existingRoute = [self routeForClass:route.objectClass method:route.method]; + if (! (existingRoute == nil || (existingRoute.method == RKRequestMethodAny && route.method != RKRequestMethodAny) || (route.method == RKRequestMethodAny && existingRoute.method != RKRequestMethodAny))) [NSException raise:NSInternalInconsistencyException format:@"Cannot add a route with the same class and method as an existing route."]; + } else if ([route isRelationshipRoute]) { + NSArray *routes = [self routesForRelationship:route.name ofClass:route.objectClass]; + for (RKRoute *existingRoute in routes) { + NSAssert(existingRoute.method != route.method, @"Cannot add a relationship route with the same name and class as an existing route."); + (void)existingRoute; + } + } + [self.routes addObject:route]; +} + +- (void)addRoutes:(NSArray *)routes +{ + for (RKRoute *route in routes) { + if (! [route isKindOfClass:[RKRoute class]]) [NSException raise:NSInvalidArgumentException format:@"Unexpected object of type `%@` encountered in array of routes.", [route class]]; + [self addRoute:route]; + } +} + +- (void)removeRoute:(RKRoute *)route +{ + NSAssert([self containsRoute:route], @"Cannot remove a route that is not added to the router."); + [self.routes removeObject:route]; +} + +- (BOOL)containsRoute:(RKRoute *)route +{ + return [self.routes containsObject:route]; +} + +- (RKRoute *)routeForName:(NSString *)name +{ + for (RKRoute *route in [self namedRoutes]) { + if ([route.name isEqualToString:name]) { + return route; + } + } + + return nil; +} + +- (RKRoute *)routeForClass:(Class)objectClass method:(RKRequestMethod)method +{ + // Check for an exact match + for (RKRoute *route in [self classRoutes]) { + if ([route.objectClass isEqual:objectClass] && (route.method != RKRequestMethodAny && route.method & method)) { + return route; + } + } + + // Check for wildcard match + for (RKRoute *route in [self classRoutes]) { + if ([route.objectClass isEqual:objectClass] && route.method == RKRequestMethodAny) { + return route; + } + } + + return nil; +} + +- (RKRoute *)routeForRelationship:(NSString *)relationshipName ofClass:(Class)objectClass method:(RKRequestMethod)method +{ + for (RKRoute *route in [self relationshipRoutes]) { + if ([route.name isEqualToString:relationshipName] && [route.objectClass isEqual:objectClass] && (route.method == method || route.method == RKRequestMethodAny)) { + return route; + } + } + + return nil; +} + +- (NSArray *)routesForClass:(Class)objectClass +{ + NSMutableArray *routes = [NSMutableArray array]; + for (RKRoute *route in [self classRoutes]) { + if ([route.objectClass isEqual:objectClass]) { + [routes addObject:route]; + } + } + + return [NSArray arrayWithArray:routes]; +} + +- (NSArray *)routesForObject:(id)object +{ + NSMutableArray *routes = [NSMutableArray array]; + for (RKRoute *route in [self classRoutes]) { + if ([object isKindOfClass:route.objectClass]) { + [routes addObject:route]; + } + } + + return [NSArray arrayWithArray:routes]; +} + +- (NSArray *)routesForRelationship:(NSString *)relationshipName ofClass:(Class)objectClass +{ + NSIndexSet *indexes = [self.relationshipRoutes indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { + return [[(RKRoute *)obj objectClass] isEqual:objectClass] && [[(RKRoute *)obj name] isEqualToString:relationshipName]; + }]; + + return [self.relationshipRoutes objectsAtIndexes:indexes]; +} + +- (RKRoute *)routeForObject:(id)object method:(RKRequestMethod)method +{ + Class searchClass = [object class]; + while (searchClass) { + NSArray *routes = [self routesForClass:searchClass]; + RKRoute *wildcardRoute = nil; + RKRoute *bitMaskMatch = nil; + for (RKRoute *route in routes) { + if (route.method == method) return route; + + // We want to favor bitmask matches separate from the Any wildcard match + if (route.method == RKRequestMethodAny) wildcardRoute = route; + else if (route.method & method) bitMaskMatch = route; + } + + if (bitMaskMatch) return bitMaskMatch; + if (wildcardRoute) return wildcardRoute; + searchClass = [searchClass superclass]; + } + + return nil; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKRouter.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKRouter.h new file mode 100644 index 0000000..f8f7221 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKRouter.h @@ -0,0 +1,118 @@ +// +// RKRouter.h +// RestKit +// +// Created by Blake Watters on 6/20/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKHTTPUtilities.h" + +@class RKRouteSet; +@class RKRoute; + +/** + An `RKRouter` instance is responsible for generating `NSURL` objects with a given base URL and a route set. It is used to centralize the knowledge about the URL's that are used by the application. + + ## Route Generation + + URL's can be generated by the router in three ways: + + 1. **By name**. Named routes link a symbolic name with a path and an HTTP request method. (see `URLForRouteNamed:method:object:`) + 2. **By object**. Routes can be defined by class and HTTP request method. When a URL is requested from the router for an object, the router will identify the most appropriate route for the object and instantiate an `NSURL` with the route's path pattern and interpolate it against the object. (see `URLForObject:method:`) + 3. **By object relationship**. Routes can be defined for relationships to other objects. When a URL is requested from the router for a relationship, the router will retrieve the appropriate route for the relationship from the route set and interpolate the route's path pattern against the source object. (see `URLForRelationship:ofObject:method:`) + + @see `RKRoute` + @see `RKRouteSet` + */ +@interface RKRouter : NSObject + +- (instancetype)init __attribute__((unavailable("Invoke initWithBaseURL: instead."))); + +///---------------------------- +/// @name Initializing a Router +///---------------------------- + +/** + Initializes a router with a given base URL. + + @param baseURL The base URL with which to initialize the receiver. + @return The receiver, initialized with the given base URL. + */ +- (instancetype)initWithBaseURL:(NSURL *)baseURL NS_DESIGNATED_INITIALIZER; + +///---------------------- +/// @name Generating URLs +///---------------------- + +/** + Generates a URL for the route with the given name. + + The route set is searched for a route with the given name and a new `NSURL` object is instantiated with the baseURL of the receiver and the path pattern of the route, optionally interpolated with a given object. If a pointer to an `RKRequestMethod` variable is provided, the HTTP method for the route will be assigned to the reference. + + @param routeName The name of the route for which a URL is to be generated. + @param method A pointer to an `RKRequestMethod` variable in which to store the HTTP method associated with the named route. May be nil. + @param object An optional object against which to interpolate the path pattern. + @return A new `NSURL` object constructed by appending the path pattern to the baseURL of the receiver and interpolating against a given object; or nil if no route was found with the given name. + */ +- (NSURL *)URLForRouteNamed:(NSString *)routeName method:(out RKRequestMethod *)method object:(id)object; + +/** + Generates a URL for a given object and HTTP method. + + The route set is searched for a route that matches the HTTP method and class of the object being routed. If there is not an exact match for the object's class, the inheritance hierarchy is searched until a match is found or all possible routes are exhausted. Exact HTTP request matches are favored over the wildcard method (`RKRequestMethodAny`). Once the appropriate route is identified, a new `NSURL` object is instantiated with the baseURL of the receiver and the path pattern of the route, interpolated against the object being routed. + + @param object The object for which a URL is to be generated. + @param method The HTTP method for which the URL is to be generated. + @return A new URL object constructed by appending the path pattern of the route for the object an HTTP method to the baseURL of the receiver, interpolated against the routed object; or nil if no route was found for the given object and HTTP method. + */ +- (NSURL *)URLForObject:(id)object method:(RKRequestMethod)method; + +/** + Generates a URL for a relationship of a given object with a given HTTP method. + + The route set is searched for a route that matches the relationship of the given object's class and the given HTTP method. If a matching route is found, a new `NSURL` object is instantiated with the baseURL of the receiver and the path pattern of the route, interpolated against the object being routed. + + @param relationshipName The name of the relationship for which a URL is to be generated. + @param object The object for which the URL is to be generated. + @param method The HTTP method for which the URL is to be generated. + @return A new URL object constructed by appending the path pattern of the route for the given object's relationship and HTTP method to the baseURL of the receiver, interpolated against the routed object; or nil if no route was found for the given relationship, object and HTTP method. + */ +- (NSURL *)URLForRelationship:(NSString *)relationshipName ofObject:(id)object method:(RKRequestMethod)method; + +/** + Generates a URL with a given route and object. + + @param route The route to generate the URL with. + @param object The object with which to interpolate the path pattern of the given route. + @return A new URL object constructed by interpolating the path pattern of the given route with the given object to construct a path and constructing an `NSURL` object relative to the `baseURL` of the receiver. + */ +- (NSURL *)URLWithRoute:(RKRoute *)route object:(id)object; + +///--------------------------------------------- +/// @name Configuring the Base URL and Route Set +///--------------------------------------------- + +/** + The base URL that all URLs constructed by the receiver are relative to. + */ +@property (nonatomic, strong, readwrite) NSURL *baseURL; + +/** + A route set defining all the routes addressable through the receiver. + */ +@property (nonatomic, strong, readonly) RKRouteSet *routeSet; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKRouter.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKRouter.m new file mode 100644 index 0000000..2d5565f --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Network/RKRouter.m @@ -0,0 +1,85 @@ +// +// RKRouter.m +// RestKit +// +// Created by Blake Watters on 6/20/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKRouter.h" +#import "RKRouteSet.h" +#import "RKRoute.h" +#import "RKPathMatcher.h" +#import <objc/runtime.h> + +@interface RKRouter () +@property (nonatomic, strong, readwrite) RKRouteSet *routeSet; +@end + +@implementation RKRouter + +- (instancetype)initWithBaseURL:(NSURL *)baseURL +{ + self = [super init]; + if (self) { + NSParameterAssert(baseURL); + self.baseURL = baseURL; + self.routeSet = [[RKRouteSet alloc] init]; + } + + return self; +} + +- (instancetype)init +{ + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"%@ Failed to call designated initializer. Invoke initWithBaseURL: instead.", NSStringFromClass([self class])] + userInfo:nil]; +} + +- (NSURL *)URLForRouteNamed:(NSString *)routeName method:(out RKRequestMethod *)method object:(id)object +{ + RKRoute *route = [self.routeSet routeForName:routeName]; + if (method) *method = route.method; + return [self URLWithRoute:route object:object]; +} + +- (NSURL *)URLForObject:(id)object method:(RKRequestMethod)method +{ + RKRoute *route = [self.routeSet routeForObject:object method:method]; + return [self URLWithRoute:route object:object]; +} + +- (NSURL *)URLForRelationship:(NSString *)relationshipName ofObject:(id)object method:(RKRequestMethod)method +{ + RKRoute *route = [self.routeSet routeForRelationship:relationshipName ofClass:[object class] method:method]; + return [self URLWithRoute:route object:object]; +} + +- (NSURL *)URLWithRoute:(RKRoute *)route object:(id)object +{ + NSParameterAssert(route); + NSURL *URL = [NSURL URLWithString:[self pathFromRoute:route forObject:object] relativeToURL:self.baseURL]; + return URL; +} + +- (NSString *)pathFromRoute:(RKRoute *)route forObject:(id)object +{ + if (! object) return route.pathPattern; + RKPathMatcher *pathMatcher = [RKPathMatcher pathMatcherWithPattern:route.pathPattern]; + return [pathMatcher pathFromObject:object addingEscapes:route.shouldEscapePath interpolatedParameters:nil]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping.h new file mode 100644 index 0000000..1ad0b8c --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping.h @@ -0,0 +1,29 @@ +// +// ObjectMapping.h +// RestKit +// +// Created by Blake Watters on 9/30/10. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <RKValueTransformers/RKValueTransformers.h> + +#import "RKObjectMapping.h" +#import "RKAttributeMapping.h" +#import "RKRelationshipMapping.h" +#import "RKMappingResult.h" +#import "RKMapperOperation.h" +#import "RKDynamicMapping.h" +#import "RKErrorMessage.h" diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKAttributeMapping.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKAttributeMapping.h new file mode 100644 index 0000000..6d08f96 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKAttributeMapping.h @@ -0,0 +1,60 @@ +// +// RKAttributeMapping.h +// RestKit +// +// Created by Blake Watters on 4/30/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKPropertyMapping.h" + +/** + Instances of `RKAttributeMapping` define a transformation of data between an attribute value on source object and an attribute value on a destination object within an object mapping. + */ +@interface RKAttributeMapping : RKPropertyMapping + +/** + Creates and returns a new attribute mapping specifying that data is to be read from a given key path on a source object + and set to a given key path on a destination object. + + Attribute mappings define transformation between key paths in the source and destination object beings mapped. In the simplest + case, an attribute mapping may simply specify that data from one object is to be copied to another. A common example of this + type of transformation is copying the `name` key from a JSON payload onto a local object. In this case, the source and + destination key paths are identical, as are the source and destination types (`NSString`), so a simple get and set operation + has been defined. + + The next most common use-case is the transformation of identical data between two different key paths in the + source and destination objects. This is typically encountered when you wish to transform inbound data to conform with the naming + conventions of the platform or the data model of your application. An example of this type of transformation would be from the + source key path of `first_name` to the destination key path of `firstName`. In this transformation, the key paths have diverged + but both sides of the mapping correspond to NSString properties. + + The final type of transformation to be specified via an attribute mapping involves the transformation between types in the mapping. + By far, the most common example of this use-case is the transformation of a inbound string or numeric property into a date on + the target object. For example, consider a backend system that returns the creation date of a piece of content in a JSON payload. + This data might be returned in JSON as `{"created_on": "2012-08-27"}`. In a given application, the developer may wish to model this + data as an NSDate `createdOn` property on the target object. An attribute mapping to support this mapping would specify a source + key path of `created_on` and a destination key path of `createdOn`. On the destination object, the `createdOn` property would be defined + as `@property (nonatomic, strong) NSDate *createdOn;`. At mapping time, the mapping operation inspects the type of the content being + mapped and attempts to transform the source content into the type of the desination property specified by the mapping. In this case, + an NSDateFormatter object would be used to process the inbound `NSString` into an outbound `NSDate` object. + + @param sourceKeyPath The key path on the source object from which to read the data being mapped. If `nil`, then the entire source object representation is mapped to the specified destination attribute. + @param destinationKeyPath The key path on the destination object on which to set the mapped data. + @return A newly created attribute mapping object that is ready to be added to an object mapping. + */ ++ (instancetype)attributeMappingFromKeyPath:(NSString *)sourceKeyPath toKeyPath:(NSString *)destinationKeyPath; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKAttributeMapping.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKAttributeMapping.m new file mode 100644 index 0000000..6d83f06 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKAttributeMapping.m @@ -0,0 +1,39 @@ +// +// RKAttributeMapping.m +// RestKit +// +// Created by Blake Watters on 4/30/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKAttributeMapping.h" + +@interface RKPropertyMapping () +@property (nonatomic, copy, readwrite) NSString *sourceKeyPath; +@property (nonatomic, copy, readwrite) NSString *destinationKeyPath; +@end + +@implementation RKAttributeMapping + ++ (instancetype)attributeMappingFromKeyPath:(NSString *)sourceKeyPath toKeyPath:(NSString *)destinationKeyPath +{ + NSAssert(sourceKeyPath || destinationKeyPath, @"Both the source and destination key paths cannot be nil"); + RKAttributeMapping *attributeMapping = [self new]; + attributeMapping.sourceKeyPath = sourceKeyPath; + attributeMapping.destinationKeyPath = destinationKeyPath; + return attributeMapping; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKDynamicMapping.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKDynamicMapping.h new file mode 100644 index 0000000..ba60aca --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKDynamicMapping.h @@ -0,0 +1,115 @@ +// +// RKDynamicMapping.h +// RestKit +// +// Created by Blake Watters on 7/28/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKMapping.h" +#import "RKObjectMappingMatcher.h" + +/** + The `RKDynamicMapping` class is an `RKMapping` subclass that provides an interface for deferring the decision about how a given object representation is to be mapped until run time. This enables many interesting mapping strategies, such as mapping similarly structured data differently and constructing object mappings at run time by examining the data being mapped. + + ## Configuring Mapping Selection + + Dynamic mappings support the selection of the concrete object mapping in one of two ways: + + 1. Through the use of a mapping selection block configured by `setObjectMappingForRepresentationBlock:`. When configured, the block is called with a reference to the current object representation being mapped and is expected to return an `RKObjectMapping` object. Returning `nil` declines the mapping of the representation. + 1. Through the configuration of one of more `RKObjectMappingMatcher` objects. The matchers are consulted in registration order and the first matcher to return an object mapping is used to map the matched representation. + + When both a mapping selection block and matchers are configured on a `RKDynamicMapping` object, the matcher objects are consulted first and if none match, the selection block is invoked. + + ## Using Matcher Objects + + The `RKObjectMappingMatcher` class provides an interface for evaluating a key path or predicate based match and returning an appropriate object mapping. Matchers can be added to the `RKDynamicMapping` objects to declaratively describe a particular mapping strategy. + + For example, suppose that we have a JSON fragment for a person that we want to map differently based on the gender of the person. When the gender is 'male', we want to use the Boy class and when then the gender is 'female' we want to use the Girl class. The JSON might look something like this: + + [ { "name": "Blake", "gender": "male" }, { "name": "Sarah", "gender": "female" } ] + + We might define configure the dynamic mapping like so: + + RKDynamicMapping *mapping = [RKDynamicMapping new]; + RKObjectMapping *boyMapping = [RKObjectMapping mappingForClass:[Boy class]]; + RKObjectMapping *girlMapping = [RKObjectMapping mappingForClass:[Girl class]]; + [mapping addMatcher:[RKObjectMappingMatcher matcherWithKeyPath:@"gender" expectedValue:@"male" objectMapping:boyMapping]]; + [mapping addMatcher:[RKObjectMappingMatcher matcherWithKeyPath:@"gender" expectedValue:@"female" objectMapping:girlMapping]]; + + When evaluated, the matchers will invoke `valueForKeyPath:@"gender"` against each dictionary in the array of object representations and apply the appropriate object mapping for each representation. This would return a mapping result containing an array of two objects, one an instance of the `Boy` class and the other an instance of the `Girl` class. + + ## HTTP Integration + + Dynamic mappings can be used to map HTTP requests and responses by adding them to an `RKRequestDescriptor` or `RKResponseDescriptor` objects. + */ +@interface RKDynamicMapping : RKMapping + +///------------------------------------------ +/// @name Configuring Block Mapping Selection +///------------------------------------------ + +/** + Sets a block to be invoked to determine the appropriate concrete object mapping with which to map an object representation. + + @param block The block object to invoke to select the object mapping with which to map the given object representation. The block returns an object mapping and accepts a single parameter: the object representation being mapped. + */ +- (void)setObjectMappingForRepresentationBlock:(RKObjectMapping *(^)(id representation))block; + +/** + Returns the array of matchers objects added to the receiver. + */ +@property (nonatomic, strong, readonly) NSArray *matchers; + +/** + Adds a matcher to the receiver. + + If the matcher has already been added to the receiver, then adding it again moves it to the top of the matcher stack. + + @param matcher The matcher to add to the receiver. + */ +- (void)addMatcher:(RKObjectMappingMatcher *)matcher; + +/** + Removes a matcher from the receiver. + + If the matcher has already been added to the receiver, then adding it again moves it to the top of the matcher stack. + + @param matcher The matcher to remove from the receiver. + */ +- (void)removeMatcher:(RKObjectMappingMatcher *)matcher; + +/** + Returns an array of object mappings that have been registered with the receiver. + + @return An array of `RKObjectMapping` objects registered with the receiver. + */ +@property (nonatomic, readonly) NSArray *objectMappings; + +///----------------------------------------------------------------- +/// @name Retrieving the Object Mapping for an Object Representation +///----------------------------------------------------------------- + +/** + Invoked by the `RKMapperOperation` and `RKMappingOperation` to determine the appropriate `RKObjectMapping` to use when mapping the given object representation. + + This method searches the stack of registered matchers and then executes the block, if any, set by `setObjectMappingForRepresentationBlock:`. If `nil` is returned, then mapping for the representation is declined and it will not be mapped. + + @param representation The object representation that being mapped dynamically for which to determine the appropriate concrete mapping. + @return The object mapping to be used to map the given object representation. + */ +- (RKObjectMapping *)objectMappingForRepresentation:(id)representation; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKDynamicMapping.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKDynamicMapping.m new file mode 100644 index 0000000..f7138ba --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKDynamicMapping.m @@ -0,0 +1,119 @@ +// +// RKDynamicMapping.m +// RestKit +// +// Created by Blake Watters on 7/28/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKDynamicMapping.h" +#import "RKObjectMappingMatcher.h" +#import "RKLog.h" + +// Set Logging Component +#undef RKLogComponent +#define RKLogComponent RKlcl_cRestKitObjectMapping + +@interface RKDynamicMapping () +@property (nonatomic, strong) NSMutableArray *mutableMatchers; +@property (nonatomic, strong) NSArray *possibleObjectMappings; +@property (nonatomic, copy) RKObjectMapping *(^objectMappingForRepresentationBlock)(id representation); +@end + +@implementation RKDynamicMapping + +- (instancetype)init +{ + self = [super init]; + if (self) { + self.mutableMatchers = [NSMutableArray new]; + self.possibleObjectMappings = [NSArray new]; + } + + return self; +} + +- (NSArray *)matchers +{ + return [self.mutableMatchers copy]; +} + +- (NSArray *)objectMappings +{ + return self.possibleObjectMappings; +} + +- (void)addMatcher:(RKObjectMappingMatcher *)matcher +{ + NSParameterAssert(matcher); + if ([self.mutableMatchers containsObject:matcher]) { + [self.mutableMatchers removeObject:matcher]; + [self.mutableMatchers insertObject:matcher atIndex:0]; + } else { + [self.mutableMatchers addObject:matcher]; + + NSArray *newPossibleMappings = [matcher possibleObjectMappings]; + if (newPossibleMappings.count > 0) { + self.possibleObjectMappings = [self.possibleObjectMappings arrayByAddingObjectsFromArray:newPossibleMappings]; + } + } +} + +- (void)removeMatcher:(RKObjectMappingMatcher *)matcher +{ + NSParameterAssert(matcher); + + if ([self.mutableMatchers containsObject:matcher]) { + NSMutableArray *mappings = [self.possibleObjectMappings mutableCopy]; + for (RKObjectMapping *mapping in [matcher possibleObjectMappings]) { + /* removeObject will remove *all* instances; if we have dups we just want to remove one */ + NSUInteger idx = [mappings indexOfObject:mapping]; + if (idx != NSNotFound) + [mappings removeObjectAtIndex:idx]; + } + self.possibleObjectMappings = [mappings copy]; + [self.mutableMatchers removeObject:matcher]; + } +} + +- (RKObjectMapping *)objectMappingForRepresentation:(id)representation +{ + RKObjectMapping *mapping = nil; + + RKLogTrace(@"Performing dynamic object mapping for object representation: %@", representation); + + // Consult the declarative matchers first + for (RKObjectMappingMatcher *matcher in self.mutableMatchers) { + if ([matcher matches:representation]) { + RKLogTrace(@"Found declarative match for matcher: %@.", matcher); + return matcher.objectMapping; + } + } + + // Otherwise consult the block + if (self.objectMappingForRepresentationBlock) { + mapping = self.objectMappingForRepresentationBlock(representation); + if (mapping) RKLogTrace(@"Determined concrete `RKObjectMapping` using object mapping for representation block"); + } + + return mapping; +} + +- (BOOL)isEqualToMapping:(RKMapping *)otherMapping +{ + return (self == otherMapping); +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKErrorMessage.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKErrorMessage.h new file mode 100644 index 0000000..2aea33f --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKErrorMessage.h @@ -0,0 +1,44 @@ +// +// RKError.h +// RestKit +// +// Created by Jeremy Ellison on 5/10/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <Foundation/Foundation.h> + +/** + The `RKErrorMessage` is a simple class used for representing error messages returned by a remote backend system with which the client application is communicating. Error messages are typically returned in a response body in the Client Error class (status code 4xx range). + + @see `RKErrorFromMappingResult` + */ +@interface RKErrorMessage : NSObject + +///----------------------------------- +/// @name Accessing Errror Information +///----------------------------------- + +/** + The error message to be presented to the user. + */ +@property (nonatomic, copy) NSString *errorMessage; + +/** + A dictionary of application specific information that accompanies the error message. + */ +@property (nonatomic, copy) NSDictionary *userInfo; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKErrorMessage.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKErrorMessage.m new file mode 100644 index 0000000..1a102c4 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKErrorMessage.m @@ -0,0 +1,30 @@ +// +// RKError.m +// RestKit +// +// Created by Jeremy Ellison on 5/10/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKErrorMessage.h" + +@implementation RKErrorMessage + +- (NSString *)description +{ + return self.errorMessage; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMapperOperation.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMapperOperation.h new file mode 100644 index 0000000..94489d0 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMapperOperation.h @@ -0,0 +1,256 @@ +// +// RKMapperOperation.h +// RestKit +// +// Created by Blake Watters on 5/6/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <Foundation/Foundation.h> +#import "RKObjectMapping.h" +#import "RKMappingOperation.h" +#import "RKMappingResult.h" +#import "RKMappingOperationDataSource.h" +#import "RKErrors.h" + +@protocol RKMapperOperationDelegate; + +/** + `RKMapperOperation` is an `NSOperation` subclass that implements object mapping for opaque object representations. Given a dictionary or an array of dictionaries that represent objects and a dictionary describing how to map the representations, the mapper will transform the source representations into `NSObject` or `NSManagedObject` instances. Mapper operations are used to map object representations from Foundation object representations, such as those deserialized from a JSON or XML document or loaded from a file. Not all the mappings specified in the mappings dictionary are required to match content in the source object for the operation to succeed. However, if none of the mappable key paths in the mappings dictionary match the source object then the operation will fail and the `error` property will be set to an `NSError` object in the `RKErrorDomain` domain with an error code value of `RKMappingErrorNotFound`. + + `RKMapperOperation` does not actually perform any mapping work. Instead, it instantiates and starts `RKMappingOperation` objects to process the mappable object representations it encounters. + + `RKMapperOperation` is a non-concurrent operation. Execution will occur synchronously on the calling thread unless the operation is enqueued onto an `NSOperationQueue`. + + ## Mappings Dictionary + + The mappings dictionary describes how to object map the source object. The keys of the dictionary are key paths into the `representation` and the values are `RKMapping` objects describing how to map the representations at the corresponding key path. This dictionary based approach enables a single document to contain an arbitrary number of object representations that can be mapped independently. Consider the following example JSON structure: + + { "tags": [ "hacking", "phreaking" ], "authors": [ "Captain Crunch", "Emmanuel Goldstein" ], "magazine": { "title": "2600 The Hacker Quarterly" } } + + Each key in the document could be mapped independently by providing a mapping for the key paths: + + RKObjectMapping *tagMapping = [RKObjectMapping mappingForClass:[Tag class]]; + RKObjectMapping *authorMapping = [RKObjectMapping mappingForClass:[Author class]]; + RKObjectMapping *magazineMapping = [RKObjectMapping mappingForClass:[Magazine class]]; + NSDictionary *mappingsDictionary = @{ @"tag": tagMapping, @"author": authorMapping, @"magazine": magazine }; + + Note that the keys of the dictionary are **key paths**. Deeply nested content can be mapped by specifying the full key path as the key of the mappings dictionary. + + ### Mapping the Root Object Representation + + A mapping set for the key `[NSNull null]` value has special significance to the mapper operation. When a mapping is encountered with the a null key, the entire `representation` is processed using the given mapping. This provides support for mapping content that does not have an outer nesting attribute. + + Note that it is possible to map the same representation with multiple mappings, including a combination of a root key mapping and nested keypaths. + + ## Data Source + + The data source is used to instantiate new objects or find existing objects to be updated during the mapping process. The object set as the `mappingOperationDataSource` will be set as the `dataSource` for the `RKMappingOperation` objects created by the mapper. + + ## Target Object + + If a `targetObject` is configured on the mapper operation, all mapping work on the `representation` will target the specified object. For transient `NSObject` mappings, this ensures that the properties of an existing object are updated rather than an new object being created for the mapped representation. If an array of representations is being processed and a `targetObject` is provided, it must be a mutable collection object else an exception will be raised. + + ## Metadata Mapping + + The `RKMapperOperation` class provides support for metadata mapping provided to the operation via the `mappingMetadata` property. This dictionary is made available to all `RKMappingOperation` objects executed by the receiver to process the representation being mapped. In addition to any user supplied metadata, the mapper operation makes the following metadata key paths available for mapping: + + 1. `@metadata.mapping.rootKeyPath` - An object specifying the root key path at which the current representation is nested within the source representation. This will correspond to a key in the `mappingsDictionary` and is typically an `NSString`, but can be `[NSNull null]` if the representation being mapped is at the root. + 1. `@metadata.mapping.collectionIndex` - An `NSNumber` object specifying the index of the current object within a collection being mapped. This key is only available if the current representation exists within a collection. + + Please refer to the documentation accompanying `RKMappingOperation` for more details on metadata mapping. + + ## Core Data + + `RKMapperOperation` supports mapping to Core Data target entities. To do so, it must be configured with an `RKManagedObjectMappingOperationDataSource` object as the data source. + */ +@interface RKMapperOperation : NSOperation + +///-------------------------------------- +/// @name Initializing a Mapper Operation +///-------------------------------------- + +/** + Initializes the operation with a source object and a mappings dictionary. + + @param representation An `NSDictionary` or `NSArray` of `NSDictionary` object representations to be mapped into local domain objects. + @param mappingsDictionary An `NSDictionary` wherein the keys are mappable key paths in `object` and the values are `RKMapping` objects specifying how the representations at its key path are to be mapped. + @return The receiver, initialized with the given object and and dictionary of key paths to mappings. + */ +- (instancetype)initWithRepresentation:(id)representation mappingsDictionary:(NSDictionary *)mappingsDictionary NS_DESIGNATED_INITIALIZER; + +///------------------------------------------ +/// @name Accessing Mapping Result and Errors +///------------------------------------------ + +/** + The error, if any, that occurred during the mapping process. + */ +@property (nonatomic, strong, readonly) NSError *error; + +/** + The result of the mapping process. A `nil` value indicates that no mappable object representations were found and no mapping was performed. + */ +@property (nonatomic, strong, readonly) RKMappingResult *mappingResult; + +/** + Returns a dictionary containing information about the mappings applied during the execution of the operation. The keys of the dictionary are keyPaths into the `mappingResult` for values that were mapped and the values are the corresponding `RKPropertyMapping` objects used to perform the mapping. + */ +@property (nonatomic, readonly) NSDictionary *mappingInfo; + +///------------------------------------- +/// @name Managing Mapping Configuration +///------------------------------------- + +/** + The representation of one or more objects against which the mapping is performed. + + Either an `NSDictionary` or an `NSArray` of `NSDictionary` objects. + */ +@property (nonatomic, strong, readonly) id representation; + +/** + A dictionary of key paths to `RKMapping` objects specifying how object representations in the `representation` are to be mapped. + + Please see the above discussion for in-depth details about the mappings dictionary. + */ +@property (nonatomic, strong, readonly) NSDictionary *mappingsDictionary; + +/** + The target object of the mapper. When configured, all object mapping will target the specified object. + + Please see the above discussion for details about target objects. + */ +@property (nonatomic, weak) id targetObject; + +/** + The data source for the underlying `RKMappingOperation` objects that perform the mapping work configured by the mapper. + */ +@property (nonatomic, strong) id<RKMappingOperationDataSource> mappingOperationDataSource; + +/** + The delegate for the mapper operation. + */ +@property (nonatomic, weak) id<RKMapperOperationDelegate> delegate; + +/** + A dictionary of metadata that is available for mappping by any mapping operation started by the receiver. + */ +@property (nonatomic, copy) NSDictionary *metadata; + +///------------------------------ +/// @name Executing the Operation +///------------------------------ + +/** + Executes the mapper operation to completion. + + @param error A pointer to an `NSError` object to set in the event an error occurs during execution. + @return A Boolean value that indicates if the operation completed successfully. + */ +- (BOOL)execute:(NSError **)error; + +@end + +///-------------------------------- +/// @name Mapper Operation Delegate +///-------------------------------- + +/** + Objects wishing to act as the delegate for `RKMapperOperation` objects must adopt the `RKMapperOperationDelegate` protocol. The protocol provides a rich set of optional callback methods that provides insight into the lifecycle of a mapper operation. + */ +@protocol RKMapperOperationDelegate <NSObject> + +@optional + +///----------------------------- +/// @name Tracking Mapper Status +///----------------------------- + +/** + Tells the delegate that the mapper operation is about to start mapping. + + @param mapper The mapper operation that is about to start mapping. + */ +- (void)mapperWillStartMapping:(RKMapperOperation *)mapper; + +/** + Tells the delegate that the mapper has finished. + + @param mapper The mapper operation that has finished mapping. + */ +- (void)mapperDidFinishMapping:(RKMapperOperation *)mapper; + +/** + Tells the delegate that the mapper has been cancelled. + + @param mapper The mapper operation that was cancelled. + */ +- (void)mapperDidCancelMapping:(RKMapperOperation *)mapper; + +///------------------------------- +/// @name Key Path Search Messages +///------------------------------- + +/** + Tells the delegate that the mapper has found one or more mappable object representations at a key path specified in the `mappingsDictionary`. + + @param mapper The mapper operation performing the mapping. + @param dictionaryOrArrayOfDictionaries The `NSDictictionary` or `NSArray` of `NSDictionary` object representations that was found at the `keyPath`. + @param keyPath The key path that the representation was read from in the `representation`. If the `keyPath` was `[NSNull null]` in the `mappingsDictionary`, it will be given as `nil` to the delegate. + */ +- (void)mapper:(RKMapperOperation *)mapper didFindRepresentationOrArrayOfRepresentations:(id)dictionaryOrArrayOfDictionaries atKeyPath:(NSString *)keyPath; + +/** + Tells the delegate that the mapper failed to find any mappable object representations at a key path specified in the `mappingsDictionary`. + + @param mapper The mapper operation performing the mapping. + @param keyPath The key path that was searched for a mappable object representation. + */ +- (void)mapper:(RKMapperOperation *)mapper didNotFindRepresentationOrArrayOfRepresentationsAtKeyPath:(NSString *)keyPath; + +///---------------------------------------------- +/// @name Tracking Child Mapping Operation Status +///---------------------------------------------- + +/** + Tells the delegate that the mapper is about to start a mapping operation to map a representation found in the `representation`. + + @param mapper The mapper operation performing the mapping. + @param mappingOperation The mapping operation that is about to be started. + @param keyPath The key path that was mapped. A `nil` key path indicates that the mapping matched the entire `representation`. + */ +- (void)mapper:(RKMapperOperation *)mapper willStartMappingOperation:(RKMappingOperation *)mappingOperation forKeyPath:(NSString *)keyPath; + +/** + Tells the delegate that a mapping operation that was started by the mapper has finished executing. + + @param mapper The mapper operation performing the mapping. + @param mappingOperation The mapping operation that has finished. + @param keyPath The key path that was mapped. A `nil` key path indicates that the mapping matched the entire `representation`. + */ +- (void)mapper:(RKMapperOperation *)mapper didFinishMappingOperation:(RKMappingOperation *)mappingOperation forKeyPath:(NSString *)keyPath; + +/** + Tells the delegate that a mapping operation that was started by the mapper has failed with an error. + + @param mapper The mapper operation performing the mapping. + @param mappingOperation The mapping operation that has failed. + @param keyPath The key path that was mapped. A `nil` key path indicates that the mapping matched the entire `representation`. + @param error The error that occurred during the execution of the mapping operation. + */ +- (void)mapper:(RKMapperOperation *)mapper didFailMappingOperation:(RKMappingOperation *)mappingOperation forKeyPath:(NSString *)keyPath withError:(NSError *)error; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMapperOperation.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMapperOperation.m new file mode 100644 index 0000000..c58cebc --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMapperOperation.m @@ -0,0 +1,453 @@ +// +// RKMapperOperation.m +// RestKit +// +// Created by Blake Watters on 5/6/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKMapperOperation.h" +#import "RKMapperOperation_Private.h" +#import "RKObjectMapping.h" +#import "RKObjectMappingOperationDataSource.h" +#import "RKMappingErrors.h" +#import "RKDynamicMapping.h" +#import "RKLog.h" +#import "RKDictionaryUtilities.h" + +NSString * const RKMappingErrorKeyPathErrorKey = @"keyPath"; + +// Set Logging Component +#undef RKLogComponent +#define RKLogComponent RKlcl_cRestKitObjectMapping + +static NSString *RKDelegateKeyPathFromKeyPath(NSString *keyPath) +{ + return ([keyPath isEqual:[NSNull null]]) ? nil : keyPath; +} + + +static NSString *RKFailureReasonErrorStringForMappingNotFoundError(id representation, NSDictionary *mappingsDictionary) +{ + NSMutableString *failureReason = [NSMutableString string]; + [failureReason appendFormat:@"The mapping operation was unable to find any nested object representations at the key paths searched: %@", [[[mappingsDictionary allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] componentsJoinedByString:@", "]]; + if ([representation respondsToSelector:@selector(allKeys)]) { + [failureReason appendFormat:@"\nThe representation inputted to the mapper was found to contain nested object representations at the following key paths: %@", [[[representation allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] componentsJoinedByString:@", "]]; + } + [failureReason appendFormat:@"\nThis likely indicates that you have misconfigured the key paths for your mappings."]; + return failureReason; +} + +// Duplicating interface from `RKMappingOperation.m` +@interface RKMappingSourceObject : NSObject +- (instancetype)initWithObject:(id)object parentObject:(id)parentObject rootObject:(id)rootObject metadata:(NSArray *)metadata; +@end + +@interface RKMappingOperation (Private) +@property (nonatomic, readwrite, getter=isNewDestinationObject) BOOL newDestinationObject; +@end + +@interface RKMapperMetadata : NSObject +@property NSUInteger collectionIndex; +@property NSString *rootKeyPath; +@end + +@implementation RKMapperMetadata +- (id)valueForUndefinedKey:(NSString *)key { return nil; } +@end + +@interface RKMapperOperation () + +@property (nonatomic, strong, readwrite) NSError *error; +@property (nonatomic, strong, readwrite) RKMappingResult *mappingResult; +@property (nonatomic, strong) NSMutableArray *mappingErrors; +@property (nonatomic, strong) id representation; +@property (nonatomic, strong, readwrite) NSDictionary *mappingsDictionary; +@property (nonatomic, strong) NSMutableDictionary *mutableMappingInfo; +@end + +@implementation RKMapperOperation + +- (instancetype)init +{ + return [self initWithRepresentation:nil mappingsDictionary:nil]; +} + +- (instancetype)initWithRepresentation:(id)representation mappingsDictionary:(NSDictionary *)mappingsDictionary; +{ + self = [super init]; + if (self) { + self.representation = representation; + self.mappingsDictionary = mappingsDictionary; + self.mappingOperationDataSource = [RKObjectMappingOperationDataSource new]; + } + + return self; +} + +- (NSDictionary *)mappingInfo +{ + return self.mutableMappingInfo; +} + +#pragma mark - Errors + +- (NSArray *)errors +{ + return [NSArray arrayWithArray:self.mappingErrors]; +} + +- (void)addError:(NSError *)error +{ + NSAssert(error, @"Cannot add a nil error"); + [self.mappingErrors addObject:error]; +} + +- (void)addErrorWithCode:(RKMappingErrorCode)errorCode message:(NSString *)errorMessage keyPath:(NSString *)keyPath userInfo:(NSDictionary *)otherInfo +{ + NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys: + errorMessage, NSLocalizedDescriptionKey, + keyPath ? keyPath : [NSNull null], RKMappingErrorKeyPathErrorKey, + nil]; + [userInfo addEntriesFromDictionary:otherInfo]; + NSError *error = [NSError errorWithDomain:RKErrorDomain code:errorCode userInfo:userInfo]; + [self addError:error]; + self.error = error; +} + +- (void)addErrorForUnmappableKeyPath:(NSString *)keyPath +{ + NSString *errorMessage = [NSString stringWithFormat:@"Could not find an object mapping for keyPath: '%@'", keyPath]; + [self addErrorWithCode:RKMappingErrorNotFound message:errorMessage keyPath:keyPath userInfo:nil]; +} + +- (BOOL)isNullCollection:(id)object +{ + // The purpose of this method is to guard against the case where we perform valueForKeyPath: on an array + // and it returns NSNull for each element in the array. + + // We consider an empty array/dictionary mappable, but a collection that contains only NSNull + // values is unmappable + if ([object respondsToSelector:@selector(objectForKey:)]) { + return NO; + } + + if ([object respondsToSelector:@selector(countForObject:)] && [object count] > 0) { + if ([object countForObject:[NSNull null]] == [object count]) { + RKLogDebug(@"Found a collection containing only `NSNull` values, considering the collection unmappable..."); + return YES; + } + } + + return NO; +} + +#pragma mark - Mapping Primitives + +// Maps a singular object representation +- (id)mapRepresentation:(id)representation atKeyPath:(NSString *)keyPath usingMapping:(RKMapping *)mapping +{ + NSAssert([representation respondsToSelector:@selector(setValue:forKeyPath:)], @"Expected self.object to be KVC compliant"); + id destinationObject = nil; + BOOL isNewObject = NO; + + if (self.targetObject) { + destinationObject = self.targetObject; + RKObjectMapping *objectMapping = nil; + if ([mapping isKindOfClass:[RKDynamicMapping class]]) { + objectMapping = [(RKDynamicMapping *)mapping objectMappingForRepresentation:representation]; + } else if ([mapping isKindOfClass:[RKObjectMapping class]]) { + objectMapping = (RKObjectMapping *)mapping; + } else { + NSAssert(objectMapping, @"Encountered unknown mapping type '%@'", NSStringFromClass([mapping class])); + } + + if (NO == [[self.targetObject class] isSubclassOfClass:objectMapping.objectClass]) { + if ([_mappingsDictionary count] == 1) { + NSString *errorMessage = [NSString stringWithFormat: + @"Expected an object mapping for class of type '%@', provider returned one for '%@'", + NSStringFromClass([self.targetObject class]), NSStringFromClass(objectMapping.objectClass)]; + [self addErrorWithCode:RKMappingErrorTypeMismatch message:errorMessage keyPath:keyPath userInfo:nil]; + return nil; + } else { + // There is more than one mapping present. We are likely mapping secondary key paths to new objects + destinationObject = [self objectForRepresentation:representation withMapping:mapping]; + isNewObject = YES; + } + } + } else { + destinationObject = [self objectForRepresentation:representation withMapping:mapping]; + isNewObject = YES; + } + + if (mapping && destinationObject) { + NSArray *metadataList = [NSArray arrayWithObjects:@{ @"mapping": @{ @"rootKeyPath": keyPath } }, self.metadata, nil]; + BOOL success = [self mapRepresentation:representation toObject:destinationObject isNew:isNewObject atKeyPath:keyPath usingMapping:mapping metadataList:metadataList]; + if (success) { + return destinationObject; + } + } else { + // Attempted to map an object but couldn't find a mapping for the keyPath + [self addErrorForUnmappableKeyPath:keyPath]; + return nil; + } + + return nil; +} + +// Map a collection of object representations +- (NSArray *)mapRepresentations:(id)representations atKeyPath:(NSString *)keyPath usingMapping:(RKMapping *)mapping +{ + NSAssert(representations != nil, @"Cannot map without an collection of mappable objects"); + NSAssert(mapping != nil, @"Cannot map without a mapping to consult"); + + NSArray *objectsToMap = representations; + if (mapping.forceCollectionMapping) { + // If we have forced mapping of a dictionary, map each subdictionary + if ([representations isKindOfClass:[NSDictionary class]]) { + RKLogDebug(@"Collection mapping forced for NSDictionary, mapping each key/value independently..."); + objectsToMap = [NSMutableArray arrayWithCapacity:[representations count]]; + for (id key in representations) { + NSDictionary *dictionaryToMap = @{key: [representations valueForKey:key]}; + [(NSMutableArray *)objectsToMap addObject:dictionaryToMap]; + } + } else { + RKLogWarning(@"Collection mapping forced but representations is of type '%@' rather than NSDictionary", NSStringFromClass([representations class])); + } + } + + RKMapperMetadata *mappingData = [RKMapperMetadata new]; + mappingData.rootKeyPath = keyPath; + NSDictionary *metadata = @{ @"mapping": mappingData }; + NSArray *metadataList = [NSArray arrayWithObjects:metadata, self.metadata, nil]; + NSMutableArray *mappedObjects = [NSMutableArray arrayWithCapacity:[representations count]]; + [objectsToMap enumerateObjectsUsingBlock:^(id mappableObject, NSUInteger index, BOOL *stop) { + if (mappableObject == [NSNull null]) { return; } + + id destinationObject = [self objectForRepresentation:mappableObject withMapping:mapping]; + if (destinationObject) { + mappingData.collectionIndex = index; + BOOL success = [self mapRepresentation:mappableObject toObject:destinationObject isNew:YES atKeyPath:keyPath usingMapping:mapping metadataList:metadataList]; + if (success) [mappedObjects addObject:destinationObject]; + } + *stop = [self isCancelled]; + }]; + + return mappedObjects; +} + +// The workhorse of this entire process. Emits object loading operations +- (BOOL)mapRepresentation:(id)mappableObject toObject:(id)destinationObject isNew:(BOOL)newDestination atKeyPath:(NSString *)keyPath usingMapping:(RKMapping *)mapping metadataList:(NSArray *)metadataList +{ + NSAssert(destinationObject != nil, @"Cannot map without a target object to assign the results to"); + NSAssert(mappableObject != nil, @"Cannot map without a collection of attributes"); + NSAssert(mapping != nil, @"Cannot map without an mapping"); + + RKLogDebug(@"Asked to map source object %@ with mapping %@", mappableObject, mapping); + + RKMappingOperation *mappingOperation = [[RKMappingOperation alloc] initWithSourceObject:mappableObject destinationObject:destinationObject mapping:mapping metadataList:metadataList]; + mappingOperation.dataSource = self.mappingOperationDataSource; + mappingOperation.newDestinationObject = newDestination; + if ([self.delegate respondsToSelector:@selector(mapper:willStartMappingOperation:forKeyPath:)]) { + [self.delegate mapper:self willStartMappingOperation:mappingOperation forKeyPath:RKDelegateKeyPathFromKeyPath(keyPath)]; + } + [mappingOperation start]; + if (mappingOperation.error) { + if ([self.delegate respondsToSelector:@selector(mapper:didFailMappingOperation:forKeyPath:withError:)]) { + [self.delegate mapper:self didFailMappingOperation:mappingOperation forKeyPath:RKDelegateKeyPathFromKeyPath(keyPath) withError:mappingOperation.error]; + } + [self addError:mappingOperation.error]; + + return NO; + } else { + if ([self.delegate respondsToSelector:@selector(mapper:didFinishMappingOperation:forKeyPath:)]) { + [self.delegate mapper:self didFinishMappingOperation:mappingOperation forKeyPath:RKDelegateKeyPathFromKeyPath(keyPath)]; + } + + if (mappingOperation.mappingInfo) { + id infoKey = keyPath ?: [NSNull null]; + NSMutableArray *infoForKeyPath = (self.mutableMappingInfo)[infoKey]; + if (infoForKeyPath) { + [infoForKeyPath addObject:mappingOperation.mappingInfo]; + } else { + infoForKeyPath = [NSMutableArray arrayWithObject:mappingOperation.mappingInfo]; + [self.mutableMappingInfo setValue:infoForKeyPath forKey:infoKey]; + } + } + + return YES; + } +} + +- (id)objectForRepresentation:(id)representation withMapping:(RKMapping *)mapping +{ + NSAssert([mapping isKindOfClass:[RKMapping class]], @"Expected an RKMapping object"); + NSAssert(self.mappingOperationDataSource, @"Cannot find or instantiate objects without a data source"); + + RKObjectMapping *objectMapping = nil; + if ([mapping isKindOfClass:[RKDynamicMapping class]]) { + objectMapping = [(RKDynamicMapping *)mapping objectMappingForRepresentation:representation]; + if (! objectMapping) { + RKLogDebug(@"Mapping %@ declined mapping for representation %@: returned nil objectMapping", mapping, representation); + } + } else if ([mapping isKindOfClass:[RKObjectMapping class]]) { + objectMapping = (RKObjectMapping *)mapping; + } else { + NSAssert(objectMapping, @"Encountered unknown mapping type '%@'", NSStringFromClass([mapping class])); + } + + if (objectMapping) { + id object = nil; + if ([self.mappingOperationDataSource respondsToSelector:@selector(mappingOperation:targetObjectForMapping:inRelationship:)]) + { + object = [self.mappingOperationDataSource mappingOperation:nil targetObjectForMapping:objectMapping inRelationship:nil]; + } + if (object == nil) + { + // Ensure that we are working with a dictionary when we call down into the data source + NSDictionary *representationDictionary = [representation isKindOfClass:[NSDictionary class]] ? representation : @{ [NSNull null]: representation }; + id mappingSourceObject = [[RKMappingSourceObject alloc] initWithObject:representationDictionary parentObject:nil rootObject:representation metadata:self.metadata? @[self.metadata] : nil]; + object = [self.mappingOperationDataSource mappingOperation:nil targetObjectForRepresentation:mappingSourceObject withMapping:objectMapping inRelationship:nil]; + } + return object; + } + + return nil; +} + +- (id)mapRepresentationOrRepresentations:(id)mappableValue atKeyPath:(NSString *)keyPath usingMapping:(RKMapping *)mapping +{ + id mappingResult; + if (mapping.forceCollectionMapping || [mappableValue isKindOfClass:[NSArray class]] || [mappableValue isKindOfClass:[NSSet class]]) { + RKLogDebug(@"Found mappable collection at keyPath '%@': %@", keyPath, mappableValue); + mappingResult = [self mapRepresentations:mappableValue atKeyPath:keyPath usingMapping:mapping]; + } else { + RKLogDebug(@"Found mappable data at keyPath '%@': %@", keyPath, mappableValue); + mappingResult = [self mapRepresentation:mappableValue atKeyPath:keyPath usingMapping:mapping]; + } + + return mappingResult; +} + +#pragma mark - + +- (NSMutableDictionary *)mapSourceRepresentationWithMappingsDictionary:(NSDictionary *)mappingsByKeyPath +{ + BOOL foundMappable = NO; + NSMutableDictionary *results = [NSMutableDictionary dictionary]; + for (NSString *keyPath in mappingsByKeyPath) { + if ([self isCancelled]) return nil; + + @autoreleasepool { + id mappingResult = nil; + id nestedRepresentation = nil; + + RKLogTrace(@"Examining keyPath '%@' for mappable content...", keyPath); + + if ([keyPath isEqual:[NSNull null]] || [keyPath isEqualToString:@""]) { + nestedRepresentation = self.representation; + } else { + nestedRepresentation = [self.representation valueForKeyPath:keyPath]; + } + + // Not found... + if (nestedRepresentation == nil || nestedRepresentation == [NSNull null] || [self isNullCollection:nestedRepresentation]) { + RKLogDebug(@"Found unmappable value at keyPath: %@", keyPath); + + if ([self.delegate respondsToSelector:@selector(mapper:didNotFindRepresentationOrArrayOfRepresentationsAtKeyPath:)]) { + [self.delegate mapper:self didNotFindRepresentationOrArrayOfRepresentationsAtKeyPath:RKDelegateKeyPathFromKeyPath(keyPath)]; + } + + continue; + } + + // Found something to map + foundMappable = YES; + RKMapping *mapping = mappingsByKeyPath[keyPath]; + if ([self.delegate respondsToSelector:@selector(mapper:didFindRepresentationOrArrayOfRepresentations:atKeyPath:)]) { + [self.delegate mapper:self didFindRepresentationOrArrayOfRepresentations:nestedRepresentation atKeyPath:RKDelegateKeyPathFromKeyPath(keyPath)]; + } + + mappingResult = [self mapRepresentationOrRepresentations:nestedRepresentation atKeyPath:keyPath usingMapping:mapping]; + + if (mappingResult) { + results[keyPath] = mappingResult; + } + } + } + + if (NO == foundMappable) return nil; + return results; +} + +- (void)cancel +{ + [super cancel]; + RKLogDebug(@"%@:%p received `cancel` message: cancelling mapping...", [self class], self); + + if ([self.delegate respondsToSelector:@selector(mapperDidCancelMapping:)]) { + [self.delegate mapperDidCancelMapping:self]; + } +} + +- (void)main +{ + NSAssert(self.representation != nil, @"Cannot perform object mapping without a source object to map from"); + NSAssert(self.mappingsDictionary, @"Cannot perform object mapping without a dictionary of mappings"); + + if ([self isCancelled]) return; + self.mutableMappingInfo = [NSMutableDictionary dictionary]; + self.mappingErrors = [NSMutableArray new]; + + RKLogDebug(@"Executing mapping operation for representation: %@\n and targetObject: %@", self.representation, self.targetObject); + + if ([self.delegate respondsToSelector:@selector(mapperWillStartMapping:)]) { + [self.delegate mapperWillStartMapping:self]; + } + + // Perform the mapping + BOOL foundMappable = NO; + NSMutableDictionary *results = [self mapSourceRepresentationWithMappingsDictionary:self.mappingsDictionary]; + if ([self isCancelled]) return; + foundMappable = (results != nil); + + // If we found nothing eligible for mapping in the content, add an unmappable key path error and fail mapping + // If the content is empty, we don't consider it an error + BOOL isEmpty = [self.representation respondsToSelector:@selector(count)] && ([self.representation count] == 0); + if (foundMappable == NO && !isEmpty) { + NSMutableDictionary *userInfo = [@{ NSLocalizedDescriptionKey: NSLocalizedString(@"No mappable object representations were found at the key paths searched.", nil), + NSLocalizedFailureReasonErrorKey: RKFailureReasonErrorStringForMappingNotFoundError(self.representation, self.mappingsDictionary), + RKMappingErrorKeyPathErrorKey: [NSNull null], + RKDetailedErrorsKey: self.errors} mutableCopy]; + NSError *compositeError = [[NSError alloc] initWithDomain:RKErrorDomain code:RKMappingErrorNotFound userInfo:userInfo]; + self.error = compositeError; + } else { + if (results) self.mappingResult = [[RKMappingResult alloc] initWithDictionary:results]; + } + + RKLogDebug(@"Finished performing object mapping. Results: %@", results); + if ([self.delegate respondsToSelector:@selector(mapperDidFinishMapping:)]) { + [self.delegate mapperDidFinishMapping:self]; + } +} + +- (BOOL)execute:(NSError **)error +{ + [self start]; + if (error) *error = self.error; + return self.mappingResult != nil; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMapperOperation_Private.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMapperOperation_Private.h new file mode 100644 index 0000000..0804dcf --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMapperOperation_Private.h @@ -0,0 +1,28 @@ +// +// RKMapperOperation_Private.h +// RestKit +// +// Created by Blake Watters on 5/9/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +@interface RKMapperOperation (Private) + +- (id)mapRepresentation:(id)mappableObject atKeyPath:(NSString *)keyPath usingMapping:(RKMapping *)mapping; +- (NSArray *)mapRepresentations:(NSArray *)mappableObjects atKeyPath:(NSString *)keyPath usingMapping:(RKMapping *)mapping; +- (BOOL)mapRepresentation:(id)mappableObject toObject:(id)destinationObject isNew:(BOOL)isNew atKeyPath:(NSString *)keyPath usingMapping:(RKMapping *)mapping metadataList:(NSArray *)metadata; +- (id)objectForRepresentation:(id)representation withMapping:(RKMapping *)mapping; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMapping.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMapping.h new file mode 100644 index 0000000..b3a969d --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMapping.h @@ -0,0 +1,62 @@ +// +// RKMapping.h +// RestKit +// +// Created by Blake Watters on 7/31/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <Foundation/Foundation.h> + +/** + `RKMapping` is an abstract class for objects defining RestKit object mappings. Its interface is common to all object mapping classes, including its concrete subclasses `RKObjectMapping` and `RKDynamicMapping`. + */ +@interface RKMapping : NSObject + +///--------------------------------- +/// @name Forcing Collection Mapping +///--------------------------------- + +/** + Forces the mapper to treat the mapped keyPath as a collection even if it does not return an array or a set of objects. This permits mapping where a dictionary identifies a collection of objects. + + When enabled, each key/value pair in the resolved dictionary will be mapped as a separate entity. This is useful when you have a JSON structure similar to: + + { "users": { + "blake": { "id": 1234, "email": "blake@restkit.org" }, + "rachit": { "id": 5678, "email": "rachit@restkit.org" } + } + } + + By enabling `forceCollectionMapping`, RestKit will map "blake" => attributes and "rachit" => attributes as independent objects. This can be combined with `mapKeyOfNestedDictionaryToAttribute:` to properly map these sorts of structures. + + @default `NO` + @see `mapKeyOfNestedDictionaryToAttribute` + */ +@property (nonatomic, assign) BOOL forceCollectionMapping; + + +///------------------------- +/// @name Comparing Mappings +///------------------------- + +/** + Returns `YES` if the receiver and the specified mapping are considered equivalent. + + **NOTE**: Must be implemented in subclass. + */ +- (BOOL)isEqualToMapping:(RKMapping *)otherMapping; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMapping.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMapping.m new file mode 100644 index 0000000..9f60f3b --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMapping.m @@ -0,0 +1,22 @@ +// +// RKMapping.m +// RestKit +// +// Created by Blake Watters on 2/15/12. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// + +#import "RKMapping.h" + +@implementation RKMapping + +@synthesize forceCollectionMapping; + +- (BOOL)isEqualToMapping:(RKMapping *)otherMapping +{ + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)] + userInfo:nil]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMappingErrors.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMappingErrors.h new file mode 100644 index 0000000..4636bcb --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMappingErrors.h @@ -0,0 +1,36 @@ +// +// RKMappingErrors.h +// RestKit +// +// Created by Blake Watters on 5/31/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKErrors.h" + +typedef NS_ENUM(NSInteger, RKMappingErrorCode) { + RKMappingErrorNotFound = 1001, // No mapping found + RKMappingErrorTypeMismatch = 1002, // Target class and object mapping are in disagreement + RKMappingErrorUnmappableRepresentation = 1003, // No values were found at the key paths of any attribute or relationship mappings in the given representation + RKMappingErrorFromMappingResult = 1004, // The error was returned from the mapping result + RKMappingErrorValidationFailure = 1005, // Generic error code for use when constructing validation errors + RKMappingErrorUnableToDetermineMapping = 1006, // The mapping operation was unable to obtain a concrete object mapping from a given dynamic mapping + RKMappingErrorNilDestinationObject = 1007, // The mapping operation failed due to a nil destination object. + RKMappingErrorNilManagedObjectCache = 1008, // A managed object cache is required to satisfy the mapping, but none was given. + RKMappingErrorMappingDeclined = 1009, // Mapping was declined by a callback. + RKMappingErrorInvalidAssignmentPolicy = 1010, // The assignment policy for the relationship is invalid. +}; + +extern NSString * const RKMappingErrorKeyPathErrorKey; // The key path the error is associated with diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMappingOperation.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMappingOperation.h new file mode 100644 index 0000000..1ca10e3 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMappingOperation.h @@ -0,0 +1,394 @@ +// +// RKMappingOperation.h +// RestKit +// +// Created by Blake Watters on 4/30/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#if __has_include("CoreData.h") +#import <CoreData/CoreData.h> +#endif + +#import "RKObjectMapping.h" +#import "RKAttributeMapping.h" + +@class RKMappingOperation, RKDynamicMapping, RKConnectionDescription, RKMappingInfo; +@protocol RKMappingOperationDataSource; + +/** + Objects acting as the delegate for `RKMappingOperation` objects must adopt the `RKMappingOperationDelegate` protocol. These methods enable the delegate to be notified of events such as the application of attribute and relationship mappings during a mapping operation. + */ +@protocol RKMappingOperationDelegate <NSObject> + +///--------------------------------------- +/// @name Tracking Property Mapping Events +///--------------------------------------- + +@optional + +/** + Tells the delegate that an attribute or relationship mapping was found for a given key path within the data being mapped. + + @param operation The object mapping operation being performed. + @param keyPath The key path in the source object for which the mapping is to be applied. + @param value The value that was found at the given key path in the source object representation. + @param propertyMapping The `RKAttributeMapping` or `RKRelationshipMapping` for which the mappable value was found within the source object representation. + */ +- (void)mappingOperation:(RKMappingOperation *)operation didFindValue:(id)value forKeyPath:(NSString *)keyPath mapping:(RKPropertyMapping *)propertyMapping; + +/** + Tells the delegate that no attribute or relationships mapping was found for a given key path within the data being mapped. + + @param operation The object mapping operation being performed. + @param keyPath The key path in the source object for which no mappable value was found. + @param propertyMapping The `RKAttributeMapping` or `RKRelationshipMapping` for which no mappable value could be found within the source object representation. + */ +- (void)mappingOperation:(RKMappingOperation *)operation didNotFindValueForKeyPath:(NSString *)keyPath mapping:(RKPropertyMapping *)propertyMapping; + +/** + Asks the delegate if the mapping operation should set a value for a given key path with an attribute or relationship mapping. This method is invoked before the value is set. If the delegate does not implement this method, then the mapping operation will determine if the value should be set by comparing the current property value with the new property value. + + @param operation The object mapping operation being performed. + @param value A new value that was set on the destination object. + @param keyPath The key path in the destination object for which a new value has been set. + @param propertyMapping The `RKAttributeMapping` or `RKRelationshipMapping` found for the key path. + @return `YES` if the operation should set the proposed value for the key path, else `NO`. + */ +- (BOOL)mappingOperation:(RKMappingOperation *)operation shouldSetValue:(id)value forKeyPath:(NSString *)keyPath usingMapping:(RKPropertyMapping *)propertyMapping; + +/** + Tells the delegate that the mapping operation has set a value for a given key path with an attribute or relationship mapping. + + @param operation The object mapping operation being performed. + @param value A new value that was set on the destination object. + @param keyPath The key path in the destination object for which a new value has been set. + @param propertyMapping The `RKAttributeMapping` or `RKRelationshipMapping` found for the key path. + */ +- (void)mappingOperation:(RKMappingOperation *)operation didSetValue:(id)value forKeyPath:(NSString *)keyPath usingMapping:(RKPropertyMapping *)propertyMapping; + +/** + Tells the delegate that the mapping operation has declined to set a value for a given key path because the value has not changed. + + @param operation The object mapping operation being performed. + @param value A unchanged value for the key path in the destination object. + @param keyPath The key path in the destination object for which a unchanged value was not set. + @param propertyMapping The `RKAttributeMapping` or `RKRelationshipMapping` found for the key path. + */ +- (void)mappingOperation:(RKMappingOperation *)operation didNotSetUnchangedValue:(id)value forKeyPath:(NSString *)keyPath usingMapping:(RKPropertyMapping *)propertyMapping; + +/** + Tells the delegate that the mapping operation has failed due to an error. + + @param operation The object mapping operation that has failed. + @param error An error object indicating the reason for the failure. + */ +- (void)mappingOperation:(RKMappingOperation *)operation didFailWithError:(NSError *)error; + +///----------------------------------------- +/// @name Tracking Dynamic Mapping Selection +///----------------------------------------- + +/** + Tells the delegate that the mapping operation has selected a concrete object mapping with which to map the source object. + + Only sent if the receiver was initialized with an instance of `RKDynamicMapping` as the mapping. + + @param operation The mapping operation. + @param objectMapping The concrete object mapping with which to perform the mapping. + @param dynamicMapping The dynamic source mapping from which the object mapping was determined. + */ +- (void)mappingOperation:(RKMappingOperation *)operation didSelectObjectMapping:(RKObjectMapping *)objectMapping forDynamicMapping:(RKDynamicMapping *)dynamicMapping; + +#if __has_include("CoreData.h") + +///---------------------------------------- +/// @name Tracking Relationship Connections +///---------------------------------------- + +/** + Tells the delegate that the mapping operation has connected a relationship. + + Only sent when mapping an `RKEntityMapping` object that contains connection mappings. + + @param operation The mapping operation. + @param relationship The relationship that was connected. + @param value The value that was connected to the relationship + @param connection The connection object describing how the relationship was to be connected. + */ +- (void)mappingOperation:(RKMappingOperation *)operation didConnectRelationship:(NSRelationshipDescription *)relationship toValue:(id)value usingConnection:(RKConnectionDescription *)connection; + +/** + Tells the delegate that the mapping operation failed to connect a relationship. + + Only sent when mapping an `RKEntityMapping` object that contains connection mappings. + + @param operation The mapping operation. + @param relationship The relationship that was connected. + @param connection The connection object describing how the relationship was to be connected. + */ +- (void)mappingOperation:(RKMappingOperation *)operation didFailToConnectRelationship:(NSRelationshipDescription *)relationship usingConnection:(RKConnectionDescription *)connection; + +#endif + +@end + +/** + Instances of `RKMappingOperation` perform transformation between object representations according to the rules expressed in `RKObjectMapping` objects. Mapping operations provide the foundation for the RestKit object mapping engine and perform the work of inspecting the attributes and relationships of a source object and determining how to map them into new representations on a destination object. + + ## Metadata Mapping + + The mapping operation provides support for mapping for a dictionary of metadata in addition to the source object. This metadata is made available by mapping key paths nested under a specially designated parent key that cannot exist in a source representation. By convention, metadata is typically nested under sub keys to effectively namespace usage between components. The object mapping engine itself reserves the 'mapping' key for its usage. Metadata is passed down through a hierarchy of mapping operations (i.e. as relationships are traversed), making a common set of ancillary information available for mapping for by any operation executed. + + To understand how metadata works, consider the following example: + + @interface RKMetadataExample : NSObject + @property (nonatomic, copy) NSString *name; + @property (nonatomic, copy) NSURL *URL; + @property (nonatomic, copy) NSDate *mappedAt; + @end + + RKMetadataExample *example = [RKMetadataExample new]; + NSDictionary *representation = @{ @"name": @"Blake Watters" }; + NSDictionary *metadata = @{ @"URL": [NSURL URLWithString:@"http://restkit.org"] }; + + RKObjectMapping *objectMapping = [RKObjectMapping mappingForClass:[RKMetadataExample class]]; + [objectMapping addAttributeMappingsFromDictionary:@{ @"name": @"name", @"@metadata.URL": @"URL" }]; + + RKMappingOperation *mappingOperation = [[RKMappingOperation alloc] initWithSourceObject:representation destinationObject:example mapping:objectMapping]; + mappingOperation.metadata = metadata; + + NSError *error = nil; + BOOL success = [mappingOperation execute:&error]; + + Note the use of the special key path `@"@metadata.URL"`. The `@metadata` prefix indicates that the property is to be mapped from the metadata dictionary instead of from the source object representation. If any relationships were mapped, it would have access to this same metadata information as well. + + In addition to any metadata provided to the mapping operation via the `metadata` property, the operation itself makes the following metadata key paths available for mapping: + + 1. `@metadata.mapping.collectionIndex` - An `NSNumber` object specifying the index of the current object within a collection being mapped. This key is only available if the current representation exists within a collection. + 1. `@metadata.mapping.parentObject` - The direct parent object of the object that is currently being mapped. This key is only available for objects that are mapped as relationships of a parent object. + + ## Traversing the Representation Hierarchy + + In certain mapping scenarios it can become desirable to access ancestors of the current source object. For example, consider the following example JSON: + + { + "user": { + "id": 1, + "name": "Blake Watters", + "preferences": [ + { + { + "name": "push_notifications_enabled", + "value": true, + }, + { + "name": "subscribed_to_mailing_list", + "value": false + } + } + ] + } + } + + And it's corresponding model: + + @interface RKPreferenceExample : NSObject + @property (nonatomic, strong) NSNumber *userID; + @property (nonatomic, copy) NSString *name; + @property (nonatomic, strong) id value; + @end + + Notice that `userID` is a field that we wish to model as part of our local `RKPreferenceExample` class, but its not available within the `@"preferences"` key path that our + mapping will target. In this case we'd up like to reach "up" in the parsed JSON hierarchy to access our parent node, as demonstrated in the following mapping: + + RKObjectMapping *objectMapping = [RKObjectMapping mappingForClass:[RKPreferenceExample class]]; + [objectMapping addAttributeMappingsFromDictionary:@{ @"name": @"name", @"value": @"value", @"@parent.id": @"userID" }]; + + Note the use of the `@parent` key in the final attribute mapping: this pseudo-key always points to the direct parent node of the representation being mapped (or `nil` if there is none). Parent access can be chained to traverse upward all the way to the root node of the representation. + + ### Representation Traversal Keys + + There are currently two keys provided for traversing the representation hierarchy: + + 1. `@"root"` - Returns the root node of the representation being mapped. When a large JSON document is being mapped by an instance of `RKMapperOperation` this will point to the parsed JSON document that was used to initialize the operation. + 1. `@"parent"` - Returns the direct parent node of the `sourceObject` being mapped or `nil` if the `sourceObject` is itself a root node. + */ +@interface RKMappingOperation : NSObject + +///--------------------------------------- +/// @name Initializing a Mapping Operation +///--------------------------------------- + +/** + Initializes the receiver with a source object, a destination object and an object mapping with which to perform an object mapping. + + @param sourceObject The source object to be mapped. Cannot be `nil`. + @param destinationObject The destination object the results are to be mapped onto. May be `nil`, in which case a new object target object will be obtained from the `dataSource`. + @param objectOrDynamicMapping An instance of `RKObjectMapping` or `RKDynamicMapping` defining how the mapping is to be performed. + @return The receiver, initialized with a source object, a destination object, and a mapping. + */ +- (instancetype)initWithSourceObject:(id)sourceObject destinationObject:(id)destinationObject mapping:(RKMapping *)objectOrDynamicMapping; + +/** + Initializes the receiver with a source object, a destination object and an object mapping with which to perform an object mapping, and metadata information to be made available to the mapping. + + @param sourceObject The source object to be mapped. Cannot be `nil`. + @param destinationObject The destination object the results are to be mapped onto. May be `nil`, in which case a new object target object will be obtained from the `dataSource`. + @param objectOrDynamicMapping An instance of `RKObjectMapping` or `RKDynamicMapping` defining how the mapping is to be performed. + @param metadataList A list of objects (usually dictionaries) which provide metadata to the operation, available via the @metadata key in mapping paths. Each object should respond to -valueForKeyPath:, and return nil if the requested key path is not represented in the object (in which case the following object in the list will be consulted). + @return The receiver, initialized with a source object, a destination object, and a mapping. + */ +- (instancetype)initWithSourceObject:(id)sourceObject destinationObject:(id)destinationObject mapping:(RKMapping *)objectOrDynamicMapping metadataList:(NSArray *)metadataList; + +///-------------------------------------- +/// @name Accessing Mapping Configuration +///-------------------------------------- + +/** + A dictionary of mappable elements containing simple values or nested object structures. + */ +@property (nonatomic, strong, readonly) id sourceObject; + +/** + The target object for this operation. Mappable values in the source object will be applied to the destination object using key-value coding. + + If initialized with a `nil` destination object, the mapping operation will attempt to find or create a destination object via the data source and will populate the value of the `destinationObject` property. + */ +@property (nonatomic, strong, readonly) id destinationObject; + +/** + Property which is `YES` when the destinationObject was provided from the data source, and `NO` when the destination object was provided externally to the operation. + */ +@property (nonatomic, readonly, getter=isNewDestinationObject) BOOL newDestinationObject; + +/** + The mapping defining how values contained in the source object should be transformed to the destination object via key-value coding. + + Will either be an instance of `RKObjectMapping` or `RKDynamicMapping`. + */ +@property (nonatomic, strong, readonly) RKMapping *mapping; + +/** + The concrete object mapping for the operation. + + If the value of `mapping` is an `RKObjectMapping`, returns the same value as `mapping`. If `mapping` is an `RKDynamicMapping`, then returns the concrete `RKObjectMapping` object selected for mapping `sourceObject`. + */ +@property (nonatomic, strong, readonly) RKObjectMapping *objectMapping; + +/** + A list of metadata objects available for mapping in addition to the source object. + */ +@property (nonatomic, strong, readonly) NSArray *metadataList; + +///------------------------------------------- +/// @name Configuring Delegate and Data Source +///------------------------------------------- + +/** + The delegate to inform of interesting events during the mapping operation lifecycle. + */ +@property (nonatomic, weak) id<RKMappingOperationDelegate> delegate; + +/** + The data source is responsible for providing the mapping operation with an appropriate target object for mapping when the `destinationObject` is `nil`. + + @see `RKMappingOperationDataSource` + */ +@property (nonatomic, weak) id<RKMappingOperationDataSource> dataSource; + +///-------------------------------- +/// @name Accessing Mapping Details +///-------------------------------- + +/** + The error, if any, that occurred during the execution of the mapping operation. + */ +@property (nonatomic, strong, readonly) NSError *error; + +/** + Returns a dictionary containing information about the mappings applied during the execution of the operation. The keys of the dictionary are key paths into the `destinationObject` for values that were mapped and the values are instances of `RKMappingDetails` that specify the object mapping and property mappings that were applied. + + Mapping info is aggregated for all child mapping operations executed for relationships. + */ +@property (nonatomic, readonly) RKMappingInfo *mappingInfo; + +/** + Property to indicate whether this operation has been cancelled or not. It will be `NO` until `-cancel` is called, after which it will return `YES`. + */ +@property (nonatomic, readonly, getter=isCancelled) BOOL cancelled; + +/** + Cancels the operation, by setting the `cancelled` property to `YES`. Various steps of the process check the `cancelled` property and will abort when it gets set. + */ +- (void)cancel; + +///------------------------- +/// @name Performing Mapping +///------------------------- + +/** + Process all mappable values from the mappable dictionary and assign them to the target object according to the rules expressed in the object mapping definition. The error properties need to be checked to see if the operation was successful. + */ +- (void)start; + +/** + Process all mappable values from the mappable dictionary and assign them to the target object according to the rules expressed in the object mapping definition. + + @param error A pointer to an `NSError` reference to capture any error that occurs during the mapping. May be `nil`. + @return A Boolean value indicating if the mapping operation was successful. + */ +- (BOOL)performMapping:(NSError **)error; + +@end + +/** + Specifies the concrete object mapping and collection of property mappings that were applied for a given key path during the execution of an `RKMappingOperation`. + */ +@interface RKMappingInfo : NSObject + +/** + The mapping that was applied. + */ +@property (nonatomic, strong, readonly) RKObjectMapping *objectMapping; + +/** + The dynamic mapping, if any, that was used to perform the mapping. + */ +@property (nonatomic, strong, readonly) RKDynamicMapping *dynamicMapping; + +/** + The set of property mappings that were applied from the mapping. An empty set indicates that the mapping matched the representation, but all values were unchanged and thus no properties were set. + */ +@property (nonatomic, readonly) NSSet *propertyMappings; + +/** + A dictionary whose keys are the destination key path for a mapped relationship and the value is an array of `RKMappingInfo` objects specifying the mapping details for each item within the collection. + */ +@property (nonatomic, readonly) NSDictionary *relationshipMappingInfo; + +///-------------------------------------- +/// @name Accessing Property by Subscript +///-------------------------------------- + +/** + Retrieves the property mapping with the specified destination key path. + + @param key An `NSString` object specifying the destination key path for the property that is to be retrieved. + @return The `RKPropertyMapping` with the specified destination key path or `nil` if none was found. + */ +- (id)objectForKeyedSubscript:(id)key; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMappingOperation.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMappingOperation.m new file mode 100644 index 0000000..e2a3754 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMappingOperation.m @@ -0,0 +1,1294 @@ +// +// RKMappingOperation.m +// RestKit +// +// Created by Blake Watters on 4/30/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <objc/runtime.h> +#import "RKMappingOperation.h" +#import "RKMappingErrors.h" +#import "RKPropertyInspector.h" +#import "RKAttributeMapping.h" +#import "RKRelationshipMapping.h" +#import "RKErrors.h" +#import "RKLog.h" +#import "RKMappingOperationDataSource.h" +#import "RKObjectMappingOperationDataSource.h" +#import "RKDynamicMapping.h" +#import "RKObjectUtilities.h" +#import "RKValueTransformers.h" +#import "RKDictionaryUtilities.h" + +// Set Logging Component +#undef RKLogComponent +#define RKLogComponent RKlcl_cRestKitObjectMapping + +#pragma mark - Mapping utilities + +extern NSString * const RKObjectMappingNestingAttributeKeyName; + +/** + This function ensures that attribute mappings apply cleanly to an `NSMutableDictionary` target class to support mapping to nested keyPaths. See issue #882 + */ +static void RKSetIntermediateDictionaryValuesOnObjectForKeyPath(id object, NSString *keyPath) +{ + if (! [object isKindOfClass:[NSMutableDictionary class]]) return; + NSArray *keyPathComponents = [keyPath componentsSeparatedByString:@"."]; + if ([keyPathComponents count] > 1) { + for (NSUInteger index = 0; index < [keyPathComponents count] - 1; index++) { + NSString *intermediateKeyPath = [[keyPathComponents subarrayWithRange:NSMakeRange(0, index + 1)] componentsJoinedByString:@"."]; + if (! [object valueForKeyPath:intermediateKeyPath]) { + [object setValue:[NSMutableDictionary dictionary] forKeyPath:intermediateKeyPath]; + } + } + } +} + +static BOOL RKIsManagedObject(id object) +{ + Class managedObjectClass = NSClassFromString(@"NSManagedObject"); + return managedObjectClass && [object isKindOfClass:managedObjectClass]; +} + +// Returns the appropriate value for `nil` value of a primitive type +static id RKPrimitiveValueForNilValueOfClass(Class keyValueCodingClass) +{ + if ([keyValueCodingClass isSubclassOfClass:[NSNumber class]]) { + return @0; + } else { + return nil; + } +} + +// Key comes from: nestedAttributeSubstitutionKey AND nestedAttributeSubstitutionValue; +NSArray *RKApplyNestingAttributeValueToMappings(NSString *attributeName, id value, NSArray *propertyMappings); +NSArray *RKApplyNestingAttributeValueToMappings(NSString *attributeName, id value, NSArray *propertyMappings) +{ + if (!attributeName) return propertyMappings; + + NSString *searchString = [NSString stringWithFormat:@"{%@}", attributeName]; + NSString *replacementString = [NSString stringWithFormat:@"%@", value]; + NSMutableArray *nestedMappings = [NSMutableArray arrayWithCapacity:[propertyMappings count]]; + for (RKPropertyMapping *propertyMapping in propertyMappings) { + NSString *sourceKeyPath = [propertyMapping.sourceKeyPath stringByReplacingOccurrencesOfString:searchString withString:replacementString]; + NSString *destinationKeyPath = [propertyMapping.destinationKeyPath stringByReplacingOccurrencesOfString:searchString withString:replacementString]; + RKPropertyMapping *nestedPropertyMapping = nil; + if ([propertyMapping isKindOfClass:[RKAttributeMapping class]]) { + nestedPropertyMapping = [RKAttributeMapping attributeMappingFromKeyPath:sourceKeyPath toKeyPath:destinationKeyPath]; + } else if ([propertyMapping isKindOfClass:[RKRelationshipMapping class]]) { + nestedPropertyMapping = [RKRelationshipMapping relationshipMappingFromKeyPath:sourceKeyPath + toKeyPath:destinationKeyPath + withMapping:[(RKRelationshipMapping *)propertyMapping mapping]]; + } + nestedPropertyMapping.propertyValueClass = propertyMapping.propertyValueClass; + nestedPropertyMapping.valueTransformer = propertyMapping.valueTransformer; + if (nestedPropertyMapping) [nestedMappings addObject:nestedPropertyMapping]; + } + + return nestedMappings; +} + +// Returns YES if there is a value present for at least one key path in the given collection +static BOOL RKObjectContainsValueForMappings(id representation, NSArray *propertyMappings) +{ + for (RKPropertyMapping *mapping in propertyMappings) { + NSString *keyPath = mapping.sourceKeyPath; + if (keyPath && [representation valueForKeyPath:keyPath]) return YES; + } + return NO; +} + +#pragma mark - Metadata utilities + +static NSString *const RKMetadataKey = @"@metadata"; +static NSString *const RKMetadataKeyPathPrefix = @"@metadata."; +static NSString *const RKParentKey = @"@parent"; +static NSString *const RKParentKeyPathPrefix = @"@parent."; +static NSString *const RKRootKey = @"@root"; +static NSString *const RKRootKeyPathPrefix = @"@root."; +static NSString *const RKSelfKey = @"self"; +static NSString *const RKSelfKeyPathPrefix = @"self."; + +/** + Inserts up to two objects a the start of the metadata list. metadata1 will be at the front if both are provided. + */ +static NSArray *RKInsertInMetadataList(NSArray *list, id metadata1, id metadata2) +{ + if (metadata1 == nil && metadata2 == nil) + return list; + NSMutableArray *newArray = [[NSMutableArray alloc] initWithArray:list]; + if (metadata2) + [newArray insertObject:metadata2 atIndex:0]; + if (metadata1) + [newArray insertObject:metadata1 atIndex:0]; + return newArray; +} + +@interface RKMappingSourceObject : NSObject +- (instancetype)initWithObject:(id)object parentObject:(id)parentObject rootObject:(id)rootObject metadata:(NSArray *)metadata; +- (id)metadataValueForKey:(NSString *)key; +- (id)metadataValueForKeyPath:(NSString *)keyPath; +@end + +/** + Class used in the single case of RKMappingSourceObject needing to return a single object + for the "@metadata" key, which a special implementation of -valueForKeyPath: + to iterate over the list of metadata dictionaries (which RKMappingSourceObject usually does). + This usually only happens from the parentObjectForRelationshipMapping: implementation, but + in case it does this class provides the implementation. + */ +@interface RKMetadataWrapper : NSObject +- (instancetype)initWithMappingSource:(RKMappingSourceObject *)source NS_DESIGNATED_INITIALIZER; +@property (nonatomic, strong) RKMappingSourceObject *mappingSource; +@end + +@implementation RKMetadataWrapper + +- (instancetype)init +{ + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"-init is not a valid initializer for the class %@, use designated initilizer -initWithMappingSource:", NSStringFromClass([self class])] + userInfo:nil]; + return [self init]; +} + +- (instancetype)initWithMappingSource:(RKMappingSourceObject *)source { + if (self = [super init]) { + self.mappingSource = source; + } + return self; +} + +- (id)valueForKey:(NSString *)key +{ + return [self.mappingSource metadataValueForKey:key]; +} +- (id)valueForKeyPath:(NSString *)keyPath +{ + return [self.mappingSource metadataValueForKeyPath:keyPath]; +} +@end + +/** + Class meant to represent parts of the "mapping" sub-dictionary of the "@metadata" keys, but + being more efficient to create than actual NSDictionary instances. We can add any object properties + to this class, and if non-nil that value will be used, otherwise it is a passthrough. + */ +@interface RKMappingMetadata : NSObject +@property (nonatomic) BOOL inValueForKeyPath; +@property (nonatomic) id parentObject; +@end + +@implementation RKMappingMetadata + +- (id)valueForKeyPath:(NSString *)keyPath +{ + static NSString *mappingPrefix = @"mapping."; + + /* We only allow paths with a "mapping." prefix, to simulate being a nested object */ + if ([keyPath hasPrefix:mappingPrefix]) { + self.inValueForKeyPath = YES; + id value = [super valueForKeyPath:[keyPath substringFromIndex:[mappingPrefix length]]]; + self.inValueForKeyPath = NO; + return value; + } + + return nil; +} + +/* Only return values from valueForKey: if we are being routed from valueForKeyPath:. This + avoids us from returning value values from say "@metadata.collectionIndex" without the mapping prefix. + */ +- (id)valueForKey:(NSString *)key +{ + return self.inValueForKeyPath? [super valueForKey:key] : nil; +} + +/* Return nil for any unknown keys, so the next object in the metadata list gets checked */ +- (id)valueForUndefinedKey:(NSString *)key +{ + return nil; +} + +@end + +/** + Subclass of RKMappingMetadata for use for holding the collectionIndex during a to-many mapping operation. + Needs to be a subclass since the scalar property cannot return nil from valueForKey, so this can only + be used when the collectionIndex is definitely set. + */ +@interface RKMappingIndexMetadata : RKMappingMetadata +@property (nonatomic) NSUInteger collectionIndex; +@end + +@implementation RKMappingIndexMetadata +@end + + +@interface RKMappingSourceObject () +@property (nonatomic, strong) id object; +@property (nonatomic, strong) id parentObject; +@property (nonatomic, strong) id rootObject; +@property (nonatomic, strong) NSArray *metadataList; +@end + +@implementation RKMappingSourceObject + +- (instancetype)initWithObject:(id)object parentObject:(id)parentObject rootObject:(id)rootObject metadata:(NSArray *)metadata +{ + self = [self init]; + if (self) { + _object = object; + _parentObject = parentObject; + _rootObject = rootObject; + _metadataList = metadata; + } + return self; +} + +- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector +{ + return [_object methodSignatureForSelector:selector]; +} + +- (void)forwardInvocation:(NSInvocation *)invocation +{ + [invocation invokeWithTarget:_object]; +} + +- (id)forwardingTargetForSelector:(SEL)aSelector +{ + return _object; +} + +- (id)metadataValueForKey:(NSString *)key +{ + for (NSDictionary *dict in self.metadataList) + { + id val = [dict valueForKey:key]; + if (val != nil) return val; + } + + return nil; +} + +- (id)metadataValueForKeyPath:(NSString *)keyPath +{ + for (NSDictionary *dict in self.metadataList) + { + id val = [dict valueForKeyPath:keyPath]; + if (val != nil) return val; + } + + return nil; +} + +- (id)valueForKey:(NSString *)key +{ + /* Using firstChar as a small performance enhancement -- one check can avoid several isEqual: calls */ + unichar firstChar = [key length] > 0 ? [key characterAtIndex:0] : 0; + + if (firstChar == 's' && [key isEqualToString:RKSelfKey]) { + return _object; + } else if (firstChar != '@') { + return [_object valueForKey:key]; + } else if ([key isEqualToString:RKMetadataKey]) { + return [[RKMetadataWrapper alloc] initWithMappingSource:self]; + } else if ([key isEqualToString:RKParentKey]) { + return self.parentObject; + } else if ([key isEqualToString:RKRootKey]) { + return self.rootObject; + } else { + return [_object valueForKey:key]; + } +} + +/** + NOTE: We implement `valueForKeyPath:` on the proxy instead of using `forwardInvocation:` because the OS X runtime fails to appropriately handle scalar boxing/unboxing, resulting in incorrect metadata mappings. Proxying the method directly produces the expected results on both OS X and iOS [sbw - 2/1/2012] + */ +- (id)valueForKeyPath:(NSString *)keyPath +{ + /* Using firstChar as a small performance enhancement -- one check can avoid several hasPrefix calls */ + unichar firstChar = [keyPath length] > 0 ? [keyPath characterAtIndex:0] : 0; + + @try { + if (firstChar == 's' && [keyPath hasPrefix:RKSelfKeyPathPrefix]) { + NSString *selfKeyPath = [keyPath substringFromIndex:[RKSelfKeyPathPrefix length]]; + return [_object valueForKeyPath:selfKeyPath]; + } else if (firstChar != '@') { + return [_object valueForKeyPath:keyPath]; + } else if ([keyPath hasPrefix:RKMetadataKeyPathPrefix]) { + NSString *metadataKeyPath = [keyPath substringFromIndex:[RKMetadataKeyPathPrefix length]]; + return [self metadataValueForKeyPath:metadataKeyPath]; + } else if ([keyPath hasPrefix:RKParentKeyPathPrefix]) { + NSString *parentKeyPath = [keyPath substringFromIndex:[RKParentKeyPathPrefix length]]; + return [self.parentObject valueForKeyPath:parentKeyPath]; + } else if ([keyPath hasPrefix:RKRootKeyPathPrefix]) { + NSString *rootKeyPath = [keyPath substringFromIndex:[RKRootKeyPathPrefix length]]; + return [self.rootObject valueForKeyPath:rootKeyPath]; + } else { + return [_object valueForKeyPath:keyPath]; + } + } + @catch (NSException *exception) { + return nil; + } +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"%@ (%@)", [self.object description], self.metadataList]; +} + +- (Class)class +{ + return [_object class]; +} + +- (BOOL)isKindOfClass:(Class)aClass +{ + return [_object isKindOfClass:aClass]; +} + +- (BOOL)respondsToSelector:(SEL)aSelector +{ + return [_object respondsToSelector:aSelector]; +} + +- (BOOL)conformsToProtocol:(Protocol *)aProtocol +{ + return [_object conformsToProtocol:aProtocol]; +} + +- (Class)rk_classForPropertyAtKeyPath:(NSString *)keyPath isPrimitive:(BOOL *)isPrimitive +{ + return [_object rk_classForPropertyAtKeyPath:keyPath isPrimitive:isPrimitive]; +} + +@end + + +#pragma mark - RKMappingInfo + +@interface RKMappingInfo () +@property (nonatomic, assign, readwrite) NSUInteger collectionIndex; +@property (nonatomic, strong) NSMutableSet *mutablePropertyMappings; +@property (nonatomic, strong) NSMutableDictionary *mutableRelationshipMappingInfo; + +- (instancetype)initWithObjectMapping:(RKObjectMapping *)objectMapping dynamicMapping:(RKDynamicMapping *)dynamicMapping; +- (void)addPropertyMapping:(RKPropertyMapping *)propertyMapping; +@end + +@implementation RKMappingInfo + +- (instancetype)initWithObjectMapping:(RKObjectMapping *)objectMapping dynamicMapping:(RKDynamicMapping *)dynamicMapping +{ + self = [self init]; + if (self) { + _objectMapping = objectMapping; + _dynamicMapping = dynamicMapping; + _mutablePropertyMappings = [NSMutableSet setWithCapacity:[objectMapping.propertyMappings count]]; + _mutableRelationshipMappingInfo = [NSMutableDictionary dictionaryWithCapacity:[objectMapping.relationshipMappings count]]; + } + return self; +} + +- (NSSet *)propertyMappings +{ + return [self.mutablePropertyMappings copy]; +} + +- (NSDictionary *)relationshipMappingInfo +{ + return [self.mutableRelationshipMappingInfo copy]; +} + +- (void)addPropertyMapping:(RKPropertyMapping *)propertyMapping +{ + [self.mutablePropertyMappings addObject:propertyMapping]; +} + +- (void)addMappingInfo:(RKMappingInfo *)mappingInfo forRelationshipMapping:(RKRelationshipMapping *)relationshipMapping +{ + NSMutableArray *arrayOfMappingInfo = (self.mutableRelationshipMappingInfo)[relationshipMapping.destinationKeyPath]; + if (arrayOfMappingInfo) { + [arrayOfMappingInfo addObject:mappingInfo]; + } else { + arrayOfMappingInfo = [NSMutableArray arrayWithObject:mappingInfo]; + (self.mutableRelationshipMappingInfo)[relationshipMapping.destinationKeyPath] = arrayOfMappingInfo; + } +} + +- (id)objectForKeyedSubscript:(id)key +{ + for (RKPropertyMapping *propertyMapping in self.mutablePropertyMappings) { + if ([propertyMapping.destinationKeyPath isEqualToString:key]) { + return propertyMapping; + } + } + return nil; +} + +@end + +#pragma mark - RKMappingOperation + +@interface RKMappingOperation () +@property (nonatomic, strong, readwrite) RKMapping *mapping; +@property (nonatomic, strong, readwrite) id sourceObject; +@property (nonatomic, strong, readwrite) id parentSourceObject; +@property (nonatomic, strong, readwrite) id rootSourceObject; +@property (nonatomic, strong, readwrite) id destinationObject; +@property (nonatomic, strong, readwrite) NSArray *metadataList; +@property (nonatomic, strong) NSString *nestedAttributeSubstitutionKey; +@property (nonatomic, strong) id nestedAttributeSubstitutionValue; +@property (nonatomic, strong, readwrite) NSError *error; +@property (nonatomic, strong, readwrite) RKObjectMapping *objectMapping; // The concrete mapping +@property (nonatomic, strong) NSArray *nestedAttributeMappings; +@property (nonatomic, strong) NSArray *simpleAttributeMappings; +@property (nonatomic, strong) NSArray *keyPathAttributeMappings; +@property (nonatomic, strong) NSArray *relationshipMappings; +@property (nonatomic, strong) RKMappingInfo *mappingInfo; +@property (nonatomic, getter=isCancelled) BOOL cancelled; +@property (nonatomic) BOOL collectsMappingInfo; +@property (nonatomic) BOOL shouldSetUnchangedValues; +@property (nonatomic, readwrite, getter=isNewDestinationObject) BOOL newDestinationObject; +@end + +@implementation RKMappingOperation + +- (instancetype)initWithSourceObject:(id)sourceObject destinationObject:(id)destinationObject mapping:(RKMapping *)objectOrDynamicMapping +{ + return [self initWithSourceObject:sourceObject destinationObject:destinationObject mapping:objectOrDynamicMapping metadataList:nil]; +} + +- (instancetype)initWithSourceObject:(id)sourceObject destinationObject:(id)destinationObject mapping:(RKMapping *)objectOrDynamicMapping metadataList:(NSArray *)metadataList +{ + NSAssert(sourceObject != nil, @"Cannot perform a mapping operation without a sourceObject object"); + NSAssert(objectOrDynamicMapping != nil, @"Cannot perform a mapping operation without a mapping"); + + self = [super init]; + if (self) { + self.sourceObject = sourceObject; + self.rootSourceObject = sourceObject; + self.destinationObject = destinationObject; + self.mapping = objectOrDynamicMapping; + self.metadataList = metadataList; + } + + return self; +} + +- (id)parentObjectForRelationshipMapping:(RKRelationshipMapping *)mapping +{ + id parentSourceObject = self.sourceObject; + NSString *sourceKeyPath = mapping.sourceKeyPath; + + NSRange lastDotRange = [sourceKeyPath rangeOfString:@"." options:NSBackwardsSearch|NSLiteralSearch]; + if (lastDotRange.length > 0) + { + NSString *parentKey = [sourceKeyPath substringToIndex:lastDotRange.location]; + id rootObject = self.rootSourceObject; + NSArray *metadata = self.metadataList; + for (NSString *key in [parentKey componentsSeparatedByString:@"."]) + { + parentSourceObject = [[RKMappingSourceObject alloc] initWithObject:[parentSourceObject valueForKey:key] + parentObject:parentSourceObject + rootObject:rootObject + metadata:metadata]; + } + } + + return parentSourceObject; +} + +- (id)destinationObjectForMappingRepresentation:(id)representation parentRepresentation:(id)parentRepresentation withMapping:(RKMapping *)mapping inRelationship:(RKRelationshipMapping *)relationshipMapping +{ + RKObjectMapping *concreteMapping = nil; + if ([mapping isKindOfClass:[RKDynamicMapping class]]) { + concreteMapping = [(RKDynamicMapping *)mapping objectMappingForRepresentation:representation]; + if (! concreteMapping) { + RKLogDebug(@"Unable to determine concrete object mapping from dynamic mapping %@ with which to map object representation: %@", mapping, representation); + return nil; + } + } else if ([mapping isKindOfClass:[RKObjectMapping class]]) { + concreteMapping = (RKObjectMapping *)mapping; + } + + id destinationObject = nil; + id dataSource = self.dataSource; + if ([dataSource respondsToSelector:@selector(mappingOperation:targetObjectForMapping:inRelationship:)]) + { + destinationObject = [dataSource mappingOperation:self targetObjectForMapping:concreteMapping inRelationship:relationshipMapping]; + } + + if (destinationObject == nil) + { + NSDictionary *dictionaryRepresentation = [representation isKindOfClass:[NSDictionary class]] ? representation : @{ [NSNull null] : representation }; + RKMappingMetadata *parentMetadata = [RKMappingMetadata new]; + parentMetadata.parentObject = self.destinationObject ?: [NSNull null]; + NSArray *metadata = RKInsertInMetadataList(self.metadataList, parentMetadata, nil); + RKMappingSourceObject *sourceObject = [[RKMappingSourceObject alloc] initWithObject:dictionaryRepresentation parentObject:parentRepresentation rootObject:self.rootSourceObject metadata:metadata]; + destinationObject = [dataSource mappingOperation:self targetObjectForRepresentation:(NSDictionary *)sourceObject withMapping:concreteMapping inRelationship:relationshipMapping]; + } + + return destinationObject; +} + +- (BOOL)validateValue:(id *)value atKeyPath:(NSString *)keyPath +{ + BOOL success = YES; + + if (self.objectMapping.performsKeyValueValidation) { + id destinationObject = self.destinationObject; + + if ([destinationObject respondsToSelector:@selector(validateValue:forKeyPath:error:)]) { + NSError *validationError; + success = [destinationObject validateValue:value forKeyPath:keyPath error:&validationError]; + if (!success) { + self.error = validationError; + if (validationError) { + RKLogError(@"Validation failed while mapping attribute at key path '%@' to value. Error: %@", keyPath, [validationError localizedDescription]); + RKLogValidationError(validationError); + } else { + RKLogWarning(@"Destination object %@ rejected attribute value for keyPath %@. Skipping...", self.destinationObject, keyPath); + } + RKLogDebug(@"(Value for key path '%@': %@)", keyPath, *value); + } + } + } + + return success; +} + +- (BOOL)shouldSetValue:(id *)value forKeyPath:(NSString *)keyPath usingMapping:(RKPropertyMapping *)propertyMapping +{ + if ([self.delegate respondsToSelector:@selector(mappingOperation:shouldSetValue:forKeyPath:usingMapping:)]) { + return [self.delegate mappingOperation:self shouldSetValue:*value forKeyPath:keyPath usingMapping:propertyMapping]; + } + + // Always set the properties + if (self.shouldSetUnchangedValues) { + return [self validateValue:value atKeyPath:keyPath]; + } + + id currentValue = [self.destinationObject valueForKeyPath:keyPath]; + if (currentValue == [NSNull null]) { + currentValue = nil; + } + + /* + WTF - This workaround should not be necessary, but I have been unable to replicate + the circumstances that trigger it in a unit test to fix elsewhere. The proper place + to handle it is in transformValue:atKeyPath:toType: + + See issue & pull request: https://github.com/RestKit/RestKit/pull/436 + */ + if (*value == [NSNull null]) *value = nil; + + if (nil == currentValue && nil == *value) { + // Both are nil + return NO; + } else if (nil == *value || nil == currentValue) { + // One is nil and the other is not + return [self validateValue:value atKeyPath:keyPath]; + } + + if (! RKObjectIsEqualToObject(*value, currentValue)) { + // Validate value for key + return [self validateValue:value atKeyPath:keyPath]; + } + return NO; +} + +- (NSArray *)applyNestingToMappings:(NSArray *)propertyMappings +{ + if (self.nestedAttributeSubstitutionKey == nil) return propertyMappings; + + return RKApplyNestingAttributeValueToMappings(self.nestedAttributeSubstitutionKey, self.nestedAttributeSubstitutionValue, propertyMappings); +} + +- (void)cacheMappingsIfNeeded +{ + if (!_nestedAttributeMappings) + { + RKObjectMapping *mapping = self.objectMapping; + + if (self.nestedAttributeSubstitutionKey == nil) { + _relationshipMappings = mapping.relationshipMappings; + _nestedAttributeMappings = mapping.attributeMappings; + _simpleAttributeMappings = mapping.keyAttributeMappings; + _keyPathAttributeMappings = mapping.keyPathAttributeMappings; + } + else { + _nestedAttributeMappings = [self applyNestingToMappings:mapping.attributeMappings]; + _relationshipMappings = [self applyNestingToMappings:mapping.relationshipMappings]; + NSMutableArray *simpleList = [[NSMutableArray alloc] initWithCapacity:[_nestedAttributeMappings count]]; + NSMutableArray *keyPathList = [[NSMutableArray alloc] initWithCapacity:[_nestedAttributeMappings count]]; + + // The nested substitution may have changed which properties are simple vs keyPath, so we have to + // re-check based on the nesting result. + for (RKPropertyMapping *mapping in _nestedAttributeMappings) { + BOOL isSimple = [mapping.sourceKeyPath rangeOfString:@"." options:NSLiteralSearch].length == 0; + NSMutableArray *arrayToAdd = isSimple? simpleList : keyPathList; + [arrayToAdd addObject:mapping]; + } + + _simpleAttributeMappings = simpleList; + _keyPathAttributeMappings = keyPathList; + } + } +} + +- (NSArray *)nestedAttributeMappings +{ + [self cacheMappingsIfNeeded]; + return _nestedAttributeMappings; +} + +- (NSArray *)simpleAttributeMappings +{ + [self cacheMappingsIfNeeded]; + return _simpleAttributeMappings; +} + +- (NSArray *)keyPathAttributeMappings +{ + [self cacheMappingsIfNeeded]; + return _keyPathAttributeMappings; +} + +- (NSArray *)relationshipMappings +{ + [self cacheMappingsIfNeeded]; + return _relationshipMappings; +} + +- (BOOL)transformValue:(id)inputValue toValue:(__autoreleasing id *)outputValue withPropertyMapping:(RKPropertyMapping *)propertyMapping error:(NSError *__autoreleasing *)error +{ + if (! inputValue) { + // We only want to consider the transformation successful and assign the default if the mapping calls for it + if (propertyMapping.objectMapping.assignsDefaultValueForMissingAttributes) { + *outputValue = [propertyMapping.objectMapping defaultValueForAttribute:propertyMapping.destinationKeyPath]; + return YES; + } else { + *outputValue = nil; + return NO; + } + } + Class transformedValueClass = propertyMapping.propertyValueClass ?: [self.objectMapping classForKeyPath:propertyMapping.destinationKeyPath]; + if (! transformedValueClass) { + *outputValue = inputValue; + return YES; + } + RKLogTrace(@"Found transformable value at keyPath '%@'. Transforming from class '%@' to '%@'", propertyMapping.sourceKeyPath, NSStringFromClass([inputValue class]), NSStringFromClass(transformedValueClass)); + BOOL success = [propertyMapping.valueTransformer transformValue:inputValue toValue:outputValue ofClass:transformedValueClass error:error]; + if (! success) RKLogError(@"Failed transformation of value at keyPath '%@' to representation of type '%@': %@", propertyMapping.sourceKeyPath, transformedValueClass, *error); + return success; +} + +- (BOOL)applyAttributeMapping:(RKAttributeMapping *)attributeMapping withValue:(id)value +{ + id transformedValue = nil; + NSError *error = nil; + if (! [self transformValue:value toValue:&transformedValue withPropertyMapping:attributeMapping error:&error]) return NO; + + NSString *destinationKeyPath = attributeMapping.destinationKeyPath; + id destinationObject = self.destinationObject; + id delegate = self.delegate; + + if ([delegate respondsToSelector:@selector(mappingOperation:didFindValue:forKeyPath:mapping:)]) { + [delegate mappingOperation:self didFindValue:value forKeyPath:attributeMapping.sourceKeyPath mapping:attributeMapping]; + } + RKLogTrace(@"Mapping attribute value keyPath '%@' to '%@'", attributeMapping.sourceKeyPath, destinationKeyPath); + + // If we have a nil value for a primitive property, we need to coerce it into a KVC usable value or bail out + if (transformedValue == nil && RKPropertyInspectorIsPropertyAtKeyPathOfObjectPrimitive(destinationKeyPath, destinationObject)) { + RKLogDebug(@"Detected `nil` value transformation for primitive property at keyPath '%@'", destinationKeyPath); + transformedValue = RKPrimitiveValueForNilValueOfClass([self.objectMapping classForKeyPath:destinationKeyPath]); + if (! transformedValue) { + RKLogTrace(@"Skipped mapping of attribute value from keyPath '%@ to keyPath '%@' -- Unable to transform `nil` into primitive value representation", attributeMapping.sourceKeyPath, destinationKeyPath); + return NO; + } + } + + RKSetIntermediateDictionaryValuesOnObjectForKeyPath(destinationObject, destinationKeyPath); + + // Ensure that the value is different + if ([self shouldSetValue:&transformedValue forKeyPath:destinationKeyPath usingMapping:attributeMapping]) { + RKLogTrace(@"Mapped attribute value from keyPath '%@' to '%@'. Value: %@", attributeMapping.sourceKeyPath, destinationKeyPath, transformedValue); + + if (destinationKeyPath) { + [destinationObject setValue:transformedValue forKeyPath:destinationKeyPath]; + } else { + if ([destinationObject isKindOfClass:[NSMutableDictionary class]] && [transformedValue isKindOfClass:[NSDictionary class]]) { + [destinationObject setDictionary:transformedValue]; + } else { + [NSException raise:NSInvalidArgumentException format:@"Unable to set value for destination object of type '%@': Can only directly set destination object for `NSMutableDictionary` targets. (transformedValue=%@)", [destinationObject class], transformedValue]; + } + } + if ([delegate respondsToSelector:@selector(mappingOperation:didSetValue:forKeyPath:usingMapping:)]) { + [delegate mappingOperation:self didSetValue:transformedValue forKeyPath:destinationKeyPath usingMapping:attributeMapping]; + } + } else { + RKLogTrace(@"Skipped mapping of attribute value from keyPath '%@ to keyPath '%@' -- value is unchanged (%@)", attributeMapping.sourceKeyPath, destinationKeyPath, transformedValue); + if ([delegate respondsToSelector:@selector(mappingOperation:didNotSetUnchangedValue:forKeyPath:usingMapping:)]) { + [delegate mappingOperation:self didNotSetUnchangedValue:transformedValue forKeyPath:destinationKeyPath usingMapping:attributeMapping]; + } + } + if (_collectsMappingInfo) { + [self.mappingInfo addPropertyMapping:attributeMapping]; + } + return YES; +} + +// Return YES if we mapped any attributes +- (BOOL)applyAttributeMappings:(NSArray *)attributeMappings +{ + // If we have a nesting substitution value, we have already succeeded + BOOL appliedMappings = (self.nestedAttributeSubstitutionKey != nil); + + if (!self.objectMapping.performsKeyValueValidation) { + RKLogDebug(@"Key-value validation is disabled for mapping, skipping..."); + } + + id sourceObject = self.sourceObject; + + for (RKAttributeMapping *attributeMapping in attributeMappings) { + if ([self isCancelled]) return NO; + + NSString *sourceKeyPath = attributeMapping.sourceKeyPath; + NSString *destinationKeyPath = attributeMapping.destinationKeyPath; + if ([sourceKeyPath isEqualToString:RKObjectMappingNestingAttributeKeyName] || [destinationKeyPath isEqualToString:RKObjectMappingNestingAttributeKeyName]) { + RKLogTrace(@"Skipping attribute mapping for special keyPath '%@'", sourceKeyPath); + continue; + } + + id value = (sourceKeyPath == nil) ? [sourceObject valueForKey:@"self"] : [sourceObject valueForKeyPath:sourceKeyPath]; + if ([self applyAttributeMapping:attributeMapping withValue:value]) { + appliedMappings = YES; + } else { + id delegate = self.delegate; + RKObjectMapping *objectMapping = self.objectMapping; + + if ([delegate respondsToSelector:@selector(mappingOperation:didNotFindValueForKeyPath:mapping:)]) { + [delegate mappingOperation:self didNotFindValueForKeyPath:sourceKeyPath mapping:attributeMapping]; + } + RKLogTrace(@"Did not find mappable attribute value keyPath '%@'", sourceKeyPath); + + // Optionally set the default value for missing values + if (objectMapping.assignsDefaultValueForMissingAttributes) { + [self.destinationObject setValue:[objectMapping defaultValueForAttribute:destinationKeyPath] + forKeyPath:destinationKeyPath]; + RKLogTrace(@"Setting nil for missing attribute value at keyPath '%@'", sourceKeyPath); + } + } + + // Fail out if an error has occurred + if (self.error) break; + } + + return appliedMappings; +} + +- (BOOL)mapNestedObject:(id)anObject toObject:(id)anotherObject parent:(id)parentSourceObject withRelationshipMapping:(RKRelationshipMapping *)relationshipMapping metadataList:(NSArray *)metadataList +{ + NSAssert(anObject, @"Cannot map nested object without a nested source object"); + NSAssert(anotherObject, @"Cannot map nested object without a destination object"); + NSAssert(relationshipMapping, @"Cannot map a nested object relationship without a relationship mapping"); + + RKLogTrace(@"Performing nested object mapping using mapping %@ for data: %@", relationshipMapping, anObject); + RKMappingOperation *subOperation = [[RKMappingOperation alloc] initWithSourceObject:anObject destinationObject:anotherObject mapping:relationshipMapping.mapping metadataList:metadataList]; + subOperation.dataSource = self.dataSource; + subOperation.delegate = self.delegate; + subOperation.parentSourceObject = parentSourceObject; + subOperation.rootSourceObject = self.rootSourceObject; + subOperation.newDestinationObject = YES; + [subOperation start]; + + if (subOperation.error) { + RKLogWarning(@"WARNING: Failed mapping nested object: %@", [subOperation.error localizedDescription]); + } else if (self.collectsMappingInfo) { + RKMappingInfo *mappingInfo = self.mappingInfo; + RKMappingInfo *subMappingInfo = subOperation.mappingInfo; + [mappingInfo addPropertyMapping:relationshipMapping]; + if (subMappingInfo) { + [mappingInfo addMappingInfo:subMappingInfo forRelationshipMapping:relationshipMapping]; + } + } + + return YES; +} + +- (BOOL)applyReplaceAssignmentPolicyForRelationshipMapping:(RKRelationshipMapping *)relationshipMapping +{ + if (relationshipMapping.assignmentPolicy == RKReplaceAssignmentPolicy) { + id dataSource = self.dataSource; + if ([dataSource respondsToSelector:@selector(mappingOperation:deleteExistingValueOfRelationshipWithMapping:error:)]) { + NSError *error = nil; + BOOL success = [dataSource mappingOperation:self deleteExistingValueOfRelationshipWithMapping:relationshipMapping error:&error]; + if (! success) { + RKLogError(@"Failed to delete existing value of relationship mapped with RKReplaceAssignmentPolicy: %@", error); + self.error = error; + return NO; + } + } else { + RKLogWarning(@"Requested mapping with `RKReplaceAssignmentPolicy` assignment policy, but the data source does not support it. Mapping has proceeded identically to the `RKSetAssignmentPolicy`."); + } + } + + return YES; +} + +- (BOOL)mapOneToOneRelationshipWithValue:(id)value mapping:(RKRelationshipMapping *)relationshipMapping +{ + static dispatch_once_t onceToken; + static NSDictionary *noIndexMetadata; + dispatch_once(&onceToken, ^{ + noIndexMetadata = @{ @"mapping" : @{ @"collectionIndex" : [NSNull null] } }; + }); + + // One to one relationship + NSString *destinationKeyPath = relationshipMapping.destinationKeyPath; + RKLogDebug(@"Mapping one to one relationship value at keyPath '%@' to '%@'", relationshipMapping.sourceKeyPath, destinationKeyPath); + + if (relationshipMapping.assignmentPolicy == RKUnionAssignmentPolicy) { + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: @"Invalid assignment policy: cannot union a one-to-one relationship." }; + self.error = [NSError errorWithDomain:RKErrorDomain code:RKMappingErrorInvalidAssignmentPolicy userInfo:userInfo]; + return NO; + } + + // Remove existing destination entity before mapping the new one + if (relationshipMapping.assignmentPolicy == RKAssignmentPolicyReplace && ![self applyReplaceAssignmentPolicyForRelationshipMapping:relationshipMapping]) { + return NO; + } + + id parentSourceObject = [self parentObjectForRelationshipMapping:relationshipMapping]; + id destinationObject = [self destinationObjectForMappingRepresentation:value parentRepresentation:parentSourceObject withMapping:relationshipMapping.mapping inRelationship:relationshipMapping]; + if (! destinationObject) { + RKLogDebug(@"Mapping %@ declined mapping for representation %@: returned `nil` destination object.", relationshipMapping.mapping, destinationObject); + return NO; + } + + NSArray *subOperationMetadata = RKInsertInMetadataList(self.metadataList, noIndexMetadata, nil); + [self mapNestedObject:value toObject:destinationObject parent:parentSourceObject withRelationshipMapping:relationshipMapping metadataList:subOperationMetadata]; + + // If the relationship has changed, set it + if ([self shouldSetValue:&destinationObject forKeyPath:destinationKeyPath usingMapping:relationshipMapping]) { + RKLogTrace(@"Mapped relationship object from keyPath '%@' to '%@'. Value: %@", relationshipMapping.sourceKeyPath, destinationKeyPath, destinationObject); + [self.destinationObject setValue:destinationObject forKeyPath:destinationKeyPath]; + } else { + if ([self.delegate respondsToSelector:@selector(mappingOperation:didNotSetUnchangedValue:forKeyPath:usingMapping:)]) { + [self.delegate mappingOperation:self didNotSetUnchangedValue:destinationObject forKeyPath:destinationKeyPath usingMapping:relationshipMapping]; + } + } + + return YES; +} + +- (BOOL)mapCoreDataToManyRelationshipValue:(id)valueForRelationship withMapping:(RKRelationshipMapping *)relationshipMapping +{ + id destinationObject = self.destinationObject; + if (! RKIsManagedObject(destinationObject)) return NO; + + RKLogTrace(@"Mapping a to-many relationship for an `NSManagedObject`. About to apply value via mutable[Set|Array]ValueForKey"); + if ([valueForRelationship isKindOfClass:[NSSet class]]) { + RKLogTrace(@"Mapped `NSSet` relationship object from keyPath '%@' to '%@'. Value: %@", relationshipMapping.sourceKeyPath, relationshipMapping.destinationKeyPath, valueForRelationship); + NSMutableSet *destinationSet = [destinationObject mutableSetValueForKeyPath:relationshipMapping.destinationKeyPath]; + [destinationSet setSet:valueForRelationship]; + } else if ([valueForRelationship isKindOfClass:[NSArray class]]) { + RKLogTrace(@"Mapped `NSArray` relationship object from keyPath '%@' to '%@'. Value: %@", relationshipMapping.sourceKeyPath, relationshipMapping.destinationKeyPath, valueForRelationship); + NSMutableArray *destinationArray = [destinationObject mutableArrayValueForKeyPath:relationshipMapping.destinationKeyPath]; + [destinationArray setArray:valueForRelationship]; + } else if ([valueForRelationship isKindOfClass:[NSOrderedSet class]]) { + RKLogTrace(@"Mapped `NSOrderedSet` relationship object from keyPath '%@' to '%@'. Value: %@", relationshipMapping.sourceKeyPath, relationshipMapping.destinationKeyPath, valueForRelationship); + [destinationObject setValue:valueForRelationship forKeyPath:relationshipMapping.destinationKeyPath]; + } + + return YES; +} + +- (BOOL)mapOneToManyRelationshipWithValue:(id)value mapping:(RKRelationshipMapping *)relationshipMapping +{ + NSString *destinationKeyPath = relationshipMapping.destinationKeyPath; + + // One to many relationship + RKLogDebug(@"Mapping one to many relationship value at keyPath '%@' to '%@'", relationshipMapping.sourceKeyPath, destinationKeyPath); + + NSMutableArray *relationshipCollection = [NSMutableArray arrayWithCapacity:[value count]]; + if (RKObjectIsCollectionOfCollections(value)) { + RKLogWarning(@"WARNING: Detected a relationship mapping for a collection containing another collection. This is probably not what you want. Consider using a KVC collection operator (such as @unionOfArrays) to flatten your mappable collection."); + RKLogWarning(@"Key path '%@' yielded collection containing another collection rather than a collection of objects", relationshipMapping.sourceKeyPath); + RKLogDebug(@"(Value at key path '%@': %@)", relationshipMapping.sourceKeyPath, value); + } + + if (relationshipMapping.assignmentPolicy == RKUnionAssignmentPolicy) { + RKLogDebug(@"Mapping relationship with union assignment policy: constructing combined relationship value."); + id existingObjects = [self.destinationObject valueForKeyPath:destinationKeyPath]; + if (existingObjects) { + NSArray *existingObjectsArray = nil; + NSError *error = nil; + [[RKValueTransformer defaultValueTransformer] transformValue:existingObjects toValue:&existingObjectsArray ofClass:[NSArray class] error:&error]; + [relationshipCollection addObjectsFromArray:existingObjectsArray]; + } + } + else if (relationshipMapping.assignmentPolicy == RKReplaceAssignmentPolicy) { + if (! [self applyReplaceAssignmentPolicyForRelationshipMapping:relationshipMapping]) { + return NO; + } + } + + RKMapping *relationshipDestinationMapping = relationshipMapping.mapping; + id parentSourceObject = [self parentObjectForRelationshipMapping:relationshipMapping]; + RKMappingIndexMetadata *indexMetadata = [RKMappingIndexMetadata new]; + NSArray *subOperationMetadata = RKInsertInMetadataList(self.metadataList, indexMetadata, nil); + [value enumerateObjectsUsingBlock:^(id nestedObject, NSUInteger collectionIndex, BOOL *stop) { + id mappableObject = [self destinationObjectForMappingRepresentation:nestedObject parentRepresentation:parentSourceObject withMapping:relationshipDestinationMapping inRelationship:relationshipMapping]; + if (mappableObject) { + indexMetadata.collectionIndex = collectionIndex; + if ([self mapNestedObject:nestedObject toObject:mappableObject parent:parentSourceObject withRelationshipMapping:relationshipMapping metadataList:subOperationMetadata]) { + [relationshipCollection addObject:mappableObject]; + } + } else { + RKLogDebug(@"Mapping %@ declined mapping for representation %@: returned `nil` destination object.", relationshipDestinationMapping, nestedObject); + } + }]; + + id valueForRelationship = nil; + NSError *error = nil; + if (! [self transformValue:relationshipCollection toValue:&valueForRelationship withPropertyMapping:relationshipMapping error:&error]) return NO; + + // If the relationship has changed, set it + if ([self shouldSetValue:&valueForRelationship forKeyPath:destinationKeyPath usingMapping:relationshipMapping]) { + if (! [self mapCoreDataToManyRelationshipValue:valueForRelationship withMapping:relationshipMapping]) { + RKLogTrace(@"Mapped relationship object from keyPath '%@' to '%@'. Value: %@", relationshipMapping.sourceKeyPath, destinationKeyPath, valueForRelationship); + [self.destinationObject setValue:valueForRelationship forKeyPath:destinationKeyPath]; + } + } else { + if ([self.delegate respondsToSelector:@selector(mappingOperation:didNotSetUnchangedValue:forKeyPath:usingMapping:)]) { + [self.delegate mappingOperation:self didNotSetUnchangedValue:valueForRelationship forKeyPath:destinationKeyPath usingMapping:relationshipMapping]; + } + + return NO; + } + + return YES; +} + +- (BOOL)applyRelationshipMappings +{ + NSAssert(self.dataSource, @"Cannot perform relationship mapping without a data source"); + NSUInteger mappingsApplied = 0; + RKObjectMapping *parentObjectMapping = self.objectMapping; + id sourceObject = self.sourceObject; + id destinationObject = self.destinationObject; + id delegate = self.delegate; + + for (RKRelationshipMapping *relationshipMapping in [self relationshipMappings]) { + if ([self isCancelled]) return NO; + + NSString *sourceKeyPath = relationshipMapping.sourceKeyPath; + NSString *destinationKeyPath = relationshipMapping.destinationKeyPath; + id value = nil; + + if (sourceKeyPath) { + value = [sourceObject valueForKeyPath:sourceKeyPath]; + } else { + // The nil source keyPath indicates that we want to map directly from the parent representation + value = sourceObject; + RKMapping *destinationMapping = relationshipMapping.mapping; + RKObjectMapping *objectMapping = nil; + + if ([destinationMapping isKindOfClass:[RKObjectMapping class]]) { + objectMapping = (RKObjectMapping *)destinationMapping; + } else if ([destinationMapping isKindOfClass:[RKDynamicMapping class]]) { + objectMapping = [(RKDynamicMapping *)destinationMapping objectMappingForRepresentation:value]; + } + + if (! objectMapping) continue; // Mapping declined + if (! RKObjectContainsValueForMappings(value, objectMapping.propertyMappings)) { + continue; + } + } + + // Track that we applied this mapping + mappingsApplied++; + + if (value == nil) { + RKLogDebug(@"Did not find mappable relationship value keyPath '%@'", sourceKeyPath); + if (! parentObjectMapping.assignsNilForMissingRelationships) continue; + } + + if (value == [NSNull null]) { + RKLogDebug(@"Found null value at keyPath '%@'", sourceKeyPath); + value = nil; + } + + // nil out the property if necessary + if (value == nil) { + Class relationshipClass = [parentObjectMapping classForKeyPath:destinationKeyPath]; + BOOL mappingToCollection = RKClassIsCollection(relationshipClass); + RKAssignmentPolicy assignmentPolicy = relationshipMapping.assignmentPolicy; + if (assignmentPolicy == RKUnionAssignmentPolicy && mappingToCollection) { + // Unioning `nil` with the existing value is functionally equivalent to doing nothing, so just continue + continue; + } else if (assignmentPolicy == RKUnionAssignmentPolicy) { + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: @"Invalid assignment policy: cannot union a one-to-one relationship." }; + self.error = [NSError errorWithDomain:RKErrorDomain code:RKMappingErrorInvalidAssignmentPolicy userInfo:userInfo]; + continue; + } else if (assignmentPolicy == RKReplaceAssignmentPolicy) { + if (! [self applyReplaceAssignmentPolicyForRelationshipMapping:relationshipMapping]) { + continue; + } + } + + if ([self shouldSetValue:&value forKeyPath:destinationKeyPath usingMapping:relationshipMapping]) { + RKLogTrace(@"Setting nil for relationship value at keyPath '%@'", sourceKeyPath); + [destinationObject setValue:value forKeyPath:destinationKeyPath]; + } + + continue; + } + + // Handle case where incoming content is collection represented by a dictionary + if (relationshipMapping.mapping.forceCollectionMapping) { + // If we have forced mapping of a dictionary, map each subdictionary + if ([value isKindOfClass:[NSDictionary class]]) { + RKLogDebug(@"Collection mapping forced for NSDictionary, mapping each key/value independently..."); + NSArray *objectsToMap = [NSMutableArray arrayWithCapacity:[value count]]; + for (id key in value) { + NSDictionary *dictionaryToMap = @{key: [value valueForKey:key]}; + [(NSMutableArray *)objectsToMap addObject:dictionaryToMap]; + } + value = objectsToMap; + } else { + RKLogWarning(@"Collection mapping forced but mappable objects is of type '%@' rather than NSDictionary", NSStringFromClass([value class])); + } + } + + // Handle case where incoming content is a single object, but we want a collection + Class relationshipClass = [parentObjectMapping classForKeyPath:destinationKeyPath]; + BOOL mappingToCollection = RKClassIsCollection(relationshipClass); + BOOL objectIsCollection = RKObjectIsCollection(value); + if (mappingToCollection && !objectIsCollection) { + RKLogDebug(@"Asked to map a single object into a collection relationship. Transforming to an instance of: %@", NSStringFromClass(relationshipClass)); + if ([relationshipClass isSubclassOfClass:[NSArray class]]) { + value = [relationshipClass arrayWithObject:value]; + objectIsCollection = YES; + } else if ([relationshipClass isSubclassOfClass:[NSSet class]]) { + value = [relationshipClass setWithObject:value]; + objectIsCollection = YES; + } else if ([relationshipClass isSubclassOfClass:[NSOrderedSet class]]) { + value = [relationshipClass orderedSetWithObject:value]; + objectIsCollection = YES; + } else { + RKLogWarning(@"Failed to transform single object"); + } + } + + BOOL setValueForRelationship; + if (objectIsCollection) { + setValueForRelationship = [self mapOneToManyRelationshipWithValue:value mapping:relationshipMapping]; + } else { + setValueForRelationship = [self mapOneToOneRelationshipWithValue:value mapping:relationshipMapping]; + } + + if (! setValueForRelationship) continue; + + // Notify the delegate + if ([delegate respondsToSelector:@selector(mappingOperation:didSetValue:forKeyPath:usingMapping:)]) { + id setValue = [destinationObject valueForKeyPath:destinationKeyPath]; + [delegate mappingOperation:self didSetValue:setValue forKeyPath:destinationKeyPath usingMapping:relationshipMapping]; + } + + // Fail out if a validation error has occurred + if (self.error) break; + } + + return mappingsApplied > 0; +} + +- (void)applyNestedMappings +{ + RKObjectMapping *objectMapping = self.objectMapping; + RKAttributeMapping *attributeMapping = [objectMapping mappingForSourceKeyPath:RKObjectMappingNestingAttributeKeyName]; + if (attributeMapping) { + RKLogDebug(@"Found nested mapping definition to attribute '%@'", attributeMapping.destinationKeyPath); + id attributeValue = [[self.sourceObject allKeys] lastObject]; + if (attributeValue) { + RKLogDebug(@"Found nesting value of '%@' for attribute '%@'", attributeValue, attributeMapping.destinationKeyPath); + self.nestedAttributeSubstitutionKey = attributeMapping.destinationKeyPath; + self.nestedAttributeSubstitutionValue = attributeValue; + [self applyAttributeMapping:attributeMapping withValue:attributeValue]; + } else { + RKLogWarning(@"Unable to find nesting value for attribute '%@'", attributeMapping.destinationKeyPath); + } + } + + // Serialization + attributeMapping = [objectMapping mappingForDestinationKeyPath:RKObjectMappingNestingAttributeKeyName]; + if (attributeMapping) { + RKLogDebug(@"Found nested mapping definition to attribute '%@'", attributeMapping.destinationKeyPath); + id attributeValue = [self.sourceObject valueForKeyPath:attributeMapping.sourceKeyPath]; + if (attributeValue) { + RKLogDebug(@"Found nesting value of '%@' for attribute '%@'", attributeValue, attributeMapping.sourceKeyPath); + self.nestedAttributeSubstitutionKey = attributeMapping.sourceKeyPath; + self.nestedAttributeSubstitutionValue = attributeValue; + } else { + RKLogWarning(@"Unable to find nesting value for attribute '%@'", attributeMapping.destinationKeyPath); + } + } +} + +- (void)cancel +{ + self.cancelled = YES; + RKLogDebug(@"Mapping operation cancelled: %@", self); +} + +- (void)start +{ + [self main]; +} + +- (void)main +{ + if ([self isCancelled]) return; + + // Handle metadata + id parentSourceObject = self.parentSourceObject; + id sourceObject = [[RKMappingSourceObject alloc] initWithObject:self.sourceObject parentObject:parentSourceObject rootObject:self.rootSourceObject metadata:self.metadataList]; + self.sourceObject = sourceObject; + + RKLogDebug(@"Starting mapping operation..."); + RKLogTrace(@"Performing mapping operation: %@", self); + + id dataSource = self.dataSource; + id delegate = self.delegate; + RKMapping *mapping = self.mapping; + RKObjectMapping *objectMapping; + + if (! self.destinationObject) { + self.destinationObject = [self destinationObjectForMappingRepresentation:sourceObject parentRepresentation:parentSourceObject withMapping:mapping inRelationship:nil]; + if (! self.destinationObject) { + RKLogDebug(@"Mapping operation failed: Given nil destination object and unable to instantiate a destination object for mapping."); + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: @"Cannot perform a mapping operation with a nil destination object." }; + self.error = [NSError errorWithDomain:RKErrorDomain code:RKMappingErrorNilDestinationObject userInfo:userInfo]; + return; + } + self.newDestinationObject = YES; + } + + self.collectsMappingInfo = (![dataSource respondsToSelector:@selector(mappingOperationShouldCollectMappingInfo:)] || + [dataSource mappingOperationShouldCollectMappingInfo:self]); + + self.shouldSetUnchangedValues = ([self.dataSource respondsToSelector:@selector(mappingOperationShouldSetUnchangedValues:)] && + [self.dataSource mappingOperationShouldSetUnchangedValues:self]); + + // Determine the concrete mapping if we were initialized with a dynamic mapping + if ([mapping isKindOfClass:[RKDynamicMapping class]]) { + self.objectMapping = objectMapping = [(RKDynamicMapping *)mapping objectMappingForRepresentation:sourceObject]; + if (! objectMapping) { + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: @"A dynamic mapping failed to return a concrete object mapping matching the representation being mapped." }; + self.error = [NSError errorWithDomain:RKErrorDomain code:RKMappingErrorUnableToDetermineMapping userInfo:userInfo]; + return; + } + RKLogDebug(@"RKObjectMappingOperation was initialized with a dynamic mapping. Determined concrete mapping = %@", objectMapping); + + if ([delegate respondsToSelector:@selector(mappingOperation:didSelectObjectMapping:forDynamicMapping:)]) { + [delegate mappingOperation:self didSelectObjectMapping:objectMapping forDynamicMapping:(RKDynamicMapping *)mapping]; + } + if (self.collectsMappingInfo) { + self.mappingInfo = [[RKMappingInfo alloc] initWithObjectMapping:objectMapping dynamicMapping:(RKDynamicMapping *)mapping]; + } + } else if ([mapping isKindOfClass:[RKObjectMapping class]]) { + self.objectMapping = objectMapping = (RKObjectMapping *)mapping; + if (self.collectsMappingInfo) { + self.mappingInfo = [[RKMappingInfo alloc] initWithObjectMapping:objectMapping dynamicMapping:nil]; + } + } + + BOOL canSkipAttributes = [dataSource respondsToSelector:@selector(mappingOperationShouldSkipAttributeMapping:)] && [dataSource mappingOperationShouldSkipAttributeMapping:self]; + BOOL canSkipRelationships = [dataSource respondsToSelector:@selector(mappingOperationShouldSkipRelationshipMapping:)] && [dataSource mappingOperationShouldSkipRelationshipMapping:self]; + if ([dataSource respondsToSelector:@selector(mappingOperationShouldSkipRelationshipMapping:)]) { + canSkipRelationships = [dataSource mappingOperationShouldSkipRelationshipMapping:self]; + } + if ([dataSource respondsToSelector:@selector(mappingOperationShouldSkipAttributeMapping:)]) { + canSkipAttributes = [dataSource mappingOperationShouldSkipAttributeMapping:self]; + } + if (!canSkipRelationships || !canSkipAttributes) { + BOOL foundNoSimpleAttributes = NO; + BOOL foundNoRelationships = NO; + BOOL foundNoKeyPathAttributes = NO; + if (!canSkipAttributes) { + [self applyNestedMappings]; + if ([self isCancelled]) return; + foundNoSimpleAttributes = ![self applyAttributeMappings:[self simpleAttributeMappings]]; + } + if (!canSkipRelationships) { + if ([self isCancelled]) return; + foundNoRelationships = [[self relationshipMappings] count] ? ![self applyRelationshipMappings] : YES; + } + if (!canSkipAttributes) { + if ([self isCancelled]) return; + // NOTE: We map key path attributes last to allow you to map across the object graphs for objects created/updated by the relationship mappings + foundNoKeyPathAttributes = ![self applyAttributeMappings:[self keyPathAttributeMappings]]; + } + if (foundNoSimpleAttributes && foundNoRelationships && foundNoKeyPathAttributes) { + // We did not find anything to do + RKLogDebug(@"Mapping operation did not find any mappable values for the attribute and relationship mappings in the given object representation"); + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: @"No mappable values found for any of the attributes or relationship mappings" }; + self.error = [NSError errorWithDomain:RKErrorDomain code:RKMappingErrorUnmappableRepresentation userInfo:userInfo]; + } + + // We did some mapping work, if there's no error let's commit our changes to the data source + if (self.error == nil) { + if ([dataSource respondsToSelector:@selector(commitChangesForMappingOperation:error:)]) { + NSError *error = nil; + BOOL success = [dataSource commitChangesForMappingOperation:self error:&error]; + if (! success) { + self.error = error; + } + } + } + } + + if (self.error) { + if ([delegate respondsToSelector:@selector(mappingOperation:didFailWithError:)]) { + [delegate mappingOperation:self didFailWithError:self.error]; + } + + RKLogDebug(@"Failed mapping operation: %@", [self.error localizedDescription]); + } else { + RKLogDebug(@"Finished mapping operation successfully..."); + } +} + +- (BOOL)performMapping:(NSError **)error +{ + [self start]; + if (error) *error = self.error; + return self.error == nil; +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@ %p> for '%@' object. Mapping values from object %@ to object %@ with object mapping %@", + [self class], self, NSStringFromClass([self.destinationObject class]), self.sourceObject, self.destinationObject, self.objectMapping]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMappingOperationDataSource.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMappingOperationDataSource.h new file mode 100644 index 0000000..9769083 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMappingOperationDataSource.h @@ -0,0 +1,139 @@ +// +// RKMappingOperationDataSource.h +// RestKit +// +// Created by Blake Watters on 7/3/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <Foundation/Foundation.h> + +@class RKObjectMapping, RKMappingOperation, RKRelationshipMapping; + +/** + An object that adopts the `RKMappingOperationDataSource` protocol is responsible for the retrieval or creation of target objects within an `RKMapperOperation` or `RKMappingOperation`. A data source is responsible for meeting the requirements of the underlying data store implementation and must return a key-value coding compliant object instance that can be used as the target object of a mapping operation. It is also responsible for commiting any changes necessary to the underlying data store once a mapping operation has completed its work. + + At a minimum, a data source must implement the `mappingOperation:targetObjectForRepresentation:withMapping:` method. This method is responsible for finding an existing object instance to be updated or creating a new object if no existing object could be found or the underlying data store does not support persistence. Object mapping operations which target `NSObject` derived classes will always result in mapping to new transient objects, while persistent data stores such as Core Data can be queried to retrieve existing objects for update. + + @see `RKManagedObjectMappingOperationDataSource` + */ +@protocol RKMappingOperationDataSource <NSObject> + +@required + +/** + Asks the data source for the target object for an object mapping operation given an `NSDictionary` representation of the object's properties and the mapping object that will be used to perform the mapping. + + The `representation` value is a fragment of content from a deserialized response that has been identified as containing content that is mappable using the given mapping. + + @param mappingOperation The mapping operation requesting the target object. + @param representation A dictionary representation of the properties to be mapped onto the retrieved target object. + @param mapping The object mapping to be used to perform a mapping from the representation to the target object. + @return A key-value coding compliant object to perform the mapping on to. + */ +- (id)mappingOperation:(RKMappingOperation *)mappingOperation targetObjectForRepresentation:(NSDictionary *)representation withMapping:(RKObjectMapping *)mapping inRelationship:(RKRelationshipMapping *)relationshipMapping; + +@optional + +/** + Asks the data source for the target object for an object mapping operation the mapping object that will be used to perform the mapping. + + If not implemented or it returns nil, then the + `mappingOperation:targetObjectForRepresentation:withMapping:inRelationship:` method will be called to determine the target. + + It is preferable to implement this method if the `representation` is not needed to determine the target object, + as obtaining that value is somewhat expensive. + + @param mappingOperation The mapping operation requesting the target object. + @param mapping The object mapping to be used to perform a mapping from the representation to the target object. + @param relationshipMapping A dictionary representation of the properties to be mapped onto the retrieved target object. + @return A key-value coding compliant object to perform the mapping on to. + */ +- (id)mappingOperation:(RKMappingOperation *)mappingOperation targetObjectForMapping:(RKObjectMapping *)mapping inRelationship:(RKRelationshipMapping *)relationshipMapping; + + +/** + Tells the data source to commit any changes to the underlying data store. + + @param mappingOperation The mapping operation that has completed its work. + @param error A pointer to an error to be set in the event that the mapping operation could not be committed. + @return A Boolean value indicating if the changes for the mapping operation were committed successfully. + */ +- (BOOL)commitChangesForMappingOperation:(RKMappingOperation *)mappingOperation error:(NSError **)error; + +/** + Tells the data source to delete the existing value for a relationship that has been mapped with an assignment policy of `RKReplaceAssignmentPolicy`. + + @param mappingOperation The mapping operation that is executing. + @param relationshipMapping The relationship mapping for which the existing value is being replaced. + @param error A pointer to an error to be set in the event that the deletion operation could not be completed. + @return A Boolean value indicating if the existing objects for the relationship were successfully deleted. + */ +- (BOOL)mappingOperation:(RKMappingOperation *)mappingOperation deleteExistingValueOfRelationshipWithMapping:(RKRelationshipMapping *)relationshipMapping error:(NSError **)error; + +/** + Asks the data source if it should set values for properties without checking that the value has been changed. This method can result in a performance improvement during mapping as the mapping operation will not attempt to assess the change state of the property being mapped. + + If this method is not implemented by the data source, then the mapping operation defaults to `NO`. + + @param mappingOperation The mapping operation that is querying the data source. + @return `YES` if the mapping operation should disregard property change status, else `NO`. + */ +- (BOOL)mappingOperationShouldSetUnchangedValues:(RKMappingOperation *)mappingOperation; + +/** + **Deprecated in v0.26.0** + Asks the data source if it should skip mapping. This method can significantly improve performance if, for example, the data source has determined that the properties in the representation are not newer than the current target object's properties. See `modificationAttribute` in `RKEntityMapping` for an example of when skipping property mapping would be appropriate. + + If this method is not implemented by the data source, then the mapping operation defaults to `NO`. + + @param mappingOperation The mapping operation that is querying the data source. + @return `YES` if the mapping operation should skip mapping properties, else `NO`. + */ +- (BOOL)mappingOperationShouldSkipPropertyMapping:(RKMappingOperation *)mappingOperation DEPRECATED_MSG_ATTRIBUTE("use mappingOperationShouldSkipAttributeMapping: and mappingOperationShouldSkipRelationshipMapping: instead"); + +/** + Asks the data source if it should skip mapping attributes. This method can significantly improve performance if, for example, the data source has determined that the attributes in the representation are not newer than the current target object's attributes. See `modificationAttribute` in `RKEntityMapping` for an example of when skipping attribute mapping would be appropriate. + + If this method is not implemented by the data source, then the mapping operation defaults to `NO`. + + @param mappingOperation The mapping operation that is querying the data source. + @return `YES` if the mapping operation should skip mapping attributes, else `NO`. + */ +- (BOOL)mappingOperationShouldSkipAttributeMapping:(RKMappingOperation *)mappingOperation; + +/** + Asks the data source if it should skip mapping relationships. This method can significantly improve performance if, for example, the data source has determined that the relationships in the representation are not newer than the current target object's relationships. See `modificationAttribute` and `shouldMapRelationshipsIfObjectIsUnmodified` in `RKEntityMapping` for an example of when skipping relationship mapping might be appropriate. + + If this method is not implemented by the data source, then the mapping operation defaults to `NO`. + + @param mappingOperation The mapping operation that is querying the data source. + @return `YES` if the mapping operation should skip mapping relationships, else `NO`. + */ +- (BOOL)mappingOperationShouldSkipRelationshipMapping:(RKMappingOperation *)mappingOperation; + +/** + Asks the data source if the mapping operation should collect `RKMappingInfo` information during the mapping + (stored in the `mappingInfo` property). If not needed, it can be a substantially faster to skip it. The + `mappingInfo` property will be nil if not collected. + + If this method is not implemented by the data source, then the mapping operation defaults to `YES`. + + @param mappingOperation The mapping operation that is querying the data source. + @return `YES` if the mapping operation should collect mapping information, else `NO`. +*/ +- (BOOL)mappingOperationShouldCollectMappingInfo:(RKMappingOperation *)mappingOperation; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMappingResult.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMappingResult.h new file mode 100644 index 0000000..2cdeff0 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMappingResult.h @@ -0,0 +1,91 @@ +// +// RKMappingResult.h +// RestKit +// +// Created by Blake Watters on 5/7/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <Foundation/Foundation.h> + +/** + The `RKMappingResult` class represents the aggregate object mapping results returned by an `RKMapperOperation` object. The mapping result provides a thin interface on top of an `NSDictionary` and provides convenient interfaces for accessing the mapping results in various representations. + */ +@interface RKMappingResult : NSObject + +///---------------------------------------- +/// @name Creating a Mapping Result +///---------------------------------------- + +/** + Initializes the receiver with a dictionary of mapped key paths and object values. + + @param dictionary A dictionary wherein the keys represent mapped key paths and the values represent the objects mapped at those key paths. Cannot be nil. + @return The receiver, initialized with the given dictionary. + */ +- (instancetype)initWithDictionary:(NSDictionary *)dictionary; + +///---------------------------------------- +/// @name Retrieving Result Representations +///---------------------------------------- + +/** + Returns a representation of the mapping result as a dictionary. + + The keys of the returned dictionary will correspond to the mapped key paths in the source object representation and the values will be the mapped objects. The returned value is a copy of the dictionary that was used to initialize the mapping result. + + @return A dictionary containing the mapping results. + */ +- (NSDictionary *)dictionary; + +/** + Returns a representation of the mapping result as a single object by returning the first mapped value from the aggregate array of mapped objects. + + The mapping result is coerced into a single object by retrieving all mapped objects and returning the first object. If the mapping result is empty, `nil` is returned. + + @return The first object contained in the mapping result. + */ +@property (nonatomic, readonly, strong) id firstObject; + +/** + Returns a representation of the mapping result as an array of objects. + + The array returned is a flattened collection of all mapped object values contained in the underlying dictionary result representation. No guarantee is made as to the ordering of objects within the returned collection when more than one key path was mapped, as `NSDictionary` objects are unordered, + + @return An array containing the objects contained in the mapping result. + */ +- (NSArray *)array; + +/** + Returns a representation of the mapping result as a set of objects. + + The set returned is a flattened collection of all mapped object values contained in the underlying dictionary result representation. + + @return A set containing the objects contained in the mapping result. + */ +@property (nonatomic, readonly, copy) NSSet *set; + +///---------------------------------------- +/// @name Counting Entries +///---------------------------------------- + +/** + Returns a count of the number of objects contained in the mapping result. This is an aggregate count of all objects across all mapped key paths in the result. + + @return A count of the number of mapped objects in the mapping result. + */ +@property (nonatomic, readonly) NSUInteger count; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMappingResult.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMappingResult.m new file mode 100644 index 0000000..d3b7f58 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKMappingResult.m @@ -0,0 +1,81 @@ +// +// RKMappingResult.m +// RestKit +// +// Created by Blake Watters on 5/7/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKMappingResult.h" + +@interface RKMappingResult () +@property (nonatomic, strong) NSDictionary *keyPathToMappedObjects; +@end + +@implementation RKMappingResult + +- (instancetype)initWithDictionary:(id)dictionary +{ + NSParameterAssert(dictionary); + self = [self init]; + if (self) { + self.keyPathToMappedObjects = dictionary; + } + + return self; +} + +- (NSDictionary *)dictionary +{ + return [self.keyPathToMappedObjects copy]; +} + +- (NSArray *)array +{ + // Flatten results down into a single array + NSMutableArray *collection = [NSMutableArray array]; + for (id object in [self.keyPathToMappedObjects allValues]) { + // We don't want to strip the keys off of a mapped dictionary result + if (NO == [object isKindOfClass:[NSDictionary class]] && [object respondsToSelector:@selector(allObjects)]) { + [collection addObjectsFromArray:[object allObjects]]; + } else { + [collection addObject:object]; + } + } + + return collection; +} + +- (NSSet *)set +{ + return [NSSet setWithArray:[self array]]; +} + +- (id)firstObject +{ + return [[self array] firstObject]; +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@: %p, results=%@>", NSStringFromClass([self class]), self, self.keyPathToMappedObjects]; +} + +- (NSUInteger)count +{ + return [[self array] count]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKObjectMapping.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKObjectMapping.h new file mode 100644 index 0000000..92c6809 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKObjectMapping.h @@ -0,0 +1,529 @@ +// +// RKObjectMapping.h +// RestKit +// +// Created by Blake Watters on 4/30/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKMacros.h" +#import "RKMapping.h" + +#import <RKValueTransformers/RKValueTransformers.h> + +@class RKPropertyMapping, RKAttributeMapping, RKRelationshipMapping; +@protocol RKValueTransforming; + +/** + An `RKObjectMapping` object describes a transformation between object represenations using key-value coding and run-time type introspection. The mapping is defined in terms of a source object class and a collection of `RKPropertyMapping` objects describing how key paths in the source representation should be transformed into attributes and relationships on the target object. Object mappings are provided to instances of `RKMapperOperation` and `RKMappingOperation` to perform the transformations they describe. + + Object mappings are containers of property mappings that describe the actual key path transformations. There are two types of property mappings: + + 1. `RKAttributeMapping`: An attribute mapping describes a transformation between a single value from a source key path to a destination key path. The value to be mapped is read from the source object representation using `valueForKeyPath:` and then set to the destination key path using `setValueForKeyPath:`. Before the value is set, the `RKObjecMappingOperation` performing the mapping performs runtime introspection on the destination property to determine what, if any, type transformation is to be performed. Typical type transformations include reading an `NSString` value representation and mapping it to an `NSDecimalNumber` destination key path or reading an `NSString` and transforming it into an `NSDate` value before assigning to the destination. + 1. `RKRelationshipMapping`: A relationship mapping describes a transformation between a nested child object or objects from a source key path to a destination key path using another `RKObjectMapping`. The child objects to be mapped are read from the source object representation using `valueForKeyPath:`, then mapped recursively using the object mapping associated with the relationship mapping, and then finally assigned to the destination key path. Before assignment to the destination key path runtime type introspection is performed to determine if any type transformation is necessary. For relationship mappings, common type transformations include transforming a single object value in an `NSArray` or transforming an `NSArray` of object values into an `NSSet`. + + All type transformations available are discussed in detail in the documentation for `RKValueTransformer`. + + ## Transforming Representation to Property Keys + + Configuring object mappings can become quite repetitive if the keys in your serialized object representations follow a different convention than their local domain counterparts. For example, consider a typical JSON document in the "snake case" format: + + {"user": {"first_name": "Blake", "last_name": "Watters", "email_address": "blake@restkit.org"}} + + Typically when configuring a mapping for the object represented in this document we would transform the destination properties into the Objective-C idiomatic "llama case" variation. This can produce lengthy, error-prone mapping configurations in which the transformations are specified manually: + + RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[RKUser class]]; + [userMapping addAttributeMappingsFromDictionary:@{ @"first_name": @"firstName", @"last_name": @"lastName", @"email_address", @"emailAddress" }]; + + To combat this repetition, a block can be designated to perform a transformation on source keys to produce corresponding destination keys: + + [userMapping setSourceToDestinationKeyTransformationBlock:^NSString *(RKObjectMapping *mapping, NSString *sourceKey) { + // Value transformer compliments of TransformerKit (See https://github.com/mattt/TransformerKit) + return [[NSValueTransformer valueTransformerForName:TKLlamaCaseStringTransformerName] transformedValue:sourceKey]; + }]; + + With the block configured, the original configuration can be changed into a simpler array based invocation: + + [userMapping addAttributeMappingsFromArray:@[ @"first_name", @"last_name", @"email_address" ]]; + + Transformation blocks can be configured on a per-mapping basis via `setSourceToDestinationKeyTransformationBlock:` or globally via `[RKObjectMapping setDefaultSourceToDestinationKeyTransformationBlock:]`. + + @see `RKAttributeMapping` + @see `RKRelationshipMapping` + @see `RKConnectionMapping` + @see `RKMappingOperation` + @see `RKPropertyInspector` + */ +@interface RKObjectMapping : RKMapping <NSCopying> + +///--------------------------------- +/// @name Creating an Object Mapping +///--------------------------------- + +/** + Returns an object mapping for the specified class that is ready for configuration + + @param objectClass The class that the mapping targets. + @return A new mapping object. + */ ++ (instancetype)mappingForClass:(Class)objectClass; + +/** + Initializes the receiver with a given object class. This is the designated initializer. + + @param objectClass The class that the mapping targets. Cannot be `nil`. + @return The receiver, initialized with the given class. + */ +- (instancetype)initWithClass:(Class)objectClass NS_DESIGNATED_INITIALIZER; + +/** + Returns an object mapping with an `objectClass` of `NSMutableDictionary`. + + Request mappings are used when configuring mappings that are to be used for transforming local objects into HTTP parameters using the `RKObjectParameterization` class. + + @return An object mapping with an object class of `NSMutableDictionary`. + @see `RKObjectParameterization` + @see `RKObjectManager` + */ ++ (RKObjectMapping *)requestMapping; + +///---------------------------------- +/// @name Accessing Property Mappings +///---------------------------------- + +/** + The aggregate collection of attribute and relationship mappings within this object mapping. + */ +@property (nonatomic, copy, readonly) NSArray *propertyMappings; + +/** + Returns the property mappings of the receiver in a dictionary, where the keys are the source key paths and the values are instances of `RKAttributeMapping` or `RKRelationshipMapping`. + + @return The property mappings of the receiver in a dictionary, where the keys are the source key paths and the values are instances of `RKAttributeMapping` or `RKRelationshipMapping`. + @warning Note this method does not return any property mappings with a `nil` value for the source key path in the dictionary returned. + */ +@property (nonatomic, readonly) NSDictionary *propertyMappingsBySourceKeyPath; + +/** + Returns the property mappings of the receiver in a dictionary, where the keys are the destination key paths and the values are instances of `RKAttributeMapping` or `RKRelationshipMapping`. + + @return The property mappings of the receiver in a dictionary, where the keys are the destination key paths and the values are instances of `RKAttributeMapping` or `RKRelationshipMapping`. + @warning Note this method does not return any property mappings with a `nil` value for the source key path in the dictionary returned. + */ +@property (nonatomic, readonly) NSDictionary *propertyMappingsByDestinationKeyPath; + +/** + The collection of attribute mappings within this object mapping. + */ +@property (nonatomic, readonly) NSArray *attributeMappings; + +/** + The collection of single key attribute mappings within this object mapping. + + These are mappings where the source key path is a single key, and not a key path with multiple components. + */ +@property (nonatomic, readonly) NSArray *keyAttributeMappings; + +/** + The collection of key path attribute mappings within this object mapping. + + A key path mapping is one where the source key path is actually a path with multiple components. + */ +@property (nonatomic, readonly) NSArray *keyPathAttributeMappings; + +/** + The collection of relationship mappings within this object mapping. + */ +@property (nonatomic, readonly) NSArray *relationshipMappings; + +/** + Returns the property mapping registered with the receiver with the given source key path. + + @param sourceKeyPath The key path to retrieve. + */ +- (id)mappingForSourceKeyPath:(NSString *)sourceKeyPath; + +/** + Returns the property mapping registered with the receiver with the given destinationKeyPath key path. + + @param destinationKeyPath The key path to retrieve. + */ +- (id)mappingForDestinationKeyPath:(NSString *)destinationKeyPath; + +///--------------------------- +/// Managing Property Mappings +///--------------------------- + +/** + Adds a property mapping to the receiver. + + @param propertyMapping The property mapping to be added to the object mapping. + */ +- (void)addPropertyMapping:(RKPropertyMapping *)propertyMapping; + +/** + Adds an array of `RKAttributeMapping` or `RKRelationshipMapping` objects to the receiver. + + @param arrayOfPropertyMappings The array of property mappings to be added to the object mapping. + */ +- (void)addPropertyMappingsFromArray:(NSArray *)arrayOfPropertyMappings; + +/** + Removes an `RKAttributeMapping` or `RKRelationshipMapping` from the receiver. + + @param propertyMapping The attribute or relationship mapping to remove. + */ +- (void)removePropertyMapping:(RKPropertyMapping *)propertyMapping; + +/** + Adds attribute mappings from a given dictionary wherein the keys represent the source key path and the values represent the names of the target attributes on the destination object. + + @param keyPathToAttributeNames A dictionary keyed by source key to destination attribute name. + */ +- (void)addAttributeMappingsFromDictionary:(NSDictionary *)keyPathToAttributeNames; + +/** + Adds attribute mappings to the receiver from a given array. + + The array can contain `RKAttributeMapping` objects or `NSString` values. If an `NSString` is given, then a new `RKAttributeMapping` object is instantiated with a `sourceKeyPath` and `destinationKeyPath` equal to the string value. + + @param arrayOfAttributeNamesOrMappings An array of `RKAttributeMapping` or `NSString` values to be added to the receiver's set of attribute mappings, + */ +- (void)addAttributeMappingsFromArray:(NSArray *)arrayOfAttributeNamesOrMappings; + +/** + Adds a relationship mapping to the receiver with the given source key path and mapping. + + The destination key path will be the same as the source key path or processed by the source to destination key transformation block, if any is configured. + + @param sourceKeyPath The source key path at which to read the nested representation of the related objects. + @param mapping The object mapping with which to process the related object representation. + */ +- (void)addRelationshipMappingWithSourceKeyPath:(NSString *)sourceKeyPath mapping:(RKMapping *)mapping; + +///------------------------------------- +/// @name Configuring Key Transformation +///------------------------------------- + +/** + Sets an application-wide default transformation block to be used when attribute or relationship mappings are added to an object mapping by source key path. + + @param block The block to be set as the default source to destination key transformer for all object mappings in the application. + @see [RKObjectMapping setPropertyNameTransformationBlock:] + */ ++ (void)setDefaultSourceToDestinationKeyTransformationBlock:(NSString * (^)(RKObjectMapping *mapping, NSString *sourceKey))block; + +/** + Sets a block to executed to transform a source key into a destination key. + + The transformation block set with this method is used whenever an attribute or relationship mapping is added to the receiver via a method that accepts a string value for the source key. The block will be executed with the source key as the only argument and the value returned will be taken as the corresponding destination key. Methods on the `RKObjectMapping` class that will trigger the execution of the block configured via this method include: + * `addAttributeMappingsFromArray:` - Each string element contained in the given array is interpretted as a source key path and will be evaluated with the block to obtain a corresponding destination key path. + * `addRelationshipMappingWithSourceKeyPath:mapping:` - The source key path will be evaluated with the block to obtain a corresponding destination key path. + + @param block The block to execute when the receiver needs to transform a source key into a destination key. The block has a string return value specifying the destination key and accepts a single string argument: the source key that is to be transformed. + @warning Please note that the block given accepts a **key** as opposed to a **key path**. When a key path is given to a method supporting key transformation it will be decomposed into its key components by splitting the key path at the '.' (period) character, then each key will be evaluated using the transformation block and the results will be joined together into a new key path with the period character delimiter. + */ +- (void)setSourceToDestinationKeyTransformationBlock:(NSString * (^)(RKObjectMapping *mapping, NSString *sourceKey))block; + +///---------------------------------- +/// @name Mapping Nested Dictionaries +///---------------------------------- + +/** + Adds an attribute mapping from a dynamic nesting key value to an attribute. The mapped attribute name can then be referenced within other attribute mappings to access the nested content. + + For example, consider the following JSON: + + { "users": + { + "blake": { "id": 1234, "email": "blake@restkit.org" }, + "rachit": { "id": 5678, "email": "rachit@restkit.org" } + } + } + + We can configure our mappings to handle this in the following form: + + RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[User class]]; + mapping.forceCollectionMapping = YES; // RestKit cannot infer this is a collection, so we force it + [mapping addAttributeMappingFromKeyOfRepresentationToAttribute:@"firstName"]; + [mapping addAttributeMappingsFromDictionary:@{ @"{firstName}.id": @"userID", @"{firstName}.email": @"email" }]; + */ +- (void)addAttributeMappingFromKeyOfRepresentationToAttribute:(NSString *)attributeName; + +/** + Adds an attribute mapping to a dynamic nesting key from an attribute. The mapped attribute name can then be referenced wthin other attribute mappings to map content under the nesting key path. + + For example, consider that we wish to map a local user object with the properties 'id', 'firstName' and 'email': + + RKUser *user = [RKUser new]; + user.firstName = @"blake"; + user.userID = @(1234); + user.email = @"blake@restkit.org"; + + And we wish to map it into JSON that looks like: + + { "blake": { "id": 1234, "email": "blake@restkit.org" } } + + We can configure our request mapping to handle this like so: + + RKObjectMapping *mapping = [RKObjectMapping requestMapping]; + [mapping addAttributeMappingToKeyOfRepresentationFromAttribute:@"firstName"]; + [mapping addAttributeMappingsFromDictionary:@{ @"userID": @"{firstName}.id", @"email": @"{firstName}.email" }]; + */ +- (void)addAttributeMappingToKeyOfRepresentationFromAttribute:(NSString *)attributeName; + +///---------------------------------- +/// @name Configuring Mapping Options +///---------------------------------- + +/** + The target class that the receiver describes a mapping for. + */ +@property (nonatomic, weak, readonly) Class objectClass; + +/** + When `YES`, any attributes that have mappings defined but are not present within the source object will be set to nil, clearing any existing value. + + **Default**: `NO` + */ +@property (nonatomic, assign) BOOL assignsDefaultValueForMissingAttributes; + +/** + When `YES`, any relationships that have mappings defined but are not present within the source object will be set to `nil`, clearing any existing value. + + **Default**: `NO` + */ +@property (nonatomic, assign) BOOL assignsNilForMissingRelationships; + +/** + When `YES`, key-value validation will be invoked at object mapping time. + + **Default**: `YES` + @see `validateValue:forKey:error:` + */ +@property (nonatomic, assign) BOOL performsKeyValueValidation; + +/** + A value transformer with which to process input values being mapped with the receiver. Defaults to a copy of `[RKValueTransformer defaultTransformer]`. + */ +@property (nonatomic, strong) id<RKValueTransforming> valueTransformer; + +/** + Returns the default value to be assigned to the specified attribute when it is missing from a mappable payload. + + The default implementation returns nil for transient object mappings. On an entity mapping, the default value returned from the Entity definition will be used. + + @see `[RKEntityMapping defaultValueForAttribute:]` + */ +- (id)defaultValueForAttribute:(NSString *)attributeName; + +///---------------------------------- +/// @name Generating Inverse Mappings +///---------------------------------- + +/** + Generates an inverse mapping for the rules specified within this object mapping. + + This can be used to quickly generate a corresponding serialization mapping from a configured object mapping. The inverse mapping will have the source and destination keyPaths swapped for all attribute and relationship mappings. All mapping configuration and date formatters are copied from the parent to the inverse mapping. + + @return A new mapping that will map the inverse of the receiver. + */ +- (RKObjectMapping *)inverseMapping; + +/** + Generates an inverse mapping with all property mappings of the receiver that pass the given test. Each `RKAttributeMapping` and `RKRelationshipMapping` added to the receiver is yielded to the block for evaluation. The block is also invoked for any nested relationships that are traversed during the inversion process. + + @param predicate A block object to be invoked for each `RKPropertyMapping` that is considered for inversion. The block has a Boolean return value and accepts a single argument: the property mapping that is being evaluated for inversion. + @return A new mapping that will map the inverse of the receiver. + @see inverseMapping + */ +- (RKObjectMapping *)inverseMappingWithPropertyMappingsPassingTest:(BOOL (^)(RKPropertyMapping *propertyMapping))predicate; + +///--------------------------------------------------- +/// @name Obtaining Information About the Target Class +///--------------------------------------------------- + +/** + Returns the class of the attribute or relationship property of the target `objectClass` with the given name. + + Given the name of a string property, this will return an `NSString`, etc. + + @param propertyName The name of the property we would like to retrieve the type of. + @return The class of the property. + */ +- (Class)classForProperty:(NSString *)propertyName; + +/** + Returns the class of the attribute or relationship property of the target `objectClass` at the given key path. + + Given a key path to a string property, this will return an `NSString`, etc. + + @param keyPath The name of the property we would like to retrieve the type of. + @return The class of the property at the given key path. + */ +- (Class)classForKeyPath:(NSString *)keyPath; + +@end + +///////////////////////////////////////////////////////////////////////////// + +/** + **Deprecated in v0.21.0** + + This category contains deprecated API interfaces for configuring date formatters. Starting in RestKit 0.20.4 date formatting is configured via the `RKValueTransformer` API's. + + Defines the interface for configuring time and date formatting handling within RestKit object mappings. For performance reasons, RestKit reuses a pool of date formatters rather than constructing them at mapping time. This collection of date formatters can be configured on a per-object mapping or application-wide basis using the static methods exposed in this category. + */ +@interface RKObjectMapping (LegacyDateAndTimeFormatting) + +/** + **Deprecated in v0.21.0** + + This method accesses `[RKValueTransformer defaultTransformer]` and returns all `NSDate` <-> `NSString` value transformers. + + Returns the collection of default date formatters that will be used for all object mappings that have not been configured specifically. + + Out of the box, RestKit initializes default date formatters for you in the UTC time zone with the following format strings: + + * `yyyy-MM-dd'T'HH:mm:ss'Z'` + * `MM/dd/yyyy` + + @return An array of `NSFormatter` objects used when mapping strings into NSDate attributes + */ ++ (NSArray *)defaultDateFormatters DEPRECATED_ATTRIBUTE_MESSAGE("Configure `[RKValueTransformer defaultValueTransformer]` instead"); + +/** + **Deprecated in v0.21.0** + + This method accesses `[RKValueTransformer defaultTransformer]` and removes all `NSDate` <-> `NSString` value transformers that are instances of `NSFormatter` and then adds the given array of formatters to the default transformer. + + Sets the collection of default date formatters to the specified array. The array should contain configured instances of NSDateFormatter in the order in which you want them applied during object mapping operations. + + @param dateFormatters An array of date formatters to replace the existing defaults. + @see `defaultDateFormatters` + */ ++ (void)setDefaultDateFormatters:(NSArray *)dateFormatters DEPRECATED_ATTRIBUTE_MESSAGE("Configure `[RKValueTransformer defaultValueTransformer]` instead"); + +/** + **Deprecated in v0.21.0** + + This methods prepends the given date formatter to `[RKValueTransformer defaultValueTransformer]`. + + Adds a date formatter instance to the default collection + + @param dateFormatter An `NSFormatter` object to prepend to the default formatters collection + @see `defaultDateFormatters` + */ ++ (void)addDefaultDateFormatter:(NSFormatter *)dateFormatter DEPRECATED_ATTRIBUTE_MESSAGE("Configure `[RKValueTransformer defaultValueTransformer]` instead"); + +/** + **Deprecated in v0.21.0** + + This method instantiates a new `NSDateFormatter` object with the given format string and time zone and prepends it to `[RKValueTransformer defaultValueTransformer]`. + + Convenience method for quickly constructing a date formatter and adding it to the collection of default date formatters. The locale is auto-configured to `en_US_POSIX`. + + @param dateFormatString The dateFormat string to assign to the newly constructed `NSDateFormatter` instance + @param nilOrTimeZone The NSTimeZone object to configure on the `NSDateFormatter` instance. Defaults to UTC time. + @see `NSDateFormatter` + */ ++ (void)addDefaultDateFormatterForString:(NSString *)dateFormatString inTimeZone:(NSTimeZone *)nilOrTimeZone DEPRECATED_ATTRIBUTE_MESSAGE("Configure `[RKValueTransformer defaultValueTransformer]` instead"); + +/** + **Deprecated in v0.21.0** + + This method returns the first `NSString` -> `NSDate` value transformer that is an instance of `NSFormatter` in `[RKValueTransformer defaultValueTransformer]`. + + Returns the preferred date formatter to use when generating NSString representations from NSDate attributes. This type of transformation occurs when RestKit is mapping local objects into JSON or form encoded serializations that do not have a native time construct. + + Defaults to an instance of the `RKISO8601DateFormatter` configured with the UTC time-zone. The format string is equal to "yyyy-MM-DDThh:mm:ssTZD" + + For details about the ISO-8601 format, see http://www.w3.org/TR/NOTE-datetime + + @return The preferred NSFormatter object to use when serializing dates into strings + */ ++ (NSFormatter *)preferredDateFormatter DEPRECATED_ATTRIBUTE_MESSAGE("Access `[RKValueTransformer defaultValueTransformer]` instead"); + +/** + **Deprecated in v0.21.0** + + This method inserts the given date formatter at position zero in `[RKValueTransformer defaultValueTransformer]`, ensuring that it will be used for all transformations from `NSDate` -> `NSString`. + + Sets the preferred date formatter to use when generating NSString representations from NSDate attributes. This type of transformation occurs when RestKit is mapping local objects into JSON or form encoded serializations that do not have a native time construct. + + @param dateFormatter The NSFormatter object to designate as the new preferred instance + */ ++ (void)setPreferredDateFormatter:(NSFormatter *)dateFormatter DEPRECATED_ATTRIBUTE_MESSAGE("Configure `[RKValueTransformer defaultValueTransformer]` instead"); + +///---------------------------------- +/// @name Configuring Date Formatters +///---------------------------------- + +/** + **Deprecated in v0.21.0** + + An array of `NSFormatter` objects to use when mapping string values into `NSDate` attributes on the target `objectClass`. Each date formatter will be invoked with the string value being mapped until one of the date formatters does not return nil. + + Defaults to the application-wide collection of date formatters configured via `[RKObjectMapping setDefaultDateFormatters:]` + + @see `[RKObjectMapping defaultDateFormatters]` + */ +@property (nonatomic, strong) NSArray *dateFormatters DEPRECATED_ATTRIBUTE_MESSAGE("Use `valueTransformer` instead"); + +/** + **Deprecated in v0.21.0** + + The `NSFormatter` object for your application's preferred date and time configuration. This date formatter will be used when generating string representations of NSDate attributes (i.e. during serialization to URL form encoded or JSON format). + + Defaults to the application-wide preferred date formatter configured via: `[RKObjectMapping setPreferredDateFormatter:]` + + @see `[RKObjectMapping preferredDateFormatter]` + */ +@property (nonatomic, strong) NSFormatter *preferredDateFormatter DEPRECATED_ATTRIBUTE_MESSAGE("Use `valueTransformer` instead"); + +@end + +@interface RKObjectMapping (Deprecations) +// These methods were named to be more idiomation. Properties beginning with `set` generate method names like `setSetDefaultValueForMissingAttributes` and `performKeyValueValidation` reads more as a command to perform something than a configuration switch. +@property (nonatomic, assign, getter = shouldSetDefaultValueForMissingAttributes) BOOL setDefaultValueForMissingAttributes DEPRECATED_ATTRIBUTE_MESSAGE("Renamed to `assignsDefaultValueForMissingAttributes`"); +@property (nonatomic, assign) BOOL setNilForMissingRelationships DEPRECATED_ATTRIBUTE_MESSAGE("Renamed to `assignsNilForMissingRelationships`"); +@property (nonatomic, assign) BOOL performKeyValueValidation DEPRECATED_ATTRIBUTE_MESSAGE("Renamed to `performsKeyValueValidation`"); +@end + +///---------------- +/// @name Functions +///---------------- + +/** + Returns an date representation of a given string value by attempting to parse the string with all default date formatters in turn. + + @param dateString A string object encoding a date value. + @return An `NSDate` object parsed from the given string, or `nil` if the string was found to be unparsable by all default date formatters. + @see [RKObjectMapping defaultDateFormatters] + */ +NSDate *RKDateFromString(NSString *dateString); + +/** + Returns a string representation of a given date formatted with the preferred date formatter. + + This is a convenience function that is equivalent to the following example code: + + NSString *string = [[RKObjectMapping preferredDateFormatter] stringForObjectValue:date] + + @param date The date object to be formatted. + @return An `NSString` object representation of the given date formatted by the preferred date formatter. + @see [RKObjectMapping preferredDateFormatter] + */ +NSString *RKStringFromDate(NSDate *date); diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKObjectMapping.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKObjectMapping.m new file mode 100644 index 0000000..f0cd0f8 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKObjectMapping.m @@ -0,0 +1,624 @@ +// +// RKObjectMapping.m +// RestKit +// +// Created by Blake Watters on 4/30/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <CoreFoundation/CoreFoundation.h> +#import "RKObjectMapping.h" +#import "RKRelationshipMapping.h" +#import "RKPropertyInspector.h" +#import "RKLog.h" +#import "RKAttributeMapping.h" +#import "RKRelationshipMapping.h" +#import "RKValueTransformers.h" +#import "ISO8601DateFormatterValueTransformer.h" + +typedef NSString * (^RKSourceToDesinationKeyTransformationBlock)(RKObjectMapping *, NSString *); + +// Constants +NSString * const RKObjectMappingNestingAttributeKeyName = @"<RK_NESTING_ATTRIBUTE>"; + +static RKSourceToDesinationKeyTransformationBlock defaultSourceToDestinationKeyTransformationBlock = nil; + +@interface RKObjectMapping (Copying) +- (void)copyPropertiesFromMapping:(RKObjectMapping *)mapping; +@end + +@interface RKMappingInverter : NSObject +@property (nonatomic, strong) RKObjectMapping *mapping; +@property (nonatomic, strong) NSMutableDictionary *invertedMappings; + +- (instancetype)initWithMapping:(RKObjectMapping *)mapping; +- (RKObjectMapping *)inverseMappingWithPredicate:(BOOL (^)(RKPropertyMapping *propertyMapping))predicate; +@end + +@implementation RKMappingInverter + +- (instancetype)initWithMapping:(RKObjectMapping *)mapping +{ + self = [self init]; + if (self) { + self.mapping = mapping; + self.invertedMappings = [NSMutableDictionary dictionary]; + } + return self; +} + +- (RKObjectMapping *)invertMapping:(RKObjectMapping *)mapping withPredicate:(BOOL (^)(RKPropertyMapping *propertyMapping))predicate +{ + // Use an NSValue to obtain a non-copied key into our inversed mappings dictionary + NSValue *dictionaryKey = [NSValue valueWithNonretainedObject:mapping]; + RKObjectMapping *inverseMapping = (self.invertedMappings)[dictionaryKey]; + if (inverseMapping) return inverseMapping; + + inverseMapping = [RKObjectMapping requestMapping]; + (self.invertedMappings)[dictionaryKey] = inverseMapping; + [inverseMapping copyPropertiesFromMapping:mapping]; + // We want to serialize `nil` values + inverseMapping.assignsDefaultValueForMissingAttributes = YES; + + for (RKAttributeMapping *attributeMapping in mapping.attributeMappings) { + if (predicate && !predicate(attributeMapping)) continue; + [inverseMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:attributeMapping.destinationKeyPath toKeyPath:attributeMapping.sourceKeyPath]]; + } + + for (RKRelationshipMapping *relationshipMapping in mapping.relationshipMappings) { + RKObjectMapping *mapping = (RKObjectMapping *) relationshipMapping.mapping; + if (! [mapping isKindOfClass:[RKObjectMapping class]]) { + RKLogWarning(@"Unable to generate inverse mapping for relationship '%@': %@ relationships cannot be inversed.", relationshipMapping.sourceKeyPath, NSStringFromClass([mapping class])); + continue; + } + if (predicate && !predicate(relationshipMapping)) continue; + RKMapping *inverseRelationshipMapping = [self invertMapping:mapping withPredicate:predicate]; + if (inverseRelationshipMapping) [inverseMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:relationshipMapping.destinationKeyPath toKeyPath:relationshipMapping.sourceKeyPath withMapping:inverseRelationshipMapping]]; + } + + return inverseMapping; +} + +- (RKObjectMapping *)inverseMappingWithPredicate:(BOOL (^)(RKPropertyMapping *propertyMapping))predicate +{ + return [self invertMapping:self.mapping withPredicate:predicate]; +} + +@end + +@interface RKPropertyMapping () +@property (nonatomic, weak, readwrite) RKObjectMapping *objectMapping; +@end + +@interface RKObjectMapping () +@property (nonatomic, weak, readwrite) Class objectClass; +@property (nonatomic, copy, readwrite) NSArray *propertyMappings; + +@property (nonatomic, strong) NSArray *relationshipMappings; +@property (nonatomic, strong) NSArray *attributeMappings; +@property (nonatomic, strong) NSArray *keyAttributeMappings; +@property (nonatomic, strong) NSArray *keyPathAttributeMappings; +@property (nonatomic, strong) NSMutableDictionary *propertiesBySourceKeyPath; +@property (nonatomic, strong) NSMutableDictionary *propertiesByDestinationKeyPath; + +@property (nonatomic, weak, readonly) NSArray *mappedKeyPaths; +@property (nonatomic, copy) RKSourceToDesinationKeyTransformationBlock sourceToDestinationKeyTransformationBlock; +@end + +@implementation RKObjectMapping + ++ (instancetype)mappingForClass:(Class)objectClass +{ + return [[self alloc] initWithClass:objectClass]; +} + ++ (RKObjectMapping *)requestMapping +{ + if (! [self isEqual:[RKObjectMapping class]]) { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"`%@` is not meant to be invoked on `%@`. You probably want to invoke `[RKObjectMapping requestMapping]`.", + NSStringFromSelector(_cmd), + NSStringFromClass(self)] + userInfo:nil]; + } + + // TODO: Hook up value transformers from `RKObjectParameterization` + RKObjectMapping *objectMapping = [self mappingForClass:[NSMutableDictionary class]]; + objectMapping.assignsDefaultValueForMissingAttributes = YES; + return objectMapping; +} + ++ (void)initialize +{ + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + // Add an ISO8601DateFormatter to the transformation stack for backwards compatibility + RKISO8601DateFormatter *dateFormatter = [RKISO8601DateFormatter defaultISO8601DateFormatter]; + [[RKValueTransformer defaultValueTransformer] insertValueTransformer:dateFormatter atIndex:0]; + }); +} + +// Compiler requires we override this. +- (instancetype)init +{ + self = [self initWithClass:nil]; + NSAssert(NO, @"Failed to call designated initializer of %@", self); + return self; +} + +- (instancetype)initWithClass:(Class)objectClass +{ + self = [super init]; + if (self) { + self.objectClass = objectClass; + self.propertyMappings = [NSArray new]; + self.relationshipMappings = [NSArray new]; + self.attributeMappings = [NSArray new]; + self.keyAttributeMappings = [NSArray new]; + self.keyPathAttributeMappings = [NSArray new]; + self.propertiesBySourceKeyPath = [NSMutableDictionary new]; + self.propertiesByDestinationKeyPath = [NSMutableDictionary new]; + self.assignsDefaultValueForMissingAttributes = NO; + self.assignsNilForMissingRelationships = NO; + self.forceCollectionMapping = NO; + self.performsKeyValueValidation = YES; + self.sourceToDestinationKeyTransformationBlock = defaultSourceToDestinationKeyTransformationBlock; + self.valueTransformer = [[RKValueTransformer defaultValueTransformer] copy]; + } + + return self; +} + +- (void)copyPropertiesFromMapping:(RKObjectMapping *)mapping +{ + self.assignsDefaultValueForMissingAttributes = mapping.assignsDefaultValueForMissingAttributes; + self.assignsNilForMissingRelationships = mapping.assignsNilForMissingRelationships; + self.forceCollectionMapping = mapping.forceCollectionMapping; + self.performsKeyValueValidation = mapping.performsKeyValueValidation; + self.valueTransformer = mapping.valueTransformer; + self.sourceToDestinationKeyTransformationBlock = mapping.sourceToDestinationKeyTransformationBlock; +} + +- (id)copyWithZone:(NSZone *)zone +{ + RKObjectMapping *copy = [[[self class] allocWithZone:zone] initWithClass:self.objectClass]; + [copy copyPropertiesFromMapping:self]; + + for (RKPropertyMapping *propertyMapping in self.propertyMappings) { + [copy addPropertyMapping:[propertyMapping copy]]; + } + + return copy; +} + ++ (void)setDefaultSourceToDestinationKeyTransformationBlock:(RKSourceToDesinationKeyTransformationBlock)block +{ + defaultSourceToDestinationKeyTransformationBlock = block; +} + +- (NSDictionary *)propertyMappingsBySourceKeyPath +{ + return [self.propertiesBySourceKeyPath copy]; +} + +- (NSDictionary *)propertyMappingsByDestinationKeyPath +{ + return [self.propertiesByDestinationKeyPath copy]; +} + +- (NSArray *)mappedKeyPaths +{ + return [self.propertyMappings valueForKey:@"destinationKeyPath"]; +} + +- (NSArray *)attributeMappings +{ + return _attributeMappings; +} + +- (NSArray *)relationshipMappings +{ + return _relationshipMappings; +} + +- (NSArray *)keyAttributeMappings +{ + return _keyAttributeMappings; +} + +- (NSArray *)keyPathAttributeMappings +{ + return _keyPathAttributeMappings; +} + +static NSArray *RKAddProperty(NSArray *array, RKPropertyMapping *mapping) +{ + return (array)? [array arrayByAddingObject:mapping] : @[mapping]; +} + +static NSArray *RKRemoveProperty(NSArray *array, RKPropertyMapping *mapping) +{ + if (![array containsObject:mapping]) return array; + NSMutableArray *mappings = [[NSMutableArray alloc] initWithArray:array]; //alloc/init avoids autorelease + [mappings removeObject:mapping]; + return [mappings copy]; +} + +- (void)addPropertyMapping:(RKPropertyMapping *)propertyMapping +{ + NSAssert1([[self mappedKeyPaths] containsObject:propertyMapping.destinationKeyPath] == NO, + @"Unable to add mapping for keyPath %@, one already exists...", propertyMapping.destinationKeyPath); + NSAssert(self.propertyMappings, @"self.propertyMappings is nil"); + NSAssert(propertyMapping.objectMapping == nil, @"Cannot add a property mapping object that has already been added to another `RKObjectMapping` object. You probably want to obtain a copy of the mapping: `[propertyMapping copy]`"); + propertyMapping.objectMapping = self; + self.propertyMappings = [self.propertyMappings arrayByAddingObject:propertyMapping]; + [self.propertiesBySourceKeyPath setObject:propertyMapping forKey:propertyMapping.sourceKeyPath ?: [NSNull null]]; + if (propertyMapping.destinationKeyPath) (self.propertiesByDestinationKeyPath)[propertyMapping.destinationKeyPath] = propertyMapping; + if ([propertyMapping isMemberOfClass:[RKRelationshipMapping class]]) { + self.relationshipMappings = RKAddProperty(self.relationshipMappings, propertyMapping); + } + else if ([propertyMapping isMemberOfClass:[RKAttributeMapping class]]) + { + self.attributeMappings = RKAddProperty(self.attributeMappings, propertyMapping); + if ([propertyMapping.sourceKeyPath rangeOfString:@"." options:NSLiteralSearch].length == 0) { + self.keyAttributeMappings = RKAddProperty(self.keyAttributeMappings, propertyMapping); + } + else { + self.keyPathAttributeMappings = RKAddProperty(self.keyPathAttributeMappings, propertyMapping); + } + } + + if (propertyMapping.propertyValueClass == Nil && ![self.objectClass isSubclassOfClass:[NSDictionary class]]) { + propertyMapping.propertyValueClass = [self classForKeyPath:propertyMapping.destinationKeyPath]; + } +} + +- (void)addPropertyMappingsFromArray:(NSArray *)arrayOfPropertyMappings +{ + NSAssert([[arrayOfPropertyMappings valueForKeyPath:@"@distinctUnionOfObjects.objectMapping"] count] == 0, @"One or more of the property mappings in the given array has already been added to another `RKObjectMapping` object. You probably want to obtain a copy of the array of mappings: `[[NSArray alloc] initWithArray:arrayOfPropertyMappings copyItems:YES]`"); + for (RKPropertyMapping *propertyMapping in arrayOfPropertyMappings) { + [self addPropertyMapping:propertyMapping]; + } +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@:%p objectClass=%@ propertyMappings=%@>", + NSStringFromClass([self class]), self, NSStringFromClass(self.objectClass), self.propertyMappings]; +} + +- (id)mappingForSourceKeyPath:(NSString *)sourceKeyPath +{ + return _propertiesBySourceKeyPath[sourceKeyPath ?: [NSNull null]]; +} + +- (id)mappingForDestinationKeyPath:(NSString *)destinationKeyPath +{ + return _propertiesByDestinationKeyPath[destinationKeyPath]; +} + +// Evaluate each component individually so that camelization, etc. considers each component individually +- (NSString *)transformSourceKeyPath:(NSString *)keyPath +{ + if (!self.sourceToDestinationKeyTransformationBlock) return keyPath; + + NSRange dotRange = [keyPath rangeOfString:@"." options:NSLiteralSearch]; + if (dotRange.length == 0) { + return self.sourceToDestinationKeyTransformationBlock(self, keyPath); + } + + NSArray *components = [keyPath componentsSeparatedByString:@"."]; + NSMutableArray *mutableComponents = [NSMutableArray arrayWithCapacity:[components count]]; + [components enumerateObjectsUsingBlock:^(id component, NSUInteger idx, BOOL *stop) { + [mutableComponents addObject:self.sourceToDestinationKeyTransformationBlock(self, component)]; + }]; + + return [mutableComponents componentsJoinedByString:@"."]; +} + +- (void)addAttributeMappingsFromDictionary:(NSDictionary *)keyPathToAttributeNames +{ + for (NSString *attributeKeyPath in keyPathToAttributeNames) { + [self addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:attributeKeyPath toKeyPath:keyPathToAttributeNames[attributeKeyPath]]]; + } +} + +- (void)addAttributeMappingsFromArray:(NSArray *)arrayOfAttributeNamesOrMappings +{ + NSMutableArray *arrayOfAttributeMappings = [NSMutableArray arrayWithCapacity:[arrayOfAttributeNamesOrMappings count]]; + for (id entry in arrayOfAttributeNamesOrMappings) { + if ([entry isKindOfClass:[NSString class]]) { + NSString *destinationKeyPath = [self transformSourceKeyPath:entry]; + [arrayOfAttributeMappings addObject:[RKAttributeMapping attributeMappingFromKeyPath:entry toKeyPath:destinationKeyPath]]; + } else if ([entry isKindOfClass:[RKAttributeMapping class]]) { + [arrayOfAttributeMappings addObject:entry]; + } else { + [NSException raise:NSInvalidArgumentException + format:@"*** - [%@ %@]: Unable to attribute mapping from unsupported entry of type '%@' (%@).", NSStringFromClass([self class]), NSStringFromSelector(_cmd), NSStringFromClass([entry class]), entry]; + } + } + + [self addPropertyMappingsFromArray:arrayOfAttributeMappings]; +} + +- (void)addRelationshipMappingWithSourceKeyPath:(NSString *)sourceKeyPath mapping:(RKMapping *)mapping +{ + NSParameterAssert(sourceKeyPath); + NSParameterAssert(mapping); + + NSString *destinationKeyPath = [self transformSourceKeyPath:sourceKeyPath]; + RKRelationshipMapping *relationshipMapping = [RKRelationshipMapping relationshipMappingFromKeyPath:sourceKeyPath toKeyPath:destinationKeyPath withMapping:mapping]; + [self addPropertyMapping:relationshipMapping]; +} + +- (void)removePropertyMapping:(RKPropertyMapping *)attributeOrRelationshipMapping +{ + if ([self.propertyMappings containsObject:attributeOrRelationshipMapping]) { + attributeOrRelationshipMapping.objectMapping = nil; + self.propertyMappings = RKRemoveProperty(self.propertyMappings, attributeOrRelationshipMapping); + self.relationshipMappings = RKRemoveProperty(self.relationshipMappings, attributeOrRelationshipMapping); + self.attributeMappings = RKRemoveProperty(self.attributeMappings, attributeOrRelationshipMapping); + self.keyAttributeMappings = RKRemoveProperty(self.keyAttributeMappings, attributeOrRelationshipMapping); + self.keyPathAttributeMappings = RKRemoveProperty(self.keyPathAttributeMappings, attributeOrRelationshipMapping); + [self.propertiesBySourceKeyPath removeObjectForKey:attributeOrRelationshipMapping.sourceKeyPath ?: [NSNull null]]; + [self.propertiesByDestinationKeyPath removeObjectForKey:attributeOrRelationshipMapping.destinationKeyPath ?: [NSNull null]]; + } +} + +- (instancetype)inverseMappingWithPropertyMappingsPassingTest:(BOOL (^)(RKPropertyMapping *propertyMapping))predicate +{ + RKMappingInverter *mappingInverter = [[RKMappingInverter alloc] initWithMapping:self]; + return [mappingInverter inverseMappingWithPredicate:predicate]; +} + +- (instancetype)inverseMapping +{ + return [self inverseMappingWithPropertyMappingsPassingTest:nil]; +} + +- (void)addAttributeMappingFromKeyOfRepresentationToAttribute:(NSString *)attributeName +{ + [self addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:RKObjectMappingNestingAttributeKeyName toKeyPath:attributeName]]; +} + +- (void)addAttributeMappingToKeyOfRepresentationFromAttribute:(NSString *)attributeName +{ + [self addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:attributeName toKeyPath:RKObjectMappingNestingAttributeKeyName]]; +} + +- (RKAttributeMapping *)mappingForAttribute:(NSString *)attributeKey +{ + for (RKAttributeMapping *mapping in [self attributeMappings]) { + if ([mapping.destinationKeyPath isEqualToString:attributeKey]) { + return mapping; + } + } + + return nil; +} + +- (RKRelationshipMapping *)mappingForRelationship:(NSString *)relationshipKey +{ + for (RKRelationshipMapping *mapping in [self relationshipMappings]) { + if ([mapping.destinationKeyPath isEqualToString:relationshipKey]) { + return mapping; + } + } + + return nil; +} + +- (id)defaultValueForAttribute:(NSString *)attributeName +{ + return nil; +} + +- (Class)classForProperty:(NSString *)propertyName +{ + return [[RKPropertyInspector sharedInspector] classForPropertyNamed:propertyName ofClass:self.objectClass isPrimitive:nil]; +} + +- (Class)classForKeyPath:(NSString *)keyPath +{ + if (keyPath == nil) return self.objectClass; + + RKPropertyInspector *inspector = [RKPropertyInspector sharedInspector]; + + if ([keyPath rangeOfString:@"." options:NSLiteralSearch].length == 0) { + return [inspector classForPropertyNamed:keyPath ofClass:self.objectClass isPrimitive:nil]; + } + + NSArray *components = [keyPath componentsSeparatedByString:@"."]; + Class propertyClass = self.objectClass; + for (NSString *property in components) { + propertyClass = [inspector classForPropertyNamed:property ofClass:propertyClass isPrimitive:nil]; + if (! propertyClass) break; + } + + return propertyClass; +} + +- (BOOL)isEqualToMapping:(RKObjectMapping *)otherMapping +{ + if (! [otherMapping isKindOfClass:[RKObjectMapping class]]) return NO; + if ((self.objectClass && otherMapping.objectClass) && + ! [otherMapping.objectClass isEqual:self.objectClass]) { + return NO; + } else if (self.objectClass != nil && otherMapping.objectClass == nil) { + return NO; + } else if (self.objectClass == nil && otherMapping.objectClass != nil) { + return NO; + } + + // Check that the number of attribute/relationship mappings is equal and compare all + if ([self.propertyMappings count] != [otherMapping.propertyMappings count]) return NO; + + for (RKPropertyMapping *propertyMapping in self.propertyMappings) { + RKPropertyMapping *otherPropertyMapping = [otherMapping mappingForDestinationKeyPath:propertyMapping.destinationKeyPath]; + if (! [propertyMapping isEqualToMapping:otherPropertyMapping]) return NO; + } + + return YES; +} + +@end + +///////////////////////////////////////////////////////////////////////////// + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-implementations" + +@implementation RKObjectMapping (LegacyDateAndTimeFormatting) + ++ (NSArray *)defaultDateFormatters +{ + NSArray *valueTransformers = [[RKValueTransformer defaultValueTransformer] valueTransformersForTransformingFromClass:[NSString class] toClass:[NSDate class]]; + NSMutableArray *dateFormatters = [NSMutableArray arrayWithCapacity:[valueTransformers count]]; + for (id<RKValueTransforming> valueTransformer in valueTransformers) { + if ([valueTransformer respondsToSelector:@selector(dateFromString:)]) [dateFormatters addObject:valueTransformer]; + } + return dateFormatters; +} + ++ (void)setDefaultDateFormatters:(NSArray *)dateFormatters +{ + NSArray *defaultDateFormatters = [self defaultDateFormatters]; + for (NSDateFormatter *dateFormatter in defaultDateFormatters) { + [[RKValueTransformer defaultValueTransformer] removeValueTransformer:dateFormatter]; + } + + for (NSDateFormatter *dateFormatter in dateFormatters) { + [[RKValueTransformer defaultValueTransformer] addValueTransformer:dateFormatter]; + } +} + ++ (void)addDefaultDateFormatter:(id)dateFormatter +{ + [[RKValueTransformer defaultValueTransformer] insertValueTransformer:dateFormatter atIndex:0]; +} + ++ (void)addDefaultDateFormatterForString:(NSString *)dateFormatString inTimeZone:(NSTimeZone *)nilOrTimeZone +{ + NSDateFormatter *dateFormatter = [NSDateFormatter new]; + dateFormatter.dateFormat = dateFormatString; + dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; + dateFormatter.timeZone = nilOrTimeZone ?: [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; + [self addDefaultDateFormatter:dateFormatter]; +} + ++ (NSFormatter *)preferredDateFormatter +{ + NSArray *defaultDateFormatters = [self defaultDateFormatters]; + return [defaultDateFormatters count] ? defaultDateFormatters[0] : nil; +} + ++ (void)setPreferredDateFormatter:(NSDateFormatter *)dateFormatter +{ + [[RKValueTransformer defaultValueTransformer] insertValueTransformer:dateFormatter atIndex:0]; +} + +#pragma mark - Date and Time + +- (NSFormatter *)preferredDateFormatter +{ + if ([self.valueTransformer isKindOfClass:[RKCompoundValueTransformer class]]) { + NSArray *dateToStringTransformers = [(RKCompoundValueTransformer *)self.valueTransformer valueTransformersForTransformingFromClass:[NSDate class] toClass:[NSString class]]; + for (id<RKValueTransforming> valueTransformer in dateToStringTransformers) { + if ([valueTransformer isKindOfClass:[NSFormatter class]]) return (NSFormatter *)valueTransformer; + } + } + return nil; +} + +- (void)setPreferredDateFormatter:(NSFormatter *)preferredDateFormatter +{ + if ([self.valueTransformer isKindOfClass:[RKCompoundValueTransformer class]]) { + [(RKCompoundValueTransformer *)self.valueTransformer insertValueTransformer:(NSFormatter<RKValueTransforming> *)preferredDateFormatter atIndex:0]; + } +} + +- (NSArray *)dateFormatters +{ + if ([self.valueTransformer isKindOfClass:[RKCompoundValueTransformer class]]) { + return [(RKCompoundValueTransformer *)self.valueTransformer valueTransformersForTransformingFromClass:[NSDate class] toClass:[NSString class]]; + } else return nil; +} + +- (void)setDateFormatters:(NSArray *)dateFormatters +{ + if (! [self.valueTransformer isKindOfClass:[RKCompoundValueTransformer class]]) [NSException raise:NSInternalInconsistencyException format:@"Cannot set date formatters: the receiver's `valueTransformer` is not an instance of `RKCompoundValueTransformer`."]; + for (id<RKValueTransforming> dateFormatter in [self dateFormatters]) { + [(RKCompoundValueTransformer *)self.valueTransformer removeValueTransformer:dateFormatter]; + } + for (id<RKValueTransforming> dateFormatter in dateFormatters) { + [(RKCompoundValueTransformer *)self.valueTransformer addValueTransformer:dateFormatter]; + } +} + +@end + +@implementation RKObjectMapping (Deprecations) + +- (BOOL)shouldSetDefaultValueForMissingAttributes +{ + return self.assignsDefaultValueForMissingAttributes; +} + +- (void)setSetDefaultValueForMissingAttributes:(BOOL)setDefaultValueForMissingAttributes +{ + self.assignsDefaultValueForMissingAttributes = setDefaultValueForMissingAttributes; +} + +- (BOOL)setNilForMissingRelationships +{ + return self.assignsNilForMissingRelationships; +} + +- (void)setSetNilForMissingRelationships:(BOOL)setNilForMissingRelationships +{ + self.assignsNilForMissingRelationships = setNilForMissingRelationships; +} + +- (BOOL)performKeyValueValidation +{ + return self.performsKeyValueValidation; +} + +- (void)setPerformKeyValueValidation:(BOOL)performKeyValueValidation +{ + self.performsKeyValueValidation = performKeyValueValidation; +} + +@end + +#pragma clang diagnostic pop + +#pragma mark - Functions + +NSDate *RKDateFromString(NSString *dateString) +{ + NSDate *outputDate = nil; + NSError *error = nil; + BOOL success = [[RKValueTransformer defaultValueTransformer] transformValue:dateString toValue:&outputDate ofClass:[NSDate class] error:&error]; + return success ? outputDate : nil; +} + +NSString *RKStringFromDate(NSDate *date) +{ + NSString *outputString = nil; + NSError *error = nil; + BOOL success = [[RKValueTransformer defaultValueTransformer] transformValue:date toValue:&outputString ofClass:[NSString class] error:&error]; + return success ? outputString : nil; +} diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKObjectMappingMatcher.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKObjectMappingMatcher.h new file mode 100644 index 0000000..0313670 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKObjectMappingMatcher.h @@ -0,0 +1,111 @@ +// +// RKDynamicMappingMatcher.h +// RestKit +// +// Created by Jeff Arena on 8/2/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// + +#import <Foundation/Foundation.h> +#import "RKObjectMapping.h" + +/** + The `RKObjectMappingMatcher` class provides an interface for encapsulating the selection of an object mapping based on runtime values. Matcher objects may be configured by key path and expected value or with a predicate object. + + ## Key Path Matching + + A key path matcher object is initialized with a key path, an expected value to be read from the key path, and an object mapping that is to be applied if the match evaluates to `YES`. When evaluating the match, the matcher invokes `valueForKeyPath:` on the object being matched and compares the value returned with the `expectedValue` via the `RKObjectIsEqualToObject` function. This provides a flexible, semantic match of the property value. + + Alternatively, a key path matcher object can be initialized with an expected class instead. When evaluating the match, the matcher invokes `valueForKeyPath:` on the object being matched and compares the value returned with the `expectedClass` via the `isSubclassOfClass:` method. This provides a flexible, semantic match of the property value class. + + ## Predicate Matching + + A predicate matcher object is initialized with a predicate object and an object mapping that is to be applied if the predicate evaluates to `YES` for the object being matched. + */ +@interface RKObjectMappingMatcher : NSObject + +///------------------------------------- +/// @name Constructing Key Path Matchers +///------------------------------------- + +/** + Creates and returns a key path matcher object with a given key path, expected value, and an object mapping that applies in the event of a positive match. + + @param keyPath The key path to obtain the comparison value from the object being matched via `valueForKeyPath:`. + @param expectedValue The value that is expected to be read from `keyPath` if there is a match. + @param objectMapping The object mapping object that applies if the comparison value is equal to the expected value. + @return The receiver, initialized with the given key path, expected value, and object mapping. + */ ++ (instancetype)matcherWithKeyPath:(NSString *)keyPath expectedValue:(id)expectedValue objectMapping:(RKObjectMapping *)objectMapping; + +/** + Creates and returns a key path matcher object with a given key path, expected class, and an object mapping that applies in the event of a positive match. + + @param keyPath The key path to obtain the comparison value from the object being matched via `valueForKeyPath:`. + @param expectedClass The Class that is expected to be read from `keyPath` if there is a match. + @param objectMapping The object mapping object that applies if the comparison value is equal to the expected value. + @return The receiver, initialized with the given key path, expected value, and object mapping. + */ ++ (instancetype)matcherWithKeyPath:(NSString *)keyPath expectedClass:(Class)expectedClass objectMapping:(RKObjectMapping *)objectMapping; + +/** + Creates and returns a key path matcher object with a given key path, and a map of expected values to associated RKObjectMapping objects that applies in the event of a positive match with its associated value. This method can evaluate the keyPath once + + @param keyPath The key path to obtain the comparison value from the object being matched via `valueForKeyPath:`. + @param valueToObjectMapping The value that is expected to be read from `keyPath` if there is a match. + @return The receiver, initialized with the given key path and expected value map. + */ ++ (instancetype)matcherWithKeyPath:(NSString *)keyPath expectedValueMap:(NSDictionary *)valueToObjectMapping; + +///-------------------------------------- +/// @name Constructing Predicate Matchers +///-------------------------------------- + +/** + Creates and returns a predicate matcher object with a given predicate and an object mapping that applies in the predicate evaluates positively. + + @param predicate The predicate with which to evaluate the matched object. + @param objectMapping The object mapping object that applies if the predicate evaluates positively for the matched object. + @return The receiver, initialized with the given key path, expected value, and object mapping. + */ ++ (instancetype)matcherWithPredicate:(NSPredicate *)predicate objectMapping:(RKObjectMapping *)objectMapping; + + +/** + Creates and returns a matcher object with a given block which returns the RKObjectMapping instance to use, and an optional array of possible object mappings which could be returned. + + @param mappings The list of known possible RKObjectMapping instances which could be returned. This is used to aid RKDynamicMapping's -objectMappings method which is used in some instances, but is not required for mapping. The block could return a new instance if needed. + @param block The block with which to evaluate the matched object, and return the object mapping to use. Return nil if no match (i.e. a `NO` return from the `-matches:` method). + @return The receiver, initialized with the given block ans possible mappings. + */ ++ (instancetype)matcherWithPossibleMappings:(NSArray *)mappings block:(RKObjectMapping *(^)(id representation))block; + +///----------------------------------- +/// @name Accessing the Object Mapping +///----------------------------------- + +/** + Returns the list of all known RKObjectMapping instances which could be returned from this matcher. This is called when added to or removed from an RKDynamicMapping, and is used to populate the `objectMappings` property there. The default implementation returns the single value set in the `objectMapping` property, so if that is the only possibility then this method does not need to be overridden. + */ +@property (nonatomic, readonly) NSArray *possibleObjectMappings; + +/** + The object mapping object that applies when the receiver matches a given object. + + @see `matches:` + */ +@property (nonatomic, strong, readonly) RKObjectMapping *objectMapping; + +///------------------------- +/// @name Evaluating a Match +///------------------------- + +/** + Returns a Boolean value that indicates if the given object matches the expectations of the receiver. + + @param object The object to be evaluated. + @return `YES` if the object matches the expectations of the receiver, else `NO`. + */ +- (BOOL)matches:(id)object; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKObjectMappingMatcher.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKObjectMappingMatcher.m new file mode 100644 index 0000000..3abfe3c --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKObjectMappingMatcher.m @@ -0,0 +1,313 @@ +// +// RKDynamicMappingMatcher.m +// RestKit +// +// Created by Jeff Arena on 8/2/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// + +#import "RKObjectMappingMatcher.h" +#import "RKObjectUtilities.h" + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +@interface RKObjectMappingMatcher () +@property (nonatomic, strong, readwrite) RKObjectMapping *objectMapping; +@end + +@interface RKKeyPathObjectMappingMatcher : RKObjectMappingMatcher +@property (nonatomic, copy) NSString *keyPath; +@property (nonatomic, strong, readwrite) id expectedValue; + +- (instancetype)initWithKeyPath:(NSString *)keyPath expectedValue:(id)expectedValue objectMapping:(RKObjectMapping *)objectMapping NS_DESIGNATED_INITIALIZER; +@end + +@interface RKKeyPathClassObjectMappingMatcher : RKObjectMappingMatcher + +@property (nonatomic, copy) NSString *keyPath; +@property (nonatomic, readwrite) Class expectedClass; + +- (instancetype)initWithKeyPath:(NSString *)keyPath expectedClass:(Class)expectedClass objectMapping:(RKObjectMapping *)objectMapping NS_DESIGNATED_INITIALIZER; + +@end + +@interface RKKeyPathValueMapObjectMappingMatcher : RKObjectMappingMatcher +@property (nonatomic, copy) NSString *keyPath; +@property (nonatomic, copy) NSDictionary *valueMap; + +- (instancetype)initWithKeyPath:(NSString *)keyPath expectedValueMap:(NSDictionary *)valueToObjectMapping NS_DESIGNATED_INITIALIZER; +@end + +@interface RKPredicateObjectMappingMatcher : RKObjectMappingMatcher +@property (nonatomic, strong) NSPredicate *predicate; + +- (instancetype)initWithPredicate:(NSPredicate *)predicate objectMapping:(RKObjectMapping *)objectMapping NS_DESIGNATED_INITIALIZER; +@end + +@interface RKBlockObjectMatchingMatcher : RKObjectMappingMatcher +@property (nonatomic, copy) NSArray *possibleMappings; +@property (nonatomic, copy) RKObjectMapping *(^block)(id representation); +- (instancetype)initWithPossibleMappings:(NSArray *)mappings block:(RKObjectMapping *(^)(id representation))block NS_DESIGNATED_INITIALIZER; +@end + + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +@implementation RKObjectMappingMatcher + ++ (instancetype)matcherWithKeyPath:(NSString *)keyPath expectedValue:(id)expectedValue objectMapping:(RKObjectMapping *)objectMapping +{ + return [[RKKeyPathObjectMappingMatcher alloc] initWithKeyPath:keyPath expectedValue:expectedValue objectMapping:objectMapping]; +} + ++ (instancetype)matcherWithKeyPath:(NSString *)keyPath expectedClass:(Class)expectedClass objectMapping:(RKObjectMapping *)objectMapping +{ + return [[RKKeyPathClassObjectMappingMatcher alloc] initWithKeyPath:keyPath expectedClass:expectedClass objectMapping:objectMapping]; +} + ++ (instancetype)matcherWithKeyPath:(NSString *)keyPath expectedValueMap:(NSDictionary *)valueToObjectMapping +{ + return [[RKKeyPathValueMapObjectMappingMatcher alloc] initWithKeyPath:keyPath expectedValueMap:valueToObjectMapping]; +} + ++ (instancetype)matcherWithPredicate:(NSPredicate *)predicate objectMapping:(RKObjectMapping *)objectMapping +{ + return [[RKPredicateObjectMappingMatcher alloc] initWithPredicate:predicate objectMapping:objectMapping]; +} + ++ (instancetype)matcherWithPossibleMappings:(NSArray *)mappings block:(RKObjectMapping *(^)(id representation))block +{ + return [[RKBlockObjectMatchingMatcher alloc] initWithPossibleMappings:mappings block:block]; +} + +- (instancetype)init +{ + self = [super init]; + if (self) { + if ([self isMemberOfClass:[RKObjectMappingMatcher class]]) { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"%@ is not meant to be directly instantiated. Use one of the initializer methods instead.", + NSStringFromClass([self class])] + userInfo:nil]; + } + } + + return self; +} + +- (NSArray *)possibleObjectMappings +{ + RKObjectMapping *mapping = self.objectMapping; + return mapping ? @[mapping] : nil; +} + +- (BOOL)matches:(id)object +{ + return NO; +} + +@end + +@implementation RKKeyPathObjectMappingMatcher + +- (instancetype)init +{ + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"-init is not a valid initializer for the class %@, use -initWithKeyPath:expectedValue:objectMapping:", NSStringFromClass([self class])] + userInfo:nil]; + return [self init]; +} + +- (instancetype)initWithKeyPath:(NSString *)keyPath expectedValue:(id)expectedValue objectMapping:(RKObjectMapping *)objectMapping +{ + NSParameterAssert(keyPath); + NSParameterAssert(expectedValue); + NSParameterAssert(objectMapping); + self = [super init]; + if (self) { + self.keyPath = keyPath; + self.expectedValue = expectedValue; + self.objectMapping = objectMapping; + } + + return self; +} + +- (BOOL)matches:(id)object +{ + id value = [object valueForKeyPath:self.keyPath]; + if (value == nil) return NO; + return RKObjectIsEqualToObject(value, self.expectedValue); +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@: %p when `%@` == '%@' objectMapping: %@>", NSStringFromClass([self class]), self, self.keyPath, self.expectedValue, self.objectMapping]; +} + +@end + +@implementation RKKeyPathClassObjectMappingMatcher + +- (instancetype)init +{ + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"-init is not a valid initializer for the class %@, use initilizer -initWithKeyPath:expectedClass:objectMapping:", NSStringFromClass([self class])] + userInfo:nil]; + return [self init]; +} + +- (instancetype)initWithKeyPath:(NSString *)keyPath expectedClass:(Class)expectedClass objectMapping:(RKObjectMapping *)objectMapping +{ + NSParameterAssert(keyPath); + NSParameterAssert(expectedClass); + NSParameterAssert(objectMapping); + self = [super init]; + if (self) { + self.keyPath = keyPath; + self.expectedClass = expectedClass; + self.objectMapping = objectMapping; + } + + return self; +} + +- (BOOL)matches:(id)object +{ + id value = [object valueForKeyPath:self.keyPath]; + return [[value class] isSubclassOfClass:self.expectedClass]; +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@: %p when `%@` == '%@' objectMapping: %@>", NSStringFromClass([self class]), self, self.keyPath, self.expectedClass, self.objectMapping]; +} + +@end + +@implementation RKKeyPathValueMapObjectMappingMatcher + +- (instancetype)init +{ + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"-init is not a valid initializer for the class %@, use initilizer -initWithKeyPath:expectedValueMap:", NSStringFromClass([self class])] + userInfo:nil]; + return [self init]; +} + +- (instancetype)initWithKeyPath:(NSString *)keyPath expectedValueMap:(NSDictionary *)valueToObjectMapping +{ + NSParameterAssert(keyPath); + NSParameterAssert(valueToObjectMapping.count > 0); + self = [super init]; + if (self) { + self.keyPath = keyPath; + self.valueMap = valueToObjectMapping; + } + + return self; +} + +- (NSArray *)possibleObjectMappings +{ + return [self.valueMap allValues]; +} + +- (BOOL)matches:(id)object +{ + id value = [object valueForKeyPath:self.keyPath]; + RKObjectMapping *mapping = (self.valueMap)[value]; + if (mapping) { + self.objectMapping = mapping; + return YES; + } + + return NO; +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@: %p when `%@` in '%@'>", NSStringFromClass([self class]), self, self.keyPath, [self.valueMap allKeys]]; +} + +@end + +@implementation RKPredicateObjectMappingMatcher + +- (instancetype)init +{ + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"-init is not a valid initializer for the class %@, use initilizer -initWithPredicate:objectMapping:", NSStringFromClass([self class])] + userInfo:nil]; + return [self init]; +} + +- (instancetype)initWithPredicate:(NSPredicate *)predicate objectMapping:(RKObjectMapping *)objectMapping +{ + NSParameterAssert(predicate); + NSParameterAssert(objectMapping); + self = [super init]; + if (self) { + self.predicate = predicate; + self.objectMapping = objectMapping; + } + + return self; +} + +- (BOOL)matches:(id)object +{ + return [self.predicate evaluateWithObject:object]; +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@: %p when '%@' objectMapping: %@>", NSStringFromClass([self class]), self, self.predicate, self.objectMapping]; +} + +@end + +@implementation RKBlockObjectMatchingMatcher + +- (instancetype)init +{ + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"-init is not a valid initializer for the class %@, use initilizer -initWithPossibleMappings:block:", NSStringFromClass([self class])] + userInfo:nil]; + return [self init]; +} + +- (instancetype)initWithPossibleMappings:(NSArray *)mappings block:(RKObjectMapping *(^)(id representation))block +{ + NSParameterAssert(block); + self = [super init]; + if (self) { + self.block = block; + self.possibleMappings = mappings; + } + + return self; +} + +- (NSArray *)possibleObjectMappings +{ + return self.possibleMappings; +} + +- (BOOL)matches:(id)object +{ + RKObjectMapping *mapping = self.block(object); + if (mapping) { + self.objectMapping = mapping; + return YES; + } + + return NO; +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@: %p when '%@'>", NSStringFromClass([self class]), self, self.block]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKObjectMappingOperationDataSource.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKObjectMappingOperationDataSource.h new file mode 100644 index 0000000..3daf216 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKObjectMappingOperationDataSource.h @@ -0,0 +1,27 @@ +// +// RKObjectMappingOperationDataSource.h +// RestKit +// +// Created by Blake Watters on 7/3/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKMappingOperationDataSource.h" + +/** + The `RKObjectMappingOperationDataSource` class is an implementation of the `RKMappingOperationDataSource` protocol for use in performing object mappings that target plain old `NSObject` derived classes (as opposed to `NSManagedObject` derived persistent entities). + */ +@interface RKObjectMappingOperationDataSource : NSObject <RKMappingOperationDataSource> +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKObjectMappingOperationDataSource.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKObjectMappingOperationDataSource.m new file mode 100644 index 0000000..e8aba71 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKObjectMappingOperationDataSource.m @@ -0,0 +1,48 @@ +// +// RKObjectMappingOperationDataSource.m +// RestKit +// +// Created by Blake Watters on 7/3/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKObjectMappingOperationDataSource.h" +#import "RKObjectMapping.h" +#import "RKMappingOperation.h" + +@implementation RKObjectMappingOperationDataSource + +- (id)mappingOperation:(RKMappingOperation *)mappingOperation targetObjectForRepresentation:(NSDictionary *)representation + withMapping:(RKObjectMapping *)mapping inRelationship:(RKRelationshipMapping *)relationshipMapping +{ + return [mapping.objectClass new]; +} + +- (id)mappingOperation:(RKMappingOperation *)mappingOperation targetObjectForMapping:(RKObjectMapping *)mapping inRelationship:(RKRelationshipMapping *)relationshipMapping +{ + return [mapping.objectClass new]; +} + +- (BOOL)mappingOperationShouldCollectMappingInfo:(RKMappingOperation *)mappingOperation +{ + return NO; +} + +- (BOOL)mappingOperationShouldSetUnchangedValues:(RKMappingOperation *)mappingOperation +{ + return [mappingOperation isNewDestinationObject]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKObjectUtilities.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKObjectUtilities.h new file mode 100644 index 0000000..d8a4043 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKObjectUtilities.h @@ -0,0 +1,113 @@ +// +// RKObjectUtilities.h +// RestKit +// +// Created by Blake Watters on 9/30/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <Foundation/Foundation.h> + +#ifdef __cplusplus +extern "C" { +#endif + +///---------------- +/// @name Functions +///---------------- + +/** + Returns a Boolean value that indicates whether the given objects are equal. + + The actual method of comparison is dependendent upon the class of the objects given. For example, given two `NSString` objects equality would be tested using `isEqualToString:`. + + @param object The first object to compare. + @param anotherObject The second object to compare. + @return `YES` if the objects are equal, otherwise `NO`. + */ +BOOL RKObjectIsEqualToObject(id object, id anotherObject); + +/** + Returns a Boolean value that indicates if the given class is a collection. + + The following classes are considered collections: + + 1. `NSSet` + 1. `NSArray` + 1. `NSOrderedSet` + + `NSDictionary` objects are **not** considered collections as they are typically object representations. + + @param aClass The class to check. + @return `YES` if the given class is a collection. + */ +BOOL RKClassIsCollection(Class aClass); + +/** + Returns a Boolean value that indicates if the given object is a collection. + + Implemented by invoking `RKClassIsCollection` with the class of the given object. + @param object The object to be tested. + @return `YES` if the given object is a collection, else `NO`. + @see `RKClassIsCollection` + */ +BOOL RKObjectIsCollection(id object); + +/** + Returns a Boolean value that indicates if the given object is collection containing only instances of `NSManagedObject` or a class that inherits from `NSManagedObject`. + + @param object The object to be tested. + @return `YES` if the object is a collection containing only `NSManagedObject` derived objects. + */ +BOOL RKObjectIsCollectionContainingOnlyManagedObjects(id object); + +/** + Returns a Boolean value that indicates if the given object is a collection containing subcollections. + + @param object The object to be tested. + @return `YES` if the object is a collection of collections, else `NO`. + */ +BOOL RKObjectIsCollectionOfCollections(id object); + +/** + Returns an appropriate class to use for KVC access based on the Objective C runtime type encoding. + + Objective C Runtime type encodings: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html + KVC Scalar/Structure support: http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueCoding/Articles/DataTypes.html#//apple_ref/doc/uid/20002171-BAJEAIEE + + @param type An Objective C Runtime type encoding + @return The class name for the property type encoded in the given attribute string, an appropriate class for wrapping/unwrapping the primitive type, or `Nil` when no transformation is required or possible. + */ +Class RKKeyValueCodingClassForObjCType(const char *type); + +/** + Returns an appropriate class to use for KVC access based on the output obtained via the `property_getAttributes` reflection API. + + @param attr A c string containing encoding attribute information. + @return The class name for the property type encoded in the given attribute string, an appropriate class for wrapping/unwrapping the primitive type, or `Nil` when no transformation is required or possible. + */ +Class RKKeyValueCodingClassFromPropertyAttributes(const char *attr); + +/** + Returns the name of a property when provided the name of a property obtained via the `property_getAttributes` reflection API. + + @param attributeString A string object encoding attribute information. + @return The class name for the property type encoded in the given attribute string or `@"NULL"` if the property does not have an object type (the declared property is for a primitive type). + */ +NSString *RKPropertyTypeFromAttributeString(NSString *attributeString); + +#ifdef __cplusplus +} +#endif diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKObjectUtilities.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKObjectUtilities.m new file mode 100644 index 0000000..7b56fa6 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKObjectUtilities.m @@ -0,0 +1,147 @@ +// +// RKObjectUtilities.m +// RestKit +// +// Created by Blake Watters on 9/30/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <objc/message.h> +#import <objc/runtime.h> +#import "RKObjectUtilities.h" +#import "RKBooleanClass.h" + +BOOL RKObjectIsEqualToObject(id object, id anotherObject) { + NSCAssert(object, @"Expected object not to be nil"); + NSCAssert(anotherObject, @"Expected anotherObject not to be nil"); + + return (object == anotherObject) || [object isEqual:anotherObject]; +} + +BOOL RKClassIsCollection(Class aClass) +{ + return (aClass && ([aClass isSubclassOfClass:[NSSet class]] || + [aClass isSubclassOfClass:[NSArray class]] || + [aClass isSubclassOfClass:[NSOrderedSet class]])); +} + +BOOL RKObjectIsCollection(id object) +{ + return RKClassIsCollection([object class]); +} + +BOOL RKObjectIsCollectionContainingOnlyManagedObjects(id object) +{ + if (! RKObjectIsCollection(object)) return NO; + Class managedObjectClass = NSClassFromString(@"NSManagedObject"); + if (! managedObjectClass) return NO; + for (id instance in object) { + if (! [instance isKindOfClass:managedObjectClass]) return NO; + } + return YES; +} + +BOOL RKObjectIsCollectionOfCollections(id object) +{ + if (! RKObjectIsCollection(object)) return NO; + id collectionSanityCheckObject = nil; + if ([object respondsToSelector:@selector(anyObject)]) collectionSanityCheckObject = [object anyObject]; + if ([object respondsToSelector:@selector(lastObject)]) collectionSanityCheckObject = [object lastObject]; + return RKObjectIsCollection(collectionSanityCheckObject); +} + +Class RKKeyValueCodingClassForObjCType(const char *type) +{ + if (type) { + switch (type[0]) { + case _C_ID: { + char *openingQuoteLoc = strchr(type, '"'); + if (openingQuoteLoc) { + char *closingQuoteLoc = strchr(openingQuoteLoc+1, '"'); + if (closingQuoteLoc) { + size_t classNameStrLen = closingQuoteLoc-openingQuoteLoc; + char className[classNameStrLen]; + memcpy(className, openingQuoteLoc+1, classNameStrLen-1); + // Null-terminate the array to stringify + className[classNameStrLen-1] = '\0'; + return objc_getClass(className); + } + } + // If there is no quoted class type (id), it can be used as-is. + return Nil; + } + + case _C_CHR: // char + case _C_UCHR: // unsigned char + case _C_SHT: // short + case _C_USHT: // unsigned short + case _C_INT: // int + case _C_UINT: // unsigned int + case _C_LNG: // long + case _C_ULNG: // unsigned long + case _C_LNG_LNG: // long long + case _C_ULNG_LNG: // unsigned long long + case _C_FLT: // float + case _C_DBL: // double + return [NSNumber class]; + + case _C_BOOL: // C++ bool or C99 _Bool + return RK_BOOLEAN_CLASS; + + case _C_STRUCT_B: // struct + case _C_BFLD: // bitfield + case _C_UNION_B: // union + return [NSValue class]; + + case _C_ARY_B: // c array + case _C_PTR: // pointer + case _C_VOID: // void + case _C_CHARPTR: // char * + case _C_CLASS: // Class + case _C_SEL: // selector + case _C_UNDEF: // unknown type (function pointer, etc) + default: + break; + } + } + return Nil; +} + +Class RKKeyValueCodingClassFromPropertyAttributes(const char *attr) +{ + if (attr) { + const char *typeIdentifierLoc = strchr(attr, 'T'); + if (typeIdentifierLoc) { + return RKKeyValueCodingClassForObjCType(typeIdentifierLoc+1); + } + } + return Nil; +} + +NSString *RKPropertyTypeFromAttributeString(NSString *attributeString) +{ + NSString *type = [NSString string]; + NSScanner *typeScanner = [NSScanner scannerWithString:attributeString]; + [typeScanner scanUpToCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:@"@"] intoString:NULL]; + + // we are not dealing with an object + if ([typeScanner isAtEnd]) { + return @"NULL"; + } + [typeScanner scanCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:@"\"@"] intoString:NULL]; + // this gets the actual object type + [typeScanner scanUpToCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:@"\""] intoString:&type]; + return type; +} diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKPropertyInspector.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKPropertyInspector.h new file mode 100644 index 0000000..98b5d07 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKPropertyInspector.h @@ -0,0 +1,117 @@ +// +// RKPropertyInspector.h +// RestKit +// +// Created by Blake Watters on 3/4/10. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <Foundation/Foundation.h> + +@class NSEntityDescription; + +/** + * The object used to store attributes for each property; used as the value in the class dictionary. + */ +@interface RKPropertyInspectorPropertyInfo : NSObject + +/** + Creates a new RKPropertyInspectorPropertyInfo instance with the given information + */ ++ (instancetype)propertyInfoWithName:(NSString *)name keyValueClass:(Class)kvClass isPrimitive:(BOOL)isPrimitive; + +/** + The name of the property + */ +@property (nonatomic, copy, readonly) NSString *name; + +/** + The class used for key-value coding access to the property. + + If the property is an object type, then the class set for this key will be the type of the property. If the property is a primitive, then the class set for the key will be the boxed type used for KVC access to the property. For example, an `NSInteger` property is boxed to an `NSNumber` for KVC purposes. + */ +@property (nonatomic, strong, readonly) Class keyValueCodingClass; + +/** + A BOOL value that indicates if the property is a primitive (non-object) value. + */ +@property (nonatomic, readonly) BOOL isPrimitive; + +@end + + +/** + The `RKPropertyInspector` class provides an interface for introspecting the properties and attributes of classes using the reflection capabilities of the Objective-C runtime. Once inspected, the properties inspection details are cached. + */ +@interface RKPropertyInspector : NSObject + +///----------------------------------------------- +/// @name Retrieving the Shared Inspector Instance +///----------------------------------------------- + +/** + Returns the shared property inspector singleton instance. + + @return The shared `RKPropertyInspector` instance. + */ ++ (RKPropertyInspector *)sharedInspector; + +///------------------------------------------------------ +/// @name Retrieving the Properties and Types for a Class +///------------------------------------------------------ + +/** + Returns a dictionary keyed by property name that includes the key-value coding class of the property and a Boolean indicating if the property is backed by a primitive (non-object) value. The RKPropertyInspectorPropertyInfo object for each property includes details about the key-value coding class representing the property and if the property is backed by a primitive type. + + @param objectClass The class to inspect the properties of. + @return A dictionary keyed by property name that includes details about all declared properties of the class. + */ +- (NSDictionary *)propertyInspectionForClass:(Class)objectClass; + +/** + Returns the `Class` object specifying the type of the property with given name on a class. + + @param propertyName The name of the property to retrieve the type of. + @param objectClass The class to retrieve the property from. + @param isPrimitive A pointer to a Boolean value to set indicating if the specified property is of a primitive (non-object) type. + @return A `Class` object specifying the type of the requested property. + */ +- (Class)classForPropertyNamed:(NSString *)propertyName ofClass:(Class)objectClass isPrimitive:(BOOL *)isPrimitive; + +@end + +///---------------------------- +/// @name Convenience Functions +///---------------------------- + +/** + Returns the class of the attribute or relationship property at the key path of the given object. + + Given a key path to a string property, this will return an `NSString`, etc. + + @param keyPath The key path to the property to retrieve the class of. + @param object The object to evaluate. + @return The class of the property at the given key path. + */ +Class RKPropertyInspectorGetClassForPropertyAtKeyPathOfObject(NSString *keyPath, id object); + +/** + Returns a Boolean value indicating if the property at the specified key path for a given object is modeled by a primitive type. + + @param keyPath The key path to inspect the property of. + @param object The object to evaluate. + @return `YES` if the property is a primitive, else `NO`. + */ +BOOL RKPropertyInspectorIsPropertyAtKeyPathOfObjectPrimitive(NSString *keyPath, id object); diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKPropertyInspector.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKPropertyInspector.m new file mode 100644 index 0000000..7106713 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKPropertyInspector.m @@ -0,0 +1,207 @@ +// +// RKPropertyInspector.m +// RestKit +// +// Created by Blake Watters on 3/4/10. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <objc/runtime.h> +#import "RKPropertyInspector.h" +#import "RKLog.h" +#import "RKObjectUtilities.h" + +// Set Logging Component +#undef RKLogComponent +#define RKLogComponent RKlcl_cRestKitObjectMapping + +NSString * const RKPropertyInspectionNameKey = @"name"; +NSString * const RKPropertyInspectionKeyValueCodingClassKey = @"keyValueCodingClass"; +NSString * const RKPropertyInspectionIsPrimitiveKey = @"isPrimitive"; + + +@implementation RKPropertyInspectorPropertyInfo + ++ (instancetype)propertyInfoWithName:(NSString *)name keyValueClass:(Class)kvClass isPrimitive:(BOOL)isPrimitive +{ + return [[self alloc] initWithName:name keyValueClass:kvClass isPrimitive:isPrimitive]; +} + +- (instancetype)initWithName:(NSString *)name keyValueClass:(Class)kvClass isPrimitive:(BOOL)isPrimitive +{ + if (self = [super init]) { + _name = [name copy]; + _keyValueCodingClass = kvClass; + _isPrimitive = isPrimitive; + } + return self; +} + +@end + + +@interface RKPropertyInspector () +#if OS_OBJECT_USE_OBJC +@property (nonatomic, strong) dispatch_queue_t queue; +#else +@property (nonatomic, assign) dispatch_queue_t queue; +#endif +@property (nonatomic, strong) NSMutableDictionary *inspectionCache; +@end + +@implementation RKPropertyInspector + ++ (RKPropertyInspector *)sharedInspector +{ + static RKPropertyInspector *sharedInspector = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedInspector = [RKPropertyInspector new]; + }); + + return sharedInspector; +} + +- (instancetype)init +{ + self = [super init]; + if (self) { + // NOTE: We use an `NSMutableDictionary` because it is *much* faster than `NSCache` on lookup + self.inspectionCache = [NSMutableDictionary dictionary]; + self.queue = dispatch_queue_create("org.restkit.core-data.property-inspection-queue", DISPATCH_QUEUE_CONCURRENT); + } + + return self; +} + +- (void)dealloc +{ +#if !OS_OBJECT_USE_OBJC + if (_queue) dispatch_release(_queue); +#endif + _queue = NULL; +} + +- (NSDictionary *)propertyInspectionForClass:(Class)objectClass +{ + __block NSMutableDictionary *inspection; + dispatch_sync(self.queue, ^{ + inspection = (self.inspectionCache)[objectClass]; + }); + if (inspection) return inspection; + + inspection = [NSMutableDictionary dictionary]; + + //include superclass properties + Class currentClass = objectClass; + while (currentClass != nil) { + // Get the raw list of properties + unsigned int outCount = 0; + objc_property_t *propList = class_copyPropertyList(currentClass, &outCount); + + // Collect the property names + for (typeof(outCount) i = 0; i < outCount; i++) { + objc_property_t *prop = propList + i; + const char *propName = property_getName(*prop); + + if (strcmp(propName, "_mapkit_hasPanoramaID") != 0) { + const char *attr = property_getAttributes(*prop); + if (attr) { + Class aClass = RKKeyValueCodingClassFromPropertyAttributes(attr); + if (aClass) { + NSString *propNameString = [[NSString alloc] initWithCString:propName encoding:NSUTF8StringEncoding]; + if (propNameString) { + BOOL isPrimitive = NO; + if (attr) { + const char *typeIdentifierLoc = strchr(attr, 'T'); + if (typeIdentifierLoc) { + isPrimitive = (typeIdentifierLoc[1] != '@'); + } + } + + RKPropertyInspectorPropertyInfo *info; + info = [RKPropertyInspectorPropertyInfo propertyInfoWithName:propNameString + keyValueClass:aClass + isPrimitive:isPrimitive]; + inspection[propNameString] = info; + } + } + } + } + } + + free(propList); + Class superclass = [currentClass superclass]; + Class nsManagedObject = NSClassFromString(@"NSManagedObject"); + currentClass = (superclass == [NSObject class] || (nsManagedObject && superclass == nsManagedObject)) ? nil : superclass; + } + + /* dispatch_barrier_async is dangerous if we are called from +initialize */ + dispatch_barrier_sync(self.queue, ^{ + (self.inspectionCache)[(id<NSCopying>)objectClass] = inspection; + RKLogDebug(@"Cached property inspection for Class '%@': %@", NSStringFromClass(objectClass), inspection); + }); + return inspection; +} + +- (Class)classForPropertyNamed:(NSString *)propertyName ofClass:(Class)objectClass isPrimitive:(BOOL *)isPrimitive +{ + NSDictionary *classInspection = [self propertyInspectionForClass:objectClass]; + RKPropertyInspectorPropertyInfo *propertyInspection = classInspection[propertyName]; + if (isPrimitive) *isPrimitive = propertyInspection.isPrimitive; + return propertyInspection.keyValueCodingClass; +} + +@end + + +@interface NSObject (RKPropertyInspection) +- (Class)rk_classForPropertyAtKeyPath:(NSString *)keyPath isPrimitive:(BOOL *)isPrimitive; +@end + +@implementation NSObject (RKPropertyInspection) + +- (Class)rk_classForPropertyAtKeyPath:(NSString *)keyPath isPrimitive:(BOOL *)isPrimitive +{ + NSRange dotRange = [keyPath rangeOfString:@"." options:NSLiteralSearch]; + RKPropertyInspector *inspector = [RKPropertyInspector sharedInspector]; + Class propertyClass = [self class]; + + if (dotRange.length == 0) { + return [inspector classForPropertyNamed:keyPath ofClass:propertyClass isPrimitive:isPrimitive]; + } + + NSArray *components = [keyPath componentsSeparatedByString:@"."]; + for (NSString *property in components) { + propertyClass = [inspector classForPropertyNamed:property ofClass:propertyClass isPrimitive:isPrimitive]; + if (! propertyClass) break; + } + + return propertyClass; +} + +@end + +Class RKPropertyInspectorGetClassForPropertyAtKeyPathOfObject(NSString *keyPath, id object) +{ + return [object rk_classForPropertyAtKeyPath:keyPath isPrimitive:nil]; +} + +BOOL RKPropertyInspectorIsPropertyAtKeyPathOfObjectPrimitive(NSString *keyPath, id object) +{ + BOOL isPrimitive = NO; + [object rk_classForPropertyAtKeyPath:keyPath isPrimitive:&isPrimitive]; + return isPrimitive; +} diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKPropertyMapping.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKPropertyMapping.h new file mode 100644 index 0000000..5f39859 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKPropertyMapping.h @@ -0,0 +1,84 @@ +// +// RKPropertyMapping.h +// RestKit +// +// Created by Blake Watters on 8/27/12. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <Foundation/Foundation.h> + +@class RKObjectMapping; +@protocol RKValueTransforming; + +/** + `RKPropertyMapping` is an abstract class for describing the properties being mapped within an `RKObjectMapping` or `RKEntityMapping` object. It defines the common interface for its concrete subclasses `RKAttributeMapping` and `RKRelationshipMapping`. Each property mapping defines a single transformation from a source key path (often in the deserialized representation of a JSON or XML document) to a destination key path (typically on a target object). + */ +@interface RKPropertyMapping : NSObject <NSCopying> + +///------------------------------------------ +/// @name Accessing the Parent Object Mapping +///------------------------------------------ + +/** + Returns the object mapping the receiver is added to. + */ +@property (nonatomic, weak, readonly) RKObjectMapping *objectMapping; + +///----------------------------------------------------- +/// @name Accessing the Source and Destination Key Paths +///----------------------------------------------------- + +/** + A key path on the source object from which to get information that is to be mapped onto the destination object. + */ +@property (nonatomic, copy, readonly) NSString *sourceKeyPath; + +/** + A key path on the destination object on which to set information that has been mapped from the source object. + */ +@property (nonatomic, copy, readonly) NSString *destinationKeyPath; + +///------------------------------------- +/// @name Specifying a Value Transformer +///------------------------------------- + +/** + Specifies the class used to represent the value of the mapped property. A value of `Nil` (which is the default value) indicates the property class is to be determined by runtime introspection. + + In cases where run-time type introspection cannot be performed (such as during object parameterization) you can specify the class used to represent the value of the property being mapped. + */ +@property (nonatomic, strong) Class propertyValueClass; + +/** + A value transformer with which to process input values being mapped with the receiver. If `nil`, then the `valueTransformer` of the parent `objectMapping` will be used instead. + */ +@property (nonatomic, strong) id<RKValueTransforming> valueTransformer; + +///---------------------------------- +/// @name Comparing Property Mappings +///---------------------------------- + +/** + Compares the receiving property mapping to another property mapping. + + Two property mappings are equal if they are of the same type (i.e. an `RKAttributeMapping` or an `RKRelatiobshipMapping` object) and specify a mapping from the same source key path to the same destination key path. + + @param otherMapping The property mapping object with which to compare the receiver. + @return `YES` if `otherMapping` specifies the same mapping as the receiver, otherwise `NO`. + */ +- (BOOL)isEqualToMapping:(RKPropertyMapping *)otherMapping; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKPropertyMapping.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKPropertyMapping.m new file mode 100644 index 0000000..0fc2ca1 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKPropertyMapping.m @@ -0,0 +1,79 @@ +// +// RKPropertyMapping.m +// RestKit +// +// Created by Blake Watters on 8/27/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKPropertyMapping.h" +#import "RKObjectMapping.h" + +/** + For consistency with URI Templates (and most web templating languages in general) we are transitioning + to using braces "{}" instead of parentheses "()" for denoting the variables in the key paths. + */ +static NSString *RKStringByReplacingUnderscoresWithBraces(NSString *string) +{ + return [[string stringByReplacingOccurrencesOfString:@"(" withString:@"{"] stringByReplacingOccurrencesOfString:@")" withString:@"}"]; +} + +@interface RKPropertyMapping () +// Synthesize as read/write to allow assignment in `RKObjectMapping` +@property (nonatomic, weak, readwrite) RKObjectMapping *objectMapping; +@property (nonatomic, copy, readwrite) NSString *sourceKeyPath; +@property (nonatomic, copy, readwrite) NSString *destinationKeyPath; +@end + +@implementation RKPropertyMapping + +- (id)copyWithZone:(NSZone *)zone +{ + RKPropertyMapping *copy = [[[self class] allocWithZone:zone] init]; + copy.sourceKeyPath = self.sourceKeyPath; + copy.destinationKeyPath = self.destinationKeyPath; + copy.propertyValueClass = self.propertyValueClass; + copy.valueTransformer = self.valueTransformer; + return copy; +} + +- (BOOL)isEqualToMapping:(RKPropertyMapping *)otherMapping +{ + return [otherMapping isMemberOfClass:[self class]] && + (self.sourceKeyPath == otherMapping.sourceKeyPath || [self.sourceKeyPath isEqual:otherMapping.sourceKeyPath]) && + [self.destinationKeyPath isEqual:otherMapping.destinationKeyPath]; +} + +- (void)setSourceKeyPath:(NSString *)sourceKeyPath +{ + _sourceKeyPath = RKStringByReplacingUnderscoresWithBraces(sourceKeyPath); +} + +- (void)setDestinationKeyPath:(NSString *)destinationKeyPath +{ + _destinationKeyPath = RKStringByReplacingUnderscoresWithBraces(destinationKeyPath); +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@: %p %@ => %@>", self.class, self, self.sourceKeyPath, self.destinationKeyPath]; +} + +- (id<RKValueTransforming>)valueTransformer +{ + return _valueTransformer ?: [self.objectMapping valueTransformer]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKRelationshipMapping.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKRelationshipMapping.h new file mode 100644 index 0000000..5c81276 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKRelationshipMapping.h @@ -0,0 +1,95 @@ +// +// RKRelationshipMapping.h +// RestKit +// +// Created by Blake Watters on 5/4/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKPropertyMapping.h" + +@class RKMapping; + +typedef NS_ENUM(NSInteger, RKAssignmentPolicy) { + RKAssignmentPolicySet, // Set the relationship to the new value and leave the existing objects alone, breaking the relationship to existing objects at the destination. This is the default policy for `RKRelationshipMapping`. + RKAssignmentPolicyReplace, // Set the relationship to the new value and destroy the previous value, replacing the existing objects at the destination of the relationship. + RKAssignmentPolicyUnion, // Set the relationship to the union of the existing value and the new value being assigned. Only applicable for to-many relationships. + + // Deprecated + RKSetAssignmentPolicy = RKAssignmentPolicySet, // Will be deprecated, use `RKAssignmentPolicySet` instead + RKReplaceAssignmentPolicy = RKAssignmentPolicyReplace, // Will be deprecated, use `RKAssignmentPolicyReplace` instead + RKUnionAssignmentPolicy = RKAssignmentPolicyUnion, // Will be deprecated, use `RKAssignmentPolicyUnion` instead +} ; + +/** + The `RKRelationshipMapping` class is used to describe relationships of a class in an `RKObjectMapping` or an entity in an `RKEntityMapping` object. + + `RKRelationshipMapping` extends `RKPropertyMapping` to describe features specific to relationships, including the `RKMapping` object describing how to map the destination object. + + Relationship mappings are described in terms of a source key path, which identifies a key in the parent object representation under which the data for the relationship is nested, and a destination key path, which specifies the key path at which the mapped object is to be assigned on the parent entity. The key paths of the property mappings of the `RKMapping` object in the relationship mapping are evaluated against the nested object representationship at the source key path. + + ## Mapping a Non-nested Relationship from the Parent Representation + + It can often be desirable to map data for a relationship directly from the parent object representation, rather than under a nested key path. When a relationship mapping is constructed with a `nil` value for the source key path, then the `RKMapping` object is evaluated against the parent representation. + + ## Assignment Policy + + When mapping a relationship, the typical desired behavior is to set the destination of the relationship to the newly mapped values from the object representation being processed. There are times in which it is desirable to use different assignment behaviors. The way in which the relationship is assigned can be controlled by the assignmentPolicy property. There are currently three distinct assignment policies available: + + 1. `RKSetAssignmentPolicy` - Instructs the mapper to assign the new destination value to the relationship directly. No further action is taken and the relationship to the old objects is broken. This is the default assignment policy. + 1. `RKReplaceAssignmentPolicy` - Instructs the mapper to assign the new destination value to the relationship and delete any existing object or objects at the destination. The deletion behavior is contextual based on the type of objects being mapped (i.e. Core Data vs NSObject) and is delegated to the mapping operation data source. + 1. `RKUnionAssignmentPolicy` - Instructs the mapper to build a new value for the relationship by unioning the existing value with the new value and set the combined value to the relationship. The union assignment policy is only appropriate for use with a to-many relationship. + + */ +@interface RKRelationshipMapping : RKPropertyMapping + +///-------------------------------------- +/// @name Creating a Relationship Mapping +///-------------------------------------- + +/** + Creates and returns a new relationship mapping object describing how to transform a related object representation at `sourceKeyPath` to a new representation at `destinationKeyPath` using the given mapping. + + The mapping may describe a to-one or a to-many relationship. The appropriate handling of the source representation is deferred until run-time and is determined by performing reflection on the data retrieved from the source object representation by sending a `valueForKeyPath:` message where the key path is the value given in `sourceKeyPath`. If an `NSArray`, `NSSet` or `NSOrderedSet` object is returned, the related object representation is processed as a to-many collection. Otherwise the representation is considered to be a to-one. + + @param sourceKeyPath A key path from which to retrieve data in the source object representation that is to be mapped as a relationship. If `nil`, then the mapping is performed directly against the parent object representation. + @param destinationKeyPath The key path on the destination object to set the object mapped results. + @param mapping A mapping object describing how to map the data retrieved from `sourceKeyPath` that is to be set on `destinationKeyPath`. + */ ++ (instancetype)relationshipMappingFromKeyPath:(NSString *)sourceKeyPath toKeyPath:(NSString *)destinationKeyPath withMapping:(RKMapping *)mapping; + +///---------------------------------------- +/// @name Accessing the Destination Mapping +///---------------------------------------- + +/** + An `RKMapping` object describing how to map the object representation at `sourceKeyPath` to a new represenation at `destinationKeyPath`. + */ +@property (nonatomic, strong, readonly) RKMapping *mapping; + +///---------------------------------------- +/// @name Configuring the Assignment Policy +///---------------------------------------- + +/** + The assignment policy to use when applying the relationship mapping. + + The assignment policy determines how a relationship is set when there are existing objects at the destination of the relationship. The existing values can be disconnected from the parent and left in the graph (`RKSetAssignmentPolicy`), deleted and replaced by the new value (`RKReplaceAssignmentPolicy`), or the new value can be unioned with the existing objects to create a new combined value (`RKUnionAssignmentPolicy`). + + **Default**: `RKSetAssignmentPolicy` + */ +@property (nonatomic, assign) RKAssignmentPolicy assignmentPolicy; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKRelationshipMapping.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKRelationshipMapping.m new file mode 100644 index 0000000..ae867c0 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/ObjectMapping/RKRelationshipMapping.m @@ -0,0 +1,70 @@ +// +// RKRelationshipMapping.m +// RestKit +// +// Created by Blake Watters on 5/4/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKRelationshipMapping.h" +#import "RKMapping.h" + +@interface RKPropertyMapping () +@property (nonatomic, copy, readwrite) NSString *sourceKeyPath; +@property (nonatomic, copy, readwrite) NSString *destinationKeyPath; +@end + +@interface RKRelationshipMapping () +@property (nonatomic, strong, readwrite) RKMapping *mapping; +@end + +@implementation RKRelationshipMapping + ++ (instancetype)relationshipMappingFromKeyPath:(NSString *)sourceKeyPath toKeyPath:(NSString *)destinationKeyPath withMapping:(RKMapping *)mapping +{ + RKRelationshipMapping *relationshipMapping = [self new]; + relationshipMapping.sourceKeyPath = sourceKeyPath; + relationshipMapping.destinationKeyPath = destinationKeyPath; + relationshipMapping.mapping = mapping; + return relationshipMapping; +} + +- (instancetype)init +{ + self = [super init]; + if (self) { + self.assignmentPolicy = RKSetAssignmentPolicy; + } + return self; +} + +- (id)copyWithZone:(NSZone *)zone +{ + RKRelationshipMapping *copy = [super copyWithZone:zone]; + copy.mapping = self.mapping; + copy.assignmentPolicy = self.assignmentPolicy; + return copy; +} + +- (BOOL)isEqualToMapping:(RKRelationshipMapping *)otherMapping +{ + if (! [otherMapping isMemberOfClass:[RKRelationshipMapping class]]) return NO; + if (! [super isEqualToMapping:otherMapping]) return NO; + if (self.mapping == nil && otherMapping.mapping == nil) return YES; + + return [self.mapping isEqualToMapping:otherMapping.mapping]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/RestKit.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/RestKit.h new file mode 100644 index 0000000..de7c2fa --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/RestKit.h @@ -0,0 +1,50 @@ +// +// RestKit.h +// RestKit +// +// Created by Blake Watters on 2/19/10. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef _RESTKIT_ +#define _RESTKIT_ + +#if __has_include("ObjectMapping.h") +#import "ObjectMapping.h" +#endif + +#if __has_include("Network.h") +#import "Network.h" +#endif + +#if __has_include("Support.h") +#import "Support.h" +#endif + +#if __has_include("CoreData.h") +#import "CoreData.h" +#endif + +/** + Set the App logging component. This header + file is generally only imported by apps that + are pulling in all of RestKit. By setting the + log component to App here, we allow the app developer + to use RKLog() in their own app. + */ +#undef RKLogComponent +#define RKLogComponent RKlcl_cApp + +#endif /* _RESTKIT_ */ diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support.h new file mode 100644 index 0000000..ba3e127 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support.h @@ -0,0 +1,31 @@ +// +// Support.h +// RestKit +// +// Created by Blake Watters on 9/30/10. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +// Load shared support code +#import "RKErrors.h" +#import "RKMIMETypes.h" +#import "RKLog.h" +#import "RKDotNetDateFormatter.h" +#import "RKPathUtilities.h" +#import "RKDictionaryUtilities.h" +#import "RKURLEncodedSerialization.h" +#import "RKNSJSONSerialization.h" +#import "RKMIMETypeSerialization.h" +#import "RKStringTokenizer.h" diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKBooleanClass.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKBooleanClass.h new file mode 100644 index 0000000..3f0d765 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKBooleanClass.h @@ -0,0 +1,23 @@ +// +// RKBooleanClass.h +// RestKit +// +// Created by Valerio Mazzeo on 18/07/17. +// Copyright (c) 2017 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <Foundation/Foundation.h> + +#define RK_BOOLEAN_CLASS [@YES class] diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKDictionaryUtilities.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKDictionaryUtilities.h new file mode 100644 index 0000000..1752c3b --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKDictionaryUtilities.h @@ -0,0 +1,46 @@ +// +// RKDictionaryUtilities.h +// RestKit +// +// Created by Blake Watters on 9/11/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifdef __cplusplus +extern "C" { +#endif + +#import <Foundation/Foundation.h> + +/** + Reverse merges two dictionary to produce a new dictionary wherein the keys in the second dictionary have taken precedence in instances where keys overlap. The merge is performed recursively such that subdictionaries are reverse merged as well. + + @param dict1 The dictionary to be reverse merged. + @param dict2 A secondary dictionary to perform the reverse merging with. + @return A new `NSDicionary` object that is the product of the reverse merge. + */ +NSDictionary *RKDictionaryByMergingDictionaryWithDictionary(NSDictionary *dict1, NSDictionary *dict2); + +/** + Return a new dictionary by stripping out any percent escapes (such as %20) from the given dictionary's key and values. + + @param dictionary The dictionary from which to remove the percent escape sequences. + @return A new `NSDictionary` wherein any percent escape sequences in the key and values have been replaced with their literal values. + */ +NSDictionary *RKDictionaryByReplacingPercentEscapesInEntriesFromDictionary(NSDictionary *dictionary); + +#ifdef __cplusplus +} +#endif diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKDictionaryUtilities.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKDictionaryUtilities.m new file mode 100644 index 0000000..66b09ce --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKDictionaryUtilities.m @@ -0,0 +1,44 @@ +// +// RKDictionaryUtilities.m +// RestKit +// +// Created by Blake Watters on 9/11/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// + +#import "RKDictionaryUtilities.h" + +NSDictionary *RKDictionaryByMergingDictionaryWithDictionary(NSDictionary *dict1, NSDictionary *dict2) +{ + if (! dict1) return dict2; + if (! dict2) return dict1; + + NSMutableDictionary *mergedDictionary = [dict1 mutableCopy]; + + for (id key2 in dict2) { + id obj2 = dict2[key2]; + id obj1 = dict1[key2]; + if ([obj1 isKindOfClass:[NSDictionary class]] && [obj2 isKindOfClass:[NSDictionary class]]) { + NSDictionary *mergedSubdict = RKDictionaryByMergingDictionaryWithDictionary(obj1, obj2); + mergedDictionary[key2] = mergedSubdict; + } else { + mergedDictionary[key2] = obj2; + } + } + + return mergedDictionary; +} + +NSDictionary *RKDictionaryByReplacingPercentEscapesInEntriesFromDictionary(NSDictionary *dictionary) +{ + NSMutableDictionary *results = [NSMutableDictionary dictionaryWithCapacity:[dictionary count]]; + [dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) + { + NSString *escapedKey = [key stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + id escapedValue = value; + if ([value respondsToSelector:@selector(stringByReplacingPercentEscapesUsingEncoding:)]) + escapedValue = [value stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + results[escapedKey] = escapedValue; + }]; + return results; +} diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKDotNetDateFormatter.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKDotNetDateFormatter.h new file mode 100644 index 0000000..03bc2b4 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKDotNetDateFormatter.h @@ -0,0 +1,73 @@ +// +// RKDotNetDateFormatter.h +// RestKit +// +// Created by Greg Combs on 9/8/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <Foundation/Foundation.h> + +/** + A subclass of `NSDateFormatter` that serves as translator between ASP.NET date serializations in JSON strings and NSDate objects. This is useful for properly mapping these dates from an ASP.NET driven backend. + + @warning DO NOT attempt to use `setDateFormat:` on this class. It will return invalid results. + */ +@interface RKDotNetDateFormatter : NSDateFormatter + +/** + Instantiates an autoreleased `RKDotNetDateFormatter` object with the timezone set to the given value. The default time zone is UTC. + + The supplied timeZone, such as one produced with `[NSTimeZone timeZoneWithName:@"UTC"]`, + is only used during calls to `stringFromDate:, for a detailed explanation see `dateFromString:` + + @param timeZone An NSTimeZone object. A `nil` value sets the timezone to the default value of UTC. + @return An autoreleased `RKDotNetDateFormatter` object + @see dotNetDateFormatter + */ ++ (instancetype)dotNetDateFormatterWithTimeZone:(NSTimeZone *)timeZone; + +/** + Returns an `NSDate` object from an ASP.NET style date string respresentation, as seen in JSON. + + Acceptable examples are: + /Date(1112715000000-0500)/ + /Date(1112715000000)/ + /Date(-1112715000000)/ + Where 1112715000000 is the number of milliseconds since January 1, 1970 00:00 GMT/UTC, and -0500 represents the timezone offset from GMT in 24-hour time. Negatives milliseconds are treated as dates before January 1, 1970. + + *NOTE* `NSDate` objects do not have timezones, and you should never change an actual date value based on a timezone offset. However, timezones are important when presenting dates to the user. Therefore, If an offset is present in the ASP.NET string (it should be), we actually ignore the offset portion because we want to store the actual date value in its raw form, without any pollution of timezone information. If, on the other hand, there is no offset in the ASP.NET string, we assume GMT (+0000) anyway. In summation, for this class `setTimeZone:` is ignored except when using `stringFromDate:` + + @param string The ASP.NET style string, /Date(1112715000000-0500)/ + @return An `NSDate` object. + @see `stringFromDate` + @see `NSDateFormatter` + @see `NSTimeZone` + */ +- (NSDate *)dateFromString:(NSString *)string; + +/** + Returns an ASP.NET style date string from an NSDate, such as /Date(1112715000000+0000)/ Where 1112715000000 is the number of milliseconds since January 1, 1970 00:00 GMT/UTC, and +0000 is the timezone offset from GMT in 24-hour time. + + *NOTE *GMT (+0000) is assumed otherwise specified via `setTimeZone:` + + @param date An `NSDate` object from which to return a string value. + @return The ASP.NET style string, /Date(1112715000000-0500)/ + @see `dateFromString` + @see `NSDateFormatter` + @see `NSTimeZone` + */ +- (NSString *)stringFromDate:(NSDate *)date; +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKDotNetDateFormatter.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKDotNetDateFormatter.m new file mode 100644 index 0000000..11e2a53 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKDotNetDateFormatter.m @@ -0,0 +1,115 @@ +// +// RKDotNetDateFormatter.h +// RestKit +// +// Created by Greg Combs on 9/8/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKDotNetDateFormatter.h" +#import "RKLog.h" + +static BOOL RKDotNetDateFormatterIsValidRange(NSRange rangeOfMatch) +{ + return (!NSEqualRanges(rangeOfMatch, NSMakeRange(NSNotFound, 0))); +} + +static NSTimeInterval RKDotNetDateFormatterSecondsFromMilliseconds(NSTimeInterval millisecs) +{ + return millisecs / 1000.f; +} + +static NSTimeInterval RKDotNetDateFormatterMillisecondsFromSeconds(NSTimeInterval seconds) +{ + return seconds *1000.f; +} + +@interface RKDotNetDateFormatter () +@property (nonatomic, strong) NSRegularExpression *dotNetExpression; + +- (NSString *)millisecondsFromString:(NSString *)string; +@end + +@implementation RKDotNetDateFormatter + ++ (instancetype)dotNetDateFormatterWithTimeZone:(NSTimeZone *)newTimeZone +{ + RKDotNetDateFormatter *formatter = [self new]; + if (newTimeZone) formatter.timeZone = newTimeZone; + return formatter; +} + +- (NSDate *)dateFromString:(NSString *)string +{ + NSString *milliseconds = [self millisecondsFromString:string]; + if (!milliseconds) { + RKLogError(@"Attempted to interpret an invalid .NET date string: %@", string); + return nil; + } + NSTimeInterval seconds = RKDotNetDateFormatterSecondsFromMilliseconds([milliseconds doubleValue]); + return [NSDate dateWithTimeIntervalSince1970:seconds]; +} + + +- (NSString *)stringFromDate:(NSDate *)date +{ + if (!date) { + RKLogError(@"Attempted to represent an invalid date: %@", date); + return nil; + } + return [self stringForObjectValue:date]; +} + +- (BOOL)getObjectValue:(id *)outValue forString:(NSString *)string errorDescription:(NSString **)error +{ + NSDate *date = [self dateFromString:string]; + if (outValue) + *outValue = date; + return (date != nil); +} + +- (NSString *)stringForObjectValue:(id)value +{ + NSParameterAssert([value isKindOfClass:[NSDate class]]); + NSString *timeZoneOffset = [super stringForObjectValue:value]; + NSTimeInterval milliseconds = RKDotNetDateFormatterMillisecondsFromSeconds([(NSDate *)value timeIntervalSince1970]); + return [NSString stringWithFormat:@"/Date(%1.0lf%@)/", milliseconds, timeZoneOffset]; +} + +- (instancetype)init +{ + self = [super init]; + if (self) { + self.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; + self.timeZone = [NSTimeZone timeZoneWithName:@"UTC"]; + [self setDateFormat:@"ZZ"]; // GMT offset, like "-0500" + NSString *pattern = @"\\/Date\\((-?\\d+)((?:[\\+\\-]\\d+)?)\\)\\/"; // /Date(mSecs)/ or /Date(-mSecs)/ or /Date(mSecs-0400)/ + self.dotNetExpression = [[NSRegularExpression alloc] initWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:NULL]; + } + return self; +} + +- (NSString *)millisecondsFromString:(NSString *)string +{ + if (!string) return nil; + NSTextCheckingResult *match = [self.dotNetExpression firstMatchInString:string options:NSMatchingReportCompletion range:NSMakeRange(0, [string length])]; + if (!match) return nil; + NSRange millisecRange = [match rangeAtIndex:1]; + if (!RKDotNetDateFormatterIsValidRange(millisecRange)) return nil; + NSString *milliseconds = [string substringWithRange:millisecRange]; + return milliseconds; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKErrors.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKErrors.h new file mode 100644 index 0000000..bf79280 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKErrors.h @@ -0,0 +1,59 @@ +// +// RKErrors.h +// RestKit +// +// Created by Blake Watters on 3/25/10. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <Foundation/Foundation.h> + +///--------------------------- +/// @name Error Domain & Codes +///--------------------------- + +// The error domain for RestKit generated errors +extern NSString * const RKErrorDomain; + +typedef NS_ENUM(NSInteger, RKRestKitError) { + RKUnsupportedMIMETypeError = 1, + RKOperationCancelledError = 2 +} ; + + +///-------------------------------------- +/// @name Error User Info Dictionary Keys +///-------------------------------------- + +/** + The key RestKit generated errors will appear at within an NSNotification + indicating an error + */ +extern NSString *const RKErrorNotificationErrorKey; + +/** + When RestKit constructs an NSError object from one or more RKErrorMessage + (or other object mapped error representations), the userInfo of the NSError + object will be populated with an array of the underlying error objects. + + These underlying errors can be accessed via RKObjectMapperErrorObjectsKey key. + + @see RKObjectMappingResult + */ +extern NSString *const RKObjectMapperErrorObjectsKey; + +extern NSString *const RKDetailedErrorsKey; // When multiple errors occur, they are stored in a composite error + +extern NSString *const RKMIMETypeErrorKey; diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKErrors.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKErrors.m new file mode 100644 index 0000000..ae9a154 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKErrors.m @@ -0,0 +1,28 @@ +// +// RKErrors.m +// RestKit +// +// Created by Blake Watters on 3/25/10. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKErrors.h" + +NSString * const RKErrorDomain = @"org.restkit.RestKit.ErrorDomain"; + +NSString * const RKObjectMapperErrorObjectsKey = @"RKObjectMapperErrorObjectsKey"; +NSString * const RKErrorNotificationErrorKey = @"error"; +NSString * const RKDetailedErrorsKey = @"DetailedErrors"; +NSString * const RKMIMETypeErrorKey = @"MIME Type"; diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKLog.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKLog.h new file mode 100644 index 0000000..3f6284f --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKLog.h @@ -0,0 +1,253 @@ +// +// RKLog.h +// RestKit +// +// Created by Blake Watters on 5/3/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <Foundation/Foundation.h> +#if __has_include("CoreData.h") +#import <CoreData/CoreData.h> +#endif + +/** + RestKit Logging is based on the LibComponentLogging framework + + @see lcl_config_components_RK.h + @see lcl_config_logger_RK.h + */ +#import "lcl_RK.h" + +/** + * Protocol which classes can implement to determine how RestKit log messages actually get handled. + * There is a single "current" logging class installed, which all log messages will flow + * through. + */ +@protocol RKLogging + ++ (void)logWithComponent:(_RKlcl_component_t)component + level:(_RKlcl_level_t)level + path:(const char *)file + line:(uint32_t)line + function:(const char *)function + format:(NSString *)format, ... NS_FORMAT_FUNCTION(6, 7); + +@end + +/** + * Functions to get and set the current RKLogging class. + */ +Class <RKLogging> RKGetLoggingClass(void); +void RKSetLoggingClass(Class <RKLogging> loggingClass); + + + +/** + RKLogComponent defines the active component within any given portion of RestKit + + By default, messages will log to the base 'RestKit' log component. All other components + used by RestKit are nested under this parent, so this effectively sets the default log + level for the entire library. + + The component can be undef'd and redefined to change the active logging component. + */ +#define RKLogComponent RKlcl_cRestKit + +/** + The logging macros. These macros will log to the currently active logging component + at the log level identified in the name of the macro. + + For example, in the `RKMappingOperation` class we would redefine the RKLogComponent: + + #undef RKLogComponent + #define RKLogComponent RKlcl_cRestKitObjectMapping + + The RKlcl_c prefix is the LibComponentLogging data structure identifying the logging component + we want to target within this portion of the codebase. See lcl_config_component_RK.h for reference. + + Having defined the logging component, invoking the logger via: + + RKLogInfo(@"This is my log message!"); + + Would result in a log message similar to: + + I RestKit.ObjectMapping:RKLog.h:42 This is my log message! + + The message will only be logged if the log level for the active component is equal to or higher + than the level the message was logged at (in this case, Info). + */ +#define RKLogCritical(...) \ +RKlcl_log(RKLogComponent, RKlcl_vCritical, @"" __VA_ARGS__) + +#define RKLogError(...) \ +RKlcl_log(RKLogComponent, RKlcl_vError, @"" __VA_ARGS__) + +#define RKLogWarning(...) \ +RKlcl_log(RKLogComponent, RKlcl_vWarning, @"" __VA_ARGS__) + +#define RKLogInfo(...) \ +RKlcl_log(RKLogComponent, RKlcl_vInfo, @"" __VA_ARGS__) + +#define RKLogDebug(...) \ +RKlcl_log(RKLogComponent, RKlcl_vDebug, @"" __VA_ARGS__) + +#define RKLogTrace(...) \ +RKlcl_log(RKLogComponent, RKlcl_vTrace, @"" __VA_ARGS__) + +/** + Log Level Aliases + + These aliases simply map the log levels defined within LibComponentLogger to something more friendly + */ +#define RKLogLevelOff RKlcl_vOff +#define RKLogLevelCritical RKlcl_vCritical +#define RKLogLevelError RKlcl_vError +#define RKLogLevelWarning RKlcl_vWarning +#define RKLogLevelInfo RKlcl_vInfo +#define RKLogLevelDebug RKlcl_vDebug +#define RKLogLevelTrace RKlcl_vTrace + +/** + Alias the LibComponentLogger logging configuration method. Also ensures logging + is initialized for the framework. + + Expects the name of the component and a log level. + + Examples: + + // Log debugging messages from the Network component + RKLogConfigureByName("RestKit/Network", RKLogLevelDebug); + + // Log only critical messages from the Object Mapping component + RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelCritical); + */ +#define RKLogConfigureByName(name, level) \ +RKlcl_configure_by_name(name, level); + +/** + Alias for configuring the LibComponentLogger logging component for the App. This + enables the end-user of RestKit to leverage RKLog() to log messages inside of + their apps. + */ +#define RKLogSetAppLoggingLevel(level) \ +RKlcl_configure_by_name("App", level); + +/** + Temporarily changes the logging level for the specified component and executes the block. Any logging + statements executed within the body of the block against the specified component will log at the new + logging level. After the block has executed, the logging level is restored to its previous state. + */ +#define RKLogToComponentWithLevelWhileExecutingBlock(_component, _level, _block) \ + do { \ + int _currentLevel = _RKlcl_component_level[_component]; \ + RKlcl_configure_by_component(_component, _level); \ + @try { \ + _block(); \ + } \ + @catch (NSException *exception) { \ + @throw; \ + } \ + @finally { \ + RKlcl_configure_by_component(_component, _currentLevel); \ + } \ + } while (false); + +/** + Temporarily turns off logging for the given logging component during execution of the block. + After the block has finished execution, the logging level is restored to its previous state. + */ +#define RKLogSilenceComponentWhileExecutingBlock(component, _block) \ + RKLogToComponentWithLevelWhileExecutingBlock(component, RKLogLevelOff, _block) + +/** + Temporarily changes the logging level for the configured RKLogComponent and executes the block. Any logging + statements executed within the body of the block for the current logging component will log at the new + logging level. After the block has finished execution, the logging level is restored to its previous state. + */ +#define RKLogWithLevelWhileExecutingBlock(_level, _block) \ + RKLogToComponentWithLevelWhileExecutingBlock(RKLogComponent, _level, _block) + + +/** + Temporarily turns off logging for current logging component during execution of the block. + After the block has finished execution, the logging level is restored to its previous state. + */ +#define RKLogSilenceWhileExecutingBlock(_block) \ + RKLogToComponentWithLevelWhileExecutingBlock(RKLogComponent, RKLogLevelOff, _block) + + +/** + Set the Default Log Level + + Based on the presence of the DEBUG flag, we default the logging for the RestKit parent component + to Info or Warning. + + You can override this setting by defining RKLogLevelDefault as a pre-processor macro. + */ +#ifndef RKLogLevelDefault + #ifdef DEBUG + #define RKLogLevelDefault RKLogLevelInfo + #else + #define RKLogLevelDefault RKLogLevelWarning + #endif +#endif + +/** + Configure RestKit logging from environment variables. + (Use Option + Command + R to set Environment Variables prior to run.) + + For example to configure the equivalent of setting the following in code: + RKLogConfigureByName("RestKit/Network", RKLogLevelTrace); + + Define an environment variable named 'RKLogLevel.RestKit.Network' and set its value to "Trace" + + See lcl_config_components_RK.h for configurable RestKit logging components. + + Valid values are the following: + Default or 0 + Critical or 1 + Error or 2 + Warning or 3 + Info or 4 + Debug or 5 + Trace or 6 + */ +void RKLogConfigureFromEnvironment(void); + +/** + Logs extensive information about an NSError generated as the results + of a failed key-value validation error. + */ +void RKLogValidationError(NSError *error); + +#if __has_include("CoreData.h") +/** + Logs extensive information an NSError generated as the result of a + failed Core Data interaction, such as the execution of a fetch request + or the saving of a managed object context. + + The error will be logged to the RestKit/CoreData component with an + error level of RKLogLevelError regardless of the current logging context + at invocation time. + */ +void RKLogCoreDataError(NSError *error); +#endif + +/** + Logs the value of an NSUInteger as a binary string. Useful when + examining integers containing bitmasked values. + */ +void RKLogIntegerAsBinary(NSUInteger); diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKLog.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKLog.m new file mode 100644 index 0000000..a092fd0 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKLog.m @@ -0,0 +1,213 @@ +// +// RKLog.m +// RestKit +// +// Created by Blake Watters on 6/10/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKLog.h" + +@interface RKNSLogLogger : NSObject <RKLogging> +@end + +#if RKLOG_USE_NSLOGGER && __has_include("LCLNSLogger_RK.h") + #import "LCLNSLogger_RK.h" + #define RKLOG_CLASS LCLNSLogger_RK + +#elif __has_include("RKLumberjackLogger.h") && __has_include(<CocoaLumberjack/CocoaLumberjack.h>) + #import "RKLumberjackLogger.h" + #define RKLOG_CLASS RKLumberjackLogger + +#else + #define RKLOG_CLASS RKNSLogLogger +#endif + +// Hook into Objective-C runtime to configure logging when we are loaded +@interface RKLogInitializer : NSObject +@end + +@implementation RKLogInitializer + ++ (void)load +{ + RKlcl_configure_by_name("RestKit*", RKLogLevelDefault); + RKlcl_configure_by_name("App", RKLogLevelDefault); + if (RKGetLoggingClass() == Nil) RKSetLoggingClass([RKLOG_CLASS class]); + RKLogInfo(@"RestKit logging initialized..."); +} + +@end + +static Class <RKLogging> RKLoggingClass; + +Class <RKLogging> RKGetLoggingClass(void) +{ + return RKLoggingClass; +} + +void RKSetLoggingClass(Class <RKLogging> loggingClass) +{ + RKLoggingClass = loggingClass; +} + +@implementation RKNSLogLogger + ++ (void)logWithComponent:(_RKlcl_component_t)component + level:(_RKlcl_level_t)level + path:(const char *)file + line:(uint32_t)line + function:(const char *)function + format:(NSString *)format, ... +{ + va_list args; + va_start(args, format); + NSString *message = [[NSString alloc] initWithFormat:format arguments:args]; + va_end(args); + const char *fileName = (fileName = strrchr(file, '/')) ? fileName + 1 : file; + NSLog(@"%s %s:%s:%d %@", _RKlcl_level_header_1[level], _RKlcl_component_header[component], fileName, line, message); +} + +@end + +int RKLogLevelForString(NSString *, NSString *); + +void RKLogConfigureFromEnvironment(void) +{ + static NSString *logComponentPrefix = @"RKLogLevel."; + + NSDictionary *envVars = [[NSProcessInfo processInfo] environment]; + + for (NSString *envVarName in [envVars allKeys]) { + if ([envVarName hasPrefix:logComponentPrefix]) { + NSString *logLevel = [envVars valueForKey:envVarName]; + NSString *logComponent = [envVarName stringByReplacingOccurrencesOfString:logComponentPrefix withString:@""]; + logComponent = [logComponent stringByReplacingOccurrencesOfString:@"." withString:@"/"]; + + const char *log_component_c_str = [logComponent cStringUsingEncoding:NSUTF8StringEncoding]; + int log_level_int = RKLogLevelForString(logLevel, envVarName); + RKLogConfigureByName(log_component_c_str, log_level_int); + } + } +} + + +int RKLogLevelForString(NSString *logLevel, NSString *envVarName) +{ + // Forgive the user if they specify the full name for the value i.e. "RKLogLevelDebug" instead of "Debug" + logLevel = [logLevel stringByReplacingOccurrencesOfString:@"RKLogLevel" withString:@""]; + + if ([logLevel isEqualToString:@"Off"] || + [logLevel isEqualToString:@"0"]) { + return RKLogLevelOff; + } + else if ([logLevel isEqualToString:@"Critical"] || + [logLevel isEqualToString:@"1"]) { + return RKLogLevelCritical; + } + else if ([logLevel isEqualToString:@"Error"] || + [logLevel isEqualToString:@"2"]) { + return RKLogLevelError; + } + else if ([logLevel isEqualToString:@"Warning"] || + [logLevel isEqualToString:@"3"]) { + return RKLogLevelWarning; + } + else if ([logLevel isEqualToString:@"Info"] || + [logLevel isEqualToString:@"4"]) { + return RKLogLevelInfo; + } + else if ([logLevel isEqualToString:@"Debug"] || + [logLevel isEqualToString:@"5"]) { + return RKLogLevelDebug; + } + else if ([logLevel isEqualToString:@"Trace"] || + [logLevel isEqualToString:@"6"]) { + return RKLogLevelTrace; + } + else if ([logLevel isEqualToString:@"Default"]) { + return RKLogLevelDefault; + } + else { + NSString *errorMessage = [NSString stringWithFormat:@"The value: \"%@\" for the environment variable: \"%@\" is invalid. \ + \nThe log level must be set to one of the following values \ + \n Default or 0 \ + \n Critical or 1 \ + \n Error or 2 \ + \n Warning or 3 \ + \n Info or 4 \ + \n Debug or 5 \ + \n Trace or 6\n", logLevel, envVarName]; + @throw [NSException exceptionWithName:NSInvalidArgumentException reason:errorMessage userInfo:nil]; + + return -1; + } +} + +void RKLogIntegerAsBinary(NSUInteger bitMask) +{ + NSUInteger bit = ~(NSUIntegerMax >> 1); + NSMutableString *string = [NSMutableString string]; + do { + [string appendString:(((NSUInteger)bitMask & bit) ? @"1" : @"0")]; + } while (bit >>= 1); + + NSLog(@"Value of %ld in binary: %@", (long)bitMask, string); +} + +void RKLogValidationError(NSError *error) +{ +#if __has_include("CoreData.h") + if ([[error domain] isEqualToString:NSCocoaErrorDomain]) { + NSDictionary *userInfo = [error userInfo]; + NSArray *errors = [userInfo valueForKey:@"NSDetailedErrors"]; + if (errors) { + for (NSError *detailedError in errors) { + NSDictionary *subUserInfo = [detailedError userInfo]; + RKLogError(@"Detailed Error\n \ + NSLocalizedDescriptionKey:\t\t%@\n \ + NSValidationKeyErrorKey:\t\t\t%@\n \ + NSValidationPredicateErrorKey:\t%@\n \ + NSValidationObjectErrorKey:\n%@\n", + [subUserInfo valueForKey:NSLocalizedDescriptionKey], + [subUserInfo valueForKey:NSValidationKeyErrorKey], + [subUserInfo valueForKey:NSValidationPredicateErrorKey], + [subUserInfo valueForKey:NSValidationObjectErrorKey]); + } + } else { + RKLogError(@"Validation Error\n \ + NSLocalizedDescriptionKey:\t\t%@\n \ + NSValidationKeyErrorKey:\t\t\t%@\n \ + NSValidationPredicateErrorKey:\t%@\n \ + NSValidationObjectErrorKey:\n%@\n", + [userInfo valueForKey:NSLocalizedDescriptionKey], + [userInfo valueForKey:NSValidationKeyErrorKey], + [userInfo valueForKey:NSValidationPredicateErrorKey], + [userInfo valueForKey:NSValidationObjectErrorKey]); + } + return; + } +#endif + RKLogError(@"Validation Error: %@ (userInfo: %@)", error, [error userInfo]); +} + +#if __has_include("CoreData.h") +void RKLogCoreDataError(NSError *error) +{ + RKLogToComponentWithLevelWhileExecutingBlock(RKlcl_cRestKitCoreData, RKLogLevelError, ^{ + RKLogValidationError(error); + }); +} +#endif diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKMIMETypeSerialization.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKMIMETypeSerialization.h new file mode 100644 index 0000000..071869a --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKMIMETypeSerialization.h @@ -0,0 +1,97 @@ +// +// RKMIMETypeSerialization.h +// RestKit +// +// Created by Blake Watters on 5/18/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKMIMETypes.h" +#import "RKSerialization.h" + +/** + The `RKMIMETypeSerialization` class provides support for the registration of classes conforming to the `RKSerialization` protocol by MIME Type and the serialization and deserialization of content by MIME Type. Serialization implementations may be registered by an exact string match (i.e. 'application/json' for a JSON serialization implementation) or by regular expression to match MIME Type by pattern. + */ +@interface RKMIMETypeSerialization : NSObject + +///--------------------------------------- +/// @name Managing MIME Type Registrations +///--------------------------------------- + +/** + Registers the given serialization class to handle content for the given MIME Type identifier. + + MIME Types may be given as either a string or as a regular expression that matches the MIME Types for which the given serialization should handle. Serializations are searched in the reverse order of their registration. If a registration is made for an already registered MIME Type, the new registration will take precedence. + + @param serializationClass The class conforming to the RKSerialization protocol to be registered as handling the given MIME Type. + @param MIMETypeStringOrRegularExpression A string or regular expression specifying the MIME Type(s) that given serialization implementation is to be registered as handling. + */ ++ (void)registerClass:(Class<RKSerialization>)serializationClass forMIMEType:(id)MIMETypeStringOrRegularExpression; + +/** + Unregisters the given serialization class from handling any MIME Types. + + After this method is invoked, invocations of `serializationForMIMEType:` will no longer return the unregistered serialization class. + + @param serializationClass The class conforming to the `RKSerialization` protocol to be unregistered. + */ ++ (void)unregisterClass:(Class<RKSerialization>)serializationClass; + +/** + Returns the serialization class registered to handle the given MIME Type. + + Searches the registrations in reverse order for the first serialization implementation registered to handle the given MIME Type. Matches are determined by doing a lowercase string comparison if the MIME Type was registered with a string identifier or by evaluating a regular expression match against the given MIME Type if registered with a regular expression. + + @param MIMEType The MIME Type for which to return the registered `RKSerialization` conformant class. + @return A class conforming to the RKSerialization protocol registered for the given MIME Type or nil if none was found. + */ ++ (Class<RKSerialization>)serializationClassForMIMEType:(NSString *)MIMEType; + +/** + Returns a set containing the string values for all MIME Types for which a serialization implementation has been registered. + + @return An `NSSet` object whose elements are `NSString` values enumerating the registered MIME Types. + */ ++ (NSSet *)registeredMIMETypes; + +///--------------------------------------------------------- +/// @name Serializing and Deserializing Content by MIME Type +///--------------------------------------------------------- + +/** + Deserializes and returns a Foundation object representation of the given UTF-8 encoded data in the serialization format for the given MIME Type. + + On invocation, searches the registrations by invoking `serializationClassForMIMEType:` with the given MIME Type and then invokes `objectFromData:error:` on the `RKSerialization` conformant class returned. If no serialization implementation is found to handle the given MIME Type, nil is returned and the given error pointer will be set to an NSError object with the `RKMissingSerializationForMIMETypeError` code. + + @param data The UTF-8 encoded data representation of the object to be deserialized. + @param MIMEType The MIME Type of the serialization format the data is in. + @param error A pointer to an NSError object. + @return A Foundation object from the serialized data in data, or nil if an error occurs. + */ ++ (id)objectFromData:(NSData *)data MIMEType:(NSString *)MIMEType error:(NSError **)error; + +/** + Serializes and returns a UTF-8 encoded data representation of the given Foundation object in the serialization format for the given MIME Type. + + On invocation, searches the registrations by invoking `serializationClassForMIMEType:` with the given MIME Type and then invokes `objectFromData:error:` on the `RKSerialization` conformant class returned. If no serialization implementation is found to handle the given MIME Type, nil is returned and the given error pointer will be set to an NSError object with the `RKMissingSerializationForMIMETypeError` code. + + @param object The Foundation object to serialized. + @param MIMEType The MIME Type of the serialization format the data is in. + @param error A pointer to an NSError object. + @return A Foundation object from the serialized data in data, or nil if an error occurs. + */ ++ (NSData *)dataFromObject:(id)object MIMEType:(NSString *)MIMEType error:(NSError **)error; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKMIMETypeSerialization.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKMIMETypeSerialization.m new file mode 100644 index 0000000..2e3bf56 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKMIMETypeSerialization.m @@ -0,0 +1,190 @@ +// +// RKMIMETypeSerialization.m +// RestKit +// +// Created by Blake Watters on 5/18/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKMIMETypeSerialization.h" +#import "RKErrors.h" +#import "RKSerialization.h" +#import "RKLog.h" +#import "RKURLEncodedSerialization.h" +#import "RKNSJSONSerialization.h" + +// Define logging component +#undef RKLogComponent +#define RKLogComponent RKlcl_cRestKitSupport + +@interface RKMIMETypeSerializationRegistration : NSObject + +@property (nonatomic, strong) id MIMETypeStringOrRegularExpression; +@property (nonatomic, assign) Class<RKSerialization> serializationClass; + +- (instancetype)initWithMIMEType:(id)MIMETypeStringOrRegularExpression serializationClass:(Class<RKSerialization>)serializationClass NS_DESIGNATED_INITIALIZER; +- (BOOL)matchesMIMEType:(NSString *)MIMEType; +@end + +@implementation RKMIMETypeSerializationRegistration + +- (instancetype)init +{ + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"-init is not a valid initializer for the class %@, use designated initilizer -initWithMIMEType:serializationClass:", NSStringFromClass([self class])] + userInfo:nil]; + return [self init]; +} + +- (instancetype)initWithMIMEType:(id)MIMETypeStringOrRegularExpression serializationClass:(Class<RKSerialization>)serializationClass +{ + NSParameterAssert(MIMETypeStringOrRegularExpression); + NSParameterAssert(serializationClass); + NSAssert([MIMETypeStringOrRegularExpression isKindOfClass:[NSString class]] + || [MIMETypeStringOrRegularExpression isKindOfClass:[NSRegularExpression class]], + @"Can only register a serialization class for a MIME Type by string or regular expression."); + + self = [super init]; + if (self) { + self.MIMETypeStringOrRegularExpression = MIMETypeStringOrRegularExpression; + self.serializationClass = serializationClass; + } + + return self; +} + +- (BOOL)matchesMIMEType:(NSString *)MIMEType +{ + return RKMIMETypeInSet(MIMEType, [NSSet setWithObject:self.MIMETypeStringOrRegularExpression]); +} + +- (NSString *)description +{ + NSString *mimeTypeDescription = [self.MIMETypeStringOrRegularExpression isKindOfClass:[NSRegularExpression class]] ? + [NSString stringWithFormat:@"MIME Type =~ \"%@\"", self.MIMETypeStringOrRegularExpression] : + [NSString stringWithFormat:@"MIME Type == \"%@\"", self.MIMETypeStringOrRegularExpression]; + return [NSString stringWithFormat:@"<%@: %p, %@, serializationClass=%@>", + NSStringFromClass([self class]), self, mimeTypeDescription, NSStringFromClass(self.serializationClass)]; +} + +@end + +@interface RKMIMETypeSerialization () +@property (nonatomic, strong) NSMutableArray *registrations; +@end + +@implementation RKMIMETypeSerialization + ++ (RKMIMETypeSerialization *)sharedSerialization +{ + static RKMIMETypeSerialization *sharedInstance = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedInstance = [[RKMIMETypeSerialization alloc] init]; + [sharedInstance addRegistrationsForKnownSerializations]; + }); + return sharedInstance; + +} + +- (instancetype)init +{ + self = [super init]; + if (self) { + self.registrations = [NSMutableArray new]; + } + + return self; +} + +- (void)addRegistrationsForKnownSerializations +{ + // URL Encoded + [self.registrations addObject:[[RKMIMETypeSerializationRegistration alloc] initWithMIMEType:RKMIMETypeFormURLEncoded + serializationClass:[RKURLEncodedSerialization class]]]; + // JSON + [self.registrations addObject:[[RKMIMETypeSerializationRegistration alloc] initWithMIMEType:RKMIMETypeJSON + serializationClass:[RKNSJSONSerialization class]]]; +} + +#pragma mark - Public + ++ (Class<RKSerialization>)serializationClassForMIMEType:(NSString *)MIMEType +{ + for (RKMIMETypeSerializationRegistration *registration in [[self sharedSerialization].registrations reverseObjectEnumerator]) { + if ([registration matchesMIMEType:MIMEType]) { + return registration.serializationClass; + } + } + return nil; +} + ++ (void)registerClass:(Class<RKSerialization>)serializationClass forMIMEType:(id)MIMETypeStringOrRegularExpression +{ + RKMIMETypeSerializationRegistration *registration = [[RKMIMETypeSerializationRegistration alloc] initWithMIMEType:MIMETypeStringOrRegularExpression serializationClass:serializationClass]; + [[self sharedSerialization].registrations addObject:registration]; +} + ++ (void)unregisterClass:(Class<RKSerialization>)serializationClass +{ + NSArray *registrationsCopy = [[self sharedSerialization].registrations copy]; + for (RKMIMETypeSerializationRegistration *registration in registrationsCopy) { + if (registration.serializationClass == serializationClass) { + [[self sharedSerialization].registrations removeObject:registration]; + } + } +} + ++ (NSSet *)registeredMIMETypes +{ + return [NSSet setWithArray:[[self sharedSerialization].registrations valueForKey:@"MIMETypeStringOrRegularExpression"]]; +} + ++ (id)objectFromData:(NSData *)data MIMEType:(NSString *)MIMEType error:(NSError **)error +{ + NSParameterAssert(data); + NSParameterAssert(MIMEType); + + Class<RKSerialization> serializationClass = [self serializationClassForMIMEType:MIMEType]; + if (!serializationClass) { + if (error) { + NSString* errorMessage = [NSString stringWithFormat:@"Cannot deserialize data: No serialization registered for MIME Type '%@'", MIMEType]; + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey : errorMessage, RKMIMETypeErrorKey : MIMEType }; + *error = [NSError errorWithDomain:RKErrorDomain code:RKUnsupportedMIMETypeError userInfo:userInfo]; + } + return nil; + } + + return [serializationClass objectFromData:data error:error]; +} + ++ (id)dataFromObject:(id)object MIMEType:(NSString *)MIMEType error:(NSError **)error +{ + NSParameterAssert(object); + NSParameterAssert(MIMEType); + Class<RKSerialization> serializationClass = [self serializationClassForMIMEType:MIMEType]; + if (!serializationClass) { + if (error) { + NSString* errorMessage = [NSString stringWithFormat:@"Cannot deserialize data: No serialization registered for MIME Type '%@'", MIMEType]; + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey : errorMessage, RKMIMETypeErrorKey : MIMEType }; + *error = [NSError errorWithDomain:RKErrorDomain code:RKUnsupportedMIMETypeError userInfo:userInfo]; + } + return nil; + } + + return [serializationClass dataFromObject:object error:error]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKMIMETypes.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKMIMETypes.h new file mode 100644 index 0000000..0abb0d9 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKMIMETypes.h @@ -0,0 +1,54 @@ +// +// RKMIMETypes.h +// RestKit +// +// Created by Blake Watters on 5/18/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <Foundation/Foundation.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** + MIME Type Constants + */ + +/// MIME Type application/json +extern NSString * const RKMIMETypeJSON; + +/// MIME Type application/x-www-form-urlencoded +extern NSString * const RKMIMETypeFormURLEncoded; + +/// MIME Type application/xml +extern NSString * const RKMIMETypeXML; + +/// MIME Type text/xml +extern NSString * const RKMIMETypeTextXML; + +/** + Returns `YES` if the given MIME Type matches any MIME Type identifiers in the given set. + + @param MIMEType The MIME Type to evaluate the match for. + @param MIMETypes An `NSSet` object who entries are `NSString` or `NSRegularExpression` objects specifying MIME Types. + @return `YES` if the given MIME Type matches any identifier in the set, else `NO`. + */ +BOOL RKMIMETypeInSet(NSString *MIMEType, NSSet *MIMETypes); + +#ifdef __cplusplus +} +#endif diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKMIMETypes.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKMIMETypes.m new file mode 100644 index 0000000..c22ff5f --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKMIMETypes.m @@ -0,0 +1,44 @@ +// +// RKMIMETypes.m +// RestKit +// +// Created by Blake Watters on 5/18/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKMIMETypes.h" + +NSString * const RKMIMETypeJSON = @"application/json"; +NSString * const RKMIMETypeFormURLEncoded = @"application/x-www-form-urlencoded"; +NSString * const RKMIMETypeXML = @"application/xml"; +NSString * const RKMIMETypeTextXML = @"text/xml"; + +BOOL RKMIMETypeInSet(NSString *MIMEType, NSSet *MIMETypes) +{ + for (id MIMETypeStringOrRegularExpression in MIMETypes) { + if ([MIMETypeStringOrRegularExpression isKindOfClass:[NSString class]]) { + if ([[MIMETypeStringOrRegularExpression lowercaseString] isEqualToString:[MIMEType lowercaseString]]) return YES; + } else if ([MIMETypeStringOrRegularExpression isKindOfClass:[NSRegularExpression class]]) { + NSRegularExpression *regex = (NSRegularExpression *) MIMETypeStringOrRegularExpression; + NSUInteger numberOfMatches = [regex numberOfMatchesInString:[MIMEType lowercaseString] options:0 range:NSMakeRange(0, [MIMEType length])]; + if (numberOfMatches > 0) return YES; + } else { + NSString *reason = [NSString stringWithFormat:@"Unable to evaluate match for MIME Type '%@': expected an `NSString` or `NSRegularExpression`, got a `%@`", MIMEType, NSStringFromClass([MIMEType class])]; + @throw [NSException exceptionWithName:NSInvalidArgumentException reason:reason userInfo:nil]; + } + } + + return NO; +} diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKMacros.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKMacros.h new file mode 100644 index 0000000..2852d08 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKMacros.h @@ -0,0 +1,51 @@ +// +// RKMacros.h +// RestKit +// +// Created by Jawwad Ahmad on 7/18/12. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef RestKit_RKMacros_h +#define RestKit_RKMacros_h + +/* + Instead of using the normal DEPRECATED_ATTRIBUTE use DEPRECATED_ATTRIBUTE_MESSAGE(message) + to display a helpful recommendation message along with the deprecation message. + */ +#ifndef DEPRECATED_ATTRIBUTE_MESSAGE +#define DEPRECATED_ATTRIBUTE_MESSAGE(message) __attribute__((deprecated (message))) +#endif + +/* + Add this macro before each category implementation, so we don't have to use + -all_load or -force_load to load object files from static libraries that only contain + categories and no classes. + See http://developer.apple.com/library/mac/#qa/qa2006/qa1490.html for more info. + + Shamelessly borrowed from Three20 + */ +#define RK_FIX_CATEGORY_BUG(name) @interface RK_FIX_CATEGORY_BUG##name @end \ +@implementation RK_FIX_CATEGORY_BUG##name @end + +/* + Raises an `NSInvalidArgumentException` in the event that the given value is not an instance of the given class or an instance of any class that inherits from that class. + */ +#define RKAssertValueIsKindOfClass(value, expectedClass) \ +if (! [value isKindOfClass:expectedClass]) { \ +[NSException raise:NSInvalidArgumentException format:@"%@ invoked with invalid input value: expected a `%@`, but instead got a `%@`", [self class], expectedClass, [value class]]; \ +} + +#endif diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKNSJSONSerialization.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKNSJSONSerialization.h new file mode 100644 index 0000000..598e250 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKNSJSONSerialization.h @@ -0,0 +1,29 @@ +// +// RKNSJSONSerialization.h +// RestKit +// +// Created by Blake Watters on 8/31/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKSerialization.h" + +/** + The `RKNSJSONSerialization` class conforms to the `RKSerialization` protocol and provides support for the serialization and deserialization of data in the JSON format using the Apple provided `NSJSONSerialization` class. This is the default JSON implementation for RestKit. + + @see http://www.json.org/ + */ +@interface RKNSJSONSerialization : NSObject <RKSerialization> +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKNSJSONSerialization.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKNSJSONSerialization.m new file mode 100644 index 0000000..3b277ea --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKNSJSONSerialization.m @@ -0,0 +1,35 @@ +// +// RKNSJSONSerialization.m +// RestKit +// +// Created by Blake Watters on 8/31/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKNSJSONSerialization.h" + +@implementation RKNSJSONSerialization + ++ (id)objectFromData:(NSData *)data error:(NSError **)error +{ + return [NSJSONSerialization JSONObjectWithData:data options:0 error:error]; +} + ++ (NSData *)dataFromObject:(id)object error:(NSError **)error +{ + return [NSJSONSerialization dataWithJSONObject:object options:0 error:error]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKOperationStateMachine.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKOperationStateMachine.h new file mode 100644 index 0000000..fc621ea --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKOperationStateMachine.h @@ -0,0 +1,158 @@ +// +// RKOperationStateMachine.h +// RestKit +// +// Created by Blake Watters on 4/11/13. +// Copyright (c) 2013 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <Foundation/Foundation.h> + +/** + The `RKOperationStateMachine` class provides an implementation of a state machine that is suitable for implementing a concurrent `NSOperation` subclass via composition. The concurrency mechanism is a dispatch queue. The state machine takes care of correctly implementing all aspects of a concurrent `NSOperation` including: + 1. Asynchronous execution + 1. Locking + 1. Appropriate state transitions + 1. Cancellation + 1. State Instrospection + + The state machine begins its life in the ready state. Upon start, the state transitions to executing and a user-supplied execution block is invoked on the operation's dispatch queue. The operation remains in the executing state until it is finished. Just before the operation is finished, a finalization block is invoked. In the event that the operation is cancelled, then an optional cancellation block is invoked. Note that because cancellation semantics can vary widely, a cancelled operation is merely flagged as being cancelled. It is the responsibility of the operation to ensure that a cancelled operation is finished as soon as possible. + + The underlying implementation of the state machine is backed by [TransitionKit](http://github.com/blakewatters/TransitionKit) + */ +@interface RKOperationStateMachine : NSObject + +- (instancetype)init __attribute__((unavailable("Invoke initWithOperation: instead."))); + +///----------------------------------- +/// @name Initializing a State Machine +///----------------------------------- + +/** + Initializes a new state machine object with a given operation and dispatch queue. + + @param operation The operation that the receiver is modeling the concurrent lifecycle of. + @param dispatchQueue The dispatch queue on which the operation executes concurrently. + @return The receiver, initialized with the given operation and queue. + */ +- (instancetype)initWithOperation:(NSOperation *)operation dispatchQueue:(dispatch_queue_t)dispatchQueue NS_DESIGNATED_INITIALIZER; + +///----------------------- +/// @name Inspecting State +///----------------------- + +/** + Returns a Boolean value that indicates if the receiver is ready to be started. + + @return `YES` if the receiver is ready to be started, else `NO`. + */ +@property (nonatomic, getter=isReady, readonly) BOOL ready; + +/** + Returns a Boolean value that indicates if the receiver is executing. + + @return `YES` if the receiver is executing, else `NO`. + */ +@property (nonatomic, getter=isExecuting, readonly) BOOL executing; + +/** + Returns a Boolean value that indicates if the receiver has been cancelled. + + @return `YES` if the receiver has been cancelled, else `NO`. + */ +@property (nonatomic, getter=isCancelled, readonly) BOOL cancelled; + +/** + Returns a Boolean value that indicates if the receiver has finished executing. + + @return `YES` if the receiver is finished, else `NO`. + */ +@property (nonatomic, getter=isFinished, readonly) BOOL finished; + +///-------------------- +/// @name Firing Events +///-------------------- + +/** + Starts the operation by transitioning into the executing state and asychronously invoking the execution block on the operation dispatch queue. + */ +- (void)start; + +/** + Finishes the operation by transitioning from the executing state to the finished state. The state transition is executed asynchronously on the operation dispatch queue. Invokes the finalization block just before the state changes from executing to finished. + */ +- (void)finish; + +/** + Marks the operation is being cancelled. Cancellation results in state transition because cancellation semantics can vary widely. Once the cancellation flag has been set (`isCancelled` return `YES`), the cancellation block is invoked asynchronously on the operation dispatch queue. The operation must be finished as soon as possible. + */ +- (void)cancel; + +///--------------------------------- +/// @name Configuring Event Handlers +///--------------------------------- + +/** + Sets a block to be executed on the operation dispatch queue once the operation transitions to the executing state. + + @param block The block to be executed. + */ +- (void)setExecutionBlock:(void (^)(void))block; + +/** + Sets a block to be executed when the operation is cancelled. The block will be invoked on the operation dispatch queue. Cancellation does not trigger any state transition -- the operation must still be explicitly finished as soon as possible. If appropriate, the operation may be finished within the body of the cancellation block. + + @param block The block to be executed. + */ +- (void)setCancellationBlock:(void (^)(void))block; + +/** + Sets a block to be executed when the operation is about to transition from executing to finished. This block is invoked regardless of the cancellation state. This block should be used to perform any last minute cleanup or preparation before the operation finishes. + + @param block The block to be executed. + */ +- (void)setFinalizationBlock:(void (^)(void))block; + +///------------------------------ +/// @name Accessing Configuration +///------------------------------ + +/** + The operation that the receiver is modeling the lifecycle of. + */ +@property (nonatomic, weak, readonly) NSOperation *operation; + +/** + The dispatch queue within which the state machine executes. + */ +@property (nonatomic, assign, readonly) dispatch_queue_t dispatchQueue; + +///------------------------------------------ +/// @name Performing Blocks that Mutate State +///------------------------------------------ + +/** + Executes a block after acquiring an exclusive lock on the receiver. This enables the block to safely mutate the state of the operation. The execution context of the block is not changed -- it is always executed within the caller's thread context. If you wish to guarantee execution on the dispatch queue backing the state machine then you must dispatch onto the queue before submitting your block for execution. + + @param block The block to execute after acquiring an exclusive lock on the receiver. + */ +- (void)performBlockWithLock:(void (^)(void))block; + +@end + +/** + Raised when an unexpected error has occurred. + */ +extern NSString *const RKOperationFailureException; diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKOperationStateMachine.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKOperationStateMachine.m new file mode 100644 index 0000000..1ba5fb0 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKOperationStateMachine.m @@ -0,0 +1,209 @@ +// +// RKOperationStateMachine.m +// RestKit +// +// Created by Blake Watters on 4/11/13. +// Copyright (c) 2013 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "TransitionKit.h" +#import "RKOperationStateMachine.h" + +NSString *const RKOperationFailureException = @"RKOperationFailureException"; + +static NSString *const RKOperationStateReady = @"Ready"; +static NSString *const RKOperationStateExecuting = @"Executing"; +static NSString *const RKOperationStateFinished = @"Finished"; + +static NSString *const RKOperationEventStart = @"start"; +static NSString *const RKOperationEventFinish = @"finish"; + +static NSString *const RKOperationLockName = @"org.restkit.operation.lock"; + +@interface RKOperationStateMachine () +@property (nonatomic, strong) TKStateMachine *stateMachine; +@property (nonatomic, weak, readwrite) NSOperation *operation; +@property (nonatomic, assign, readwrite) dispatch_queue_t dispatchQueue; +@property (nonatomic, assign, getter = isCancelled) BOOL cancelled; +@property (nonatomic, copy) void (^cancellationBlock)(void); +@property (nonatomic, strong) NSRecursiveLock *lock; +@end + +@implementation RKOperationStateMachine + +- (instancetype)initWithOperation:(NSOperation *)operation dispatchQueue:(dispatch_queue_t)dispatchQueue +{ + if (! operation) [NSException raise:NSInvalidArgumentException format:@"Invalid argument: `operation` cannot be nil."]; + if (! dispatchQueue) [NSException raise:NSInvalidArgumentException format:@"Invalid argument: `dispatchQueue` cannot be nil."]; + self = [super init]; + if (self) { + self.operation = operation; + self.dispatchQueue = dispatchQueue; + self.stateMachine = [TKStateMachine new]; + self.lock = [NSRecursiveLock new]; + [self.lock setName:RKOperationLockName]; + + // NOTE: State transitions are guarded by a lock via start/finish/cancel action methods + TKState *readyState = [TKState stateWithName:RKOperationStateReady]; + __weak __typeof(self)weakSelf = self; + [readyState setWillExitStateBlock:^(TKState *state, TKTransition *transition) { + [weakSelf.operation willChangeValueForKey:@"isReady"]; + }]; + [readyState setDidExitStateBlock:^(TKState *state, TKTransition *transition) { + [weakSelf.operation didChangeValueForKey:@"isReady"]; + }]; + + TKState *executingState = [TKState stateWithName:RKOperationStateExecuting]; + [executingState setWillEnterStateBlock:^(TKState *state, TKTransition *transition) { + [weakSelf.operation willChangeValueForKey:@"isExecuting"]; + }]; + // NOTE: isExecuting KVO for `setDidEnterStateBlock:` configured below in `setExecutionBlock` + [executingState setWillExitStateBlock:^(TKState *state, TKTransition *transition) { + [weakSelf.operation willChangeValueForKey:@"isExecuting"]; + }]; + [executingState setDidExitStateBlock:^(TKState *state, TKTransition *transition) { + [weakSelf.operation didChangeValueForKey:@"isExecuting"]; + }]; + [executingState setDidEnterStateBlock:^(TKState *state, TKTransition *transition) { + [NSException raise:NSInternalInconsistencyException format:@"You must configure an execution block via `setExecutionBlock:`."]; + }]; + + TKState *finishedState = [TKState stateWithName:RKOperationStateFinished]; + [finishedState setWillEnterStateBlock:^(TKState *state, TKTransition *transition) { + [weakSelf.operation willChangeValueForKey:@"isFinished"]; + }]; + [finishedState setDidEnterStateBlock:^(TKState *state, TKTransition *transition) { + [weakSelf.operation didChangeValueForKey:@"isFinished"]; + }]; + [finishedState setWillExitStateBlock:^(TKState *state, TKTransition *transition) { + [weakSelf.operation willChangeValueForKey:@"isFinished"]; + }]; + [finishedState setDidExitStateBlock:^(TKState *state, TKTransition *transition) { + [weakSelf.operation didChangeValueForKey:@"isFinished"]; + }]; + + [self.stateMachine addStates:@[ readyState, executingState, finishedState ]]; + + TKEvent *startEvent = [TKEvent eventWithName:RKOperationEventStart transitioningFromStates:@[ readyState ] toState:executingState]; + TKEvent *finishEvent = [TKEvent eventWithName:RKOperationEventFinish transitioningFromStates:@[ executingState ] toState:finishedState]; + [self.stateMachine addEvents:@[ startEvent, finishEvent ]]; + + self.stateMachine.initialState = readyState; + [self.stateMachine activate]; + } + return self; +} + +- (instancetype)init +{ + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"%@ Failed to call designated initializer. Invoke initWithOperation: instead.", + NSStringFromClass([self class])] + userInfo:nil]; +} + +- (BOOL)isReady +{ + return [self.stateMachine isInState:RKOperationStateReady]; +} + +- (BOOL)isExecuting +{ + return [self.stateMachine isInState:RKOperationStateExecuting]; +} + +- (BOOL)isFinished +{ + return [self.stateMachine isInState:RKOperationStateFinished]; +} + +- (void)start +{ + if (! self.dispatchQueue) [NSException raise:NSInternalInconsistencyException format:@"You must configure an `operationQueue`."]; + [self performBlockWithLock:^{ + NSError *error = nil; + BOOL success = [self.stateMachine fireEvent:RKOperationEventStart userInfo:nil error:&error]; + if (! success) [NSException raise:RKOperationFailureException format:@"The operation unexpectedly failed to start due to an error: %@", error]; + }]; +} + +- (void)finish +{ + // Ensure that we are finished from the operation queue + dispatch_async(self.dispatchQueue, ^{ + [self performBlockWithLock:^{ + NSError *error = nil; + BOOL success = [self.stateMachine fireEvent:RKOperationEventFinish userInfo:nil error:&error]; + if (! success) [NSException raise:RKOperationFailureException format:@"The operation unexpectedly failed to finish due to an error: %@", error]; + }]; + }); +} + +- (void)cancel +{ + if ([self isCancelled] || [self isFinished]) return; + [self performBlockWithLock:^{ + self.cancelled = YES; + }]; + + if (self.cancellationBlock) { + dispatch_async(self.dispatchQueue, ^{ + [self performBlockWithLock:self.cancellationBlock]; + }); + } +} + +- (void)setExecutionBlock:(void (^)(void))block +{ + __weak __typeof(self)weakSelf = self; + TKState *executingState = [self.stateMachine stateNamed:RKOperationStateExecuting]; + [executingState setDidEnterStateBlock:^(TKState *state, TKTransition *transition) { + [weakSelf.operation didChangeValueForKey:@"isExecuting"]; + dispatch_async(weakSelf.dispatchQueue, ^{ + block(); + }); + }]; +} + +- (void)setFinalizationBlock:(void (^)(void))block +{ + __weak __typeof(self)weakSelf = self; + TKState *finishedState = [self.stateMachine stateNamed:RKOperationStateFinished]; + [finishedState setWillEnterStateBlock:^(TKState *state, TKTransition *transition) { + [weakSelf performBlockWithLock:^{ + // Must emit KVO as we are replacing the block configured in `initWithOperation:queue:` + [weakSelf.operation willChangeValueForKey:@"isFinished"]; + block(); + }]; + }]; +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@: %p (for %@:%p), state: %@, cancelled: %@>", + [self class], self, + [self.operation class], self.operation, + self.stateMachine.currentState.name, + ([self isCancelled] ? @"YES" : @"NO")]; +} + +- (void)performBlockWithLock:(void (^)(void))block +{ + [self.lock lock]; + block(); + [self.lock unlock]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKPathUtilities.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKPathUtilities.h new file mode 100644 index 0000000..c7155d7 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKPathUtilities.h @@ -0,0 +1,62 @@ +// +// RKPathUtilities.h +// RestKit +// +// Created by Blake Watters on 12/9/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// + +#import <Foundation/Foundation.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** + Returns the path to the Application Data directory for the executing application. On iOS, this is a sandboxed path specific for the executing application. On OS X, this is an application specific path under `NSApplicationSupportDirectory` (i.e. ~/Application Support). + + @return The full path to the application data directory. + */ +NSString *RKApplicationDataDirectory(void); + +/** + Returns a path to the root caches directory used by RestKit for storage. On iOS, this is a sanboxed path specific for the executing application. On OS X, this is an application specific path under NSCachesDirectory (i.e. ~/Library/Caches). + + @return The full path to the Caches directory. + */ +NSString *RKCachesDirectory(void); + +/** + Ensures that a directory exists at a given path by checking for the existence of the directory and creating it if it does not exist. + + @param path The path to ensure a directory exists at. + @param error On input, a pointer to an error object. + @returns A Boolean value indicating if the directory exists. + */ +BOOL RKEnsureDirectoryExistsAtPath(NSString *path, NSError **error); + +/** + Returns a MIME Type for a given path by using the Core Services framework. + + For example, given a string with the path `@"/Users/blake/Documents/monkey.json"` `@"application/json"` would be returned as the MIME Type. + + @param path The path to return the MIME Type for. + @return The expected MIME Type of the resource identified by the path or nil if unknown. + */ +NSString *RKMIMETypeFromPathExtension(NSString *path); + +/** + Excludes the item at a given path from backup via iTunes and/or iCloud using the approaches detailed in "Apple Technical Q&A QA1719". + + Excluding a path from backup can be necessary in order to conform to the iCloud Data Storage Guidelines. Please refer to the following links for more details: + + 1. [iCloud Data Storage Guidelines](https://developer.apple.com/icloud/documentation/data-storage/) + 1. [Technical Q&A QA1719](http://developer.apple.com/library/ios/#qa/qa1719/_index.html) + + @param path The path to the item that is to be excluded from backup. + */ +void RKSetExcludeFromBackupAttributeForItemAtPath(NSString *path); + +#ifdef __cplusplus +} +#endif diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKPathUtilities.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKPathUtilities.m new file mode 100644 index 0000000..37fcc03 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKPathUtilities.m @@ -0,0 +1,135 @@ +// +// RKPathUtilities.m +// RestKit +// +// Created by Blake Watters on 12/9/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// + +#import <Foundation/Foundation.h> +#if TARGET_OS_IPHONE +#import <MobileCoreServices/UTType.h> +#import <UIKit/UIDevice.h> +#else +#import <CoreServices/CoreServices.h> +#endif +#import <Availability.h> +#import <sys/xattr.h> +#import "RKPathUtilities.h" +#import "RKLog.h" + +NSString *RKExecutableName(void); + +NSString *RKApplicationDataDirectory(void) +{ +#if TARGET_OS_IPHONE + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + return ([paths count] > 0) ? paths[0] : nil; +#else + NSFileManager *sharedFM = [NSFileManager defaultManager]; + + NSArray *possibleURLs = [sharedFM URLsForDirectory:NSApplicationSupportDirectory + inDomains:NSUserDomainMask]; + NSURL *appSupportDir = nil; + NSURL *appDirectory = nil; + + if ([possibleURLs count] >= 1) { + appSupportDir = possibleURLs[0]; + } + + if (appSupportDir) { + appDirectory = [appSupportDir URLByAppendingPathComponent:RKExecutableName()]; + return [appDirectory path]; + } + + return nil; +#endif +} + +NSString *RKExecutableName(void) +{ + NSString *executableName = [[[NSBundle mainBundle] executablePath] lastPathComponent]; + if (nil == executableName) { + RKLogWarning(@"Unable to determine CFBundleExecutable: storing data under RestKit directory name."); + executableName = @"RestKit"; + } + + return executableName; +} + +NSString *RKCachesDirectory(void) +{ +#if TARGET_OS_IPHONE + return NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0]; +#else + NSString *path = nil; + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); + if ([paths count]) { + path = [paths[0] stringByAppendingPathComponent:RKExecutableName()]; + } + + return path; +#endif +} + +BOOL RKEnsureDirectoryExistsAtPath(NSString *path, NSError **error) +{ + BOOL isDirectory; + if ([[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDirectory]) { + if (isDirectory) { + // Exists at a path and is a directory, we're good + if (error) *error = nil; + return YES; + } + } + + // Create the directory and any intermediates + NSError *errorReference = (error == nil) ? nil : *error; + if (! [[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&errorReference]) { + RKLogError(@"Failed to create requested directory at path '%@': %@", path, errorReference); + return NO; + } + + return YES; +} + +static NSDictionary *RKDictionaryOfFileExtensionsToMIMETypes() +{ + return @{ @"json": @"application/json" }; +} + +NSString *RKMIMETypeFromPathExtension(NSString *path) +{ + NSString *pathExtension = [path pathExtension]; + CFStringRef uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)pathExtension, NULL); + if (uti != NULL) { + CFStringRef mime = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType); + CFRelease(uti); + if (mime != NULL) { + NSString *type = [NSString stringWithString:(__bridge NSString *)mime]; + CFRelease(mime); + return type; + } + } + + // Consult our internal dictionary of mappings if not found + return [RKDictionaryOfFileExtensionsToMIMETypes() valueForKey:pathExtension]; +} + +void RKSetExcludeFromBackupAttributeForItemAtPath(NSString *path) +{ + NSCParameterAssert(path); + NSCAssert([[NSFileManager defaultManager] fileExistsAtPath:path], @"Cannot set Exclude from Backup attribute for non-existant item at path: '%@'", path); + +#if __IPHONE_OS_VERSION_MIN_REQUIRED + NSError *error = nil; + NSURL *URL = [NSURL fileURLWithPath:path]; + + BOOL success = [URL setResourceValue:@(YES) forKey:NSURLIsExcludedFromBackupKey error:&error]; + if (!success) { + RKLogError(@"Failed to exclude item at path '%@' from Backup: %@", path, error); + } +#else + RKLogDebug(@"Not built for iOS -- excluding path from Backup is not possible."); +#endif +} diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKSerialization.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKSerialization.h new file mode 100644 index 0000000..ad27006 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKSerialization.h @@ -0,0 +1,56 @@ +// +// RKSerialization.h +// RestKit +// +// Created by Blake Watters on 10/1/10. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <Foundation/Foundation.h> + +/** + The `RKSerialization` protocol declares two methods that a class must implement so that it can provide support for serializing objects to and deserializing objects from UTF-8 encoded data representations of a serialization format such as JSON or XML. Serialization implementations typically handle data in a given MIME Type (i.e. `application/json`) and may be registered with the `RKMIMETypeSerialization` class. + + @see `RKMIMETypeSerialization` + */ +@protocol RKSerialization <NSObject> + +///------------------------------ +/// @name Deserializing an Object +///------------------------------ + +/** + Deserializes and returns the given data in the format supported by the receiver (i.e. JSON, XML, etc) as a Foundation object representation. + + @param data The UTF-8 encoded data representation of the object to be deserialized. + @param error A pointer to an `NSError` object. + @return A Foundation object from the serialized data in data, or nil if an error occurs. + */ ++ (id)objectFromData:(NSData *)data error:(NSError **)error; + +///---------------------------- +/// @name Serializing an Object +///---------------------------- + +/** + Serializes and returns a UTF-8 encoded data representation of the given Foundation object in the format supported by the receiver (i.e. JSON, XML, etc). + + @param object The object to be serialized. + @param error A pointer to an NSError object. + @return A data representation of the given object in UTF-8 encoding, or nil if an error occurred. + */ ++ (NSData *)dataFromObject:(id)object error:(NSError **)error; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKStringTokenizer.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKStringTokenizer.h new file mode 100644 index 0000000..721671d --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKStringTokenizer.h @@ -0,0 +1,51 @@ +// +// RKStringTokenizer.h +// RestKit +// +// Created by Blake Watters on 7/30/12. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <Foundation/Foundation.h> + +/** + The `RKStringTokenizer` class provides an interface for tokenizing input text into a set of searchable words. Diacritics are removed and the input text is tokenized case insensitively. A set of stop words can be optionally trimmed from the result token set. + */ +@interface RKStringTokenizer : NSObject + +///------------------------------- +/// @name Configuring Tokenization +///------------------------------- + +/** + The set of stop words that are to be removed from the token set. + + Defaults to nil. + */ +@property (nonatomic, strong) NSSet *stopWords; + +///---------------------------------- +/// @name Tokenizing a String of Text +///---------------------------------- + +/** + Tokenizes the given string by folding it case and diacritic insensitively and then splitting it apart using the the word unit delimiters for the current locale. If a set of stop words has been provided, the resulting token set will have the stop words subtracted. + + @param string A string of text you wish to tokenize. + @returns A set of searchable text tokens extracted from the given string. + */ +- (NSSet *)tokenize:(NSString *)string; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKStringTokenizer.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKStringTokenizer.m new file mode 100644 index 0000000..fe3fa9a --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKStringTokenizer.m @@ -0,0 +1,48 @@ +// +// RKStringTokenizer.m +// RestKit +// +// Created by Blake Watters on 7/30/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// + +#import "RKStringTokenizer.h" + +@implementation RKStringTokenizer + +- (NSSet *)tokenize:(NSString *)string +{ + NSMutableSet *tokens = [NSMutableSet set]; + + CFLocaleRef locale = CFLocaleCopyCurrent(); + + // Remove diacratics and lowercase our input text + NSString *tokenizeText = string = [string stringByFoldingWithOptions:kCFCompareCaseInsensitive|kCFCompareDiacriticInsensitive locale:[NSLocale systemLocale]]; + CFStringTokenizerRef tokenizer = CFStringTokenizerCreate(kCFAllocatorDefault, (__bridge CFStringRef)tokenizeText, CFRangeMake(0, CFStringGetLength((__bridge CFStringRef)tokenizeText)), kCFStringTokenizerUnitWordBoundary, locale); + CFStringTokenizerTokenType tokenType = kCFStringTokenizerTokenNone; + + while (kCFStringTokenizerTokenNone != (tokenType = CFStringTokenizerAdvanceToNextToken(tokenizer))) { + CFRange tokenRange = CFStringTokenizerGetCurrentTokenRange(tokenizer); + + NSRange range = NSMakeRange(tokenRange.location, tokenRange.length); + NSString *token = [string substringWithRange:range]; + + [tokens addObject:token]; + } + + CFRelease(tokenizer); + CFRelease(locale); + + // Remove any stop words + if (self.stopWords) [tokens minusSet:self.stopWords]; + + // Remove any space token created by using kCFStringTokenizerUnitWordBoundary + NSString *spaceToken = @" "; + if ([tokens containsObject:spaceToken]) { + [tokens removeObject:spaceToken]; + } + + return tokens; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKURLEncodedSerialization.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKURLEncodedSerialization.h new file mode 100644 index 0000000..3c109d2 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKURLEncodedSerialization.h @@ -0,0 +1,74 @@ +// +// RKURLEncodedSerialization.h +// RestKit +// +// Created by Blake Watters on 9/4/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKSerialization.h" + +/** + The `RKURLEncodedSerialization` class conforms to the `RKSerialization` protocol and provides support for the serialization and deserialization of URL encoded data. URL encoding is used to replace certain characters in a string with equivalent percent escape sequences. The list of characters replaced by the implementation are designed as illegal URL characters by RFC 3986. URL encoded data is used for the submission of HTML forms with the MIME Type `application/x-www-form-urlencoded`. + + @see http://www.w3.org/TR/html401/interact/forms.html + @see http://www.ietf.org/rfc/rfc3986.txt + */ +@interface RKURLEncodedSerialization : NSObject <RKSerialization> + +@end + +/** + Creates and returns a new `NSDictionary` object from the given URL-encoded string, using the specified encoding. + + The dictionary is constructed by splitting the string into components using the `&` character as the delimiter. The results array of strings is then split again using the `=` character as the delimiter. Each resulting key and value delimited by the `=` character is then URL decoded and added a resulting dictionary. The process is across the entire string. Any extraneous `=` characters not delimiting a key and value are ignored. The corresponding values for any keys that appear multiple times within the string be coalesced into an `NSArray` of values. + + @param URLEncodedString A URL-encoded string that is to be parsed into an `NSDictionary`. + @param encoding The encoding to use when URL-decoding the components of the given string. If you are uncertain of the correct encoding, you should use UTF-8 (NSUTF8StringEncoding), which is the encoding designated by RFC 3986 as the correct encoding for use in URLs. + @return An `NSDictionary` object containing the keys and values deserialized from the URL-encoded string. + */ +NSDictionary *RKDictionaryFromURLEncodedStringWithEncoding(NSString *URLEncodedString, NSStringEncoding encoding); + +/** + Returns a URL-encoded `NSString` object containing the entries in the given `NSDictionary` object. + + The dictionary is created by collecting each key-value pair, URL-encoding a string representation of the key-value pair, and then joining the components with "&". + + @param dictionary The dictionary from to construct the URL-encoded string. + @param encoding The encoding to use in constructing the URL-encoded string. If you are uncertain of the correct encoding, you should use UTF-8 (NSUTF8StringEncoding), which is the encoding designated by RFC 3986 as the correct encoding for use in URLs. + @return A new `NSString` object in the given encoding containing a URL-encoded serialization of the entries in the given dictionary. + @see `AFQueryStringFromParametersWithEncoding` + */ +NSString *RKURLEncodedStringFromDictionaryWithEncoding(NSDictionary *dictionary, NSStringEncoding encoding); + +/** + Returns a copy of the given string with the characters that are unsafe for use in a URL query string replaced with the equivalent percent escape sequences. + + @param string The string to be escaped. + @param encoding The encoding to use in constructing the URL-encoded string. If you are uncertain of the correct encoding, you should use UTF-8 (NSUTF8StringEncoding), which is the encoding designated by RFC 3986 as the correct encoding for use in URLs. + @return A new `NSString` object in the given encoding with the query string unsafe characters replaced with percent escape sequences. + */ +NSString *RKPercentEscapedQueryStringFromStringWithEncoding(NSString *string, NSStringEncoding encoding); + +/** + Creates and returns a new `NSDictionary` object containing the keys and values in the query string of the given string. + + The given string is searched for a `?` character denoting the beginning of the query parameters. If none is found, the entire string is treated as a URL encoded query string. The parameters are extracted from the query string by invoking `RKDictionaryFromURLEncodedStringWithEncoding()` with the query string. + + @param string A string containing a query string that is to be tokenized into a dictionary of parameters. + @param encoding The encoding to use in constructing the URL-encoded string. If you are uncertain of the correct encoding, you should use UTF-8 (NSUTF8StringEncoding), which is the encoding designated by RFC 3986 as the correct encoding for use in URLs. + @return An `NSDictionary` object containing the keys and values contained in the query string of the given string. + */ +NSDictionary *RKQueryParametersFromStringWithEncoding(NSString *string, NSStringEncoding encoding); diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKURLEncodedSerialization.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKURLEncodedSerialization.m new file mode 100644 index 0000000..8a1d7ed --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/RKURLEncodedSerialization.m @@ -0,0 +1,198 @@ +// +// RKURLEncodedSerialization.m +// RestKit +// +// Created by Blake Watters on 9/4/12. +// Copyright (c) 2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "RKURLEncodedSerialization.h" + +#pragma mark - AFNetworking + +// Taken from https://github.com/AFNetworking/AFNetworking/blob/49f2f8c9a907977ec1b3afb182404ae0a6bce883/AFNetworking/AFURLRequestSerialization.m + +static NSString * const RKAFCharactersToBeEscapedInQueryString = @":/?&=;+!@#$()',*"; + +static NSString * RKAFPercentEscapedQueryStringKeyFromStringWithEncoding(NSString *string, NSStringEncoding encoding) { + static NSString * const RKAFCharactersToLeaveUnescapedInQueryStringPairKey = @"[]."; + + return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, (__bridge CFStringRef)RKAFCharactersToLeaveUnescapedInQueryStringPairKey, (__bridge CFStringRef)RKAFCharactersToBeEscapedInQueryString, CFStringConvertNSStringEncodingToEncoding(encoding)); +} + +static NSString * AFPercentEscapedQueryStringValueFromStringWithEncoding(NSString *string, NSStringEncoding encoding) { + return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, NULL, (__bridge CFStringRef)RKAFCharactersToBeEscapedInQueryString, CFStringConvertNSStringEncodingToEncoding(encoding)); +} + +#pragma mark - + +@interface RKAFQueryStringPair : NSObject +@property (readwrite, nonatomic, strong) id field; +@property (readwrite, nonatomic, strong) id value; + +- (instancetype)initWithField:(id)field value:(id)value NS_DESIGNATED_INITIALIZER; + +- (NSString *)URLEncodedStringValueWithEncoding:(NSStringEncoding)stringEncoding; +@end + +@implementation RKAFQueryStringPair + +- (instancetype)init +{ + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"-init is not a valid initializer for the class %@, use designated initilizer -initWithField:", NSStringFromClass([self class])] + userInfo:nil]; + return [self init]; +} + +- (instancetype)initWithField:(id)field value:(id)value { + self = [super init]; + if (!self) { + return nil; + } + + self.field = field; + self.value = value; + + return self; +} + +- (NSString *)URLEncodedStringValueWithEncoding:(NSStringEncoding)stringEncoding { + if (!self.value || [self.value isEqual:[NSNull null]]) { + return RKAFPercentEscapedQueryStringKeyFromStringWithEncoding([self.field description], stringEncoding); + } else { + return [NSString stringWithFormat:@"%@=%@", RKAFPercentEscapedQueryStringKeyFromStringWithEncoding([self.field description], stringEncoding), AFPercentEscapedQueryStringValueFromStringWithEncoding([self.value description], stringEncoding)]; + } +} + +@end + +#pragma mark - + +extern NSArray * RKAFQueryStringPairsFromDictionary(NSDictionary *dictionary); +extern NSArray * RKAFQueryStringPairsFromKeyAndValue(NSString *key, id value); + +static NSString * RKAFQueryStringFromParametersWithEncoding(NSDictionary *parameters, NSStringEncoding stringEncoding) { + NSMutableArray *mutablePairs = [NSMutableArray array]; + for (RKAFQueryStringPair *pair in RKAFQueryStringPairsFromDictionary(parameters)) { + [mutablePairs addObject:[pair URLEncodedStringValueWithEncoding:stringEncoding]]; + } + + return [mutablePairs componentsJoinedByString:@"&"]; +} + +NSArray * RKAFQueryStringPairsFromDictionary(NSDictionary *dictionary) { + return RKAFQueryStringPairsFromKeyAndValue(nil, dictionary); +} + +NSArray * RKAFQueryStringPairsFromKeyAndValue(NSString *key, id value) { + NSMutableArray *mutableQueryStringComponents = [NSMutableArray array]; + + NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES selector:@selector(compare:)]; + + if ([value isKindOfClass:[NSDictionary class]]) { + NSDictionary *dictionary = value; + // Sort dictionary keys to ensure consistent ordering in query string, which is important when deserializing potentially ambiguous sequences, such as an array of dictionaries + for (id nestedKey in [dictionary.allKeys sortedArrayUsingDescriptors:@[ sortDescriptor ]]) { + id nestedValue = dictionary[nestedKey]; + if (nestedValue) { + [mutableQueryStringComponents addObjectsFromArray:RKAFQueryStringPairsFromKeyAndValue((key ? [NSString stringWithFormat:@"%@[%@]", key, nestedKey] : nestedKey), nestedValue)]; + } + } + } else if ([value isKindOfClass:[NSArray class]]) { + NSArray *array = value; + for (id nestedValue in array) { + [mutableQueryStringComponents addObjectsFromArray:RKAFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)]; + } + } else if ([value isKindOfClass:[NSSet class]]) { + NSSet *set = value; + for (id obj in [set sortedArrayUsingDescriptors:@[ sortDescriptor ]]) { + [mutableQueryStringComponents addObjectsFromArray:RKAFQueryStringPairsFromKeyAndValue(key, obj)]; + } + } else { + [mutableQueryStringComponents addObject:[[RKAFQueryStringPair alloc] initWithField:key value:value]]; + } + + return mutableQueryStringComponents; +} + +#pragma mark - RestKit + +@implementation RKURLEncodedSerialization + ++ (id)objectFromData:(NSData *)data error:(NSError **)error +{ + NSString *string = [NSString stringWithUTF8String:[data bytes]]; + return RKDictionaryFromURLEncodedStringWithEncoding(string, NSUTF8StringEncoding); +} + ++ (NSData *)dataFromObject:(id)object error:(NSError **)error +{ + NSString *string = RKURLEncodedStringFromDictionaryWithEncoding(object, NSUTF8StringEncoding); + return [string dataUsingEncoding:NSUTF8StringEncoding]; +} + +@end + +NSDictionary *RKDictionaryFromURLEncodedStringWithEncoding(NSString *URLEncodedString, NSStringEncoding encoding) +{ + NSMutableDictionary *queryComponents = [NSMutableDictionary dictionary]; + for (NSString *keyValuePairString in [URLEncodedString componentsSeparatedByString:@"&"]) { + NSArray *keyValuePairArray = [keyValuePairString componentsSeparatedByString:@"="]; + if ([keyValuePairArray count] < 2) continue; // Verify that there is at least one key, and at least one value. Ignore extra = signs + NSString *key = [keyValuePairArray[0] stringByReplacingPercentEscapesUsingEncoding:encoding]; + NSString *value = [keyValuePairArray[1] stringByReplacingPercentEscapesUsingEncoding:encoding]; + + // URL spec says that multiple values are allowed per key + id results = queryComponents[key]; + if (results) { + if ([results isKindOfClass:[NSMutableArray class]]) { + [(NSMutableArray *)results addObject:value]; + } else { + // On second occurrence of the key, convert into an array + NSMutableArray *values = [NSMutableArray arrayWithObjects:results, value, nil]; + queryComponents[key] = values; + } + } else { + queryComponents[key] = value; + } + } + return queryComponents; +} + +NSString *RKURLEncodedStringFromDictionaryWithEncoding(NSDictionary *dictionary, NSStringEncoding encoding) +{ + return RKAFQueryStringFromParametersWithEncoding(dictionary, encoding); +} + +// This replicates `AFPercentEscapedQueryStringPairMemberFromStringWithEncoding`. Should send PR exposing non-static version +NSString *RKPercentEscapedQueryStringFromStringWithEncoding(NSString *string, NSStringEncoding encoding) +{ + // Escape characters that are legal in URIs, but have unintentional semantic significance when used in a query string parameter + static NSString * const kAFLegalCharactersToBeEscaped = @":/.?&=;+!@$()~"; + + return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, NULL, (__bridge CFStringRef)kAFLegalCharactersToBeEscaped, CFStringConvertNSStringEncodingToEncoding(encoding)); +} + +NSDictionary *RKQueryParametersFromStringWithEncoding(NSString *string, NSStringEncoding encoding) +{ + NSRange chopRange = [string rangeOfString:@"?"]; + if (chopRange.length > 0) { + chopRange.location += 1; // we want inclusive chopping up *through *"?" + if (chopRange.location < [string length]) string = [string substringFromIndex:chopRange.location]; + } + return RKDictionaryFromURLEncodedStringWithEncoding(string, encoding); +} + diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/lcl_RK.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/lcl_RK.h new file mode 100644 index 0000000..a1324cb --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/lcl_RK.h @@ -0,0 +1,389 @@ +// +// +// lcl_RK.h -- LibComponentLogging, embedded, RestKit/RK +// +// +// Copyright (c) 2008-2012 Arne Harren <ah@0xc0.de> +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef __RKLCL_H__ +#define __RKLCL_H__ + +#define _RKLCL_VERSION_MAJOR 1 +#define _RKLCL_VERSION_MINOR 3 +#define _RKLCL_VERSION_BUILD 1 +#define _RKLCL_VERSION_SUFFIX "" + +#import "lcl_config_components_RK.h" + +// +// lcl -- LibComponentLogging, embedded, RestKit/RK +// +// LibComponentLogging is a logging library for Objective-C applications +// with the following characteristics: +// +// - Log levels +// The library provides log levels for distinguishing between error messages, +// informational messages, and fine-grained trace messages for debugging. +// +// - Log components +// The library provides log components for identifying different parts of an +// application. A log component contains a unique identifier, a short name +// which is used as a header in a log message, and a full name which can be +// used in a user interface. +// +// - Active log level per log component +// At runtime, the library provides an active log level for each log +// component in order to enable/disable logging for certain parts of an +// application. +// +// - Grouping of log components +// Log components which have the same name prefix form a group of log +// components and logging can be enabled/disabled for the whole group with +// a single command. +// +// - Low runtime-overhead when logging is disabled +// Logging is based on a log macro which checks the active log level before +// constructing the log message and before evaluating log message arguments. +// +// - Code completion support +// The library provides symbols for log components and log levels which work +// with Xcode's code completion. All symbols, e.g. values or functions, which +// are relevant when using the logging library in an application, are prefixed +// with 'RKlcl_'. Internal symbols, which are needed when working with meta +// data, when defining log components, or when writing a logging back-end, are +// prefixed with '_RKlcl_'. Internal symbols, which are only used by the logging +// library itself, are prefixed with '__RKlcl_'. +// +// - Meta data +// The library provides public data structures which contain information about +// log levels and log components, e.g. headers and names. +// +// - Pluggable loggers +// The library does not contain a concrete logger, but provides a simple +// delegation mechanism for plugging-in a concrete logger based on the +// application's requirements, e.g. a logger which writes to the system log, +// or a logger which writes to a log file. The concrete logger is configured +// at build-time. +// +// Note: If the preprocessor symbol _RKLCL_NO_LOGGING is defined, the log macro +// will be defined to an empty effect. +// + + +#import <Foundation/Foundation.h> + + +// Use C linkage. +#ifdef __cplusplus +extern "C" { +#endif + + +// +// Log levels. +// + + +// Log levels, prefixed with 'RKlcl_v'. +enum _RKlcl_enum_level_t { + RKlcl_vOff = 0, + + RKlcl_vCritical, // critical situation + RKlcl_vError, // error situation + RKlcl_vWarning, // warning + RKlcl_vInfo, // informational message + RKlcl_vDebug, // coarse-grained debugging information + RKlcl_vTrace, // fine-grained debugging information + + _RKlcl_level_t_count, + _RKlcl_level_t_first = 0, + _RKlcl_level_t_last = _RKlcl_level_t_count-1 +}; + +// Log level type. +typedef uint32_t _RKlcl_level_t; +typedef uint8_t _RKlcl_level_narrow_t; + + +// +// Log components. +// + + +// Log components, prefixed with 'RKlcl_c'. +enum _RKlcl_enum_component_t { +# define _RKlcl_component(_identifier, _header, _name) \ + RKlcl_c##_identifier, \ + __RKlcl_log_symbol_RKlcl_c##_identifier = RKlcl_c##_identifier, + RKLCLComponentDefinitions +# undef _RKlcl_component + + _RKlcl_component_t_count, + _RKlcl_component_t_first = 0, + _RKlcl_component_t_last = _RKlcl_component_t_count-1 +}; + +// Log component type. +typedef uint32_t _RKlcl_component_t; + + +// +// Functions and macros. +// + +#ifndef _RKLCL_NO_IGNORE_WARNINGS +# ifdef __clang__ + // Ignore some warnings about variadic macros when using '-Weverything'. +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wunknown-pragmas" +# pragma clang diagnostic ignored "-Wvariadic-macros" +# pragma clang diagnostic ignored "-Wpedantic" +# endif +#endif + +// RKlcl_log(<component>, <level>, <format>[, <arg1>[, <arg2>[, ...]]]) +// +// <component>: a log component with prefix 'RKlcl_c' +// <level> : a log level with prefix 'RKlcl_v' +// <format> : a format string of type NSString (may include %@) +// <arg..> : optional arguments required by the format string +// +// Logs a message for the given log component at the given log level if the +// log level is active for the log component. +// +// The actual logging is done by _RKlcl_logger which must be defined by a concrete +// logging back-end. _RKlcl_logger has the same signature as RKlcl_log. +// +#ifdef _RKLCL_NO_LOGGING +# define RKlcl_log(_component, _level, _format, ...) \ + do { \ + } while (0) +#else +# define RKlcl_log(_component, _level, _format, ...) \ + do { \ + if (((_RKlcl_component_level[(__RKlcl_log_symbol(_component))]) >= \ + (__RKlcl_log_symbol(_level))) \ + ) { \ + _RKlcl_logger(_component, \ + _level, \ + _format, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#endif + +// RKlcl_log_if(<component>, <level>, <predicate>, <format>[, <arg1>[, ...]]) +// +// <component>: a log component with prefix 'RKlcl_c' +// <level> : a log level with prefix 'RKlcl_v' +// <predicate>: a predicate for conditional logging +// <format> : a format string of type NSString (may include %@) +// <arg..> : optional arguments required by the format string +// +// Logs a message for the given log component at the given log level if the +// log level is active for the log component and if the predicate evaluates +// to true. +// +// The predicate is only evaluated if the given log level is active. +// +// The actual logging is done by _RKlcl_logger which must be defined by a concrete +// logging back-end. _RKlcl_logger has the same signature as RKlcl_log. +// +#ifdef _RKLCL_NO_LOGGING +# define RKlcl_log_if(_component, _level, _predicate, _format, ...) \ + do { \ + } while (0) +#else +# define RKlcl_log_if(_component, _level, _predicate, _format, ...) \ + do { \ + if (((_RKlcl_component_level[(__RKlcl_log_symbol(_component))]) >= \ + (__RKlcl_log_symbol(_level))) \ + && \ + (_predicate) \ + ) { \ + _RKlcl_logger(_component, \ + _level, \ + _format, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#endif + +#ifndef _RKLCL_NO_IGNORE_WARNINGS +# ifdef __clang__ +# pragma clang diagnostic pop +# endif +#endif + +// RKlcl_configure_by_component(<component>, <level>) +// +// <component>: a log component with prefix 'RKlcl_c' +// <level> : a log level with prefix 'RKlcl_v' +// +// Configures the given log level for the given log component. +// Returns the number of configured log components, or 0 on failure. +// +uint32_t RKlcl_configure_by_component(_RKlcl_component_t component, _RKlcl_level_t level); + +// RKlcl_configure_by_identifier(<identifier>, <level>) +// +// <identifier>: a log component's identifier with optional '*' wildcard suffix +// <level> : a log level with prefix 'RKlcl_v' +// +// Configures the given log level for the given log component(s). +// Returns the number of configured log components, or 0 on failure. +// +uint32_t RKlcl_configure_by_identifier(const char *identifier, _RKlcl_level_t level); + +// RKlcl_configure_by_header(<header>, <level>) +// +// <header> : a log component's header with optional '*' wildcard suffix +// <level> : a log level with prefix 'RKlcl_v' +// +// Configures the given log level for the given log component(s). +// Returns the number of configured log components, or 0 on failure. +// +uint32_t RKlcl_configure_by_header(const char *header, _RKlcl_level_t level); + +// RKlcl_configure_by_name(<name>, <level>) +// +// <name> : a log component's name with optional '*' wildcard suffix +// <level> : a log level with prefix 'RKlcl_v' +// +// Configures the given log level for the given log component(s). +// Returns the number of configured log components, or 0 on failure. +// +uint32_t RKlcl_configure_by_name(const char *name, _RKlcl_level_t level); + + +// +// Internals. +// + + +// Active log levels, indexed by log component. +extern _RKlcl_level_narrow_t _RKlcl_component_level[_RKlcl_component_t_count]; + +// Log component identifiers, indexed by log component. +extern const char * const _RKlcl_component_identifier[_RKlcl_component_t_count]; + +// Log component headers, indexed by log component. +extern const char * const _RKlcl_component_header[_RKlcl_component_t_count]; + +// Log component names, indexed by log component. +extern const char * const _RKlcl_component_name[_RKlcl_component_t_count]; + +// Log level headers, indexed by log level. +extern const char * const _RKlcl_level_header[_RKlcl_level_t_count]; // full header +extern const char * const _RKlcl_level_header_1[_RKlcl_level_t_count]; // header with 1 character +extern const char * const _RKlcl_level_header_3[_RKlcl_level_t_count]; // header with 3 characters + +// Log level names, indexed by log level. +extern const char * const _RKlcl_level_name[_RKlcl_level_t_count]; + +// Version. +extern const char * const _RKlcl_version; + +// Log level symbols used by RKlcl_log, prefixed with '__RKlcl_log_symbol_RKlcl_v'. +enum { + __RKlcl_log_symbol_RKlcl_vCritical = RKlcl_vCritical, + __RKlcl_log_symbol_RKlcl_vError = RKlcl_vError, + __RKlcl_log_symbol_RKlcl_vWarning = RKlcl_vWarning, + __RKlcl_log_symbol_RKlcl_vInfo = RKlcl_vInfo, + __RKlcl_log_symbol_RKlcl_vDebug = RKlcl_vDebug, + __RKlcl_log_symbol_RKlcl_vTrace = RKlcl_vTrace +}; + +// Macro for appending the '__RKlcl_log_symbol_' prefix to a given symbol. +#define __RKlcl_log_symbol(_symbol) \ + __RKlcl_log_symbol_##_symbol + + +// End C linkage. +#ifdef __cplusplus +} +#endif + + +// Include logging back-end and definition of _RKlcl_logger. +#import "lcl_config_logger_RK.h" + + +// For simple configurations where 'lcl_config_logger_RK.h' is empty, define a +// default NSLog()-based _RKlcl_logger here. +#ifndef _RKlcl_logger + +// ARC/non-ARC autorelease pool +#define _RKlcl_logger_autoreleasepool_arc 0 +#if defined(__has_feature) +# if __has_feature(objc_arc) +# undef _RKlcl_logger_autoreleasepool_arc +# define _RKlcl_logger_autoreleasepool_arc 1 +# endif +#endif +#if _RKlcl_logger_autoreleasepool_arc +# define _RKlcl_logger_autoreleasepool_begin \ + @autoreleasepool { +# define _RKlcl_logger_autoreleasepool_end \ + } +#else +# define _RKlcl_logger_autoreleasepool_begin \ + NSAutoreleasePool *_RKlcl_logger_autoreleasepool = [[NSAutoreleasePool alloc] init]; +# define _RKlcl_logger_autoreleasepool_end \ + [_RKlcl_logger_autoreleasepool release]; +#endif + +#ifndef _RKLCL_NO_IGNORE_WARNINGS +# ifdef __clang__ + // Ignore some warnings about variadic macros when using '-Weverything'. +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wunknown-pragmas" +# pragma clang diagnostic ignored "-Wvariadic-macros" +# pragma clang diagnostic ignored "-Wpedantic" +# endif +#endif + +// A simple default logger, which redirects to NSLog(). +#define _RKlcl_logger(_component, _level, _format, ...) { \ + _RKlcl_logger_autoreleasepool_begin \ + NSLog(@"%s %s:%@:%d " _format, \ + _RKlcl_level_header_1[_level], \ + _RKlcl_component_header[_component], \ + [@__FILE__ lastPathComponent], \ + __LINE__, \ + ## __VA_ARGS__); \ + _RKlcl_logger_autoreleasepool_end \ +} + +#ifndef _RKLCL_NO_IGNORE_WARNINGS +# ifdef __clang__ +# pragma clang diagnostic pop +# endif +#endif + +#endif + + +// Include extensions. +#import "lcl_config_extensions_RK.h" + + +#endif // __RKLCL_H__ diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/lcl_RK.m b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/lcl_RK.m new file mode 100644 index 0000000..fb068aa --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/lcl_RK.m @@ -0,0 +1,175 @@ +// +// +// lcl_RK.m -- LibComponentLogging, embedded, RestKit/RK +// +// +// Copyright (c) 2008-2012 Arne Harren <ah@0xc0.de> +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "lcl_RK.h" +#include <string.h> + + +// Active log levels, indexed by log component. +_RKlcl_level_narrow_t _RKlcl_component_level[_RKlcl_component_t_count]; + +// Log component identifiers, indexed by log component. +const char * const _RKlcl_component_identifier[] = { +# define _RKlcl_component(_identifier, _header, _name) \ + #_identifier, + RKLCLComponentDefinitions +# undef _RKlcl_component +}; + +// Log component headers, indexed by log component. +const char * const _RKlcl_component_header[] = { +# define _RKlcl_component(_identifier, _header, _name) \ + _header, + RKLCLComponentDefinitions +# undef _RKlcl_component +}; + +// Log component names, indexed by log component. +const char * const _RKlcl_component_name[] = { +# define _RKlcl_component(_identifier, _header, _name) \ + _name, + RKLCLComponentDefinitions +# undef _RKlcl_component +}; + +// Log level headers, indexed by log level. +const char * const _RKlcl_level_header[] = { + "-", + "CRITICAL", + "ERROR", + "WARNING", + "INFO", + "DEBUG", + "TRACE" +}; +const char * const _RKlcl_level_header_1[] = { + "-", + "C", + "E", + "W", + "I", + "D", + "T" +}; +const char * const _RKlcl_level_header_3[] = { + "---", + "CRI", + "ERR", + "WRN", + "INF", + "DBG", + "TRC" +}; + +// Log level names, indexed by log level. +const char * const _RKlcl_level_name[] = { + "Off", + "Critical", + "Error", + "Warning", + "Info", + "Debug", + "Trace" +}; + +// Version. +#define __RKlcl_version_to_string( _text) __RKlcl_version_to_string0(_text) +#define __RKlcl_version_to_string0(_text) #_text +const char * const _RKlcl_version = __RKlcl_version_to_string(_RKLCL_VERSION_MAJOR) + "." __RKlcl_version_to_string(_RKLCL_VERSION_MINOR) + "." __RKlcl_version_to_string(_RKLCL_VERSION_BUILD) + "" _RKLCL_VERSION_SUFFIX; + +// Configures the given log level for the given log component. +uint32_t RKlcl_configure_by_component(_RKlcl_component_t component, _RKlcl_level_t level) { + // unsupported level, clip to last level + if (level > _RKlcl_level_t_last) { + level = _RKlcl_level_t_last; + } + + // configure the component + if (component <= _RKlcl_component_t_last) { + _RKlcl_component_level[component] = level; + return 1; + } + + return 0; +} + +// Configures the given log level for the given log component(s). +static uint32_t _RKlcl_configure_by_text(uint32_t count, const char * const *texts, + _RKlcl_level_narrow_t *levels, const char *text, + _RKlcl_level_t level) { + // no text given, quit + if (text == NULL || text[0] == '\0') { + return 0; + } + + // unsupported level, clip to last level + if (level > _RKlcl_level_t_last) { + level = _RKlcl_level_t_last; + } + + // configure the components + uint32_t num_configured = 0; + size_t text_len = strlen(text); + if (text[text_len-1] == '*') { + // text ends with '*', wildcard suffix was specified + text_len--; + for (uint32_t c = 0; c < count; c++) { + if (strncmp(text, texts[c], text_len) == 0) { + levels[c] = level; + num_configured++; + } + } + } else { + // no wildcard suffix was specified + for (uint32_t c = 0; c < count; c++) { + if (strcmp(text, texts[c]) == 0) { + levels[c] = level; + num_configured++; + } + } + } + return num_configured; +} + +// Configures the given log level for the given log component(s) by identifier. +uint32_t RKlcl_configure_by_identifier(const char *identifier, _RKlcl_level_t level) { + return _RKlcl_configure_by_text(_RKlcl_component_t_count, _RKlcl_component_identifier, + _RKlcl_component_level, identifier, level); +} + +// Configures the given log level for the given log component(s) by header. +uint32_t RKlcl_configure_by_header(const char *header, _RKlcl_level_t level) { + return _RKlcl_configure_by_text(_RKlcl_component_t_count, _RKlcl_component_header, + _RKlcl_component_level, header, level); +} + +// Configures the given log level for the given log component(s) by name. +uint32_t RKlcl_configure_by_name(const char *name, _RKlcl_level_t level) { + return _RKlcl_configure_by_text(_RKlcl_component_t_count, _RKlcl_component_name, + _RKlcl_component_level, name, level); +} diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/lcl_config_components_RK.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/lcl_config_components_RK.h new file mode 100644 index 0000000..e710254 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/lcl_config_components_RK.h @@ -0,0 +1,63 @@ +// +// lcl_config_components_RK.h +// RestKit +// +// Created by Blake Watters on 6/8/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +// +// The lcl_config_components_RK.h file is used to define the application's log +// components. +// +// Use the code +// +// _RKlcl_component(<identifier>, <header>, <name>) +// +// for defining a log component, where +// +// - <identifier> is the unique name of a log component which is used in calls +// to RKlcl_log etc. A symbol 'RKlcl_c<identifier>' is automatically created for +// each log component. +// +// - <header> is a C string in UTF-8 which should be used by a logging back-end +// when writing a log message for the log component. The header is a technical +// key for identifying a log component's messages. It is recommended to use +// a 'Reverse ICANN' naming scheme when the header contains grouping +// information, e.g. 'example.main.component1'. +// +// - <name> is a C string in UTF-8 which contains the name of the log component +// and its grouping information in a non-technical, human-readable way +// which could be used by a user interface. Groups should be separated by the +// path separator '/', e.g. 'Example/Main/Component 1'. +// + + +// +// RestKit Logging Components +// + +#define RKLCLComponentDefinitions \ +_RKlcl_component(App, "app", "App") \ +_RKlcl_component(RestKit, "restkit", "RestKit") \ +_RKlcl_component(RestKitCoreData, "restkit.core_data", "RestKit/CoreData") \ +_RKlcl_component(RestKitCoreDataCache, "restkit.core_data.cache", "RestKit/CoreData/Cache") \ +_RKlcl_component(RestKitNetwork, "restkit.network", "RestKit/Network") \ +_RKlcl_component(RestKitNetworkCoreData, "restkit.network.core_data", "RestKit/Network/CoreData") \ +_RKlcl_component(RestKitObjectMapping, "restkit.object_mapping", "RestKit/ObjectMapping") \ +_RKlcl_component(RestKitSearch, "restkit.search", "RestKit/Search") \ +_RKlcl_component(RestKitSupport, "restkit.support", "RestKit/Support") \ +_RKlcl_component(RestKitTesting, "restkit.testing", "RestKit/Testing") \ +_RKlcl_component(RestKitUI, "restkit.ui", "RestKit/UI") diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/lcl_config_extensions_RK.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/lcl_config_extensions_RK.h new file mode 100644 index 0000000..6229343 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/lcl_config_extensions_RK.h @@ -0,0 +1,20 @@ +// +// lcl_config_extensions_RK.h +// RestKit +// +// Created by Blake Watters on 6/8/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/lcl_config_logger_RK.h b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/lcl_config_logger_RK.h new file mode 100644 index 0000000..64e2ffa --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/Code/Support/lcl_config_logger_RK.h @@ -0,0 +1,53 @@ +// +// lcl_config_logger_RK.h +// RestKit +// +// Created by Blake Watters on 6/8/11. +// Copyright (c) 2009-2012 RestKit. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +// +// Integration with LibComponentLogging Core. +// + +// ARC/non-ARC autorelease pool +#define _RKlcl_logger_autoreleasepool_arc 0 +#if defined(__has_feature) +# if __has_feature(objc_arc) +# undef _RKlcl_logger_autoreleasepool_arc +# define _RKlcl_logger_autoreleasepool_arc 1 +# endif +#endif + +#if _RKlcl_logger_autoreleasepool_arc + #define _RKlcl_logger_autoreleasepool_begin @autoreleasepool { + #define _RKlcl_logger_autoreleasepool_end } +#else + #define _RKlcl_logger_autoreleasepool_begin NSAutoreleasePool *_RKlcl_logpool = [[NSAutoreleasePool alloc] init]; + #define _RKlcl_logger_autoreleasepool_end [_RKlcl_logpool release]; +#endif + + +#define _RKlcl_logger(_component, _level, _format, ...) { \ + _RKlcl_logger_autoreleasepool_begin \ + [RKGetLoggingClass() logWithComponent:_component \ + level:_level \ + path:__FILE__ \ + line:__LINE__ \ + function:__PRETTY_FUNCTION__ \ + format:_format, ## __VA_ARGS__]; \ + _RKlcl_logger_autoreleasepool_end \ +} + diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/LICENSE b/code/iOS/ScriptorSprint3/Pods/RestKit/LICENSE new file mode 100644 index 0000000..eb8d4bc --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2009-2012 The RestKit Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/code/iOS/ScriptorSprint3/Pods/RestKit/README.md b/code/iOS/ScriptorSprint3/Pods/RestKit/README.md new file mode 100644 index 0000000..be7262b --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/RestKit/README.md @@ -0,0 +1,634 @@ +# RestKit + +[![Build Status](http://img.shields.io/travis/RestKit/RestKit/development.svg?style=flat)](https://travis-ci.org/RestKit/RestKit) +[![Pod Version](http://img.shields.io/cocoapods/v/RestKit.svg?style=flat)](http://cocoadocs.org/docsets/RestKit/) +[![Pod Platform](http://img.shields.io/cocoapods/p/RestKit.svg?style=flat)](http://cocoadocs.org/docsets/RestKit/) +[![Pod License](http://img.shields.io/cocoapods/l/RestKit.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0.html) +[![Visit our IRC channel](http://img.shields.io/badge/IRC-%23RestKit-green.svg?style=flat)](https://kiwiirc.com/client/irc.freenode.net/?nick=rkuser|?&theme=basic#RestKit) + +RestKit is a modern Objective-C framework for implementing RESTful web services clients on iOS and Mac OS X. It provides a powerful [object mapping](https://github.com/RestKit/RestKit/wiki/Object-mapping) engine that seamlessly integrates with [Core Data](http://developer.apple.com/library/mac/#documentation/cocoa/Conceptual/CoreData/cdProgrammingGuide.html) and a simple set of networking primitives for mapping HTTP requests and responses built on top of [AFNetworking](https://github.com/AFNetworking/AFNetworking). It has an elegant, carefully designed set of APIs that make accessing and modeling RESTful resources feel almost magical. For example, here's how to access the Twitter public timeline and turn the JSON contents into an array of Tweet objects: + +``` objective-c +@interface RKTweet : NSObject +@property (nonatomic, copy) NSNumber *userID; +@property (nonatomic, copy) NSString *username; +@property (nonatomic, copy) NSString *text; +@end + +RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[RKTweet class]]; +[mapping addAttributeMappingsFromDictionary:@{ + @"user.name": @"username", + @"user.id": @"userID", + @"text": @"text" +}]; + +RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping method:RKRequestMethodAny pathPattern:nil keyPath:nil statusCodes:nil]; +NSURL *url = [NSURL URLWithString:@"http://api.twitter.com/1/statuses/public_timeline.json"]; +NSURLRequest *request = [NSURLRequest requestWithURL:url]; +RKObjectRequestOperation *operation = [[RKObjectRequestOperation alloc] initWithRequest:request responseDescriptors:@[responseDescriptor]]; +[operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *result) { + NSLog(@"The public timeline Tweets: %@", [result array]); +} failure:nil]; +[operation start]; +``` + +## Getting Started + +- [Download RestKit](https://github.com/RestKit/RestKit/releases) and play with the [examples](https://github.com/RestKit/RestKit/tree/development/Examples) for iPhone and Mac OS X +- First time with RestKit? Read the ["Overview"](#overview) section below and then check out the ["Getting Acquainted with RestKit"](https://github.com/RestKit/RKGist/blob/master/TUTORIAL.md) tutorial and [Object Mapping Reference](https://github.com/RestKit/RestKit/wiki/Object-mapping) documents in the wiki to jump right in. +- Upgrading from RestKit 0.9.x or 0.10.x? Read the ["Upgrading to RestKit 0.20.x"](https://github.com/RestKit/RestKit/wiki/Upgrading-from-v0.10.x-to-v0.20.0) guide in the wiki +- Adding RestKit to an existing [AFNetworking](https://github.com/AFNetworking/AFNetworking) application? Read the [AFNetworking Integration](https://github.com/RestKit/RestKit/wiki/AFNetworking-Integration) document to learn details about how the frameworks fit together. +- Review the [source code API documentation](http://cocoadocs.org/docsets/RestKit/) for a detailed look at the classes and API's in RestKit. A great place to start is [RKObjectManager](http://restkit.org/api/latest/Classes/RKObjectManager.html). +- Still need some help? Ask questions on [Stack Overflow](http://stackoverflow.com/questions/tagged/restkit) or the [mailing list](http://groups.google.com/group/restkit), ping us on [Twitter](http://twitter.com/RestKit) or chat with us on [IRC](https://kiwiirc.com/client/irc.freenode.net/?nick=rkuser|?&theme=basic#RestKit). + +## Overview + +RestKit is designed to be modular and each module strives to maintain a minimal set of dependencies across the framework and with the host platform. At the core of library sits the object mapping engine, which is responsible for transforming objects between representations (such as JSON/XML <-> local domain objects). + +### Object Mapping Fundamentals + +The object mapping engine is built on top of the [Key-Value Coding](https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueCoding/Articles/KeyValueCoding.html) (KVC) informal protocol that is foundational to numerous Cocoa technologies such as key-value observing, bindings, and Core Data. Object mappings are expressed as pairs of KVC key paths that specify the source and destination attributes or relationships that are to be transformed. + +RestKit leverages the highly dynamic Objective-C runtime to infer the developers desired intent by examining the type of the source and destination properties and performing appropriate type transformations. For example, given a source key path of `created_at` that identifies a string within a parsed JSON document and a destination key path of `creationDate` that identifies an `NSDate` property on a target object, RestKit will transform the date from a string into an `NSDate` using an `NSDateFormatter`. Numerous other transformations are provided out of the box and the engine is pluggable to allow the developer to define new transformations or replace an existing transformation with a new implementation. + +The mapper fully supports both simple attribute as well as relationship mappings in which nested to-one or to-many child objects are mapped recursively. Through relationship mappings, one object mapping can be added to another to compose aggregate mappings that are capable of processing arbitrarily complex source documents. + +Object mapping is a deep topic and is explored in exhaustive detail in the [Object Mapping Guide](https://github.com/RestKit/RestKit/wiki/Object-mapping) on the wiki. + +### API Quickstart + +RestKit is broken into several modules that cleanly separate the mapping engine from the HTTP and Core Data integrations to provide maximum flexibility. Key classes in each module are highlighted below and each module is hyperlinked to the README.md contained within the source code. + +<table> + <tr><th colspan="2" style="text-align:center;"><a href="https://github.com/RestKit/RestKit/wiki/Object-mapping">Object Mapping</a></th></tr> + <tr> + <td><a href="http://restkit.org/api/latest/Classes/RKObjectMapping.html">RKObjectMapping</a></td> + <td>Encapsulates configuration for transforming object representations as expressed by key-value coding keypaths.</td> + </tr> + <tr> + <td><a href="http://restkit.org/api/latest/Classes/RKAttributeMapping.html">RKAttributeMapping</a></td> + <td>Specifies a desired transformation between attributes within an object or entity mapping in terms of a source and destination key path.</td> + </tr> + <tr> + <td><a href="http://restkit.org/api/latest/Classes/RKRelationshipMapping.html">RKRelationshipMapping</a></td> + <td>Specifies a desired mapping of a nested to-one or to-many child objects in terms of a source and destination key path and an <tt>RKObjectMapping</tt> with which to map the attributes of the child object.</td> + </tr> + <tr> + <td><a href="http://restkit.org/api/latest/Classes/RKDynamicMapping.html">RKDynamicMapping</a></td> + <td>Specifies a flexible mapping in which the decision about which <tt>RKObjectMapping</tt> is to be used to process a given document is deferred to run time.</td> + </tr> + <tr> + <td><a href="http://restkit.org/api/latest/Classes/RKMapperOperation.html">RKMapperOperation</a></td> + <td>Provides an interface for mapping a deserialized document into a set of local domain objects.</td> + </tr> + <tr> + <td><a href="http://restkit.org/api/latest/Classes/RKMappingOperation.html">RKMappingOperation</a></td> + <td>An <tt>NSOperation</tt> that performs a mapping between object representations using an <tt>RKObjectMapping</tt>.</td> + </tr> + <tr><th colspan="2" style="text-align:center;"><a href="Code/Network/README.md">Networking</a></th></tr> + <tr> + <td><a href="http://restkit.org/api/latest/Classes/RKRequestDescriptor.html">RKRequestDescriptor</a></td> + <td>Describes a request that can be sent from the application to a remote web application for a given object type.</td> + </tr> + <tr> + <td><a href="http://restkit.org/api/latest/Classes/RKResponseDescriptor.html">RKResponseDescriptor</a></td> + <td>Describes an object mappable response that may be returned from a remote web application in terms of an object mapping, a key path, a <a href="http://cocoadocs.org/docsets/SOCKit/">SOCKit pattern</a> for matching the URL, and a set of status codes that define the circumstances in which the mapping is appropriate for a given response.</td> + </tr> + <tr> + <td><a href="http://restkit.org/api/latest/Classes/RKObjectParameterization.html">RKObjectParameterization</a></td> + <td>Performs mapping of a given object into an <tt>NSDictionary</tt> representation suitable for use as the parameters of an HTTP request.</td> + </tr> + <tr> + <td><a href="http://restkit.org/api/latest/Classes/RKObjectRequestOperation.html">RKObjectRequestOperation</a></td> + <td>An <tt>NSOperation</tt> that sends an HTTP request and performs object mapping on the parsed response body using the configurations expressed in a set of <tt>RKResponseDescriptor</tt> objects.</td> + </tr> + <tr> + <td><a href="http://restkit.org/api/latest/Classes/RKResponseMapper.html">RKResponseMapperOperation</a></td> + <td>An <tt>NSOperation</tt> that provides support for object mapping an <tt>NSHTTPURLResponse</tt> using a set of <tt>RKResponseDescriptor</tt> objects.</td> + </tr> + <tr> + <td><a href="http://restkit.org/api/latest/Classes/RKObjectManager.html">RKObjectManager</a></td> + <td>Captures the common patterns for communicating with a RESTful web application over HTTP using object mapping including: + <ul> + <li>Centralizing <tt>RKRequestDescriptor</tt> and <tt>RKResponseDescriptor</tt> configurations</li> + <li>Describing URL configuration with an <tt>RKRouter</tt></li> + <li>Serializing objects and sending requests with the serialized representations</li> + <li>Sending requests to load remote resources and object mapping the response bodies</li> + <li>Building multi-part form requests for objects</li> + </ul> + </td> + </tr> + <tr> + <td><a href="http://restkit.org/api/latest/Classes/RKRouter.html">RKRouter</a></td> + <td>Generates <tt>NSURL</tt> objects from a base URL and a set of <tt>RKRoute</tt> objects describing relative paths used by the application.</td> + </tr> + <tr> + <td><a href="http://restkit.org/api/latest/Classes/RKRoute.html">RKRoute</a></td> + <td>Describes a single relative path for a given object type and HTTP method, the relationship of an object, or a symbolic name.</td> + </tr> + <tr><th colspan="2" style="text-align:center;"><a href="Code/CoreData/README.md">Core Data</a></th></tr> + <tr> + <td><a href="http://restkit.org/api/latest/Classes/RKManagedObjectStore.html">RKManagedObjectStore</a></td> + <td>Encapsulates Core Data configuration including an <tt>NSManagedObjectModel</tt>, a <tt>NSPersistentStoreCoordinator</tt>, and a pair of <tt>NSManagedObjectContext</tt> objects.</td> + </tr> + <tr> + <td><a href="http://restkit.org/api/latest/Classes/RKEntityMapping.html">RKEntityMapping</a></td> + <td>Models a mapping for transforming an object representation into a <tt>NSManagedObject</tt> instance for a given <tt>NSEntityDescription</tt>.</td> + </tr> + <tr> + <td><a href="http://restkit.org/api/latest/Classes/RKConnectionDescription.html">RKConnectionDescription</a></td> + <td>Describes a mapping for establishing a relationship between Core Data entities using foreign key attributes.</td> + </tr> + <tr> + <td><a href="http://restkit.org/api/latest/Classes/RKManagedObjectRequestOperation.html">RKManagedObjectRequestOperation</a></td> + <td>An <tt>NSOperation</tt> subclass that sends an HTTP request and performs object mapping on the parsed response body to create <tt>NSManagedObject</tt> instances, establishes relationships between objects using <tt>RKConnectionDescription</tt> objects, and cleans up orphaned objects that no longer exist in the remote backend system.</td> + </tr> + <tr> + <td><a href="http://restkit.org/api/latest/Classes/RKManagedObjectImporter.html">RKManagedObjectImporter</a></td> + <td>Provides support for bulk mapping of managed objects using <tt>RKEntityMapping</tt> objects for two use cases: + <ol> + <li>Bulk importing of parsed documents into an <tt>NSPersistentStore.</tt></li> + <li>Generating a <a href="Docs for database seeding">seed database</a> for initializing an application's Core Data store with an initial data set upon installation.</li> + </ol> + </td> + </tr> + <tr><th colspan="2" style="text-align:center;"><a href="Code/Search/README.md">Search</a></th></tr> + <tr> + <td><a href="http://restkit.org/api/latest/Classes/RKSearchIndexer.html">RKSearchIndexer</a></td> + <td>Provides support for generating a full-text searchable index within Core Data for string attributes of entities within an application.</td> + </tr> + <tr> + <td><a href="http://restkit.org/api/latest/Classes/RKSearchPredicate.html">RKSearchPredicate</a></td> + <td>Generates an <tt>NSCompoundPredicate</tt> given a string of text that will search an index built with an <tt>RKSearchIndexer</tt> across any indexed entity.</td> + </tr> + <tr><th colspan="2" style="text-align:center;"><a href="Code/Testing/README.md">Testing</a></th></tr> + <tr> + <td><a href="http://restkit.org/api/latest/Classes/RKMappingTest.html">RKMappingTest</a></td> + <td>Provides support for unit testing object mapping configurations given a parsed document and an object or entity mapping. Expectations are configured in terms of expected key path mappings and/or expected transformation results.</td> + </tr> + <tr> + <td><a href="http://restkit.org/api/latest/Classes/RKTestFixture.html">RKTestFixture</a></td> + <td>Provides an interface for easily generating test fixture data for unit testing.</td> + </tr> + <tr> + <td><a href="http://restkit.org/api/latest/Classes/RKTestFactory.html">RKTestFactory</a></td> + <td>Provides support for creating objects for use in testing.</td> + </tr> +</table> + +### + +## Examples + +### Object Request +``` objective-c +// GET a single Article from /articles/1234.json and map it into an object +// JSON looks like {"article": {"title": "My Article", "author": "Blake", "body": "Very cool!!"}} +RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[Article class]]; +[mapping addAttributeMappingsFromArray:@[@"title", @"author", @"body"]]; +NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful); // Anything in 2xx +RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping method:RKRequestMethodAny pathPattern:@"/articles/:articleID" keyPath:@"article" statusCodes:statusCodes]; + +NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://restkit.org/articles/1234.json"]]; +RKObjectRequestOperation *operation = [[RKObjectRequestOperation alloc] initWithRequest:request responseDescriptors:@[responseDescriptor]]; +[operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *result) { + Article *article = [result firstObject]; + NSLog(@"Mapped the article: %@", article); +} failure:^(RKObjectRequestOperation *operation, NSError *error) { + NSLog(@"Failed with error: %@", [error localizedDescription]); +}]; +[operation start]; +``` + +### Managed Object Request +``` objective-c +// GET an Article and its Categories from /articles/888.json and map into Core Data entities +// JSON looks like {"article": {"title": "My Article", "author": "Blake", "body": "Very cool!!", "categories": [{"id": 1, "name": "Core Data"]} +NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil]; +RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel]; +NSError *error = nil; +BOOL success = RKEnsureDirectoryExistsAtPath(RKApplicationDataDirectory(), &error); +if (! success) { + RKLogError(@"Failed to create Application Data Directory at path '%@': %@", RKApplicationDataDirectory(), error); +} +NSString *path = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"Store.sqlite"]; +NSPersistentStore *persistentStore = [managedObjectStore addSQLitePersistentStoreAtPath:path fromSeedDatabaseAtPath:nil withConfiguration:nil options:nil error:&error]; +if (! persistentStore) { + RKLogError(@"Failed adding persistent store at path '%@': %@", path, error); +} +[managedObjectStore createManagedObjectContexts]; + +RKEntityMapping *categoryMapping = [RKEntityMapping mappingForEntityForName:@"Category" inManagedObjectStore:managedObjectStore]; +[categoryMapping addAttributeMappingsFromDictionary:@{ "id": "categoryID", @"name": "name" }]; +RKEntityMapping *articleMapping = [RKEntityMapping mappingForEntityForName:@"Article" inManagedObjectStore:managedObjectStore]; +[articleMapping addAttributeMappingsFromArray:@[@"title", @"author", @"body"]]; +[articleMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"categories" toKeyPath:@"categories" withMapping:categoryMapping]]; + +NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful); // Anything in 2xx +RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:articleMapping method:RKRequestMethodAny pathPattern:@"/articles/:articleID" keyPath:@"article" statusCodes:statusCodes]; + +NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://restkit.org/articles/888.json"]]; +RKManagedObjectRequestOperation *operation = [[RKManagedObjectRequestOperation alloc] initWithRequest:request responseDescriptors:@[responseDescriptor]]; +operation.managedObjectContext = managedObjectStore.mainQueueManagedObjectContext; +operation.managedObjectCache = managedObjectStore.managedObjectCache; +[operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *result) { + Article *article = [result firstObject]; + NSLog(@"Mapped the article: %@", article); + NSLog(@"Mapped the category: %@", [article.categories anyObject]); +} failure:^(RKObjectRequestOperation *operation, NSError *error) { + NSLog(@"Failed with error: %@", [error localizedDescription]); +}]; +NSOperationQueue *operationQueue = [NSOperationQueue new]; +[operationQueue addOperation:operation]; +``` + +### Map a Client Error Response to an NSError +``` objective-c +// GET /articles/error.json returns a 422 (Unprocessable Entity) +// JSON looks like {"errors": "Some Error Has Occurred"} + +// You can map errors to any class, but `RKErrorMessage` is included for free +RKObjectMapping *errorMapping = [RKObjectMapping mappingForClass:[RKErrorMessage class]]; +// The entire value at the source key path containing the errors maps to the message +[errorMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil toKeyPath:@"errorMessage"]]; + +NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassClientError); +// Any response in the 4xx status code range with an "errors" key path uses this mapping +RKResponseDescriptor *errorDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:errorMapping method:RKRequestMethodAny pathPattern:nil keyPath:@"errors" statusCodes:statusCodes]; + +NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://restkit.org/articles/error.json"]]; +RKObjectRequestOperation *operation = [[RKObjectRequestOperation alloc] initWithRequest:request responseDescriptors:@[errorDescriptor]]; +[operation setCompletionBlockWithSuccess:nil failure:^(RKObjectRequestOperation *operation, NSError *error) { + // The `description` method of the class the error is mapped to is used to construct the value of the localizedDescription + NSLog(@"Loaded this error: %@", [error localizedDescription]); + + // You can access the model object used to construct the `NSError` via the `userInfo` + RKErrorMessage *errorMessage = [[error.userInfo objectForKey:RKObjectMapperErrorObjectsKey] firstObject]; +}]; +``` + +### Centralize Configuration in an Object Manager +``` objective-c +// Set up Article and Error Response Descriptors +// Successful JSON looks like {"article": {"title": "My Article", "author": "Blake", "body": "Very cool!!"}} +RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[Article class]]; +[mapping addAttributeMappingsFromArray:@[@"title", @"author", @"body"]]; +NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful); // Anything in 2xx +RKResponseDescriptor *articleDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping method:RKRequestMethodAny pathPattern:@"/articles" keyPath:@"article" statusCodes:statusCodes]; + +// Error JSON looks like {"errors": "Some Error Has Occurred"} +RKObjectMapping *errorMapping = [RKObjectMapping mappingForClass:[RKErrorMessage class]]; +// The entire value at the source key path containing the errors maps to the message +[errorMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil toKeyPath:@"errorMessage"]]; +NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassClientError); +// Any response in the 4xx status code range with an "errors" key path uses this mapping +RKResponseDescriptor *errorDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:errorMapping method:RKRequestMethodAny pathPattern:nil keyPath:@"errors" statusCodes:statusCodes]; + +// Add our descriptors to the manager +RKObjectManager *manager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://restkit.org"]]; +[manager addResponseDescriptorsFromArray:@[ articleDescriptor, errorDescriptor ]]; + +[manager getObjectsAtPath:@"/articles/555.json" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { + // Handled with articleDescriptor +} failure:^(RKObjectRequestOperation *operation, NSError *error) { + // Transport error or server error handled by errorDescriptor +}]; +``` + +### Configure Core Data Integration with the Object Manager +``` objective-c +NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil]; +RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel]; +BOOL success = RKEnsureDirectoryExistsAtPath(RKApplicationDataDirectory(), &error); +if (! success) { + RKLogError(@"Failed to create Application Data Directory at path '%@': %@", RKApplicationDataDirectory(), error); +} +NSString *path = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"Store.sqlite"]; +NSPersistentStore *persistentStore = [managedObjectStore addSQLitePersistentStoreAtPath:path fromSeedDatabaseAtPath:nil withConfiguration:nil options:nil error:&error]; +if (! persistentStore) { + RKLogError(@"Failed adding persistent store at path '%@': %@", path, error); +} +[managedObjectStore createManagedObjectContexts]; + +RKObjectManager *manager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://restkit.org"]]; +manager.managedObjectStore = managedObjectStore; +``` + +### Load a Collection of Objects at a Path +``` objective-c +RKObjectManager *manager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://restkit.org"]]; +[manager getObjectsAtPath:@"/articles" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { +} failure:^(RKObjectRequestOperation *operation, NSError *error) { +}]; +``` + +### Manage a Queue of Object Request Operations +``` objective-c +RKObjectManager *manager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://restkit.org"]]; + +NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://restkit.org/articles/1234.json"]]; +RKObjectRequestOperation *operation = [[RKObjectRequestOperation alloc] initWithRequest:request responseDescriptors:@[responseDescriptor]]; + +[manager enqueueObjectRequestOperation:operation]; +[manager cancelAllObjectRequestOperationsWithMethod:RKRequestMethodANY matchingPathPattern:@"/articles/:articleID\\.json"]; +``` + +### POST, PATCH, and DELETE an Object +``` objective-c +RKObjectMapping *responseMapping = [RKObjectMapping mappingForClass:[Article class]]; +[responseMapping addAttributeMappingsFromArray:@[@"title", @"author", @"body"]]; +NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful); // Anything in 2xx +RKResponseDescriptor *articleDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:responseMapping method:RKRequestMethodAny pathPattern:@"/articles" keyPath:@"article" statusCodes:statusCodes]; + +RKObjectMapping *requestMapping = [RKObjectMapping requestMapping]; // objectClass == NSMutableDictionary +[requestMapping addAttributeMappingsFromArray:@[@"title", @"author", @"body"]]; + +// For any object of class Article, serialize into an NSMutableDictionary using the given mapping and nest +// under the 'article' key path +RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:requestMapping objectClass:[Article class] rootKeyPath:@"article" method:RKRequestMethodAny]; + +RKObjectManager *manager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://restkit.org"]]; +[manager addRequestDescriptor:requestDescriptor]; +[manager addResponseDescriptor:articleDescriptor]; + +Article *article = [Article new]; +article.title = @"Introduction to RestKit"; +article.body = @"This is some text."; +article.author = @"Blake"; + +// POST to create +[manager postObject:article path:@"/articles" parameters:nil success:nil failure:nil]; + +// PATCH to update +article.body = @"New Body"; +[manager patchObject:article path:@"/articles/1234" parameters:nil success:nil failure:nil]; + +// DELETE to destroy +[manager deleteObject:article path:@"/articles/1234" parameters:nil success:nil failure:nil]; +``` + +### Configure Logging +``` objective-c +// Log all HTTP traffic with request and response bodies +RKLogConfigureByName("RestKit/Network", RKLogLevelTrace); + +// Log debugging info about Core Data +RKLogConfigureByName("RestKit/CoreData", RKLogLevelDebug); + +// Raise logging for a block +RKLogWithLevelWhileExecutingBlock(RKLogLevelTrace, ^{ + // Do something that generates logs +}); +``` + +### Configure Routing +``` objective-c +RKObjectManager *manager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://restkit.org"]]; + +// Class Routing +[manager.router.routeSet addRoute:[RKRoute routeWithClass:[GGSegment class] pathPattern:@"/segments/:segmentID\\.json" method:RKRequestMethodGET]]; + +// Relationship Routing +[manager.router.routeSet addRoute:[RKRoute routeWithRelationshipName:@"amenities" objectClass:[GGAirport class] pathPattern:@"/airports/:airportID/amenities.json" method:RKRequestMethodGET]]; + +// Named Routes +[manager.router.routeSet addRoute:[RKRoute routeWithName:@"thumbs_down_review" resourcePathPattern:@"/reviews/:reviewID/thumbs_down" method:RKRequestMethodPOST]]; +``` + +### POST an Object with a File Attachment +``` objective-c +Article *article = [Article new]; +UIImage *image = [UIImage imageNamed:@"some_image.png"]; + +// Serialize the Article attributes then attach a file +NSMutableURLRequest *request = [[RKObjectManager sharedManager] multipartFormRequestWithObject:article method:RKRequestMethodPOST path:nil parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { + [formData appendPartWithFileData:UIImagePNGRepresentation(image) + name:@"article[image]" + fileName:@"photo.png" + mimeType:@"image/png"]; +}]; + +RKObjectRequestOperation *operation = [[RKObjectManager sharedManager] objectRequestOperationWithRequest:request success:nil failure:nil]; +[[RKObjectManager sharedManager] enqueueObjectRequestOperation:operation]; // NOTE: Must be enqueued rather than started +``` + +### Enqueue a Batch of Object Request Operations +``` objective-c + +RKObjectManager *manager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://restkit.org"]]; + +Airport *jfk = [Airport new]; +jfk.code = @"jfk"; +Airport *lga = [Airport new]; +lga.code = @"lga"; +Airport *rdu = [Airport new]; +rdu.code = @"rdu"; + +// Enqueue a GET for '/airports/jfk/weather', '/airports/lga/weather', '/airports/rdu/weather' +RKRoute *route = [RKRoute routeWithName:@"airport_weather" resourcePathPattern:@"/airports/:code/weather" method:RKRequestMethodGET]; + +[manager enqueueBatchOfObjectRequestOperationsWithRoute:route + objects:@[ jfk, lga, rdu] + progress:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) { + NSLog(@"Finished %d operations", numberOfFinishedOperations); + } completion:^ (NSArray *operations) { + NSLog(@"All Weather Reports Loaded!"); + }]; +``` + +### Generate a Seed Database +``` objective-c +NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil]; +RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel]; +NSError *error = nil; +BOOL success = RKEnsureDirectoryExistsAtPath(RKApplicationDataDirectory(), &error); +if (! success) { + RKLogError(@"Failed to create Application Data Directory at path '%@': %@", RKApplicationDataDirectory(), error); +} +NSString *path = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"Store.sqlite"]; +NSPersistentStore *persistentStore = [managedObjectStore addSQLitePersistentStoreAtPath:path fromSeedDatabaseAtPath:nil withConfiguration:nil options:nil error:&error]; +if (! persistentStore) { + RKLogError(@"Failed adding persistent store at path '%@': %@", path, error); +} +[managedObjectStore createManagedObjectContexts]; + +RKEntityMapping *articleMapping = [RKEntityMapping mappingForEntityForName:@"Article" inManagedObjectStore:managedObjectStore]; +[articleMapping addAttributeMappingsFromArray:@[@"title", @"author", @"body"]]; + +NSString *seedPath = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"MySeedDatabase.sqlite"]; +RKManagedObjectImporter *importer = [[RKManagedObjectImporter alloc] initWithManagedObjectModel:managedObjectStore.managedObjectModel storePath:seedPath]; + +// Import the files "articles.json" from the Main Bundle using our RKEntityMapping +// JSON looks like {"articles": [ {"title": "Article 1", "body": "Text", "author": "Blake" ]} +NSError *error; +NSBundle *mainBundle = [NSBundle mainBundle]; +[importer importObjectsFromItemAtPath:[mainBundle pathForResource:@"articles" ofType:@"json"] + withMapping:articleMapping + keyPath:@"articles" + error:&error]; + +BOOL success = [importer finishImporting:&error]; +if (success) { + [importer logSeedingInfo]; +} +``` + +### Index and Search an Entity +``` objective-c +NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil]; +RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel]; +NSError *error = nil; +BOOL success = RKEnsureDirectoryExistsAtPath(RKApplicationDataDirectory(), &error); +if (! success) { + RKLogError(@"Failed to create Application Data Directory at path '%@': %@", RKApplicationDataDirectory(), error); +} +NSString *path = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"Store.sqlite"]; +NSPersistentStore *persistentStore = [managedObjectStore addSQLitePersistentStoreAtPath:path fromSeedDatabaseAtPath:nil withConfiguration:nil options:nil error:&error]; +if (! persistentStore) { + RKLogError(@"Failed adding persistent store at path '%@': %@", path, error); +} +[managedObjectStore createManagedObjectContexts]; +[managedObjectStore addSearchIndexingToEntityForName:@"Article" onAttributes:@[ @"title", @"body" ]]; +[managedObjectStore addInMemoryPersistentStore:nil]; +[managedObjectStore createManagedObjectContexts]; +[managedObjectStore startIndexingPersistentStoreManagedObjectContext]; + +Article *article1 = [NSEntityDescription insertNewObjectForEntityForName:@"Article" inManagedObjectContext:managedObjectStore.mainQueueManagedObjectContext]; +article1.title = @"First Article"; +article1.body = "This should match search"; + +Article *article2 = [NSEntityDescription insertNewObjectForEntityForName:@"Article" inManagedObjectContext:managedObjectStore.mainQueueManagedObjectContext]; +article2.title = @"Second Article"; +article2.body = "Does not"; + +BOOL success = [managedObjectStore.mainQueueManagedObjectContext saveToPersistentStore:nil]; + +RKSearchPredicate *predicate = [RKSearchPredicate searchPredicateWithText:@"Match" type:NSAndPredicateType]; +NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Article"]; +fetchRequest.predicate = predicate; + +// Contains article1 due to body text containing 'match' +NSArray *matches = [managedObjectStore.mainQueueManagedObjectContext executeFetchRequest:fetchRequest error:nil]; +NSLog(@"Found the matching articles: %@", matches); +``` + +### Unit Test a Mapping +``` objective-c +// JSON looks like {"article": {"title": "My Article", "author": "Blake", "body": "Very cool!!"}} +RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[Article class]]; +[mapping addAttributeMappingsFromArray:@[@"title", @"author", @"body"]]; + +NSDictionary *article = @{ @"article": @{ @"title": @"My Title", @"body": @"The article body", @"author": @"Blake" } }; +RKMappingTest *mappingTest = [[RKMappingTest alloc] initWithMapping:mapping sourceObject:article destinationObject:nil]; + +[mappingTest expectMappingFromKeyPath:@"title" toKeyPath:@"title" value:@"My Title"]; +[mappingTest performMapping]; +[mappingTest verify]; +``` + +## Requirements + +RestKit requires [iOS 8.0](https://developer.apple.com/library/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS8.html#//apple_ref/doc/uid/TP40014205-SW1) and above or [Mac OS X 10.9](https://developer.apple.com/library/mac/releasenotes/MacOSX/WhatsNewInOSX/Articles/MacOSX10_9.html#//apple_ref/doc/uid/TP40013207-CH100) and above. + +Several third-party open source libraries are used within RestKit, including: + +1. [AFNetworking](https://github.com/AFNetworking/AFNetworking) - Networking Support +2. [LibComponentLogging](http://0xc0.de/LibComponentLogging) - Logging Support +3. [SOCKit](https://github.com/NimbusKit/sockit) - String <-> Object Coding +4. [iso8601parser](http://boredzo.org/iso8601parser/) - Support for parsing and generating ISO-8601 dates + +The following Cocoa frameworks must be linked into the application target for proper compilation: + +1. **CFNetwork.framework** on iOS +1. **CoreData.framework** +1. **Security.framework** +1. **MobileCoreServices.framework** on iOS or **CoreServices.framework** on OS X + +And the following linker flags must be set: + +1. **-ObjC** +1. **-all_load** + +### ARC + +As of [version 0.20.0](https://github.com/RestKit/RestKit/wiki/Restkit-0.20.0), RestKit has migrated the entire codebase to ARC. + +If you are including the RestKit sources directly into a project that does not yet use [Automatic Reference Counting](http://clang.llvm.org/docs/AutomaticReferenceCounting.html), you will need to set the `-fobjc-arc` compiler flag on all of the RestKit source files. To do this in Xcode, go to your active target and select the "Build Phases" tab. Now select all RestKit source files, press Enter, insert `-fobjc-arc` and then "Done" to enable ARC for RestKit. + +### Serialization Formats + +RestKit provides a pluggable interface for handling arbitrary serialization formats via the [`RKSerialization`](http://restkit.org/api/latest/Classes/RKSerialization.html) protocol and the [`RKMIMETypeSerialization`](http://restkit.org/api/latest/Classes/RKMIMETypeSerialization.html) class. Out of the box, RestKit supports handling the [JSON](http://www.json.org/) format for serializing and deserializing object representations via the [`NSJSONSerialization`](http://developer.apple.com/library/mac/#documentation/Foundation/Reference/NSJSONSerialization_Class/Reference/Reference.html) class. + +#### Additional Serializations + +Support for additional formats and alternate serialization backends is provided via external modules that can be added to the project. Currently the following serialization implementations are available for use: + +* JSONKit +* SBJSON +* YAJL +* NextiveJson +* XMLReader + XMLWriter + +## Installation + +The recommended approach for installing RestKit is via the [CocoaPods](http://cocoapods.org/) package manager, as it provides flexible dependency management and dead simple installation. For best results, it is recommended that you install via CocoaPods **>= 0.19.1** using Git **>= 1.8.0** installed via Homebrew. + +### via CocoaPods + +Install CocoaPods if not already available: + +``` bash +$ [sudo] gem install cocoapods +$ pod setup +``` + +Change to the directory of your Xcode project, and Create and Edit your Podfile and add RestKit: + +``` bash +$ cd /path/to/MyProject +$ touch Podfile +$ edit Podfile +target "YOUR PROJECT" do + platform :ios, '7.0' + # Or platform :osx, '10.7' + pod 'RestKit', '~> 0.24.0' +end +# Testing and Search are optional components +pod 'RestKit/Testing', '~> 0.24.0' +pod 'RestKit/Search', '~> 0.24.0' +``` + +Install into your project: + +``` bash +$ pod install +``` + +Open your project in Xcode from the .xcworkspace file (not the usual project file) + +``` bash +$ open MyProject.xcworkspace +``` + +Please note that if your installation fails, it may be because you are installing with a version of Git lower than CocoaPods is expecting. Please ensure that you are running Git **>= 1.8.0** by executing `git --version`. You can get a full picture of the installation details by executing `pod install --verbose`. + +### From a Release Package or as a Git submodule + +Detailed installation instructions are available in the [Visual Install Guide](https://github.com/RestKit/RestKit/wiki/Installing-RestKit-v0.20.x-as-a-Git-Submodule) on the Wiki. + +## Using RestKit in a Swift Project + +Install RestKit using one of the above methods. Then add `@import RestKit;` (if RestKit is built as a dynamic framework) or `#import <RestKit/RestKit.h>` (if RestKit is built as a static library) into the bridging header for your Swift project. To enable the Core Data functionality in RestKit, add `@import CoreData;` into your bridging header _before_ you import RestKit. + +## License + +RestKit is licensed under the terms of the [Apache License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html). Please see the [LICENSE](LICENSE) file for full details. + +## Credits + +RestKit is brought to you by [Blake Watters](http://twitter.com/blakewatters) and the RestKit team. + +Support is provided by the following organizations: + +* [GateGuru](http://www.gateguruapp.com/) +* [Two Toasters](http://www.twotoasters.com/) diff --git a/code/iOS/ScriptorSprint3/Pods/SOCKit/LICENSE b/code/iOS/ScriptorSprint3/Pods/SOCKit/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/SOCKit/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/code/iOS/ScriptorSprint3/Pods/SOCKit/README.mdown b/code/iOS/ScriptorSprint3/Pods/SOCKit/README.mdown new file mode 100644 index 0000000..8f66367 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/SOCKit/README.mdown @@ -0,0 +1,94 @@ +SOCKit +====== + +String <-> Object Coding for Objective-C. Rhymes with "socket". + +With SOCKit and [SOCPattern][] you can easily transform objects into strings and vice versa. + +### Two examples, cuz devs love examples. + +```obj-c +SOCPattern* pattern = [SOCPattern patternWithString:@"api.github.com/users/:username/gists"]; +[pattern stringFromObject:githubUser]; +> @"api.github.com/users/jverkoey/gists" +``` + +```obj-c +SOCPattern* pattern = [SOCPattern patternWithString:@"github.com/:username"]; +[pattern performSelector:@selector(initWithUsername:) onObject:[GithubUser class] sourceString:@"github.com/jverkoey"]; +> <GithubUser> username = jverkoey +``` + +### Hey, this is really similar to defining routes in Rails. + +Damn straight it is. + +### And isn't this kind of like Three20's navigator? + +Except hella better. It's also entirely incompatible with Three20 routes. This kinda blows if +you've already invested a ton of energy into Three20's routing tech, but here are a few reasons +why SOCKit is better: + +1. *Selectors are not defined in the pattern*. The fact that Three20 requires that you define + selectors in the pattern is scary as hell: rename a method in one of your controllers and + your URL routing will silently break. No warnings, just broke. With SOCKit you define the + selectors using @selector notation and SOCKit infers the parameters from the pattern definition. + This way you can depend on the compiler to fire a warning if the selector isn't defined anywhere. +2. *Parameters are encoded using true KVC*. You now have full access to [KVC collection operators]. +3. *SOCKit is fully unit tested and documented*. Not much more to be said here. + +Here's a quick breakdown of the differences between Three20 and SOCKit, if SOCKit were used as +the backend for Three20's URL routing. + +``` +Three20: [map from:@"twitter://tweet/(initWithTweetId:)" toViewController:[TweetController class]]; +SOCKit: [map from:@"twitter://tweet/:id" toViewController:[TweetController class] selector:@selector(initWithTweetId:)]; + +Three20: [map from:[Tweet class] name:@"thread" toURL:@"twitter://tweet/(id)/thread"]; +SOCKit: [map from:[Tweet class] name:@"thread" toURL:@"twitter://tweet/:id/thread"]; +``` + +## Where it's being used + +SOCKit is a sibling project to [Nimbus][], a light-weight and modular framework that makes it +easy to blaze a trail with your iOS apps. Nimbus will soon be using SOCKit in a re-envisioning +of Three20's navigator. + +Users of RESTKit will notice that SOCKit provides similar functionality to RESTKit's +[RKMakePathWithObject][]. In fact, both `RKMakePathWithObject` and the underlying `RKPathMatcher` +class rely on SOCKit behind the scenes. + +## Adding SOCKit to your project + +This lightweight library is built to be a dead-simple airdrop directly into your project. Contained +in SOCKit.h and SOCKit.m is all of the functionality you will need in order to start mapping +Strings <-> Objects. To start using SOCKit, simply download or `git checkout` the SOCKit repo +and drag SOCKit.h and SOCKit.m to your project's source tree. `#import "SOCKit.h"` where you want +to use SOCKit and start pumping out some mad String <-> Object coding. + +## Some cool things + +When coding objects into strings you define parameters by prefixing the property name with a colon. +So if you have a Tweet object with a `tweetId` property, the pattern parameter name would look like +`:tweetId`. Simple enough. + +But now let's say you have a Tweet object that contains a reference to a TwitterUser object via +the `user` property, and that TwitterUser object has a `username` property. Check this out: +`:user.username`. If this was one of my tweets and I encoded the Tweet object using a SOCKit +pattern the resulting string would be `@"featherless"`. KVC rocks. + +## Learning more + +In-depth documentation can be found in the [SOCKit.h][SOCPattern] header file. + +## Contributing + +If you find a bug in SOCKit please file an issue on the Github [SOCKit issue tracker][]. Even +better: if you have a solution for the bug then fork the project and make a pull request. + +[SOCKit issue tracker]: https://github.com/jverkoey/sockit/issues +[SOCPattern]: https://github.com/jverkoey/sockit/blob/master/SOCKit.h +[KVC collection operators]: http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueCoding/Articles/CollectionOperators.html#//apple_ref/doc/uid/20002176-BAJEAIEE +[Nimbus]: http://jverkoey.github.com/nimbus +[RESTKit]: https://github.com/RestKit/RestKit +[RKMakePathWithObject]: https://github.com/RestKit/RestKit/blob/master/Code/Network/RKClient.m#L37 \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/Pods/SOCKit/SOCKit.h b/code/iOS/ScriptorSprint3/Pods/SOCKit/SOCKit.h new file mode 100644 index 0000000..57fcf44 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/SOCKit/SOCKit.h @@ -0,0 +1,214 @@ +// +// Copyright 2011-2012 Jeff Verkoeyen +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <Foundation/Foundation.h> + +/** + * String <-> Object Coding. + * + * Code information from strings into objects and vice versa. + * + * A pattern is a string with parameter names prefixed by colons (":"). + * An example of a pattern string with one parameter named :username is: + * api.github.com/users/:username/gists + * + * Patterns, once created, can be used to efficiently turn objects into strings and + * vice versa. Respectively, these techniques are referred to as inbound and outbound. + * + * Inbound examples (creating strings from objects): + * + * pattern: api.github.com/users/:username/gists + * > [pattern stringFromObject:[GithubUser userWithUsername:@"jverkoey"]]; + * returns: api.github.com/users/jverkoey/gists + * + * pattern: api.github.com/repos/:username/:repo/issues + * > [pattern stringFromObject:[GithubRepo repoWithUsername:@"jverkoey" repo:@"sockit"]]; + * returns: api.github.com/repos/jverkoey/sockit/issues + * + * Outbound examples (performing selectors on objects with values from given strings): + * + * pattern: github.com/:username + * > [pattern performSelector:@selector(initWithUsername:) onObject:[GithubUser class] sourceString:@"github.com/jverkoey"]; + * returns: an allocated, initialized, and autoreleased GithubUser object with @"jverkoey" passed + * to the initWithUsername: method. + * + * pattern: github.com/:username/:repo + * > [pattern performSelector:@selector(initWithUsername:repoName:) onObject:[GithubUser class] sourceString:@"github.com/jverkoey/sockit"]; + * returns: an allocated, initialized, and autoreleased GithubUser object with @"jverkoey" and + * @"sockit" passed to the initWithUsername:repoName: method. + * + * pattern: github.com/:username + * > [pattern performSelector:@selector(setUsername:) onObject:githubUser sourceString:@"github.com/jverkoey"]; + * returns: nil because setUsername: does not have a return value. githubUser's username property + * is now @"jverkoey". + * + * Note 1: Parameters must be separated by string literals + * + * Pattern parameters must be separated by some sort of non-parameter character. + * This means that you can't define a pattern like :user:repo. This is because when we + * get around to wanting to decode the string back into an object we need some sort of + * delimiter between the parameters. + * + * Note 2: When colons aren't seen as parameters + * + * If you have colons in your text that aren't followed by a valid parameter name then the + * colon will be treated as static text. This is handy if you're defining a URL pattern. + * For example: @"http://github.com/:user" only has one parameter, :user. The ":" in http:// + * is treated as a string literal and not a parameter. + * + * Note 3: Escaping KVC characters + * + * If you need to use KVC characters in SOCKit patterns as literal string tokens and not + * treated with KVC then you must escape the characters using double backslashes. For example, + * @"/:userid.json" would create a pattern that uses KVC to access the json property of the + * username value. In this case, however, we wish to interpret the ".json" portion as a + * static string. + * + * In order to do so we must escape the "." using a double backslash: "\\.". For example: + * @"/:userid\\.json". This makes it possible to create strings of the form @"/3.json". + * This also works with outbound parameters, so that the string @"/3.json" can + * be used with the pattern to invoke a selector with "3" as the first argument rather + * than "3.json". + * + * You can escape the following characters: + * ":" => @"\\:" + * "@" => @"\\@" + * "." => @"\\." + * "\\" => @"\\\\" + * + * Note 4: Allocating new objects with outbound patterns + * + * SOCKit will allocate a new object of a given class if + * performSelector:onObject:sourceString: is provided a selector with "init" as a prefix + * and object is a Class. E.g. [GithubUser class]. + */ +@interface SOCPattern : NSObject { +@private + NSString* _patternString; + NSArray* _tokens; + NSArray* _parameters; +} + +/** + * Initializes a newly allocated pattern object with the given pattern string. + * + * Designated initializer. + */ +- (id)initWithString:(NSString *)string; ++ (id)patternWithString:(NSString *)string; + +/** + * Returns YES if the given string can be used with performSelector:onObject:sourceString: or + * extractParameterKeyValuesFromSourceString:. + * + * A matching string must exactly match all of the static portions of the pattern and provide + * values for each of the parameters. + * + * @param string A string that may or may not conform to this pattern. + * @returns YES if the given string conforms to this pattern, NO otherwise. + */ +- (BOOL)stringMatches:(NSString *)string; + +/** + * Performs the given selector on the object with the matching parameter values from sourceString. + * + * @param selector The selector to perform on the object. If there aren't enough + * parameters in the pattern then the excess parameters in the selector + * will be nil. + * @param object The object to perform the selector on. + * @param sourceString A string that conforms to this pattern. The parameter values from + * this string are used as the arguments when performing the selector + * on the object. + * @returns The initialized, autoreleased object if the selector is an initializer + * (prefixed with "init") and object is a Class, otherwise the return value from + * invoking the selector. + */ +- (id)performSelector:(SEL)selector onObject:(id)object sourceString:(NSString *)sourceString; + +/** + * Extracts the matching parameter values from sourceString into an NSDictionary. + * + * @param sourceString A string that conforms to this pattern. The parameter values from + * this string are extracted into the NSDictionary. + * @returns A dictionary of key value pairs. All values will be NSStrings. The keys will + * correspond to the pattern's parameter names. Duplicate key values will be + * overwritten by later values. + */ +- (NSDictionary *)parameterDictionaryFromSourceString:(NSString *)sourceString; + +/** + * Returns a string with the parameters of this pattern replaced using Key-Value Coding (KVC) + * on the receiving object. + * + * Parameters of the pattern are evaluated using valueForKeyPath:. See Apple's KVC documentation + * for more details. + * + * Key-Value Coding Fundamentals: + * http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueCoding/Articles/BasicPrinciples.html#//apple_ref/doc/uid/20002170-BAJEAIEE + * + * Collection Operators: + * http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueCoding/Articles/CollectionOperators.html#//apple_ref/doc/uid/20002176-BAJEAIEE + * + * @param object The object whose properties will be used to replace the parameters in + * the pattern. + * @returns A string with the pattern parameters replaced by the object property values. + * @see stringFromObject:withBlock: + */ +- (NSString *)stringFromObject:(id)object; + +#if NS_BLOCKS_AVAILABLE +/** + * Returns a string with the parameters of this pattern replaced using Key-Value Coding (KVC) + * on the receiving object, and the result is (optionally) modified or encoded by the block. + * + * For example, consider we have individual object values that need percent escapes added to them, + * while preserving the slashes, question marks, and ampersands of a typical resource path. + * Using blocks, this is very succinct: + * + * @code + * NSDictionary* person = [NSDictionary dictionaryWithObjectsAndKeys: + * @"SECRET|KEY",@"password", + * @"Joe Bob Briggs", @"name", nil]; + * SOCPattern* soc = [SOCPattern patternWithString:@"/people/:name/:password"]; + * NSString* actualPath = [soc stringFromObject:person withBlock:^(NSString *)propertyValue) { + * return [propertyValue stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + * } + * NSString* expectedPath = @"/people/Joe%20Bob%20Briggs/SECRET%7CKEY"; + * @endcode + * + * @param object The object whose properties will be used to replace the parameters in + * the pattern. + * @param block An optional block (may be nil) that modifies or encodes each + * property value string. The block accepts one parameter - the property + * value as a string - and should return the modified property string. + * @returns A string with the pattern parameters replaced by the block-processed object + * property values. + * @see stringFromObject: + */ +- (NSString *)stringFromObject:(id)object withBlock:(NSString*(^)(NSString*))block; +#endif + +@end + +/** + * A convenience method for: + * + * SOCPattern* pattern = [SOCPattern patternWithString:string]; + * NSString* result = [pattern stringFromObject:object]; + * + * @see documentation for stringFromObject: + */ +NSString* SOCStringFromStringWithObject(NSString* string, id object); diff --git a/code/iOS/ScriptorSprint3/Pods/SOCKit/SOCKit.m b/code/iOS/ScriptorSprint3/Pods/SOCKit/SOCKit.m new file mode 100644 index 0000000..59e4a65 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/SOCKit/SOCKit.m @@ -0,0 +1,543 @@ +// +// Copyright 2011-2012 Jeff Verkoeyen +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "SOCKit.h" + +#import <objc/runtime.h> +#import <assert.h> + +typedef enum { + SOCArgumentTypeNone, + SOCArgumentTypePointer, + SOCArgumentTypeBool, + SOCArgumentTypeInteger, + SOCArgumentTypeLongLong, + SOCArgumentTypeFloat, + SOCArgumentTypeDouble, +} SOCArgumentType; + +SOCArgumentType SOCArgumentTypeForTypeAsChar(char argType); +NSString* kTemporaryBackslashToken = @"/backslash/"; + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////// +@interface SOCParameter : NSObject { +@private + NSString* _string; +} + +- (id)initWithString:(NSString *)string; ++ (id)parameterWithString:(NSString *)string; + +- (NSString *)string; + +@end + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////// +@interface SOCPattern() + +- (void)_compilePattern; + +@end + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////// +@implementation SOCPattern + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +- (void)dealloc { + [_patternString release]; _patternString = nil; + [_tokens release]; _tokens = nil; + [_parameters release]; _parameters = nil; + [super dealloc]; +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +- (id)initWithString:(NSString *)string { + if ((self = [super init])) { + _patternString = [string copy]; + + [self _compilePattern]; + } + return self; +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// ++ (id)patternWithString:(NSString *)string { + return [[[self alloc] initWithString:string] autorelease]; +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - Pattern Compilation + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +- (NSCharacterSet *)nonParameterCharacterSet { + NSMutableCharacterSet* parameterCharacterSet = [NSMutableCharacterSet alphanumericCharacterSet]; + [parameterCharacterSet addCharactersInString:@".@_"]; + NSCharacterSet* nonParameterCharacterSet = [parameterCharacterSet invertedSet]; + return nonParameterCharacterSet; +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +- (void)_compilePattern { + if ([_patternString length] == 0) { + return; + } + + NSMutableArray* tokens = [[NSMutableArray alloc] init]; + NSMutableArray* parameters = [[NSMutableArray alloc] init]; + + NSCharacterSet* nonParameterCharacterSet = [self nonParameterCharacterSet]; + + // Turn escaped backslashes into a special backslash token to avoid \\. being interpreted as + // `\` and `\.` rather than `\\` and `.`. + NSString* escapedPatternString = _patternString; + if ([escapedPatternString rangeOfString:@"\\\\"].length > 0) { + escapedPatternString = [escapedPatternString stringByReplacingOccurrencesOfString: @"\\\\" + withString: kTemporaryBackslashToken]; + } + + // Scan through the string, creating tokens that are either strings or parameters. + // Parameters are prefixed with ":". + NSScanner* scanner = [NSScanner scannerWithString:escapedPatternString]; + + // NSScanner skips whitespace and newlines by default (not ideal!). + [scanner setCharactersToBeSkipped:nil]; + + while (![scanner isAtEnd]) { + NSString* token = nil; + [scanner scanUpToString:@":" intoString:&token]; + + if ([token length] > 0) { + if (![token hasSuffix:@"\\"]) { + // Add this static text to the token list. + [tokens addObject:token]; + + } else { + // This token is escaping the next colon, so we skip the parameter creation. + [tokens addObject:[token stringByAppendingString:@":"]]; + + // Skip the colon. + [scanner setScanLocation:[scanner scanLocation] + 1]; + continue; + } + } + + if (![scanner isAtEnd]) { + // Skip the colon. + [scanner setScanLocation:[scanner scanLocation] + 1]; + + // Scanning won't modify the token if there aren't any characters to be read, so we must + // clear it before scanning again. + token = nil; + [scanner scanUpToCharactersFromSet:nonParameterCharacterSet intoString:&token]; + + if ([token length] > 0) { + // Only add parameters that have valid names. + SOCParameter* parameter = [SOCParameter parameterWithString:token]; + [parameters addObject:parameter]; + [tokens addObject:parameter]; + + } else { + // Allows for http:// to get by without creating a parameter. + [tokens addObject:@":"]; + } + } + } + + // This is an outbound pattern. + if ([parameters count] > 0) { + BOOL lastWasParameter = NO; + for (id token in tokens) { + if ([token isKindOfClass:[SOCParameter class]]) { + NSAssert(!lastWasParameter, @"Parameters must be separated by non-parameter characters."); + lastWasParameter = YES; + + } else { + lastWasParameter = NO; + } + } + } + + [_tokens release]; + _tokens = [tokens copy]; + [_parameters release]; _parameters = nil; + if ([parameters count] > 0) { + _parameters = [parameters copy]; + } + [tokens release]; tokens = nil; + [parameters release]; parameters = nil; +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +- (NSString *)_stringFromEscapedToken:(NSString *)token { + if ([token rangeOfString:@"\\"].length == 0 + && [token rangeOfString:kTemporaryBackslashToken].length == 0) { + // The common case (faster and creates fewer autoreleased strings). + return token; + + } else { + // Escaped characters may exist. + // Create a mutable copy so that we don't excessively create new autoreleased strings. + NSMutableString* mutableToken = [token mutableCopy]; + [mutableToken replaceOccurrencesOfString:@"\\." withString:@"." options:0 range:NSMakeRange(0, [mutableToken length])]; + [mutableToken replaceOccurrencesOfString:@"\\@" withString:@"@" options:0 range:NSMakeRange(0, [mutableToken length])]; + [mutableToken replaceOccurrencesOfString:@"\\:" withString:@":" options:0 range:NSMakeRange(0, [mutableToken length])]; + [mutableToken replaceOccurrencesOfString:kTemporaryBackslashToken withString:@"\\" options:0 range:NSMakeRange(0, [mutableToken length])]; + return [mutableToken autorelease]; + } +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - Public Methods + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +- (BOOL)gatherParameterValues:(NSArray**)pValues fromString:(NSString *)string { + const NSInteger stringLength = [string length]; + NSInteger validUpUntil = 0; + NSInteger matchingTokens = 0; + + NSMutableArray* values = nil; + if (nil != pValues) { + values = [NSMutableArray array]; + } + + NSInteger tokenIndex = 0; + for (id token in _tokens) { + + if ([token isKindOfClass:[NSString class]]) { + // Replace the escaped characters in the token before we start comparing the string. + token = [self _stringFromEscapedToken:token]; + + NSInteger tokenLength = [token length]; + if (validUpUntil + tokenLength > stringLength) { + // There aren't enough characters in the string to satisfy this token. + break; + } + if (![[string substringWithRange:NSMakeRange(validUpUntil, tokenLength)] + isEqualToString:token]) { + // The tokens don't match up. + break; + } + + // The string token matches. + validUpUntil += tokenLength; + ++matchingTokens; + + } else { + NSInteger parameterLocation = validUpUntil; + + // Look ahead for the next string token match. + if (tokenIndex + 1 < [_tokens count]) { + NSString* nextToken = [self _stringFromEscapedToken:[_tokens objectAtIndex:tokenIndex + 1]]; + NSAssert([nextToken isKindOfClass:[NSString class]], @"The token following a parameter must be a string."); + + NSRange nextTokenRange = [string rangeOfString:nextToken options:0 range:NSMakeRange(validUpUntil, stringLength - validUpUntil)]; + if (nextTokenRange.length == 0) { + // Couldn't find the next token. + break; + } + if (nextTokenRange.location == validUpUntil) { + // This parameter is empty. + break; + } + + validUpUntil = nextTokenRange.location; + ++matchingTokens; + + } else { + // Anything goes until the end of the string then. + if (validUpUntil == stringLength) { + // The last parameter is empty. + break; + } + + validUpUntil = stringLength; + ++matchingTokens; + } + + NSRange parameterRange = NSMakeRange(parameterLocation, validUpUntil - parameterLocation); + [values addObject:[string substringWithRange:parameterRange]]; + } + + ++tokenIndex; + } + + if (nil != pValues) { + *pValues = [[values copy] autorelease]; + } + + return validUpUntil == stringLength && matchingTokens == [_tokens count]; +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +- (BOOL)stringMatches:(NSString *)string { + return [self gatherParameterValues:nil fromString:string]; +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +- (void)setArgument:(NSString*)text withType:(SOCArgumentType)type atIndex:(NSInteger)index forInvocation:(NSInvocation*)invocation { + // There are two implicit arguments with an invocation. + index+=2; + + switch (type) { + case SOCArgumentTypeNone: { + break; + } + case SOCArgumentTypeInteger: { + int val = [text intValue]; + [invocation setArgument:&val atIndex:index]; + break; + } + case SOCArgumentTypeLongLong: { + long long val = [text longLongValue]; + [invocation setArgument:&val atIndex:index]; + break; + } + case SOCArgumentTypeFloat: { + float val = [text floatValue]; + [invocation setArgument:&val atIndex:index]; + break; + } + case SOCArgumentTypeDouble: { + double val = [text doubleValue]; + [invocation setArgument:&val atIndex:index]; + break; + } + case SOCArgumentTypeBool: { + BOOL val = [text boolValue]; + [invocation setArgument:&val atIndex:index]; + break; + } + default: { + [invocation setArgument:&text atIndex:index]; + break; + } + } +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +- (void)setArgumentsFromValues:(NSArray *)values forInvocation:(NSInvocation *)invocation { + Method method = class_getInstanceMethod([invocation.target class], invocation.selector); + NSAssert(nil != method, @"The method must exist with the given invocation target."); + + for (NSInteger ix = 0; ix < [values count]; ++ix) { + NSString* value = [values objectAtIndex:ix]; + + char argType[4]; + method_getArgumentType(method, (unsigned int) ix + 2, argType, sizeof(argType) / sizeof(argType[0])); + SOCArgumentType type = SOCArgumentTypeForTypeAsChar(argType[0]); + + [self setArgument:value withType:type atIndex:ix forInvocation:invocation]; + } +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +- (id)performSelector:(SEL)selector onObject:(id)object sourceString:(NSString *)sourceString { + BOOL isInitializer = [NSStringFromSelector(selector) hasPrefix:@"init"] && [object class] == object; + + if (isInitializer) { + object = [[object alloc] autorelease]; + } + + NSArray* values = nil; + BOOL succeeded = [self gatherParameterValues:&values fromString:sourceString]; + NSAssert(succeeded, @"The pattern can't be used with this string."); + + id returnValue = nil; + + if (succeeded) { + NSMethodSignature* sig = [object methodSignatureForSelector:selector]; + NSAssert(nil != sig, @"%@ does not respond to selector: '%@'", object, NSStringFromSelector(selector)); + NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:sig]; + [invocation setTarget:object]; + [invocation setSelector:selector]; + [self setArgumentsFromValues:values forInvocation:invocation]; + [invocation invoke]; + + if (sig.methodReturnLength) { + [invocation getReturnValue:&returnValue]; + } + } + + return returnValue; +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +- (NSDictionary *)parameterDictionaryFromSourceString:(NSString *)sourceString { + NSMutableDictionary* kvs = [[NSMutableDictionary alloc] initWithCapacity:[_parameters count]]; + + NSArray* values = nil; + BOOL succeeded = [self gatherParameterValues:&values fromString:sourceString]; + NSAssert(succeeded, @"The pattern can't be used with this string."); + + NSDictionary* result = nil; + + if (succeeded) { + for (NSInteger ix = 0; ix < [values count]; ++ix) { + SOCParameter* parameter = [_parameters objectAtIndex:ix]; + id value = [values objectAtIndex:ix]; + [kvs setObject:value forKey:parameter.string]; + } + + result = [[kvs copy] autorelease]; + [kvs release]; kvs = nil; + } + + return result; +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +- (NSString *)_stringWithParameterValues:(NSDictionary *)parameterValues { + NSMutableString* accumulator = [[NSMutableString alloc] initWithCapacity:[_patternString length]]; + + for (id token in _tokens) { + if ([token isKindOfClass:[NSString class]]) { + [accumulator appendString:[self _stringFromEscapedToken:token]]; + + } else { + SOCParameter* parameter = token; + [accumulator appendString:[parameterValues objectForKey:parameter.string]]; + } + } + + NSString* result = nil; + result = [[accumulator copy] autorelease]; + [accumulator release]; accumulator = nil; + return result; +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +- (NSString *)stringFromObject:(id)object { + if ([_tokens count] == 0) { + return @""; + } + NSMutableDictionary* parameterValues = + [NSMutableDictionary dictionaryWithCapacity:[_parameters count]]; + for (SOCParameter* parameter in _parameters) { + NSString* stringValue = [NSString stringWithFormat:@"%@", [object valueForKeyPath:parameter.string]]; + [parameterValues setObject:stringValue forKey:parameter.string]; + } + return [self _stringWithParameterValues:parameterValues]; +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +#if NS_BLOCKS_AVAILABLE +- (NSString *)stringFromObject:(id)object withBlock:(NSString *(^)(NSString*))block { + if ([_tokens count] == 0) { + return @""; + } + NSMutableDictionary* parameterValues = [NSMutableDictionary dictionaryWithCapacity:[_parameters count]]; + for (SOCParameter* parameter in _parameters) { + NSString* stringValue = [NSString stringWithFormat:@"%@", [object valueForKeyPath:parameter.string]]; + if (nil != block) { + stringValue = block(stringValue); + } + if (nil != stringValue) { + [parameterValues setObject:stringValue forKey:parameter.string]; + } + } + return [self _stringWithParameterValues:parameterValues]; +} +#endif + +@end + +/////////////////////////////////////////////////////////////////////////////////////////////////// +@implementation SOCParameter + +- (void)dealloc { + [_string release]; _string = nil; + [super dealloc]; +} + +- (id)initWithString:(NSString *)string { + if ((self = [super init])) { + _string = [string copy]; + } + return self; +} + ++ (id)parameterWithString:(NSString *)string { + return [[[self alloc] initWithString:string] autorelease]; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"Parameter: %@", _string]; +} + +- (NSString *)string { + return [[_string retain] autorelease]; +} + +@end + +/////////////////////////////////////////////////////////////////////////////////////////////////// +SOCArgumentType SOCArgumentTypeForTypeAsChar(char argType) { + if (argType == 'c' || argType == 'i' || argType == 's' || argType == 'l' || argType == 'C' + || argType == 'I' || argType == 'S' || argType == 'L') { + return SOCArgumentTypeInteger; + + } else if (argType == 'q' || argType == 'Q') { + return SOCArgumentTypeLongLong; + + } else if (argType == 'f') { + return SOCArgumentTypeFloat; + + } else if (argType == 'd') { + return SOCArgumentTypeDouble; + + } else if (argType == 'B') { + return SOCArgumentTypeBool; + + } else { + return SOCArgumentTypePointer; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +NSString* SOCStringFromStringWithObject(NSString* string, id object) { + SOCPattern* pattern = [[SOCPattern alloc] initWithString:string]; + NSString* result = [pattern stringFromObject:object]; + [pattern release]; + return result; +} diff --git a/code/iOS/ScriptorSprint3/Pods/Target Support Files/ISO8601DateFormatterValueTransformer/ISO8601DateFormatterValueTransformer-dummy.m b/code/iOS/ScriptorSprint3/Pods/Target Support Files/ISO8601DateFormatterValueTransformer/ISO8601DateFormatterValueTransformer-dummy.m new file mode 100644 index 0000000..8a45508 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Target Support Files/ISO8601DateFormatterValueTransformer/ISO8601DateFormatterValueTransformer-dummy.m @@ -0,0 +1,5 @@ +#import <Foundation/Foundation.h> +@interface PodsDummy_ISO8601DateFormatterValueTransformer : NSObject +@end +@implementation PodsDummy_ISO8601DateFormatterValueTransformer +@end diff --git a/code/iOS/ScriptorSprint3/Pods/Target Support Files/ISO8601DateFormatterValueTransformer/ISO8601DateFormatterValueTransformer-prefix.pch b/code/iOS/ScriptorSprint3/Pods/Target Support Files/ISO8601DateFormatterValueTransformer/ISO8601DateFormatterValueTransformer-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Target Support Files/ISO8601DateFormatterValueTransformer/ISO8601DateFormatterValueTransformer-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import <UIKit/UIKit.h> +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/code/iOS/ScriptorSprint3/Pods/Target Support Files/ISO8601DateFormatterValueTransformer/ISO8601DateFormatterValueTransformer.xcconfig b/code/iOS/ScriptorSprint3/Pods/Target Support Files/ISO8601DateFormatterValueTransformer/ISO8601DateFormatterValueTransformer.xcconfig new file mode 100644 index 0000000..1294c5a --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Target Support Files/ISO8601DateFormatterValueTransformer/ISO8601DateFormatterValueTransformer.xcconfig @@ -0,0 +1,9 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/ISO8601DateFormatterValueTransformer +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/ISO8601DateFormatterValueTransformer" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/ISO8601DateFormatterValueTransformer" "${PODS_ROOT}/Headers/Public/RKValueTransformers" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/ISO8601DateFormatterValueTransformer +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/code/iOS/ScriptorSprint3/Pods/Target Support Files/Pods-ScriptorSprint2/Pods-ScriptorSprint2-acknowledgements.markdown b/code/iOS/ScriptorSprint3/Pods/Target Support Files/Pods-ScriptorSprint2/Pods-ScriptorSprint2-acknowledgements.markdown new file mode 100644 index 0000000..2e3bb5b --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Target Support Files/Pods-ScriptorSprint2/Pods-ScriptorSprint2-acknowledgements.markdown @@ -0,0 +1,1011 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## ISO8601DateFormatterValueTransformer + +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +2. Grant of Copyright License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +3. Grant of Patent License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. + +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source form +of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. + +5. Submission of Contributions. + +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. + +6. Trademarks. + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. + +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +8. Limitation of Liability. + +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same "printed page" as the copyright notice for easier identification within +third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +## RKValueTransformers + +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +2. Grant of Copyright License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +3. Grant of Patent License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. + +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source form +of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. + +5. Submission of Contributions. + +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. + +6. Trademarks. + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. + +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +8. Limitation of Liability. + +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same "printed page" as the copyright notice for easier identification within +third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +## RestKit + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2009-2012 The RestKit Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +## SOCKit + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +## TransitionKit + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2013-2014 Blake Watters + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +Generated by CocoaPods - https://cocoapods.org diff --git a/code/iOS/ScriptorSprint3/Pods/Target Support Files/Pods-ScriptorSprint2/Pods-ScriptorSprint2-acknowledgements.plist b/code/iOS/ScriptorSprint3/Pods/Target Support Files/Pods-ScriptorSprint2/Pods-ScriptorSprint2-acknowledgements.plist new file mode 100644 index 0000000..ccb9eaa --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Target Support Files/Pods-ScriptorSprint2/Pods-ScriptorSprint2-acknowledgements.plist @@ -0,0 +1,1067 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>PreferenceSpecifiers</key> + <array> + <dict> + <key>FooterText</key> + <string>This application makes use of the following third party libraries:</string> + <key>Title</key> + <string>Acknowledgements</string> + <key>Type</key> + <string>PSGroupSpecifier</string> + </dict> + <dict> + <key>FooterText</key> + <string>Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +2. Grant of Copyright License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +3. Grant of Patent License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. + +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source form +of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. + +5. Submission of Contributions. + +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. + +6. Trademarks. + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. + +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +8. Limitation of Liability. + +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same "printed page" as the copyright notice for easier identification within +third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +</string> + <key>License</key> + <string>Apache2</string> + <key>Title</key> + <string>ISO8601DateFormatterValueTransformer</string> + <key>Type</key> + <string>PSGroupSpecifier</string> + </dict> + <dict> + <key>FooterText</key> + <string>Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +2. Grant of Copyright License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +3. Grant of Patent License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. + +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source form +of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. + +5. Submission of Contributions. + +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. + +6. Trademarks. + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. + +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +8. Limitation of Liability. + +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same "printed page" as the copyright notice for easier identification within +third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +</string> + <key>License</key> + <string>Apache2</string> + <key>Title</key> + <string>RKValueTransformers</string> + <key>Type</key> + <string>PSGroupSpecifier</string> + </dict> + <dict> + <key>FooterText</key> + <string> + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2009-2012 The RestKit Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +</string> + <key>License</key> + <string>Apache License, Version 2.0</string> + <key>Title</key> + <string>RestKit</string> + <key>Type</key> + <string>PSGroupSpecifier</string> + </dict> + <dict> + <key>FooterText</key> + <string> + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +</string> + <key>License</key> + <string>Apache License, Version 2.0</string> + <key>Title</key> + <string>SOCKit</string> + <key>Type</key> + <string>PSGroupSpecifier</string> + </dict> + <dict> + <key>FooterText</key> + <string> + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2013-2014 Blake Watters + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +</string> + <key>License</key> + <string>Apache2</string> + <key>Title</key> + <string>TransitionKit</string> + <key>Type</key> + <string>PSGroupSpecifier</string> + </dict> + <dict> + <key>FooterText</key> + <string>Generated by CocoaPods - https://cocoapods.org</string> + <key>Title</key> + <string></string> + <key>Type</key> + <string>PSGroupSpecifier</string> + </dict> + </array> + <key>StringsTable</key> + <string>Acknowledgements</string> + <key>Title</key> + <string>Acknowledgements</string> +</dict> +</plist> diff --git a/code/iOS/ScriptorSprint3/Pods/Target Support Files/Pods-ScriptorSprint2/Pods-ScriptorSprint2-dummy.m b/code/iOS/ScriptorSprint3/Pods/Target Support Files/Pods-ScriptorSprint2/Pods-ScriptorSprint2-dummy.m new file mode 100644 index 0000000..a5712b2 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Target Support Files/Pods-ScriptorSprint2/Pods-ScriptorSprint2-dummy.m @@ -0,0 +1,5 @@ +#import <Foundation/Foundation.h> +@interface PodsDummy_Pods_ScriptorSprint2 : NSObject +@end +@implementation PodsDummy_Pods_ScriptorSprint2 +@end diff --git a/code/iOS/ScriptorSprint3/Pods/Target Support Files/Pods-ScriptorSprint2/Pods-ScriptorSprint2.debug.xcconfig b/code/iOS/ScriptorSprint3/Pods/Target Support Files/Pods-ScriptorSprint2/Pods-ScriptorSprint2.debug.xcconfig new file mode 100644 index 0000000..5783a5e --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Target Support Files/Pods-ScriptorSprint2/Pods-ScriptorSprint2.debug.xcconfig @@ -0,0 +1,8 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/ISO8601DateFormatterValueTransformer" "${PODS_ROOT}/Headers/Public/RKValueTransformers" "${PODS_ROOT}/Headers/Public/RestKit" "${PODS_ROOT}/Headers/Public/SOCKit" "${PODS_ROOT}/Headers/Public/TransitionKit" +LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ISO8601DateFormatterValueTransformer" "${PODS_CONFIGURATION_BUILD_DIR}/RKValueTransformers" "${PODS_CONFIGURATION_BUILD_DIR}/RestKit" "${PODS_CONFIGURATION_BUILD_DIR}/SOCKit" "${PODS_CONFIGURATION_BUILD_DIR}/TransitionKit" +OTHER_LDFLAGS = $(inherited) -ObjC -l"ISO8601DateFormatterValueTransformer" -l"RKValueTransformers" -l"RestKit" -l"SOCKit" -l"TransitionKit" -framework "CFNetwork" -framework "CoreData" -framework "MobileCoreServices" -framework "Security" -framework "SystemConfiguration" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/code/iOS/ScriptorSprint3/Pods/Target Support Files/Pods-ScriptorSprint2/Pods-ScriptorSprint2.release.xcconfig b/code/iOS/ScriptorSprint3/Pods/Target Support Files/Pods-ScriptorSprint2/Pods-ScriptorSprint2.release.xcconfig new file mode 100644 index 0000000..5783a5e --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Target Support Files/Pods-ScriptorSprint2/Pods-ScriptorSprint2.release.xcconfig @@ -0,0 +1,8 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/ISO8601DateFormatterValueTransformer" "${PODS_ROOT}/Headers/Public/RKValueTransformers" "${PODS_ROOT}/Headers/Public/RestKit" "${PODS_ROOT}/Headers/Public/SOCKit" "${PODS_ROOT}/Headers/Public/TransitionKit" +LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ISO8601DateFormatterValueTransformer" "${PODS_CONFIGURATION_BUILD_DIR}/RKValueTransformers" "${PODS_CONFIGURATION_BUILD_DIR}/RestKit" "${PODS_CONFIGURATION_BUILD_DIR}/SOCKit" "${PODS_CONFIGURATION_BUILD_DIR}/TransitionKit" +OTHER_LDFLAGS = $(inherited) -ObjC -l"ISO8601DateFormatterValueTransformer" -l"RKValueTransformers" -l"RestKit" -l"SOCKit" -l"TransitionKit" -framework "CFNetwork" -framework "CoreData" -framework "MobileCoreServices" -framework "Security" -framework "SystemConfiguration" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/code/iOS/ScriptorSprint3/Pods/Target Support Files/RKValueTransformers/RKValueTransformers-dummy.m b/code/iOS/ScriptorSprint3/Pods/Target Support Files/RKValueTransformers/RKValueTransformers-dummy.m new file mode 100644 index 0000000..792c92a --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Target Support Files/RKValueTransformers/RKValueTransformers-dummy.m @@ -0,0 +1,5 @@ +#import <Foundation/Foundation.h> +@interface PodsDummy_RKValueTransformers : NSObject +@end +@implementation PodsDummy_RKValueTransformers +@end diff --git a/code/iOS/ScriptorSprint3/Pods/Target Support Files/RKValueTransformers/RKValueTransformers-prefix.pch b/code/iOS/ScriptorSprint3/Pods/Target Support Files/RKValueTransformers/RKValueTransformers-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Target Support Files/RKValueTransformers/RKValueTransformers-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import <UIKit/UIKit.h> +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/code/iOS/ScriptorSprint3/Pods/Target Support Files/RKValueTransformers/RKValueTransformers.xcconfig b/code/iOS/ScriptorSprint3/Pods/Target Support Files/RKValueTransformers/RKValueTransformers.xcconfig new file mode 100644 index 0000000..c8804f0 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Target Support Files/RKValueTransformers/RKValueTransformers.xcconfig @@ -0,0 +1,9 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/RKValueTransformers +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/RKValueTransformers" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/RKValueTransformers" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/RKValueTransformers +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/code/iOS/ScriptorSprint3/Pods/Target Support Files/RestKit/RestKit-dummy.m b/code/iOS/ScriptorSprint3/Pods/Target Support Files/RestKit/RestKit-dummy.m new file mode 100644 index 0000000..61870a2 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Target Support Files/RestKit/RestKit-dummy.m @@ -0,0 +1,5 @@ +#import <Foundation/Foundation.h> +@interface PodsDummy_RestKit : NSObject +@end +@implementation PodsDummy_RestKit +@end diff --git a/code/iOS/ScriptorSprint3/Pods/Target Support Files/RestKit/RestKit-prefix.pch b/code/iOS/ScriptorSprint3/Pods/Target Support Files/RestKit/RestKit-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Target Support Files/RestKit/RestKit-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import <UIKit/UIKit.h> +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/code/iOS/ScriptorSprint3/Pods/Target Support Files/RestKit/RestKit.xcconfig b/code/iOS/ScriptorSprint3/Pods/Target Support Files/RestKit/RestKit.xcconfig new file mode 100644 index 0000000..6384408 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Target Support Files/RestKit/RestKit.xcconfig @@ -0,0 +1,9 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/RestKit +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/RestKit" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/ISO8601DateFormatterValueTransformer" "${PODS_ROOT}/Headers/Public/RKValueTransformers" "${PODS_ROOT}/Headers/Public/RestKit" "${PODS_ROOT}/Headers/Public/SOCKit" "${PODS_ROOT}/Headers/Public/TransitionKit" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/RestKit +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/code/iOS/ScriptorSprint3/Pods/Target Support Files/SOCKit/SOCKit-dummy.m b/code/iOS/ScriptorSprint3/Pods/Target Support Files/SOCKit/SOCKit-dummy.m new file mode 100644 index 0000000..54b43ff --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Target Support Files/SOCKit/SOCKit-dummy.m @@ -0,0 +1,5 @@ +#import <Foundation/Foundation.h> +@interface PodsDummy_SOCKit : NSObject +@end +@implementation PodsDummy_SOCKit +@end diff --git a/code/iOS/ScriptorSprint3/Pods/Target Support Files/SOCKit/SOCKit-prefix.pch b/code/iOS/ScriptorSprint3/Pods/Target Support Files/SOCKit/SOCKit-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Target Support Files/SOCKit/SOCKit-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import <UIKit/UIKit.h> +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/code/iOS/ScriptorSprint3/Pods/Target Support Files/SOCKit/SOCKit.xcconfig b/code/iOS/ScriptorSprint3/Pods/Target Support Files/SOCKit/SOCKit.xcconfig new file mode 100644 index 0000000..d82cca6 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Target Support Files/SOCKit/SOCKit.xcconfig @@ -0,0 +1,9 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SOCKit +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/SOCKit" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/SOCKit" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/SOCKit +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/code/iOS/ScriptorSprint3/Pods/Target Support Files/TransitionKit/TransitionKit-dummy.m b/code/iOS/ScriptorSprint3/Pods/Target Support Files/TransitionKit/TransitionKit-dummy.m new file mode 100644 index 0000000..345483c --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Target Support Files/TransitionKit/TransitionKit-dummy.m @@ -0,0 +1,5 @@ +#import <Foundation/Foundation.h> +@interface PodsDummy_TransitionKit : NSObject +@end +@implementation PodsDummy_TransitionKit +@end diff --git a/code/iOS/ScriptorSprint3/Pods/Target Support Files/TransitionKit/TransitionKit-prefix.pch b/code/iOS/ScriptorSprint3/Pods/Target Support Files/TransitionKit/TransitionKit-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Target Support Files/TransitionKit/TransitionKit-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import <UIKit/UIKit.h> +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/code/iOS/ScriptorSprint3/Pods/Target Support Files/TransitionKit/TransitionKit.xcconfig b/code/iOS/ScriptorSprint3/Pods/Target Support Files/TransitionKit/TransitionKit.xcconfig new file mode 100644 index 0000000..60f7c6c --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/Target Support Files/TransitionKit/TransitionKit.xcconfig @@ -0,0 +1,9 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/TransitionKit +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/TransitionKit" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/TransitionKit" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/TransitionKit +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/code/iOS/ScriptorSprint3/Pods/TransitionKit/Code/TKEvent.h b/code/iOS/ScriptorSprint3/Pods/TransitionKit/Code/TKEvent.h new file mode 100644 index 0000000..abd2156 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/TransitionKit/Code/TKEvent.h @@ -0,0 +1,89 @@ +// +// TKEvent.h +// TransitionKit +// +// Created by Blake Watters on 3/17/13. +// Copyright (c) 2013 Blake Watters. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <Foundation/Foundation.h> + +@class TKState, TKTransition; + +/** + The `TKEvent` class describes an event within a state machine that causes a transition between states. Each event has a descriptive name and specifies the state that the machine will transition into after the event has been fired. Events can optionally be constrained to a set of source states that the machine must be in for the event to fire. + */ +@interface TKEvent : NSObject <NSCoding, NSCopying> + +///------------------------ +/// @name Creating an Event +///------------------------ + +/** + Creates and returns a new event object with the given name, source states, and destination state. + + @param name The name for the event. + @param sourceStates An array of `TKState` objects specifying the source states that the machine must be in for the event to be permitted to fire. + @param destinationState The state that the state machine will transition into after the event has fired. + @return A newly created event object. + */ ++ (instancetype)eventWithName:(NSString *)name transitioningFromStates:(NSArray *)sourceStates toState:(TKState *)destinationState; + +///------------------------------ +/// @name Accessing Event Details +///------------------------------ + +@property (nonatomic, copy, readonly) NSString *name; + +/** + An optional array of states that the state machine must be in before the event is allowed to fire. + + If `nil`, then the event can be fired when the state machine is in any state. + */ +@property (nonatomic, copy, readonly) NSArray *sourceStates; + +/** + The state that the state machine will transition into after the event has fired. + + Cannot be `nil`. + */ +@property (nonatomic, strong, readonly) TKState *destinationState; + +///------------------------------ +/// @name Setting Callback Blocks +///------------------------------ + +/** + Sets a block to be executed in order to determines if an event should be fired. If the block returns `YES`, then the event will be permitted to fire. + + @param block The block to be executed to determine if the event can be fired. The block has a Boolean return value and accepts two arguments: the event that is being evaluated to determine if it can be fired and its associated transition. If the block returns `YES`, then the event can be fired. + */ +- (void)setShouldFireEventBlock:(BOOL (^)(TKEvent *event, TKTransition *transition))block; + +/** + Sets a block to be executed before an event is fired, while the state machine is still in the source state. + + @param block The block to be executed. The block has no return value and accepts two arguments: the event that is about to be fired and its associated transition. + */ +- (void)setWillFireEventBlock:(void (^)(TKEvent *event, TKTransition *transition))block; + +/** + Sets a block to be executed after an event is fired, when the state machine has transitioned into the destination state. + + @param block The block to be executed. The block has no return value and accepts two arguments: the event that has just been fired and its associated transition. + */ +- (void)setDidFireEventBlock:(void (^)(TKEvent *event, TKTransition *transition))block; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/TransitionKit/Code/TKEvent.m b/code/iOS/ScriptorSprint3/Pods/TransitionKit/Code/TKEvent.m new file mode 100644 index 0000000..8bbd728 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/TransitionKit/Code/TKEvent.m @@ -0,0 +1,101 @@ +// +// TKEvent.m +// TransitionKit +// +// Created by Blake Watters on 3/17/13. +// Copyright (c) 2013 Blake Watters. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "TKEvent.h" +#import "TKState.h" + +static NSString *TKDescribeSourceStates(NSArray *states) +{ + if (! [states count]) return @"any state"; + + NSMutableString *description = [NSMutableString string]; + [states enumerateObjectsUsingBlock:^(TKState *state, NSUInteger idx, BOOL *stop) { + NSString *separator = @""; + if (idx < [states count] - 1) separator = (idx == [states count] - 2) ? @" and " : @", "; + [description appendFormat:@"'%@'%@", state.name, separator]; + }]; + return description; +} + + +@interface TKEvent () +@property (nonatomic, copy, readwrite) NSString *name; +@property (nonatomic, copy, readwrite) NSArray *sourceStates; +@property (nonatomic, strong, readwrite) TKState *destinationState; +@property (nonatomic, copy) BOOL (^shouldFireEventBlock)(TKEvent *, TKTransition *); +@property (nonatomic, copy) void (^willFireEventBlock)(TKEvent *, TKTransition *); +@property (nonatomic, copy) void (^didFireEventBlock)(TKEvent *, TKTransition *); +@end + +@implementation TKEvent + ++ (instancetype)eventWithName:(NSString *)name transitioningFromStates:(NSArray *)sourceStates toState:(TKState *)destinationState +{ + if (! [name length]) [NSException raise:NSInvalidArgumentException format:@"The event name cannot be blank."]; + if (!destinationState) [NSException raise:NSInvalidArgumentException format:@"The destination state cannot be nil."]; + TKEvent *event = [self new]; + event.name = name; + event.sourceStates = sourceStates; + event.destinationState = destinationState; + return event; +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@:%p '%@' transitions from %@ to '%@'>", NSStringFromClass([self class]), self, self.name, TKDescribeSourceStates(self.sourceStates), self.destinationState.name]; +} + +#pragma mark - NSCoding + +- (id)initWithCoder:(NSCoder *)aDecoder +{ + self = [self init]; + if (!self) { + return nil; + } + + self.name = [aDecoder decodeObjectForKey:@"name"]; + self.sourceStates = [aDecoder decodeObjectForKey:@"sourceStates"]; + self.destinationState = [aDecoder decodeObjectForKey:@"destinationState"]; + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder +{ + [aCoder encodeObject:self.name forKey:@"name"]; + [aCoder encodeObject:self.sourceStates forKey:@"sourceStates"]; + [aCoder encodeObject:self.destinationState forKey:@"destinationState"]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone +{ + TKEvent *copiedEvent = [[[self class] allocWithZone:zone] init]; + copiedEvent.name = self.name; + copiedEvent.sourceStates = self.sourceStates; + copiedEvent.destinationState = self.destinationState; + copiedEvent.shouldFireEventBlock = self.shouldFireEventBlock; + copiedEvent.willFireEventBlock = self.willFireEventBlock; + copiedEvent.didFireEventBlock = self.didFireEventBlock; + return copiedEvent; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/TransitionKit/Code/TKState.h b/code/iOS/ScriptorSprint3/Pods/TransitionKit/Code/TKState.h new file mode 100644 index 0000000..15a3dc8 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/TransitionKit/Code/TKState.h @@ -0,0 +1,83 @@ +// +// TKState.h +// TransitionKit +// +// Created by Blake Watters on 3/17/13. +// Copyright (c) 2013 Blake Watters. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <Foundation/Foundation.h> + +@class TKTransition; + +/** + The `TKState` class defines a particular state with a state machine. Each state must have a unique name within the state machine in which it is used. + */ +@interface TKState : NSObject <NSCoding, NSCopying> + +///----------------------- +/// @name Creating a State +///----------------------- + +/** + Creates and returns a new state object with the specified name. + + @param name The name of the state. Cannot be blank. + @return A newly created state object with the specified name. + */ ++ (instancetype)stateWithName:(NSString *)name; + +///------------------------------------ +/// @name Accessing the Name of a State +///------------------------------------ + +/** + The name of the receiver. Cannot be `nil` and must be unique within the state machine that the receiver is added to. + */ +@property (nonatomic, copy, readonly) NSString *name; + +///---------------------------------- +/// @name Configuring Block Callbacks +///---------------------------------- + +/** + Sets a block to be executed before the state machine transitions into the state modeled by the receiver. + + @param block The block to executed before a state machine enters the receiver's state. The block has no return value and takes two arguments: the state object and a transition object modeling the state change. + */ +- (void)setWillEnterStateBlock:(void (^)(TKState *state, TKTransition *transition))block; + +/** + Sets a block to be executed after the state machine has transitioned into the state modeled by the receiver. + + @param block The block to executed after a state machine enters the receiver's state. The block has no return value and takes two arguments: the state object and a transition object modeling the state change. + */ +- (void)setDidEnterStateBlock:(void (^)(TKState *state, TKTransition *transition))block; + +/** + Sets a block to be executed before the state machine transitions out of the state modeled by the receiver. + + @param block The block to executed before a state machine exits the receiver's state. The block has no return value and takes two arguments: the state object and a transition object modeling the state change. + */ +- (void)setWillExitStateBlock:(void (^)(TKState *state, TKTransition *transition))block; + +/** + Sets a block to be executed after the state machine has transitioned out of the state modeled by the receiver. + + @param block The block to executed after a state machine exit the receiver's state. The block has no return value and takes two arguments: the state object and a transition object modeling the state change. + */ +- (void)setDidExitStateBlock:(void (^)(TKState *state, TKTransition *transition))block; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/TransitionKit/Code/TKState.m b/code/iOS/ScriptorSprint3/Pods/TransitionKit/Code/TKState.m new file mode 100644 index 0000000..1566339 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/TransitionKit/Code/TKState.m @@ -0,0 +1,77 @@ +// +// TKState.m +// TransitionKit +// +// Created by Blake Watters on 3/17/13. +// Copyright (c) 2013 Blake Watters. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "TKState.h" + +@interface TKState () +@property (nonatomic, copy, readwrite) NSString *name; +@property (nonatomic, copy) void (^willEnterStateBlock)(TKState *, TKTransition *); +@property (nonatomic, copy) void (^didEnterStateBlock)(TKState *, TKTransition *); +@property (nonatomic, copy) void (^willExitStateBlock)(TKState *, TKTransition *); +@property (nonatomic, copy) void (^didExitStateBlock)(TKState *, TKTransition *); +@end + +@implementation TKState + ++ (instancetype)stateWithName:(NSString *)name +{ + if (! [name length]) [NSException raise:NSInvalidArgumentException format:@"The `name` cannot be blank."]; + TKState *state = [TKState new]; + state.name = name; + return state; +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@:%p '%@'>", NSStringFromClass([self class]), self, self.name]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone +{ + TKState *copiedState = [[[self class] allocWithZone:zone] init]; + copiedState.name = self.name; + copiedState.willEnterStateBlock = self.willEnterStateBlock; + copiedState.didEnterStateBlock = self.didEnterStateBlock; + copiedState.willExitStateBlock = self.willExitStateBlock; + copiedState.didExitStateBlock = self.didExitStateBlock; + return copiedState; +} + +#pragma mark - NSCoding + +- (id)initWithCoder:(NSCoder *)aDecoder +{ + self = [self init]; + if (!self) { + return nil; + } + + self.name = [aDecoder decodeObjectForKey:@"name"]; + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder +{ + [aCoder encodeObject:self.name forKey:@"name"]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/TransitionKit/Code/TKStateMachine.h b/code/iOS/ScriptorSprint3/Pods/TransitionKit/Code/TKStateMachine.h new file mode 100644 index 0000000..21db66b --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/TransitionKit/Code/TKStateMachine.h @@ -0,0 +1,250 @@ +// +// TKStateMachine.h +// TransitionKit +// +// Created by Blake Watters on 3/17/13. +// Copyright (c) 2013 Blake Watters. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <Foundation/Foundation.h> + +@class TKEvent, TKState; + +/** + The `TKStateMachine` class provides an interface for modeling a state machine. The state machine supports the registration of an arbitrary number of states and events that trigger transitions between the states. + + ## Callback Sequence + + When a state machine is activated, the following callbacks are invoked: + + 1. Initial State: willEnterState - The block set with `setWillEnterStateBlock:` on the `initialState` is invoked. + 1. The `currentState` changes from `nil` to `initialState` + 1. Initial State: didEnterState - The block set with `setDidEnterStateBlock:` on the `initialState` is invoked. + + Each time an event is fired, the following callbacks are invoked: + + 1. Event: shouldFireEvent - The block set with `setShouldFireEventBlock:` on the event being fired is consulted to determine if the event can be fired. If `NO` is returned then the event is declined and no further callbacks are invoked + 1. Event: willFireEvent - The block set with `setWillFireEventBlock:` on the event being fired is invoked. + 1. Old State: willExitState - The block set with `setWillExitStateBlock:` on the outgoing state is invoked. + 1. New State: willEnterState - The block set with `setWillEnterStateBlock:` on the incoming state is invoked. + 1. The `currentState` changes from the old state to the new state. + 1. Old State: didExitState - The block set with `setDidExitStateBlock:` on the old state is invoked. + 1. New State: didEnterState - The block set with `setDidEnterStateBlock:` on the new current state is invoked. + 1. Event: didFireEvent - The block set with `setDidFireEventBlock:` on the event being fired is invoked. + 1. Notification: After the event has completed and all block callbacks + + ## Copying and Serialization Support + + The `TKStateMachine` class is both `NSCoding` and `NSCopying` compliant. When copied, a new inactive state machine instance is created with the same states, events, and initial state. All blocks associated with the events and states are copied. When archived, the current state, initial state, states, events and activation state is preserved. All block callbacks associated with the states and events become `nil`. + */ +@interface TKStateMachine : NSObject <NSCoding, NSCopying> + +///---------------------- +/// @name Managing States +///---------------------- + +/** + The set of states that have been added to the receiver. Each instance of the set is a `TKState` object. + */ +@property (nonatomic, readonly) NSSet *states; + +/** + The initial state of the receiver. + + When the machine is activated, it transitions into the initial state. + */ +@property (nonatomic, strong) TKState *initialState; + +/** + The current state of the receiver. + + When the machine is activated, the current state transitions from `nil` to the `initialState`. Subsequent state transitions are trigger by the firing of events. + + @see `fireEvent:error:` + */ +@property (nonatomic, strong, readonly) TKState *currentState; + +/** + Adds a state to the receiver. + + Before a state can be used in an event, it must be registered with the state machine. + + @param state The state to be added. + @raises TKStateMachineIsImmutableException Raised if an attempt is made to modify the state machine after it has been activated. + */ +- (void)addState:(TKState *)state; + +/** + Adds an array of state objects to the receiver. + + This is a convenience method whose implementation is equivalent to the following example code: + + for (TKState *state in arrayOfStates) { + [self addState:state]; + } + + @param arrayOfStates An array of `TKState` objects to be added to the receiver. + */ +- (void)addStates:(NSArray *)arrayOfStates; + +/** + Retrieves the state with the given name from the receiver. + + @param name The name of the state to retrieve. + @returns The state object with the given name or `nil` if it could not be found. + */ +- (TKState *)stateNamed:(NSString *)name; + +/** + Returns a Boolean value that indicates if the receiver is in the specified state. + + This is a convenience method whose functionality is equivalent to comparing the given state with the `currentState`. + + @param stateOrStateName A `TKState` object or an `NSString` object that identifies a state by name. The specified state is compared with the value of the `currentState` property. + @returns `YES` if the receiver is in the specified state, else `NO`. + @raises NSInvalidArgumentException Raised if an invalid object is given. + @raises NSInvalidArgumentException Raised if a string value is given that does not identify a registered state. + */ +- (BOOL)isInState:(id)stateOrStateName; + +///---------------------- +/// @name Managing Events +///---------------------- + +/** + The set of events that have been added to the receiver. Each instance of the set is a `TKEvent` object. + */ +@property (nonatomic, readonly) NSSet *events; + +/** + Adds an event to the receiver. + + The state objects references by the event must be registered with the receiver. + + @param event The event to be added. + @raises TKStateMachineIsImmutableException Raised if an attempt is made to modify the state machine after it has been activated. + @raises NSInternalInconsistencyException Raised if the given event references a `TKState` that has not been registered with the receiver. + */ +- (void)addEvent:(TKEvent *)event; + +/** + Adds an array of event objects to the receiver. + + This is a convenience method whose implementation is equivalent to the following example code: + + for (TKEvent *event in arrayOfEvents) { + [self addEvent:event]; + } + + @param arrayOfEvents An array of `TKEvent` objects to be added to the receiver. + */ +- (void)addEvents:(NSArray *)arrayOfEvents; + +/** + Retrieves the event with the given name from the receiver. + + @param name The name of the event to retrieve. + @returns The event object with the given name or `nil` if it could not be found. + */ +- (TKEvent *)eventNamed:(NSString *)name; + +///----------------------------------- +/// @name Activating the State Machine +///----------------------------------- + +/** + Activates the receiver by making it immutable and transitioning into the initial state. + + Once the state machine has been activated no further changes can be made to the registered events and states. Note that although callbacks will be dispatched for transition into the initial state upon activation, they will have a `nil` transition argument as no event has been fired. + */ +- (void)activate; + +/** + Returns a Boolean value that indicates if the receiver has been activated. + */ +- (BOOL)isActive; + +///-------------------- +/// @name Firing Events +///-------------------- + +/** + Returns a Boolean value that indicates if the specified event can be fired. + + @param eventOrEventName A `TKEvent` object or an `NSString` object that identifies an event by name. The source states of the specified event is compared with the current state of the receiver. If the `sourceStates` of the event is `nil`, then the event can be fired from any state. If the `sourcesStates` is not `nil`, then the event can only be fired if it includes the `currentState` of the receiver. + @return `YES` if the event can be fired, else `NO`. + */ +- (BOOL)canFireEvent:(id)eventOrEventName; + +/** + Fires an event to transition the state of the receiver. If the event fails to fire, then `NO` is returned and an error is set. + + If the receiver has not yet been activated, then the first event fired will activate it. If the specified transition is not permitted, then `NO` will be returned and an `TKInvalidTransitionError` will be created. If the `shouldFireEventBlock` of the specified event returns `NO`, then the event is declined, `NO` will be returned, and an `TKTransitionDeclinedError` will be created. + + @param eventOrEventName A `TKEvent` object or an `NSString` object that identifies an event by name. + @param userInfo An optional dictionary of user info to be delivered as part of the state transition. + @param error A pointer to an `NSError` object that will be set if the event fails to fire. + @return `YES` if the event is fired, else `NO`. + */ +- (BOOL)fireEvent:(id)eventOrEventName userInfo:(NSDictionary *)userInfo error:(NSError **)error; + +@end + +///---------------- +/// @name Constants +///---------------- + +/** + The domain for errors raised by TransitionKit. + */ +extern NSString *const TKErrorDomain; + +/** + A Notification posted when the `currentState` of a `TKStateMachine` object changes to a new value. + */ +extern NSString *const TKStateMachineDidChangeStateNotification; + +/** + A key in the `userInfo` dictionary of a `TKStateMachineDidChangeStateNotification` notification specifying the state of the machine before the transition occured. + */ +extern NSString *const TKStateMachineDidChangeStateOldStateUserInfoKey DEPRECATED_MSG_ATTRIBUTE("Use TKStateMachineDidChangeStateTransitionUserInfoKey instead (transition.sourceState)."); + +/** + A key in the `userInfo` dictionary of a `TKStateMachineDidChangeStateNotification` notification specifying the state of the machine after the transition occured. + */ +extern NSString *const TKStateMachineDidChangeStateNewStateUserInfoKey DEPRECATED_MSG_ATTRIBUTE("Use TKStateMachineDidChangeStateTransitionUserInfoKey instead (transition.destinationState)."); + +/** + A key in the `userInfo` dictionary of a `TKStateMachineDidChangeStateNotification` notification specifying the event that triggered the transition between states. + */ +extern NSString *const TKStateMachineDidChangeStateEventUserInfoKey DEPRECATED_MSG_ATTRIBUTE("Use TKStateMachineDidChangeStateTransitionUserInfoKey instead (transition.event)."); + +/** + A key in the `userInfo` dictionary of a `TKStateMachineDidChangeStateNotification` notification specifying the transition (TKTransition) between states. + */ +extern NSString *const TKStateMachineDidChangeStateTransitionUserInfoKey; + +/** + An exception raised when an attempt is made to mutate an immutable `TKStateMachine` object. + */ +extern NSString *const TKStateMachineIsImmutableException; + +/** + Error Codes + */ +typedef enum { + TKInvalidTransitionError = 1000, // An invalid transition was attempted. + TKTransitionDeclinedError = 1001, // The transition was declined by the `shouldFireEvent` guard block. +} TKErrorCode; diff --git a/code/iOS/ScriptorSprint3/Pods/TransitionKit/Code/TKStateMachine.m b/code/iOS/ScriptorSprint3/Pods/TransitionKit/Code/TKStateMachine.m new file mode 100644 index 0000000..471ade0 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/TransitionKit/Code/TKStateMachine.m @@ -0,0 +1,317 @@ +// +// TKStateMachine.m +// TransitionKit +// +// Created by Blake Watters on 3/17/13. +// Copyright (c) 2013 Blake Watters. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "TKStateMachine.h" +#import "TKState.h" +#import "TKEvent.h" +#import "TKTransition.h" + +@interface TKEvent () +@property (nonatomic, copy) BOOL (^shouldFireEventBlock)(TKEvent *, TKTransition *); +@property (nonatomic, copy) void (^willFireEventBlock)(TKEvent *, TKTransition *); +@property (nonatomic, copy) void (^didFireEventBlock)(TKEvent *, TKTransition *); +@end + +@interface TKState () +@property (nonatomic, copy) void (^willEnterStateBlock)(TKState *, TKTransition *); +@property (nonatomic, copy) void (^didEnterStateBlock)(TKState *, TKTransition *); +@property (nonatomic, copy) void (^willExitStateBlock)(TKState *, TKTransition *); +@property (nonatomic, copy) void (^didExitStateBlock)(TKState *, TKTransition *); +@end + +NSString *const TKErrorDomain = @"org.blakewatters.TransitionKit.errors"; +NSString *const TKStateMachineDidChangeStateNotification = @"TKStateMachineDidChangeStateNotification"; +NSString *const TKStateMachineDidChangeStateOldStateUserInfoKey = @"old"; +NSString *const TKStateMachineDidChangeStateNewStateUserInfoKey = @"new"; +NSString *const TKStateMachineDidChangeStateEventUserInfoKey = @"event"; +NSString *const TKStateMachineDidChangeStateTransitionUserInfoKey = @"transition"; + +NSString *const TKStateMachineIsImmutableException = @"TKStateMachineIsImmutableException"; + +#define TKRaiseIfActive() \ + if ([self isActive]) [NSException raise:TKStateMachineIsImmutableException format:@"Unable to modify state machine: The state machine has already been activated."]; + +static NSString *TKQuoteString(NSString *string) +{ + return string ? [NSString stringWithFormat:@"'%@'", string] : nil; +} + +@interface TKStateMachine () +@property (nonatomic, strong) NSMutableSet *mutableStates; +@property (nonatomic, strong) NSMutableSet *mutableEvents; +@property (nonatomic, assign, getter = isActive) BOOL active; +@property (nonatomic, strong, readwrite) TKState *currentState; +@property (nonatomic, strong) NSRecursiveLock *lock; +@end + +@implementation TKStateMachine + ++ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key +{ + NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key]; + + if ([key isEqualToString:@"states"]) { + NSSet *affectingKey = [NSSet setWithObject:@"mutableStates"]; + keyPaths = [keyPaths setByAddingObjectsFromSet:affectingKey]; + return keyPaths; + } else if ([key isEqualToString:@"events"]) { + NSSet *affectingKey = [NSSet setWithObject:@"mutableEvents"]; + keyPaths = [keyPaths setByAddingObjectsFromSet:affectingKey]; + return keyPaths; + } + + return keyPaths; +} + +- (id)init +{ + self = [super init]; + if (self) { + self.mutableStates = [NSMutableSet set]; + self.mutableEvents = [NSMutableSet set]; + self.lock = [NSRecursiveLock new]; + } + return self; +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@:%p %ld States, %ld Events. currentState=%@, initialState='%@', isActive=%@>", + NSStringFromClass([self class]), self, (unsigned long) [self.mutableStates count], (unsigned long) [self.mutableEvents count], + TKQuoteString(self.currentState.name), self.initialState.name, self.isActive ? @"YES" : @"NO"]; +} + +- (void)setInitialState:(TKState *)initialState +{ + TKRaiseIfActive(); + _initialState = initialState; +} + +- (void)setCurrentState:(TKState *)currentState +{ + if (currentState == nil) { + [NSException raise:NSInvalidArgumentException format:@"Cannot assign currentState to `nil`: Expected a `TKState` object. (%@)", self]; + } + _currentState = currentState; +} + +- (NSSet *)states +{ + return [NSSet setWithSet:self.mutableStates]; +} + +- (void)addState:(TKState *)state +{ + TKRaiseIfActive(); + if (! [state isKindOfClass:[TKState class]]) [NSException raise:NSInvalidArgumentException format:@"Expected a `TKState` object, instead got a `%@` (%@)", [state class], state]; + if ([self stateNamed: state.name]) [NSException raise:NSInvalidArgumentException format:@"State with name `%@` already exists", state.name]; + + if (self.initialState == nil) self.initialState = state; + [self.mutableStates addObject:state]; +} + +- (void)addStates:(NSArray *)arrayOfStates +{ + TKRaiseIfActive(); + for (TKState *state in arrayOfStates) { + [self addState:state]; + } +} + +- (TKState *)stateNamed:(NSString *)name +{ + for (TKState *state in self.mutableStates) { + if ([state.name isEqualToString:name]) return state; + } + return nil; +} + +- (BOOL)isInState:(id)stateOrStateName +{ + if (! [stateOrStateName isKindOfClass:[TKState class]] && ![stateOrStateName isKindOfClass:[NSString class]]) [NSException raise:NSInvalidArgumentException format:@"Expected a `TKState` object or `NSString` object specifying the name of a state, instead got a `%@` (%@)", [stateOrStateName class], stateOrStateName]; + TKState *state = [stateOrStateName isKindOfClass:[TKState class]] ? stateOrStateName : [self stateNamed:stateOrStateName]; + if (! state) [NSException raise:NSInvalidArgumentException format:@"Cannot find a State named '%@'", stateOrStateName]; + return [self.currentState isEqual:state]; +} + +- (NSSet *)events +{ + return [NSSet setWithSet:self.mutableEvents]; +} + +- (void)addEvent:(TKEvent *)event +{ + TKRaiseIfActive(); + if (! event) [NSException raise:NSInvalidArgumentException format:@"Cannot add a `nil` event to the state machine."]; + if (event.sourceStates) { + for (TKState *state in event.sourceStates) { + if (! [self.mutableStates containsObject:state]) { + [NSException raise:NSInternalInconsistencyException format:@"Cannot add event '%@' to the state machine: the event references a state '%@', which has not been added to the state machine.", event.name, state.name]; + } + } + } + if (! [self.mutableStates containsObject:event.destinationState]) [NSException raise:NSInternalInconsistencyException format:@"Cannot add event '%@' to the state machine: the event references a state '%@', which has not been added to the state machine.", event.name, event.destinationState.name]; + [self.mutableEvents addObject:event]; +} + +- (void)addEvents:(NSArray *)arrayOfEvents +{ + TKRaiseIfActive(); + for (TKEvent *event in arrayOfEvents) { + [self addEvent:event]; + } +} + +- (TKEvent *)eventNamed:(NSString *)name +{ + for (TKEvent *event in self.mutableEvents) { + if ([event.name isEqualToString:name]) return event; + } + return nil; +} + +- (void)activate +{ + if (self.isActive) [NSException raise:NSInternalInconsistencyException format:@"The state machine has already been activated."]; + [self.lock lock]; + self.active = YES; + + // Dispatch callbacks to establish initial state + if (self.initialState.willEnterStateBlock) self.initialState.willEnterStateBlock(self.initialState, nil); + self.currentState = self.initialState; + if (self.initialState.didEnterStateBlock) self.initialState.didEnterStateBlock(self.initialState, nil); + [self.lock unlock]; +} + +- (BOOL)canFireEvent:(id)eventOrEventName +{ + if (! [eventOrEventName isKindOfClass:[TKEvent class]] && ![eventOrEventName isKindOfClass:[NSString class]]) [NSException raise:NSInvalidArgumentException format:@"Expected a `TKEvent` object or `NSString` object specifying the name of an event, instead got a `%@` (%@)", [eventOrEventName class], eventOrEventName]; + TKEvent *event = [eventOrEventName isKindOfClass:[TKEvent class]] ? eventOrEventName : [self eventNamed:eventOrEventName]; + if (! event) [NSException raise:NSInvalidArgumentException format:@"Cannot find an Event named '%@'", eventOrEventName]; + return [event.sourceStates containsObject:self.currentState]; +} + +- (BOOL)fireEvent:(id)eventOrEventName userInfo:(NSDictionary *)userInfo error:(NSError *__autoreleasing *)error +{ + [self.lock lock]; + if (! self.isActive) [self activate]; + if (! [eventOrEventName isKindOfClass:[TKEvent class]] && ![eventOrEventName isKindOfClass:[NSString class]]) [NSException raise:NSInvalidArgumentException format:@"Expected a `TKEvent` object or `NSString` object specifying the name of an event, instead got a `%@` (%@)", [eventOrEventName class], eventOrEventName]; + TKEvent *event = [eventOrEventName isKindOfClass:[TKEvent class]] ? eventOrEventName : [self eventNamed:eventOrEventName]; + if (! event) [NSException raise:NSInvalidArgumentException format:@"Cannot find an Event named '%@'", eventOrEventName]; + + // Check that this transition is permitted + if (event.sourceStates != nil && ![event.sourceStates containsObject:self.currentState]) { + NSString *failureReason = [NSString stringWithFormat:@"An attempt was made to fire the '%@' event while in the '%@' state, but the event can only be fired from the following states: %@", event.name, self.currentState.name, [[event.sourceStates valueForKey:@"name"] componentsJoinedByString:@", "]]; + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: @"The event cannot be fired from the current state.", NSLocalizedFailureReasonErrorKey: failureReason }; + if (error) *error = [NSError errorWithDomain:TKErrorDomain code:TKInvalidTransitionError userInfo:userInfo]; + [self.lock unlock]; + return NO; + } + + TKTransition *transition = [TKTransition transitionForEvent:event fromState:self.currentState inStateMachine:self userInfo:userInfo]; + if (event.shouldFireEventBlock) { + if (! event.shouldFireEventBlock(event, transition)) { + NSString *failureReason = [NSString stringWithFormat:@"An attempt to fire the '%@' event was declined because `shouldFireEventBlock` returned `NO`.", event.name]; + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: @"The event declined to be fired.", NSLocalizedFailureReasonErrorKey: failureReason }; + if (error) *error = [NSError errorWithDomain:TKErrorDomain code:TKTransitionDeclinedError userInfo:userInfo]; + [self.lock unlock]; + return NO; + } + } + + TKState *oldState = self.currentState; + TKState *newState = event.destinationState; + + if (event.willFireEventBlock) event.willFireEventBlock(event, transition); + + if (oldState.willExitStateBlock) oldState.willExitStateBlock(oldState, transition); + if (newState.willEnterStateBlock) newState.willEnterStateBlock(newState, transition); + self.currentState = newState; + + NSMutableDictionary *notificationInfo = [userInfo mutableCopy] ?: [NSMutableDictionary dictionary]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + [notificationInfo addEntriesFromDictionary:@{ TKStateMachineDidChangeStateOldStateUserInfoKey: oldState, + TKStateMachineDidChangeStateNewStateUserInfoKey: newState, + TKStateMachineDidChangeStateEventUserInfoKey: event, +#pragma clang diagnostic pop + TKStateMachineDidChangeStateTransitionUserInfoKey: transition }]; + [[NSNotificationCenter defaultCenter] postNotificationName:TKStateMachineDidChangeStateNotification object:self userInfo:notificationInfo]; + + if (oldState.didExitStateBlock) oldState.didExitStateBlock(oldState, transition); + if (newState.didEnterStateBlock) newState.didEnterStateBlock(newState, transition); + + if (event.didFireEventBlock) event.didFireEventBlock(event, transition); + [self.lock unlock]; + + return YES; +} + +#pragma mark - NSCoding + +- (id)initWithCoder:(NSCoder *)aDecoder +{ + self = [self init]; + if (!self) { + return nil; + } + + self.initialState = [aDecoder decodeObjectForKey:@"initialState"]; + self.currentState =[aDecoder decodeObjectForKey:@"currentState"]; + self.mutableStates = [[aDecoder decodeObjectForKey:@"states"] mutableCopy]; + self.mutableEvents = [[aDecoder decodeObjectForKey:@"events"] mutableCopy]; + self.active = [aDecoder decodeBoolForKey:@"isActive"]; + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder +{ + [aCoder encodeObject:self.initialState forKey:@"initialState"]; + [aCoder encodeObject:self.currentState forKey:@"currentState"]; + [aCoder encodeObject:self.states forKey:@"states"]; + [aCoder encodeObject:self.events forKey:@"events"]; + [aCoder encodeBool:self.isActive forKey:@"isActive"]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone +{ + TKStateMachine *copiedStateMachine = [[[self class] allocWithZone:zone] init]; + copiedStateMachine.active = NO; + copiedStateMachine.initialState = self.initialState; + + for (TKState *state in self.states) { + [copiedStateMachine addState:[state copy]]; + } + + for (TKEvent *event in self.events) { + NSMutableArray *sourceStates = [NSMutableArray arrayWithCapacity:[event.sourceStates count]]; + for (TKState *sourceState in event.sourceStates) { + [sourceStates addObject:[copiedStateMachine stateNamed:sourceState.name]]; + } + TKState *destinationState = [copiedStateMachine stateNamed:event.destinationState.name]; + TKEvent *copiedEvent = [TKEvent eventWithName:event.name transitioningFromStates:sourceStates toState:destinationState]; + [copiedStateMachine addEvent:copiedEvent]; + } + return copiedStateMachine; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/TransitionKit/Code/TKTransition.h b/code/iOS/ScriptorSprint3/Pods/TransitionKit/Code/TKTransition.h new file mode 100644 index 0000000..91c5aa6 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/TransitionKit/Code/TKTransition.h @@ -0,0 +1,73 @@ +// +// TKTransition.h +// TransitionKit +// +// Created by Blake Watters on 10/11/13. +// Copyright (c) 2013 Blake Watters. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <Foundation/Foundation.h> + +@class TKEvent, TKState, TKStateMachine; + +/** + The `TKTransition` class models a state change in response to an event firing within a state machine. It encapsulates all details about the change and is yielded as an argument to all block callbacks within TransitionKit. The optional dictionary of `userInfo` can be used to broadcast arbitrary data across callbacks. + */ +@interface TKTransition : NSObject + +///---------------------------- +/// @name Creating a Transition +///---------------------------- + +/** + Creates and returns a new transition object describing a state change occuring within a state machine in response to the firing of an event. + + @param event The event being fired that is causing the transition to occur. + @param sourceState The state of the machine when the event was fired. + @param stateMachine The state machine in which the transition is occurirng. + @param userInfo An optional dictionary of user info supplied with the event when it was fired. + */ ++ (instancetype)transitionForEvent:(TKEvent *)event fromState:(TKState *)sourceState inStateMachine:(TKStateMachine *)stateMachine userInfo:(NSDictionary *)userInfo; + +///----------------------------------- +/// @name Accessing Transition Details +///----------------------------------- + +/** + The event that was fired, causing the transition to occur. + */ +@property (nonatomic, strong, readonly) TKEvent *event; + +/** + The state of the state machine when the transition starts. + */ +@property (nonatomic, strong, readonly) TKState *sourceState; + +/** + The state of the state machine after the transition finishes. + */ +@property (nonatomic, strong, readonly) TKState *destinationState; + +/** + The state machine in which the transition is occurring. + */ +@property (nonatomic, strong, readonly) TKStateMachine *stateMachine; + +/** + An optional dictionary of user info supplied with the event when fired. + */ +@property (nonatomic, copy, readonly) NSDictionary *userInfo; + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/TransitionKit/Code/TKTransition.m b/code/iOS/ScriptorSprint3/Pods/TransitionKit/Code/TKTransition.m new file mode 100644 index 0000000..21cb35c --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/TransitionKit/Code/TKTransition.m @@ -0,0 +1,49 @@ +// +// TKTransition.m +// TransitionKit +// +// Created by Blake Watters on 10/11/13. +// Copyright (c) 2013 Blake Watters. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "TKTransition.h" +#import "TKEvent.h" + +@interface TKTransition () + +@property (nonatomic, strong, readwrite) TKEvent *event; +@property (nonatomic, strong, readwrite) TKState *sourceState; +@property (nonatomic, strong, readwrite) TKStateMachine *stateMachine; +@property (nonatomic, copy, readwrite) NSDictionary *userInfo; +@end + +@implementation TKTransition + ++ (instancetype)transitionForEvent:(TKEvent *)event fromState:(TKState *)sourceState inStateMachine:(TKStateMachine *)stateMachine userInfo:(NSDictionary *)userInfo +{ + TKTransition *transition = [self new]; + transition.event = event; + transition.sourceState = sourceState; + transition.stateMachine = stateMachine; + transition.userInfo = userInfo; + return transition; +} + +- (TKState *)destinationState +{ + return self.event.destinationState; +} + +@end diff --git a/code/iOS/ScriptorSprint3/Pods/TransitionKit/Code/TransitionKit.h b/code/iOS/ScriptorSprint3/Pods/TransitionKit/Code/TransitionKit.h new file mode 100644 index 0000000..2505ad9 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/TransitionKit/Code/TransitionKit.h @@ -0,0 +1,29 @@ +// +// TransitionKit.h +// TransitionKit +// +// Created by Blake Watters on 3/17/13. +// Copyright (c) 2013 Blake Watters. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef TransitionKit_TransitionKit_h +#define TransitionKit_TransitionKit_h + +#import "TKStateMachine.h" +#import "TKEvent.h" +#import "TKState.h" +#import "TKTransition.h" + +#endif diff --git a/code/iOS/ScriptorSprint3/Pods/TransitionKit/LICENSE b/code/iOS/ScriptorSprint3/Pods/TransitionKit/LICENSE new file mode 100644 index 0000000..0637909 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/TransitionKit/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2013-2014 Blake Watters + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/code/iOS/ScriptorSprint3/Pods/TransitionKit/README.md b/code/iOS/ScriptorSprint3/Pods/TransitionKit/README.md new file mode 100644 index 0000000..299f983 --- /dev/null +++ b/code/iOS/ScriptorSprint3/Pods/TransitionKit/README.md @@ -0,0 +1,126 @@ +TransitionKit +============= + +[![Build Status](https://travis-ci.org/blakewatters/TransitionKit.png?branch=master,development)](https://travis-ci.org/blakewatters/TransitionKit) +![Pod Version](https://cocoapod-badges.herokuapp.com/v/TransitionKit/badge.png) +![Pod Platform](https://cocoapod-badges.herokuapp.com/p/TransitionKit/badge.png) + +**A simple, elegantly designed block based API for implementing State Machines in Objective-C** + +TransitionKit is a small Cocoa library that provides an API for implementing a state machine in Objective C. It is full-featured, completely documented, and very thoroughly unit tested. State machines are a great way to manage complexity in your application and TransitionKit provides you with an elegant API for implementing state machines in your next iOS or Mac OS X application. + +### Features + +* Supports an arbitrary number of States and Events. +* States and Events support a thorough set of block based callbacks for responding to state transitions. +* States, Events, and State Machines are NSCopying and NSCoding compliant, enabling easy integration with archiving and copying in your custom classes. +* Strongly enforced. The state machine includes numerous runtime checks for misconfigurations, making it easy to debug and trust your state machines. +* Transitions support the inclusion of arbitrary user data via a `userInfo` dictionary, making it easy to broadcast metadata across callbacks. +* Completely Documented. The entire library is marked up with Appledoc. +* Thorougly unit tested. You know it works and can make changes with confidence. +* Lightweight. TransitionKit has no dependencies beyond the Foundation library and works on iOS and Mac OS X. + +## Installation via CocoaPods + +The recommended approach for installing TransitionKit is via the [CocoaPods](http://cocoapods.org/) package manager, as it provides flexible dependency management and dead simple installation. For best results, it is recommended that you install via CocoaPods **>= 0.16.0** using Git **>= 1.8.0** installed via Homebrew. + +Install CocoaPods if not already available: + +``` bash +$ [sudo] gem install cocoapods +$ pod setup +``` + +Change to the directory of your Xcode project, and Create and Edit your Podfile and add TransitionKit: + +``` bash +$ cd /path/to/MyProject +$ touch Podfile +$ edit Podfile +platform :ios, '5.0' +# Or platform :osx, '10.7' +pod 'TransitionKit', '~> 2.0.0' +``` + +Install into your project: + +``` bash +$ pod install +``` + +Open your project in Xcode from the .xcworkspace file (not the usual project file) + +``` bash +$ open MyProject.xcworkspace +``` + +## Examples + +#### Simple Example + +The following example is a simple state machine that models the state of a Message in an Inbox. + +```objc +TKStateMachine *inboxStateMachine = [TKStateMachine new]; + +TKState *unread = [TKState stateWithName:@"Unread"]; +[unread setDidEnterStateBlock:^(TKState *state, TKTransition *transition) { + [self incrementUnreadCount]; +}]; +TKState *read = [TKState stateWithName:@"Read"]; +[read setDidExitStateBlock:^(TKState *state, TKTransition *transition) { + [self decrementUnreadCount]; +}]; +TKState *deleted = [TKState stateWithName:@"Deleted"]; +[deleted setDidEnterStateBlock:^(TKState *state, TKTransition *transition) { + [self moveMessageToTrash]; +}]; + +[inboxStateMachine addStates:@[ unread, read, deleted ]]; +inboxStateMachine.initialState = unread; + +TKEvent *viewMessage = [TKEvent eventWithName:@"View Message" transitioningFromStates:@[ unread ] toState:read]; +TKEvent *deleteMessage = [TKEvent eventWithName:@"Delete Message" transitioningFromStates:@[ read, unread ] toState:deleted]; +TKEvent *markAsUnread = [TKEvent eventWithName:@"Mark as Unread" transitioningFromStates:@[ read, deleted ] toState:unread]; + +[inboxStateMachine addEvents:@[ viewMessage, deleteMessage, markAsUnread ]]; + +// Activate the state machine +[inboxStateMachine activate]; + +[inboxStateMachine isInState:@"Unread"]; // YES, the initial state + +// Fire some events +NSDictionary *userInfo = nil; +NSError *error = nil; +BOOL success = [inboxStateMachine fireEvent:@"View Message" userInfo:userInfo error:&error]; // YES +success = [inboxStateMachine fireEvent:@"Delete Message" userInfo:userInfo error:&error]; // YES +success = [inboxStateMachine fireEvent:@"Mark as Unread" userInfo:userInfo error:&error]; // YES + +success = [inboxStateMachine canFireEvent:@"Mark as Unread"]; // NO + +// Error. Cannot mark an Unread message as Unread +success = [inboxStateMachine fireEvent:@"Mark as Unread" userInfo:nil error:&error]; // NO + +// error is an TKInvalidTransitionError with a descriptive error message and failure reason +``` + +## Unit Tests + +TransitionKit is tested using the [Kiwi](https://github.com/allending/Kiwi) BDD library. In order to run the tests, you must do the following: + +1. Install the dependencies via CocoaPods: `pod install` +1. Open the workspace: `open TransitionKit.xcworkspace` +1. Run the specs via the **Product** menu > **Test** + +## Contact + +Blake Watters + +- http://github.com/blakewatters +- http://twitter.com/blakewatters +- blakewatters@gmail.com + +## License + +TransitionKit is available under the Apache 2 License. See the LICENSE file for more info. diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2.xcodeproj/project.pbxproj b/code/iOS/ScriptorSprint3/ScriptorSprint2.xcodeproj/project.pbxproj new file mode 100644 index 0000000..7492595 --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2.xcodeproj/project.pbxproj @@ -0,0 +1,662 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 259401FE7BEFD80DA67529DF /* libPods-ScriptorSprint2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F479DC1DE280873375531614 /* libPods-ScriptorSprint2.a */; }; + 712DB3BD223D736F00425AE8 /* Songs.m in Sources */ = {isa = PBXBuildFile; fileRef = 712DB3BC223D736F00425AE8 /* Songs.m */; }; + 712DB3C0223D8CAB00425AE8 /* ChurchTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 712DB3BF223D8CAB00425AE8 /* ChurchTableViewCell.m */; }; + CA84DCF822236A520088BE57 /* SettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = CA84DCF722236A520088BE57 /* SettingsViewController.m */; }; + CAC1616F221DE89900384604 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CAC1616E221DE89900384604 /* AppDelegate.m */; }; + CAC16172221DE89900384604 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = CAC16171221DE89900384604 /* ViewController.m */; }; + CAC16175221DE89900384604 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CAC16173221DE89900384604 /* Main.storyboard */; }; + CAC16177221DE89D00384604 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CAC16176221DE89D00384604 /* Assets.xcassets */; }; + CAC1617A221DE89D00384604 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CAC16178221DE89D00384604 /* LaunchScreen.storyboard */; }; + CAC1617D221DE89D00384604 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = CAC1617C221DE89D00384604 /* main.m */; }; + CAC16187221DE89D00384604 /* ScriptorSprint2Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = CAC16186221DE89D00384604 /* ScriptorSprint2Tests.m */; }; + CAC16192221DE89D00384604 /* ScriptorSprint2UITests.m in Sources */ = {isa = PBXBuildFile; fileRef = CAC16191221DE89D00384604 /* ScriptorSprint2UITests.m */; }; + CAC4DF65223D5346004302FE /* ChurchSelectorController.m in Sources */ = {isa = PBXBuildFile; fileRef = CAC4DF64223D5346004302FE /* ChurchSelectorController.m */; }; + CAC4DF68223D58E5004302FE /* Church.m in Sources */ = {isa = PBXBuildFile; fileRef = CAC4DF67223D58E4004302FE /* Church.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + CAC16183221DE89D00384604 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = CAC16162221DE89800384604 /* Project object */; + proxyType = 1; + remoteGlobalIDString = CAC16169221DE89800384604; + remoteInfo = ScriptorSprint2; + }; + CAC1618E221DE89D00384604 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = CAC16162221DE89800384604 /* Project object */; + proxyType = 1; + remoteGlobalIDString = CAC16169221DE89800384604; + remoteInfo = ScriptorSprint2; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 19CA7FF17711D5C639593277 /* Pods-ScriptorSprint2.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ScriptorSprint2.debug.xcconfig"; path = "Target Support Files/Pods-ScriptorSprint2/Pods-ScriptorSprint2.debug.xcconfig"; sourceTree = "<group>"; }; + 624E2C86F7A18D6DEBCA9B8C /* Pods-ScriptorSprint2.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ScriptorSprint2.release.xcconfig"; path = "Target Support Files/Pods-ScriptorSprint2/Pods-ScriptorSprint2.release.xcconfig"; sourceTree = "<group>"; }; + 712DB3BB223D736F00425AE8 /* Songs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Songs.h; sourceTree = "<group>"; }; + 712DB3BC223D736F00425AE8 /* Songs.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Songs.m; sourceTree = "<group>"; }; + 712DB3BE223D8CAB00425AE8 /* ChurchTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ChurchTableViewCell.h; sourceTree = "<group>"; }; + 712DB3BF223D8CAB00425AE8 /* ChurchTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ChurchTableViewCell.m; sourceTree = "<group>"; }; + CA84DCF722236A520088BE57 /* SettingsViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SettingsViewController.m; sourceTree = "<group>"; }; + CA84DCF922236A6B0088BE57 /* SettingsViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SettingsViewController.h; sourceTree = "<group>"; }; + CAC1616A221DE89900384604 /* ScriptorSprint2.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ScriptorSprint2.app; sourceTree = BUILT_PRODUCTS_DIR; }; + CAC1616D221DE89900384604 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; }; + CAC1616E221DE89900384604 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; }; + CAC16170221DE89900384604 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; }; + CAC16171221DE89900384604 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; }; + CAC16174221DE89900384604 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; + CAC16176221DE89D00384604 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; + CAC16179221DE89D00384604 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; + CAC1617B221DE89D00384604 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; + CAC1617C221DE89D00384604 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; }; + CAC16182221DE89D00384604 /* ScriptorSprint2Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ScriptorSprint2Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + CAC16186221DE89D00384604 /* ScriptorSprint2Tests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ScriptorSprint2Tests.m; sourceTree = "<group>"; }; + CAC16188221DE89D00384604 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; + CAC1618D221DE89D00384604 /* ScriptorSprint2UITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ScriptorSprint2UITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + CAC16191221DE89D00384604 /* ScriptorSprint2UITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ScriptorSprint2UITests.m; sourceTree = "<group>"; }; + CAC16193221DE89D00384604 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; + CAC4DF63223D5346004302FE /* ChurchSelectorController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ChurchSelectorController.h; sourceTree = "<group>"; }; + CAC4DF64223D5346004302FE /* ChurchSelectorController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ChurchSelectorController.m; sourceTree = "<group>"; }; + CAC4DF66223D58AD004302FE /* Church.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Church.h; sourceTree = "<group>"; }; + CAC4DF67223D58E4004302FE /* Church.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Church.m; sourceTree = "<group>"; }; + F479DC1DE280873375531614 /* libPods-ScriptorSprint2.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ScriptorSprint2.a"; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + CAC16167221DE89800384604 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 259401FE7BEFD80DA67529DF /* libPods-ScriptorSprint2.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CAC1617F221DE89D00384604 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CAC1618A221DE89D00384604 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 86CD4968131771A5B898FD6A /* Pods */ = { + isa = PBXGroup; + children = ( + 19CA7FF17711D5C639593277 /* Pods-ScriptorSprint2.debug.xcconfig */, + 624E2C86F7A18D6DEBCA9B8C /* Pods-ScriptorSprint2.release.xcconfig */, + ); + path = Pods; + sourceTree = "<group>"; + }; + CAC16161221DE89800384604 = { + isa = PBXGroup; + children = ( + CAC1616C221DE89900384604 /* ScriptorSprint2 */, + CAC16185221DE89D00384604 /* ScriptorSprint2Tests */, + CAC16190221DE89D00384604 /* ScriptorSprint2UITests */, + CAC1616B221DE89900384604 /* Products */, + 86CD4968131771A5B898FD6A /* Pods */, + F77BE9AFF86D0F15532FDAE1 /* Frameworks */, + ); + sourceTree = "<group>"; + }; + CAC1616B221DE89900384604 /* Products */ = { + isa = PBXGroup; + children = ( + CAC1616A221DE89900384604 /* ScriptorSprint2.app */, + CAC16182221DE89D00384604 /* ScriptorSprint2Tests.xctest */, + CAC1618D221DE89D00384604 /* ScriptorSprint2UITests.xctest */, + ); + name = Products; + sourceTree = "<group>"; + }; + CAC1616C221DE89900384604 /* ScriptorSprint2 */ = { + isa = PBXGroup; + children = ( + CAC1616D221DE89900384604 /* AppDelegate.h */, + CAC1616E221DE89900384604 /* AppDelegate.m */, + CAC16170221DE89900384604 /* ViewController.h */, + CAC16171221DE89900384604 /* ViewController.m */, + CAC4DF66223D58AD004302FE /* Church.h */, + CAC4DF67223D58E4004302FE /* Church.m */, + 712DB3BB223D736F00425AE8 /* Songs.h */, + 712DB3BC223D736F00425AE8 /* Songs.m */, + CAC16173221DE89900384604 /* Main.storyboard */, + CAC4DF63223D5346004302FE /* ChurchSelectorController.h */, + CAC4DF64223D5346004302FE /* ChurchSelectorController.m */, + CA84DCF722236A520088BE57 /* SettingsViewController.m */, + CA84DCF922236A6B0088BE57 /* SettingsViewController.h */, + CAC16176221DE89D00384604 /* Assets.xcassets */, + CAC16178221DE89D00384604 /* LaunchScreen.storyboard */, + CAC1617B221DE89D00384604 /* Info.plist */, + CAC1617C221DE89D00384604 /* main.m */, + 712DB3BE223D8CAB00425AE8 /* ChurchTableViewCell.h */, + 712DB3BF223D8CAB00425AE8 /* ChurchTableViewCell.m */, + ); + path = ScriptorSprint2; + sourceTree = "<group>"; + }; + CAC16185221DE89D00384604 /* ScriptorSprint2Tests */ = { + isa = PBXGroup; + children = ( + CAC16186221DE89D00384604 /* ScriptorSprint2Tests.m */, + CAC16188221DE89D00384604 /* Info.plist */, + ); + path = ScriptorSprint2Tests; + sourceTree = "<group>"; + }; + CAC16190221DE89D00384604 /* ScriptorSprint2UITests */ = { + isa = PBXGroup; + children = ( + CAC16191221DE89D00384604 /* ScriptorSprint2UITests.m */, + CAC16193221DE89D00384604 /* Info.plist */, + ); + path = ScriptorSprint2UITests; + sourceTree = "<group>"; + }; + F77BE9AFF86D0F15532FDAE1 /* Frameworks */ = { + isa = PBXGroup; + children = ( + F479DC1DE280873375531614 /* libPods-ScriptorSprint2.a */, + ); + name = Frameworks; + sourceTree = "<group>"; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + CAC16169221DE89800384604 /* ScriptorSprint2 */ = { + isa = PBXNativeTarget; + buildConfigurationList = CAC16196221DE89D00384604 /* Build configuration list for PBXNativeTarget "ScriptorSprint2" */; + buildPhases = ( + AB8A59E71153707DB90EB81E /* [CP] Check Pods Manifest.lock */, + CAC16166221DE89800384604 /* Sources */, + CAC16167221DE89800384604 /* Frameworks */, + CAC16168221DE89800384604 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ScriptorSprint2; + productName = ScriptorSprint2; + productReference = CAC1616A221DE89900384604 /* ScriptorSprint2.app */; + productType = "com.apple.product-type.application"; + }; + CAC16181221DE89D00384604 /* ScriptorSprint2Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = CAC16199221DE89D00384604 /* Build configuration list for PBXNativeTarget "ScriptorSprint2Tests" */; + buildPhases = ( + CAC1617E221DE89D00384604 /* Sources */, + CAC1617F221DE89D00384604 /* Frameworks */, + CAC16180221DE89D00384604 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + CAC16184221DE89D00384604 /* PBXTargetDependency */, + ); + name = ScriptorSprint2Tests; + productName = ScriptorSprint2Tests; + productReference = CAC16182221DE89D00384604 /* ScriptorSprint2Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + CAC1618C221DE89D00384604 /* ScriptorSprint2UITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = CAC1619C221DE89D00384604 /* Build configuration list for PBXNativeTarget "ScriptorSprint2UITests" */; + buildPhases = ( + CAC16189221DE89D00384604 /* Sources */, + CAC1618A221DE89D00384604 /* Frameworks */, + CAC1618B221DE89D00384604 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + CAC1618F221DE89D00384604 /* PBXTargetDependency */, + ); + name = ScriptorSprint2UITests; + productName = ScriptorSprint2UITests; + productReference = CAC1618D221DE89D00384604 /* ScriptorSprint2UITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + CAC16162221DE89800384604 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1010; + ORGANIZATIONNAME = "Adrian Garcia"; + TargetAttributes = { + CAC16169221DE89800384604 = { + CreatedOnToolsVersion = 10.1; + }; + CAC16181221DE89D00384604 = { + CreatedOnToolsVersion = 10.1; + TestTargetID = CAC16169221DE89800384604; + }; + CAC1618C221DE89D00384604 = { + CreatedOnToolsVersion = 10.1; + TestTargetID = CAC16169221DE89800384604; + }; + }; + }; + buildConfigurationList = CAC16165221DE89800384604 /* Build configuration list for PBXProject "ScriptorSprint2" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = CAC16161221DE89800384604; + productRefGroup = CAC1616B221DE89900384604 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + CAC16169221DE89800384604 /* ScriptorSprint2 */, + CAC16181221DE89D00384604 /* ScriptorSprint2Tests */, + CAC1618C221DE89D00384604 /* ScriptorSprint2UITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + CAC16168221DE89800384604 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CAC1617A221DE89D00384604 /* LaunchScreen.storyboard in Resources */, + CAC16177221DE89D00384604 /* Assets.xcassets in Resources */, + CAC16175221DE89900384604 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CAC16180221DE89D00384604 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CAC1618B221DE89D00384604 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + AB8A59E71153707DB90EB81E /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-ScriptorSprint2-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + CAC16166221DE89800384604 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 712DB3C0223D8CAB00425AE8 /* ChurchTableViewCell.m in Sources */, + CAC4DF68223D58E5004302FE /* Church.m in Sources */, + CAC4DF65223D5346004302FE /* ChurchSelectorController.m in Sources */, + CAC16172221DE89900384604 /* ViewController.m in Sources */, + 712DB3BD223D736F00425AE8 /* Songs.m in Sources */, + CA84DCF822236A520088BE57 /* SettingsViewController.m in Sources */, + CAC1617D221DE89D00384604 /* main.m in Sources */, + CAC1616F221DE89900384604 /* AppDelegate.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CAC1617E221DE89D00384604 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CAC16187221DE89D00384604 /* ScriptorSprint2Tests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CAC16189221DE89D00384604 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CAC16192221DE89D00384604 /* ScriptorSprint2UITests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + CAC16184221DE89D00384604 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = CAC16169221DE89800384604 /* ScriptorSprint2 */; + targetProxy = CAC16183221DE89D00384604 /* PBXContainerItemProxy */; + }; + CAC1618F221DE89D00384604 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = CAC16169221DE89800384604 /* ScriptorSprint2 */; + targetProxy = CAC1618E221DE89D00384604 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + CAC16173221DE89900384604 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + CAC16174221DE89900384604 /* Base */, + ); + name = Main.storyboard; + sourceTree = "<group>"; + }; + CAC16178221DE89D00384604 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + CAC16179221DE89D00384604 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = "<group>"; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + CAC16194221DE89D00384604 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + }; + name = Debug; + }; + CAC16195221DE89D00384604 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + CAC16197221DE89D00384604 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 19CA7FF17711D5C639593277 /* Pods-ScriptorSprint2.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 43DCSVR34Y; + INFOPLIST_FILE = ScriptorSprint2/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.adriangarcia.ScriptorSprint2; + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + CAC16198221DE89D00384604 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 624E2C86F7A18D6DEBCA9B8C /* Pods-ScriptorSprint2.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 43DCSVR34Y; + INFOPLIST_FILE = ScriptorSprint2/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.adriangarcia.ScriptorSprint2; + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + CAC1619A221DE89D00384604 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = ScriptorSprint2Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.adriangarcia.ScriptorSprint2Tests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ScriptorSprint2.app/ScriptorSprint2"; + }; + name = Debug; + }; + CAC1619B221DE89D00384604 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = ScriptorSprint2Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.adriangarcia.ScriptorSprint2Tests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ScriptorSprint2.app/ScriptorSprint2"; + }; + name = Release; + }; + CAC1619D221DE89D00384604 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = ScriptorSprint2UITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.adriangarcia.ScriptorSprint2UITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = ScriptorSprint2; + }; + name = Debug; + }; + CAC1619E221DE89D00384604 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = ScriptorSprint2UITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.adriangarcia.ScriptorSprint2UITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = ScriptorSprint2; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + CAC16165221DE89800384604 /* Build configuration list for PBXProject "ScriptorSprint2" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CAC16194221DE89D00384604 /* Debug */, + CAC16195221DE89D00384604 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + CAC16196221DE89D00384604 /* Build configuration list for PBXNativeTarget "ScriptorSprint2" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CAC16197221DE89D00384604 /* Debug */, + CAC16198221DE89D00384604 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + CAC16199221DE89D00384604 /* Build configuration list for PBXNativeTarget "ScriptorSprint2Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CAC1619A221DE89D00384604 /* Debug */, + CAC1619B221DE89D00384604 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + CAC1619C221DE89D00384604 /* Build configuration list for PBXNativeTarget "ScriptorSprint2UITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CAC1619D221DE89D00384604 /* Debug */, + CAC1619E221DE89D00384604 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = CAC16162221DE89800384604 /* Project object */; +} diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/code/iOS/ScriptorSprint3/ScriptorSprint2.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..9ccbd63 --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Workspace + version = "1.0"> + <FileRef + location = "group:SongsJSON.h"> + </FileRef> + <FileRef + location = "group:SongsJSON.m"> + </FileRef> + <FileRef + location = "group:../SongsArrayJSON.h"> + </FileRef> + <FileRef + location = "group:../SongsArrayJSON.m"> + </FileRef> + <FileRef + location = "group:../jsonmodel-master"> + </FileRef> + <FileRef + location = "self:"> + </FileRef> +</Workspace> diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/code/iOS/ScriptorSprint3/ScriptorSprint2.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>IDEDidComputeMac32BitWarning</key> + <true/> +</dict> +</plist> diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2.xcodeproj/project.xcworkspace/xcuserdata/adriangarcia.xcuserdatad/UserInterfaceState.xcuserstate b/code/iOS/ScriptorSprint3/ScriptorSprint2.xcodeproj/project.xcworkspace/xcuserdata/adriangarcia.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..8d3f4ae Binary files /dev/null and b/code/iOS/ScriptorSprint3/ScriptorSprint2.xcodeproj/project.xcworkspace/xcuserdata/adriangarcia.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2.xcodeproj/xcuserdata/adriangarcia.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/code/iOS/ScriptorSprint3/ScriptorSprint2.xcodeproj/xcuserdata/adriangarcia.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..b4a0be1 --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2.xcodeproj/xcuserdata/adriangarcia.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Bucket + type = "1" + version = "2.0"> + <Breakpoints> + <BreakpointProxy + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> + <BreakpointContent + shouldBeEnabled = "No" + ignoreCount = "0" + continueAfterRunningActions = "No" + filePath = "ScriptorSprint2/ViewController.m" + timestampString = "576445152.952577" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "66" + endingLineNumber = "66" + landmarkName = "ViewController" + landmarkType = "3"> + </BreakpointContent> + </BreakpointProxy> + <BreakpointProxy + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> + <BreakpointContent + shouldBeEnabled = "No" + ignoreCount = "0" + continueAfterRunningActions = "No" + filePath = "ScriptorSprint2/ViewController.m" + timestampString = "576445152.9531161" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "156" + endingLineNumber = "156" + landmarkName = "-getJSON" + landmarkType = "7"> + </BreakpointContent> + </BreakpointProxy> + <BreakpointProxy + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> + <BreakpointContent + shouldBeEnabled = "No" + ignoreCount = "0" + continueAfterRunningActions = "No" + filePath = "ScriptorSprint2/ViewController.m" + timestampString = "576445152.953712" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "158" + endingLineNumber = "158" + landmarkName = "-getJSON" + landmarkType = "7"> + </BreakpointContent> + </BreakpointProxy> + </Breakpoints> +</Bucket> diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2.xcodeproj/xcuserdata/adriangarcia.xcuserdatad/xcschemes/xcschememanagement.plist b/code/iOS/ScriptorSprint3/ScriptorSprint2.xcodeproj/xcuserdata/adriangarcia.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..da5c792 --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2.xcodeproj/xcuserdata/adriangarcia.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>SchemeUserState</key> + <dict> + <key>ScriptorSprint2.xcscheme_^#shared#^_</key> + <dict> + <key>orderHint</key> + <integer>6</integer> + </dict> + </dict> +</dict> +</plist> diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2.xcodeproj/xcuserdata/jgarcia.xcuserdatad/xcschemes/xcschememanagement.plist b/code/iOS/ScriptorSprint3/ScriptorSprint2.xcodeproj/xcuserdata/jgarcia.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..6cad61a --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2.xcodeproj/xcuserdata/jgarcia.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>SchemeUserState</key> + <dict> + <key>ScriptorSprint2.xcscheme_^#shared#^_</key> + <dict> + <key>orderHint</key> + <integer>0</integer> + </dict> + </dict> +</dict> +</plist> diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2.xcworkspace/contents.xcworkspacedata b/code/iOS/ScriptorSprint3/ScriptorSprint2.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..7f9dcd3 --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Workspace + version = "1.0"> + <FileRef + location = "group:ScriptorSprint2.xcodeproj"> + </FileRef> + <FileRef + location = "group:Pods/Pods.xcodeproj"> + </FileRef> +</Workspace> diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/code/iOS/ScriptorSprint3/ScriptorSprint2.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>IDEDidComputeMac32BitWarning</key> + <true/> +</dict> +</plist> diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2.xcworkspace/xcuserdata/adriangarcia.xcuserdatad/UserInterfaceState.xcuserstate b/code/iOS/ScriptorSprint3/ScriptorSprint2.xcworkspace/xcuserdata/adriangarcia.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..80fdaea Binary files /dev/null and b/code/iOS/ScriptorSprint3/ScriptorSprint2.xcworkspace/xcuserdata/adriangarcia.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2.xcworkspace/xcuserdata/adriangarcia.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/code/iOS/ScriptorSprint3/ScriptorSprint2.xcworkspace/xcuserdata/adriangarcia.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..7783d5d --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2.xcworkspace/xcuserdata/adriangarcia.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,199 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Bucket + type = "0" + version = "2.0"> + <Breakpoints> + <BreakpointProxy + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> + <BreakpointContent + shouldBeEnabled = "No" + ignoreCount = "0" + continueAfterRunningActions = "No" + filePath = "ScriptorSprint2/ViewController.m" + timestampString = "576445152.94907" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "57" + endingLineNumber = "57" + landmarkName = "-settingsButtonPressed:" + landmarkType = "7"> + </BreakpointContent> + </BreakpointProxy> + <BreakpointProxy + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> + <BreakpointContent + shouldBeEnabled = "No" + ignoreCount = "0" + continueAfterRunningActions = "No" + filePath = "ScriptorSprint2/SettingsViewController.m" + timestampString = "576364478.3076251" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "70" + endingLineNumber = "70" + landmarkName = "-backButtonPressed:" + landmarkType = "7"> + </BreakpointContent> + </BreakpointProxy> + <BreakpointProxy + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> + <BreakpointContent + shouldBeEnabled = "No" + ignoreCount = "0" + continueAfterRunningActions = "No" + filePath = "ScriptorSprint2/ChurchSelectorController.m" + timestampString = "576364478.310526" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "85" + endingLineNumber = "85" + landmarkName = "-tableView:cellForRowAtIndexPath:" + landmarkType = "7"> + </BreakpointContent> + </BreakpointProxy> + <BreakpointProxy + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> + <BreakpointContent + shouldBeEnabled = "No" + ignoreCount = "0" + continueAfterRunningActions = "No" + filePath = "ScriptorSprint2/SettingsViewController.m" + timestampString = "576364478.323012" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "97" + endingLineNumber = "97" + landmarkName = "-changeDate" + landmarkType = "7"> + </BreakpointContent> + </BreakpointProxy> + <BreakpointProxy + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> + <BreakpointContent + shouldBeEnabled = "No" + ignoreCount = "0" + continueAfterRunningActions = "No" + filePath = "ScriptorSprint2/ViewController.m" + timestampString = "576445152.950112" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "28" + endingLineNumber = "28" + landmarkName = "-viewDidLoad" + landmarkType = "7"> + </BreakpointContent> + </BreakpointProxy> + <BreakpointProxy + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> + <BreakpointContent + shouldBeEnabled = "No" + ignoreCount = "0" + continueAfterRunningActions = "No" + filePath = "ScriptorSprint2/ViewController.m" + timestampString = "576445152.9506969" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "56" + endingLineNumber = "56" + landmarkName = "-settingsButtonPressed:" + landmarkType = "7"> + </BreakpointContent> + </BreakpointProxy> + <BreakpointProxy + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> + <BreakpointContent + shouldBeEnabled = "No" + ignoreCount = "0" + continueAfterRunningActions = "No" + filePath = "ScriptorSprint2/SettingsViewController.m" + timestampString = "576364478.3345701" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "42" + endingLineNumber = "42" + landmarkName = "-viewDidLoad" + landmarkType = "7"> + </BreakpointContent> + </BreakpointProxy> + <BreakpointProxy + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> + <BreakpointContent + shouldBeEnabled = "No" + ignoreCount = "0" + continueAfterRunningActions = "No" + filePath = "ScriptorSprint2/SettingsViewController.m" + timestampString = "576364478.336345" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "46" + endingLineNumber = "46" + landmarkName = "-viewDidLoad" + landmarkType = "7"> + </BreakpointContent> + </BreakpointProxy> + <BreakpointProxy + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> + <BreakpointContent + shouldBeEnabled = "No" + ignoreCount = "0" + continueAfterRunningActions = "No" + filePath = "ScriptorSprint2/ViewController.m" + timestampString = "576445152.9514509" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "154" + endingLineNumber = "154" + landmarkName = "-getJSON" + landmarkType = "7"> + </BreakpointContent> + </BreakpointProxy> + <BreakpointProxy + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> + <BreakpointContent + shouldBeEnabled = "No" + ignoreCount = "0" + continueAfterRunningActions = "No" + filePath = "ScriptorSprint2/ViewController.m" + timestampString = "576445152.95204" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "161" + endingLineNumber = "161" + landmarkName = "-getJSON" + landmarkType = "7"> + </BreakpointContent> + </BreakpointProxy> + <BreakpointProxy + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> + <BreakpointContent + shouldBeEnabled = "No" + ignoreCount = "0" + continueAfterRunningActions = "No" + filePath = "ScriptorSprint2/ViewController.m" + timestampString = "576445152.954293" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "105" + endingLineNumber = "105" + landmarkName = "-getJSON" + landmarkType = "7"> + </BreakpointContent> + </BreakpointProxy> + <BreakpointProxy + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> + <BreakpointContent + shouldBeEnabled = "No" + ignoreCount = "0" + continueAfterRunningActions = "No" + filePath = "ScriptorSprint2/ViewController.m" + timestampString = "576445152.954812" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "119" + endingLineNumber = "119" + landmarkName = "-getJSON" + landmarkType = "7"> + </BreakpointContent> + </BreakpointProxy> + </Breakpoints> +</Bucket> diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2.xcworkspace/xcuserdata/jgarcia.xcuserdatad/UserInterfaceState.xcuserstate b/code/iOS/ScriptorSprint3/ScriptorSprint2.xcworkspace/xcuserdata/jgarcia.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..6a7d6c1 Binary files /dev/null and b/code/iOS/ScriptorSprint3/ScriptorSprint2.xcworkspace/xcuserdata/jgarcia.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2.xcworkspace/xcuserdata/jgarcia.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/code/iOS/ScriptorSprint3/ScriptorSprint2.xcworkspace/xcuserdata/jgarcia.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..fe588df --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2.xcworkspace/xcuserdata/jgarcia.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,118 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Bucket + type = "0" + version = "2.0"> + <Breakpoints> + <BreakpointProxy + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> + <BreakpointContent + shouldBeEnabled = "No" + ignoreCount = "0" + continueAfterRunningActions = "No" + filePath = "ScriptorSprint2/ChurchSelectorController.m" + timestampString = "574461009.692664" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "57" + endingLineNumber = "57" + landmarkName = "-getChurches" + landmarkType = "7"> + <Locations> + <Location + shouldBeEnabled = "No" + ignoreCount = "0" + continueAfterRunningActions = "No" + symbolName = "__39-[ChurchSelectorController getChurches]_block_invoke" + moduleName = "ScriptorSprint2" + usesParentBreakpointCondition = "Yes" + urlString = "file:///Users/jgarcia/Downloads/ScriptorSprint2%202/ScriptorSprint2/ChurchSelectorController.m" + timestampString = "574454913.23727" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "56" + endingLineNumber = "56" + offsetFromSymbolStart = "297"> + </Location> + <Location + shouldBeEnabled = "No" + ignoreCount = "0" + continueAfterRunningActions = "No" + symbolName = "__39-[ChurchSelectorController getChurches]_block_invoke_2" + moduleName = "ScriptorSprint2" + usesParentBreakpointCondition = "Yes" + urlString = "file:///Users/jgarcia/Downloads/ScriptorSprint2%202/ScriptorSprint2/ChurchSelectorController.m" + timestampString = "574454913.287343" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "56" + endingLineNumber = "56" + offsetFromSymbolStart = "16"> + </Location> + <Location + shouldBeEnabled = "No" + ignoreCount = "0" + continueAfterRunningActions = "No" + symbolName = "__destroy_helper_block_" + moduleName = "ScriptorSprint2" + usesParentBreakpointCondition = "Yes" + urlString = "file:///Users/jgarcia/Downloads/ScriptorSprint2%202/ScriptorSprint2/ChurchSelectorController.m" + timestampString = "574454913.308763" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "56" + endingLineNumber = "56" + offsetFromSymbolStart = "16"> + </Location> + </Locations> + </BreakpointContent> + </BreakpointProxy> + <BreakpointProxy + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> + <BreakpointContent + shouldBeEnabled = "No" + ignoreCount = "0" + continueAfterRunningActions = "No" + filePath = "ScriptorSprint2/ChurchSelectorController.m" + timestampString = "574461009.693259" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "60" + endingLineNumber = "60" + landmarkName = "-getChurches" + landmarkType = "7"> + </BreakpointContent> + </BreakpointProxy> + <BreakpointProxy + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> + <BreakpointContent + shouldBeEnabled = "No" + ignoreCount = "0" + continueAfterRunningActions = "No" + filePath = "ScriptorSprint2/ChurchSelectorController.m" + timestampString = "574461009.693719" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "58" + endingLineNumber = "58" + landmarkName = "-getChurches" + landmarkType = "7"> + </BreakpointContent> + </BreakpointProxy> + <BreakpointProxy + BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> + <BreakpointContent + shouldBeEnabled = "No" + ignoreCount = "0" + continueAfterRunningActions = "No" + filePath = "ScriptorSprint2/ChurchSelectorController.m" + timestampString = "574461009.694128" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "84" + endingLineNumber = "84" + landmarkName = "-tableView:cellForRowAtIndexPath:" + landmarkType = "7"> + </BreakpointContent> + </BreakpointProxy> + </Breakpoints> +</Bucket> diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/AppDelegate.h b/code/iOS/ScriptorSprint3/ScriptorSprint2/AppDelegate.h new file mode 100644 index 0000000..2e4aebc --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/AppDelegate.h @@ -0,0 +1,17 @@ +// +// AppDelegate.h +// ScriptorSprint2 +// +// Created by Adrian Garcia on 2/20/19. +// Copyright © 2019 Adrian Garcia. All rights reserved. +// + +#import <UIKit/UIKit.h> + +@interface AppDelegate : UIResponder <UIApplicationDelegate> + +@property (strong, nonatomic) UIWindow *window; + + +@end + diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/AppDelegate.m b/code/iOS/ScriptorSprint3/ScriptorSprint2/AppDelegate.m new file mode 100644 index 0000000..52475ec --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/AppDelegate.m @@ -0,0 +1,91 @@ +// +// AppDelegate.m +// ScriptorSprint2 +// +// Created by Adrian Garcia on 2/20/19. +// Copyright © 2019 Adrian Garcia. All rights reserved. +// + +#import "AppDelegate.h" +#import <Foundation/Foundation.h> +#import <UIKit/UIKit.h> +#import <RestKit/RestKit.h> +#import "Songs.h" +#import "Church.h" + + +@interface AppDelegate () + +@end + +@implementation AppDelegate + +- (void)configureRestKit +{ + // initialize AFNetworking HTTPClient + NSURL *baseURL = [NSURL URLWithString:@"http://34.73.45.124:8080"]; + AFRKHTTPClient *client = [[AFRKHTTPClient alloc] initWithBaseURL:baseURL]; + + // initialize RestKit + RKObjectManager *objectManager = [[RKObjectManager alloc] initWithHTTPClient:client]; + + // setup object mappings + RKObjectMapping *songsMapping = [RKObjectMapping mappingForClass:[Songs class]]; + [songsMapping addAttributeMappingsFromArray:@[@"mainText"]]; + + RKObjectMapping *songschurches = [RKObjectMapping mappingForClass:[Church class]]; + [songschurches addAttributeMappingsFromArray:@[@"name"]]; + [songschurches addAttributeMappingsFromArray:@[@"address"]]; + + // register mappings with the provider using a response descriptor + RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:songsMapping + method:RKRequestMethodGET + pathPattern:@"/getData" + keyPath:nil + statusCodes:[NSIndexSet indexSetWithIndex:200]]; + + RKResponseDescriptor *responseDescriptorChurches = [RKResponseDescriptor responseDescriptorWithMapping:songschurches + method:RKRequestMethodGET + pathPattern:@"/getchurches" + keyPath:nil + statusCodes:[NSIndexSet indexSetWithIndex:200]]; + + [objectManager addResponseDescriptor:responseDescriptor]; + [objectManager addResponseDescriptor:responseDescriptorChurches]; +} + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + // Override point for customization after application launch. + [self configureRestKit]; + return YES; +} + + +- (void)applicationWillResignActive:(UIApplication *)application { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. +} + + +- (void)applicationDidEnterBackground:(UIApplication *)application { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. +} + + +- (void)applicationWillEnterForeground:(UIApplication *)application { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. +} + + +- (void)applicationDidBecomeActive:(UIApplication *)application { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. +} + + +- (void)applicationWillTerminate:(UIApplication *)application { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. +} + + +@end diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/Assets.xcassets/AppIcon.appiconset/Contents.json b/code/iOS/ScriptorSprint3/ScriptorSprint2/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d8db8d6 --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/Assets.xcassets/Contents.json b/code/iOS/ScriptorSprint3/ScriptorSprint2/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/Base.lproj/LaunchScreen.storyboard b/code/iOS/ScriptorSprint3/ScriptorSprint2/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..13e6141 --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM"> + <device id="retina4_7" orientation="portrait"> + <adaptation id="fullscreen"/> + </device> + <dependencies> + <deployment identifier="iOS"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/> + <capability name="Safe area layout guides" minToolsVersion="9.0"/> + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> + </dependencies> + <scenes> + <!--View Controller--> + <scene sceneID="EHf-IW-A2E"> + <objects> + <viewController id="01J-lp-oVM" sceneMemberID="viewController"> + <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3"> + <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + <color key="backgroundColor" red="1" green="0.83234566450000003" blue="0.47320586440000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> + <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/> + </view> + </viewController> + <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/> + </objects> + <point key="canvasLocation" x="53" y="375"/> + </scene> + </scenes> +</document> diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/Base.lproj/Main.storyboard b/code/iOS/ScriptorSprint3/ScriptorSprint2/Base.lproj/Main.storyboard new file mode 100644 index 0000000..b5f31c3 --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/Base.lproj/Main.storyboard @@ -0,0 +1,254 @@ +<?xml version="1.0" encoding="UTF-8"?> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="BYZ-38-t0r"> + <device id="retina6_5" orientation="portrait"> + <adaptation id="fullscreen"/> + </device> + <dependencies> + <deployment identifier="iOS"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/> + <capability name="Safe area layout guides" minToolsVersion="9.0"/> + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> + </dependencies> + <scenes> + <!--View Controller--> + <scene sceneID="tne-QT-ifu"> + <objects> + <viewController id="BYZ-38-t0r" customClass="ViewController" sceneMemberID="viewController"> + <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC"> + <rect key="frame" x="0.0" y="0.0" width="414" height="896"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + <subviews> + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Scriptor" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Tff-X5-y5l"> + <rect key="frame" x="138" y="44" width="138" height="48"/> + <fontDescription key="fontDescription" type="italicSystem" pointSize="40"/> + <nil key="textColor"/> + <nil key="highlightedColor"/> + </label> + <button hidden="YES" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="G7z-A8-tv2"> + <rect key="frame" x="131" y="832" width="152" height="30"/> + <state key="normal" title="Check For New Songs"/> + <connections> + <action selector="secondaryButtonPressed:" destination="BYZ-38-t0r" eventType="touchDown" id="L8J-r5-pfo"/> + </connections> + </button> + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="y6j-13-k1f"> + <rect key="frame" x="128.66666666666666" y="433" width="156.99999999999997" height="30"/> + <state key="normal" title="Download Day's Songs"/> + <connections> + <action selector="mainButtonPressed:" destination="BYZ-38-t0r" eventType="touchDown" id="w1f-dm-Mul"/> + </connections> + </button> + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="FxO-zk-pi1"> + <rect key="frame" x="343" y="53" width="57" height="30"/> + <state key="normal" title="Settings"/> + <connections> + <action selector="settingsButtonPressed:" destination="BYZ-38-t0r" eventType="touchDown" id="M4j-UA-PKI"/> + </connections> + </button> + <textView hidden="YES" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" fixedFrame="YES" editable="NO" textAlignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="3Sx-cq-xld"> + <rect key="frame" x="20" y="100" width="374" height="724"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> + <fontDescription key="fontDescription" type="system" pointSize="14"/> + <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/> + </textView> + </subviews> + <color key="backgroundColor" red="1" green="0.83234566450000003" blue="0.47320586440000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> + <constraints> + <constraint firstItem="y6j-13-k1f" firstAttribute="centerX" secondItem="8bC-Xf-vdC" secondAttribute="centerX" id="1Q5-kG-KzV"/> + <constraint firstItem="6Tk-OE-BBY" firstAttribute="trailing" secondItem="FxO-zk-pi1" secondAttribute="trailing" constant="14" id="ALh-aT-D03"/> + <constraint firstItem="Tff-X5-y5l" firstAttribute="top" secondItem="6Tk-OE-BBY" secondAttribute="top" id="FS7-8Z-9iC"/> + <constraint firstItem="6Tk-OE-BBY" firstAttribute="trailing" secondItem="Tff-X5-y5l" secondAttribute="trailing" constant="138" id="HiI-OF-U9h"/> + <constraint firstItem="6Tk-OE-BBY" firstAttribute="trailing" secondItem="G7z-A8-tv2" secondAttribute="trailing" constant="131" id="Jdy-7a-Om8"/> + <constraint firstItem="G7z-A8-tv2" firstAttribute="bottom" secondItem="6Tk-OE-BBY" secondAttribute="bottom" id="Ydp-5W-JxO"/> + <constraint firstItem="G7z-A8-tv2" firstAttribute="leading" secondItem="6Tk-OE-BBY" secondAttribute="leading" constant="131" id="ZY6-dL-oBV"/> + <constraint firstItem="y6j-13-k1f" firstAttribute="centerY" secondItem="8bC-Xf-vdC" secondAttribute="centerY" id="dPK-wh-eui"/> + <constraint firstItem="FxO-zk-pi1" firstAttribute="top" secondItem="6Tk-OE-BBY" secondAttribute="top" constant="9" id="m6A-Xq-byq"/> + <constraint firstItem="Tff-X5-y5l" firstAttribute="leading" secondItem="6Tk-OE-BBY" secondAttribute="leading" constant="138" id="oBS-mW-dtW"/> + <constraint firstItem="FxO-zk-pi1" firstAttribute="leading" secondItem="Tff-X5-y5l" secondAttribute="trailing" constant="67" id="sw2-5C-vK1"/> + </constraints> + <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/> + </view> + <connections> + <outlet property="displayText" destination="3Sx-cq-xld" id="ggJ-wh-DIE"/> + <outlet property="mainButton" destination="y6j-13-k1f" id="XqF-D3-z3w"/> + <outlet property="mainView" destination="8bC-Xf-vdC" id="LyS-oE-ngS"/> + <outlet property="secondaryButton" destination="G7z-A8-tv2" id="tm7-OH-2wp"/> + <outlet property="settingsButton" destination="FxO-zk-pi1" id="CaD-kX-pXl"/> + <segue destination="QLA-Sl-ISX" kind="show" identifier="toSettings" id="qnY-Pb-SU4"/> + </connections> + </viewController> + <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/> + </objects> + <point key="canvasLocation" x="137.68115942028987" y="133.92857142857142"/> + </scene> + <!--Settings View Controller--> + <scene sceneID="Rn2-ov-v6R"> + <objects> + <viewController id="QLA-Sl-ISX" customClass="SettingsViewController" sceneMemberID="viewController"> + <view key="view" contentMode="scaleToFill" id="e7W-o5-Jib"> + <rect key="frame" x="0.0" y="0.0" width="414" height="896"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + <subviews> + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="YAT-nq-h9g"> + <rect key="frame" x="26" y="44" width="34" height="30"/> + <state key="normal" title="Back"/> + <connections> + <action selector="backButtonPressed:" destination="QLA-Sl-ISX" eventType="touchDown" id="dzb-Rq-4dy"/> + </connections> + </button> + <stepper opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="17" minimumValue="10" maximumValue="60" stepValue="2" translatesAutoresizingMaskIntoConstraints="NO" id="T33-zc-Hj5"> + <rect key="frame" x="300" y="157" width="94" height="29"/> + <connections> + <action selector="changeSize:" destination="QLA-Sl-ISX" eventType="touchDown" id="e8h-jW-yL5"/> + </connections> + </stepper> + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Settings" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="BwW-8U-AEM"> + <rect key="frame" x="152" y="44" width="110" height="41"/> + <fontDescription key="fontDescription" type="system" weight="ultraLight" pointSize="34"/> + <nil key="textColor"/> + <nil key="highlightedColor"/> + </label> + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Font Size" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="eeX-d7-bhr"> + <rect key="frame" x="42" y="161" width="71" height="21"/> + <fontDescription key="fontDescription" type="system" pointSize="17"/> + <nil key="textColor"/> + <nil key="highlightedColor"/> + </label> + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Aa" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="b4V-uk-1gn"> + <rect key="frame" x="150.33333333333334" y="197.33333333333334" width="113.33333333333334" height="119.33333333333334"/> + <fontDescription key="fontDescription" type="system" pointSize="100"/> + <nil key="textColor"/> + <nil key="highlightedColor"/> + </label> + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Current Church:" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="xhb-3S-hq9"> + <rect key="frame" x="117.33333333333333" y="471.33333333333331" width="179.33333333333337" height="31.333333333333314"/> + <fontDescription key="fontDescription" type="system" pointSize="26"/> + <nil key="textColor"/> + <nil key="highlightedColor"/> + </label> + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="N/A" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="GT0-M7-1Gx"> + <rect key="frame" x="184.66666666666666" y="511.33333333333326" width="45" height="33"/> + <fontDescription key="fontDescription" type="system" pointSize="27"/> + <nil key="textColor"/> + <nil key="highlightedColor"/> + </label> + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="F6z-4h-epZ"> + <rect key="frame" x="141" y="432.66666666666669" width="132" height="30.666666666666686"/> + <state key="normal" title="Select Your Church"/> + <connections> + <action selector="selectChurchPressed:" destination="QLA-Sl-ISX" eventType="touchDown" id="coa-hh-CXe"/> + <segue destination="lGI-qO-KKT" kind="show" id="25s-es-Q1f"/> + </connections> + </button> + <datePicker contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" datePickerMode="date" minuteInterval="1" translatesAutoresizingMaskIntoConstraints="NO" id="ybL-sG-6A9"> + <rect key="frame" x="0.0" y="617" width="414" height="216"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/> + <date key="date" timeIntervalSinceReferenceDate="576189304.56047797"> + <!--2019-04-05 20:35:04 +0000--> + </date> + <connections> + <action selector="dateChanged:" destination="QLA-Sl-ISX" eventType="editingDidEnd" id="KeV-gc-DeR"/> + <action selector="editingChanged:" destination="QLA-Sl-ISX" eventType="editingChanged" id="4vw-Uj-NQm"/> + <action selector="touchInside:" destination="QLA-Sl-ISX" eventType="touchUpInside" id="ARq-dV-rLv"/> + <action selector="touchOutside:" destination="QLA-Sl-ISX" eventType="touchUpOutside" id="mvA-vZ-kSL"/> + </connections> + </datePicker> + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Search For Date" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="s1m-gK-Tg9"> + <rect key="frame" x="145" y="588" width="124" height="21"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> + <fontDescription key="fontDescription" type="system" pointSize="17"/> + <nil key="textColor"/> + <nil key="highlightedColor"/> + </label> + </subviews> + <color key="backgroundColor" red="1" green="0.83234566450000003" blue="0.47320586440000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> + <constraints> + <constraint firstItem="eeX-d7-bhr" firstAttribute="top" secondItem="YAT-nq-h9g" secondAttribute="bottom" constant="87" id="4nz-lv-9iX"/> + <constraint firstItem="F6z-4h-epZ" firstAttribute="top" secondItem="b4V-uk-1gn" secondAttribute="bottom" constant="116" id="6MH-8V-GgD"/> + <constraint firstItem="YAT-nq-h9g" firstAttribute="top" secondItem="hA2-2b-PUm" secondAttribute="top" id="9En-Rr-0Xr"/> + <constraint firstItem="T33-zc-Hj5" firstAttribute="leading" secondItem="eeX-d7-bhr" secondAttribute="trailing" constant="187" id="A5C-42-MPe"/> + <constraint firstItem="hA2-2b-PUm" firstAttribute="trailing" secondItem="T33-zc-Hj5" secondAttribute="trailing" constant="20" id="F9Z-Tl-l2c"/> + <constraint firstItem="GT0-M7-1Gx" firstAttribute="top" secondItem="xhb-3S-hq9" secondAttribute="bottom" constant="8.6699999999999999" id="FJp-gN-i9v"/> + <constraint firstItem="T33-zc-Hj5" firstAttribute="top" secondItem="hA2-2b-PUm" secondAttribute="top" constant="113" id="Rqn-iQ-PKw"/> + <constraint firstItem="F6z-4h-epZ" firstAttribute="centerX" secondItem="e7W-o5-Jib" secondAttribute="centerX" id="TIe-CS-q5u"/> + <constraint firstItem="GT0-M7-1Gx" firstAttribute="top" secondItem="xhb-3S-hq9" secondAttribute="bottom" constant="8.6699999999999999" id="TYR-vi-ygf"/> + <constraint firstItem="BwW-8U-AEM" firstAttribute="top" secondItem="hA2-2b-PUm" secondAttribute="top" id="ZyD-q7-kQm"/> + <constraint firstItem="xhb-3S-hq9" firstAttribute="centerX" secondItem="e7W-o5-Jib" secondAttribute="centerX" id="aio-1X-2MU"/> + <constraint firstItem="GT0-M7-1Gx" firstAttribute="centerX" secondItem="e7W-o5-Jib" secondAttribute="centerX" id="d6v-Zo-WGT"/> + <constraint firstItem="YAT-nq-h9g" firstAttribute="leading" secondItem="hA2-2b-PUm" secondAttribute="leading" constant="26" id="fs6-W3-gnR"/> + <constraint firstItem="hA2-2b-PUm" firstAttribute="bottom" secondItem="GT0-M7-1Gx" secondAttribute="bottom" constant="317.67000000000002" id="g0h-pq-xO2"/> + <constraint firstItem="xhb-3S-hq9" firstAttribute="top" secondItem="F6z-4h-epZ" secondAttribute="bottom" constant="8" id="hbe-Y4-CYj"/> + <constraint firstItem="F6z-4h-epZ" firstAttribute="centerY" secondItem="e7W-o5-Jib" secondAttribute="centerY" id="k9X-KI-gUj"/> + <constraint firstItem="BwW-8U-AEM" firstAttribute="centerX" secondItem="e7W-o5-Jib" secondAttribute="centerX" id="qtf-xl-WoE"/> + <constraint firstItem="b4V-uk-1gn" firstAttribute="centerX" secondItem="BwW-8U-AEM" secondAttribute="centerX" id="rRQ-xS-n4K"/> + <constraint firstItem="eeX-d7-bhr" firstAttribute="leading" secondItem="hA2-2b-PUm" secondAttribute="leading" constant="42" id="srO-9M-UeT"/> + </constraints> + <viewLayoutGuide key="safeArea" id="hA2-2b-PUm"/> + </view> + <connections> + <outlet property="backButton" destination="YAT-nq-h9g" id="dSZ-G2-Jry"/> + <outlet property="churchNameLabel" destination="GT0-M7-1Gx" id="KBG-Cc-mnm"/> + <outlet property="dateSelector" destination="ybL-sG-6A9" id="5bI-YW-Uye"/> + <outlet property="exampleLabel" destination="b4V-uk-1gn" id="moX-CD-y4R"/> + <outlet property="fontStepper" destination="T33-zc-Hj5" id="G9C-hJ-ZNM"/> + <outlet property="selectChurch" destination="F6z-4h-epZ" id="gIb-rJ-OUi"/> + </connections> + </viewController> + <placeholder placeholderIdentifier="IBFirstResponder" id="yai-Ti-Z2g" userLabel="First Responder" sceneMemberID="firstResponder"/> + </objects> + <point key="canvasLocation" x="1205.7971014492755" y="136.60714285714286"/> + </scene> + <!--Church Selector Controller--> + <scene sceneID="sly-ya-RED"> + <objects> + <tableViewController id="lGI-qO-KKT" customClass="ChurchSelectorController" sceneMemberID="viewController"> + <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" id="Bd6-C0-8wT"> + <rect key="frame" x="0.0" y="0.0" width="414" height="896"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> + <prototypes> + <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="tableChurchCell" textLabel="npU-8e-gaZ" detailTextLabel="bnD-MO-5p3" rowHeight="100" style="IBUITableViewCellStyleSubtitle" id="iDJ-gz-BXc" customClass="ChurchTableViewCell"> + <rect key="frame" x="0.0" y="28" width="414" height="100"/> + <autoresizingMask key="autoresizingMask"/> + <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="iDJ-gz-BXc" id="MmR-2a-xmm"> + <rect key="frame" x="0.0" y="0.0" width="414" height="99.666666666666671"/> + <autoresizingMask key="autoresizingMask"/> + <subviews> + <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Title" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="npU-8e-gaZ"> + <rect key="frame" x="20.000000000000004" y="30" width="33.333333333333336" height="20.333333333333332"/> + <autoresizingMask key="autoresizingMask"/> + <fontDescription key="fontDescription" type="system" pointSize="17"/> + <nil key="textColor"/> + <nil key="highlightedColor"/> + </label> + <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Subtitle" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="bnD-MO-5p3"> + <rect key="frame" x="19.999999999999996" y="53.333333333333329" width="43.666666666666664" height="14.333333333333334"/> + <autoresizingMask key="autoresizingMask"/> + <fontDescription key="fontDescription" type="system" pointSize="12"/> + <nil key="textColor"/> + <nil key="highlightedColor"/> + </label> + </subviews> + </tableViewCellContentView> + <connections> + <outlet property="address" destination="bnD-MO-5p3" id="ppT-G0-nup"/> + <outlet property="name" destination="npU-8e-gaZ" id="SZx-mU-yp2"/> + </connections> + </tableViewCell> + </prototypes> + <connections> + <outlet property="dataSource" destination="lGI-qO-KKT" id="bge-i8-VVT"/> + <outlet property="delegate" destination="lGI-qO-KKT" id="UYe-nx-fRq"/> + </connections> + </tableView> + <connections> + <outlet property="churchTable" destination="Bd6-C0-8wT" id="1jR-N3-k3F"/> + <outlet property="tableView" destination="Bd6-C0-8wT" id="MPt-gu-2BN"/> + </connections> + </tableViewController> + <placeholder placeholderIdentifier="IBFirstResponder" id="M9U-9j-wjK" userLabel="First Responder" sceneMemberID="firstResponder"/> + </objects> + <point key="canvasLocation" x="2397.1014492753625" y="134.59821428571428"/> + </scene> + </scenes> +</document> diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/Church.h b/code/iOS/ScriptorSprint3/ScriptorSprint2/Church.h new file mode 100644 index 0000000..3043740 --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/Church.h @@ -0,0 +1,18 @@ +// +// Church.h +// ScriptorSprint2 +// +// Created by Adrian Garcia on 3/16/19. +// Copyright © 2019 Adrian Garcia. All rights reserved. +// + +#import <Foundation/Foundation.h> + +NS_ASSUME_NONNULL_BEGIN + +@interface Church : NSObject +@property (nonatomic, strong) NSString *name; +@property (nonatomic, strong) NSString *address; +@end + +NS_ASSUME_NONNULL_END diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/Church.m b/code/iOS/ScriptorSprint3/ScriptorSprint2/Church.m new file mode 100644 index 0000000..d90c654 --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/Church.m @@ -0,0 +1,14 @@ +// +// Church.m +// ScriptorSprint2 +// +// Created by Adrian Garcia on 3/16/19. +// Copyright © 2019 Adrian Garcia. All rights reserved. +// + +#import "Church.h" + +@implementation Church + + +@end diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/ChurchSelectorController.h b/code/iOS/ScriptorSprint3/ScriptorSprint2/ChurchSelectorController.h new file mode 100644 index 0000000..2b0dc1e --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/ChurchSelectorController.h @@ -0,0 +1,16 @@ +// +// ChurchSelectorController.h +// ScriptorSprint2 +// +// Created by Adrian Garcia on 3/16/19. +// Copyright © 2019 Adrian Garcia. All rights reserved. +// + +#import <UIKit/UIKit.h> + +NS_ASSUME_NONNULL_BEGIN + +@interface ChurchSelectorController : UITableViewController +@end + +NS_ASSUME_NONNULL_END diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/ChurchSelectorController.m b/code/iOS/ScriptorSprint3/ScriptorSprint2/ChurchSelectorController.m new file mode 100644 index 0000000..21ebacd --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/ChurchSelectorController.m @@ -0,0 +1,167 @@ +// +// ChurchSelectorController.m +// ScriptorSprint2 +// +// Created by Adrian Garcia on 3/16/19. +// Copyright © 2019 Adrian Garcia. All rights reserved. +// + +#import "ChurchSelectorController.h" +#import "Church.h" +#import "ChurchTableViewCell.h" +#import <RestKit/RestKit.h> +#import "SettingsViewController.h" + +@interface ChurchSelectorController () +@property (strong, nonatomic) IBOutlet UITableView *churchTable; +@property (strong, nonatomic) NSArray* churches; + + +@end + +@implementation ChurchSelectorController + +NSInteger numOfChurches; + +- (void)viewDidLoad { + [super viewDidLoad]; + [self getChurches]; + //get the church data + + // Uncomment the following line to preserve selection between presentations. + // self.clearsSelectionOnViewWillAppear = NO; + + // Uncomment the following line to display an Edit button in the navigation bar for this view controller. + // self.navigationItem.rightBarButtonItem = self.editButtonItem; +} + +#pragma mark - Table view data source + +- (void) getChurches { + NSString *theURL = @"http://34.73.45.124:8080/getchurches"; + NSURL *connectionURL = [NSURL URLWithString:theURL]; + NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:connectionURL]; + [req setHTTPMethod:@"GET"]; + NSURLSession *session = [NSURLSession sharedSession]; + NSURLSessionDataTask *task = [session dataTaskWithRequest:req + completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { + if (error != nil){ + NSLog(@"%@", error.localizedDescription); + return; + } + NSData *localData = data; + NSString *localDataString = [[NSString alloc] initWithData:localData encoding:NSUTF8StringEncoding]; + + + NSLog(@"%@", localDataString); + + [[RKObjectManager sharedManager] getObjectsAtPath:@"/getchurches" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { + numOfChurches = mappingResult.array.count; + self.churches = (Church *) mappingResult.array; + [self.churchTable reloadData]; + } + failure:^(RKObjectRequestOperation *operation, + NSError *error) { + NSLog(@"What do you mean by 'there is no coffee?': %@", error); + }]; + + //ends the connection + }]; + [task resume]; + return; + +} + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + return 1; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return numOfChurches; +} + + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"tableChurchCell" forIndexPath:indexPath]; + + // cell = [tableView dequeueReusableCellWithIdentifier:@"tableWebdbCell" forIndexPath:indexPath]; + + if (cell == nil) { + cell = [[ChurchTableViewCell alloc] + initWithStyle:UITableViewCellStyleDefault + reuseIdentifier:@"tableChurchCell"]; + } + + ChurchTableViewCell *churchCell =(ChurchTableViewCell *) cell; + Church *data = self.churches[indexPath.row]; + + churchCell.name.text = data.name; + churchCell.address.text = data.address; + + + // Configure the cell... + + return cell; +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ + + Church *data = self.churches[indexPath.row]; + + + NSLog(@"Check Selected: %@",data.name ); + NSLog(@"Address of selection %@", data.address); + NSUserDefaults *settings = [NSUserDefaults standardUserDefaults]; + [settings setObject:data.name forKey:@"church"]; + [settings setObject:data.address forKey:@"churchAddress"]; + + [self dismissViewControllerAnimated:YES completion:nil]; + + +} + +/* +// Override to support conditional editing of the table view. +- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { + // Return NO if you do not want the specified item to be editable. + return YES; +} +*/ + +/* +// Override to support editing the table view. +- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { + if (editingStyle == UITableViewCellEditingStyleDelete) { + // Delete the row from the data source + [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; + } else if (editingStyle == UITableViewCellEditingStyleInsert) { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view + } +} +*/ + +/* +// Override to support rearranging the table view. +- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { +} +*/ + +/* +// Override to support conditional rearranging of the table view. +- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { + // Return NO if you do not want the item to be re-orderable. + return YES; +} +*/ + +/* +#pragma mark - Navigation + +// In a storyboard-based application, you will often want to do a little preparation before navigation +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { + // Get the new view controller using [segue destinationViewController]. + // Pass the selected object to the new view controller. +} +*/ + +@end diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/ChurchTableViewCell.h b/code/iOS/ScriptorSprint3/ScriptorSprint2/ChurchTableViewCell.h new file mode 100644 index 0000000..3c62e11 --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/ChurchTableViewCell.h @@ -0,0 +1,19 @@ +// +// ChurchTableViewCell.h +// ScriptorSprint2 +// +// Created by Jower Garcia on 3/16/19. +// Copyright © 2019 Adrian Garcia. All rights reserved. +// + +#import <UIKit/UIKit.h> + +NS_ASSUME_NONNULL_BEGIN + +@interface ChurchTableViewCell : UITableViewCell +@property (weak, nonatomic) IBOutlet UILabel *name; +@property (weak, nonatomic) IBOutlet UILabel *address; + +@end + +NS_ASSUME_NONNULL_END diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/ChurchTableViewCell.m b/code/iOS/ScriptorSprint3/ScriptorSprint2/ChurchTableViewCell.m new file mode 100644 index 0000000..5b17165 --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/ChurchTableViewCell.m @@ -0,0 +1,24 @@ +// +// ChurchTableViewCell.m +// ScriptorSprint2 +// +// Created by Jower Garcia on 3/16/19. +// Copyright © 2019 Adrian Garcia. All rights reserved. +// + +#import "ChurchTableViewCell.h" + +@implementation ChurchTableViewCell + +- (void)awakeFromNib { + [super awakeFromNib]; + // Initialization code +} + +- (void)setSelected:(BOOL)selected animated:(BOOL)animated { + [super setSelected:selected animated:animated]; + + // Configure the view for the selected state +} + +@end diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/Info.plist b/code/iOS/ScriptorSprint3/ScriptorSprint2/Info.plist new file mode 100644 index 0000000..70263b3 --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/Info.plist @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>NSAppTransportSecurity</key> + <dict> + <key>NSExceptionMinimumTLSVersion</key> + <string>TLSv1.0</string> + <key>NSAllowsArbitraryLoads</key> + <true/> + </dict> + <key>CFBundleDevelopmentRegion</key> + <string>$(DEVELOPMENT_LANGUAGE)</string> + <key>CFBundleExecutable</key> + <string>$(EXECUTABLE_NAME)</string> + <key>CFBundleIdentifier</key> + <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>$(PRODUCT_NAME)</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleVersion</key> + <string>1</string> + <key>LSRequiresIPhoneOS</key> + <true/> + <key>UILaunchStoryboardName</key> + <string>LaunchScreen</string> + <key>UIMainStoryboardFile</key> + <string>Main</string> + <key>UIRequiredDeviceCapabilities</key> + <array> + <string>armv7</string> + </array> + <key>UISupportedInterfaceOrientations</key> + <array> + <string>UIInterfaceOrientationPortrait</string> + <string>UIInterfaceOrientationLandscapeLeft</string> + <string>UIInterfaceOrientationLandscapeRight</string> + </array> + <key>UISupportedInterfaceOrientations~ipad</key> + <array> + <string>UIInterfaceOrientationPortrait</string> + <string>UIInterfaceOrientationPortraitUpsideDown</string> + <string>UIInterfaceOrientationLandscapeLeft</string> + <string>UIInterfaceOrientationLandscapeRight</string> + </array> +</dict> +</plist> diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModel.h b/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModel.h new file mode 100755 index 0000000..c4ca47c --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModel.h @@ -0,0 +1,284 @@ +// +// JSONModel.h +// JSONModel +// + +#import <Foundation/Foundation.h> + +#import "JSONModelError.h" +#import "JSONValueTransformer.h" +#import "JSONKeyMapper.h" + +///////////////////////////////////////////////////////////////////////////////////////////// +#if TARGET_IPHONE_SIMULATOR +#define JMLog( s, ... ) NSLog( @"[%@:%d] %@", [[NSString stringWithUTF8String:__FILE__] \ +lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] ) +#else +#define JMLog( s, ... ) +#endif +///////////////////////////////////////////////////////////////////////////////////////////// + +DEPRECATED_ATTRIBUTE +@protocol ConvertOnDemand +@end + +DEPRECATED_ATTRIBUTE +@protocol Index +@end + +#pragma mark - Property Protocols +/** + * Protocol for defining properties in a JSON Model class that should not be considered at all + * neither while importing nor when exporting JSON. + * + * @property (strong, nonatomic) NSString <Ignore> *propertyName; + * + */ +@protocol Ignore +@end + +/** + * Protocol for defining optional properties in a JSON Model class. Use like below to define + * model properties that are not required to have values in the JSON input: + * + * @property (strong, nonatomic) NSString <Optional> *propertyName; + * + */ +@protocol Optional +@end + +/** + * Make all objects compatible to avoid compiler warnings + */ +@interface NSObject (JSONModelPropertyCompatibility) <Optional, Ignore> +@end + +///////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - JSONModel protocol +/** + * A protocol describing an abstract JSONModel class + * JSONModel conforms to this protocol, so it can use itself abstractly + */ +@protocol AbstractJSONModelProtocol <NSCopying, NSCoding> + +@required +/** + * All JSONModel classes should implement initWithDictionary: + * + * For most classes the default initWithDictionary: inherited from JSONModel itself + * should suffice, but developers have the option to also overwrite it if needed. + * + * @param dict a dictionary holding JSON objects, to be imported in the model. + * @param err an error or NULL + */ +- (instancetype)initWithDictionary:(NSDictionary *)dict error:(NSError **)err; + + +/** + * All JSONModel classes should implement initWithData:error: + * + * For most classes the default initWithData: inherited from JSONModel itself + * should suffice, but developers have the option to also overwrite it if needed. + * + * @param data representing a JSON response (usually fetched from web), to be imported in the model. + * @param error an error or NULL + */ +- (instancetype)initWithData:(NSData *)data error:(NSError **)error; + +/** + * All JSONModel classes should be able to export themselves as a dictionary of + * JSON compliant objects. + * + * For most classes the inherited from JSONModel default toDictionary implementation + * should suffice. + * + * @return NSDictionary dictionary of JSON compliant objects + * @exception JSONModelTypeNotAllowedException thrown when one of your model's custom class properties + * does not have matching transformer method in an JSONValueTransformer. + */ +- (NSDictionary *)toDictionary; + +/** + * Export a model class to a dictionary, including only given properties + * + * @param propertyNames the properties to export; if nil, all properties exported + * @return NSDictionary dictionary of JSON compliant objects + * @exception JSONModelTypeNotAllowedException thrown when one of your model's custom class properties + * does not have matching transformer method in an JSONValueTransformer. + */ +- (NSDictionary *)toDictionaryWithKeys:(NSArray <NSString *> *)propertyNames; +@end + +///////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - JSONModel interface +/** + * The JSONModel is an abstract model class, you should not instantiate it directly, + * as it does not have any properties, and therefore cannot serve as a data model. + * Instead you should subclass it, and define the properties you want your data model + * to have as properties of your own class. + */ +@interface JSONModel : NSObject <AbstractJSONModelProtocol, NSSecureCoding> + +// deprecated ++ (NSMutableArray *)arrayOfModelsFromDictionaries:(NSArray *)array DEPRECATED_MSG_ATTRIBUTE("use arrayOfModelsFromDictionaries:error:"); ++ (void)setGlobalKeyMapper:(JSONKeyMapper *)globalKeyMapper DEPRECATED_MSG_ATTRIBUTE("override +keyMapper in a base model class instead"); ++ (NSString *)protocolForArrayProperty:(NSString *)propertyName DEPRECATED_MSG_ATTRIBUTE("use classForCollectionProperty:"); +- (void)mergeFromDictionary:(NSDictionary *)dict useKeyMapping:(BOOL)useKeyMapping DEPRECATED_MSG_ATTRIBUTE("use mergeFromDictionary:useKeyMapping:error:"); +- (NSString *)indexPropertyName DEPRECATED_ATTRIBUTE; +- (NSComparisonResult)compare:(id)object DEPRECATED_ATTRIBUTE; + +/** @name Creating and initializing models */ + +/** + * Create a new model instance and initialize it with the JSON from a text parameter. The method assumes UTF8 encoded input text. + * @param string JSON text data + * @param err an initialization error or nil + * @exception JSONModelTypeNotAllowedException thrown when unsupported type is found in the incoming JSON, + * or a property type in your model is not supported by JSONValueTransformer and its categories + * @see initWithString:usingEncoding:error: for use of custom text encodings + */ +- (instancetype)initWithString:(NSString *)string error:(JSONModelError **)err; + +/** + * Create a new model instance and initialize it with the JSON from a text parameter using the given encoding. + * @param string JSON text data + * @param encoding the text encoding to use when parsing the string (see NSStringEncoding) + * @param err an initialization error or nil + * @exception JSONModelTypeNotAllowedException thrown when unsupported type is found in the incoming JSON, + * or a property type in your model is not supported by JSONValueTransformer and its categories + */ +- (instancetype)initWithString:(NSString *)string usingEncoding:(NSStringEncoding)encoding error:(JSONModelError **)err; + +/** @name Exporting model contents */ + +/** + * Export the whole object to a JSON data text string + * @return JSON text describing the data model + */ +- (NSString *)toJSONString; + +/** + * Export the whole object to a JSON data text string + * @return JSON text data describing the data model + */ +- (NSData *)toJSONData; + +/** + * Export the specified properties of the object to a JSON data text string + * @param propertyNames the properties to export; if nil, all properties exported + * @return JSON text describing the data model + */ +- (NSString *)toJSONStringWithKeys:(NSArray <NSString *> *)propertyNames; + +/** + * Export the specified properties of the object to a JSON data text string + * @param propertyNames the properties to export; if nil, all properties exported + * @return JSON text data describing the data model + */ +- (NSData *)toJSONDataWithKeys:(NSArray <NSString *> *)propertyNames; + +/** @name Batch methods */ + +/** + * If you have a list of dictionaries in a JSON feed, you can use this method to create an NSArray + * of model objects. Handy when importing JSON data lists. + * This method will loop over the input list and initialize a data model for every dictionary in the list. + * + * @param array list of dictionaries to be imported as models + * @return list of initialized data model objects + * @exception JSONModelTypeNotAllowedException thrown when unsupported type is found in the incoming JSON, + * or a property type in your model is not supported by JSONValueTransformer and its categories + * @exception JSONModelInvalidDataException thrown when the input data does not include all required keys + * @see arrayOfDictionariesFromModels: + */ ++ (NSMutableArray *)arrayOfModelsFromDictionaries:(NSArray *)array error:(NSError **)err; ++ (NSMutableArray *)arrayOfModelsFromData:(NSData *)data error:(NSError **)err; ++ (NSMutableArray *)arrayOfModelsFromString:(NSString *)string error:(NSError **)err; ++ (NSMutableDictionary *)dictionaryOfModelsFromDictionary:(NSDictionary *)dictionary error:(NSError **)err; ++ (NSMutableDictionary *)dictionaryOfModelsFromData:(NSData *)data error:(NSError **)err; ++ (NSMutableDictionary *)dictionaryOfModelsFromString:(NSString *)string error:(NSError **)err; + +/** + * If you have an NSArray of data model objects, this method takes it in and outputs a list of the + * matching dictionaries. This method does the opposite of arrayOfObjectsFromDictionaries: + * @param array list of JSONModel objects + * @return a list of NSDictionary objects + * @exception JSONModelTypeNotAllowedException thrown when unsupported type is found in the incoming JSON, + * or a property type in your model is not supported by JSONValueTransformer and its categories + * @see arrayOfModelsFromDictionaries: + */ ++ (NSMutableArray *)arrayOfDictionariesFromModels:(NSArray *)array; ++ (NSMutableDictionary *)dictionaryOfDictionariesFromModels:(NSDictionary *)dictionary; + +/** @name Validation */ + +/** + * Overwrite the validate method in your own models if you need to perform some custom validation over the model data. + * This method gets called at the very end of the JSONModel initializer, thus the model is in the state that you would + * get it back when initialized. Check the values of any property that needs to be validated and if any invalid values + * are encountered return NO and set the error parameter to an NSError object. If the model is valid return YES. + * + * NB: Only setting the error parameter is not enough to fail the validation, you also need to return a NO value. + * + * @param error a pointer to an NSError object, to pass back an error if needed + * @return a BOOL result, showing whether the model data validates or not. You can use the convenience method + * [JSONModelError errorModelIsInvalid] to set the NSError param if the data fails your custom validation + */ +- (BOOL)validate:(NSError **)error; + +/** @name Key mapping */ +/** + * Overwrite in your models if your property names don't match your JSON key names. + * Lookup JSONKeyMapper docs for more details. + */ ++ (JSONKeyMapper *)keyMapper; + +/** + * Indicates whether the property with the given name is Optional. + * To have a model with all of its properties being Optional just return YES. + * This method returns by default NO, since the default behaviour is to have all properties required. + * @param propertyName the name of the property + * @return a BOOL result indicating whether the property is optional + */ ++ (BOOL)propertyIsOptional:(NSString *)propertyName; + +/** + * Indicates whether the property with the given name is Ignored. + * To have a model with all of its properties being Ignored just return YES. + * This method returns by default NO, since the default behaviour is to have all properties required. + * @param propertyName the name of the property + * @return a BOOL result indicating whether the property is ignored + */ ++ (BOOL)propertyIsIgnored:(NSString *)propertyName; + +/** + * Indicates the class used for the elements of a collection property. + * Rather than using: + * @property (strong) NSArray <MyType> *things; + * You can implement classForCollectionProperty: and keep your property + * defined like: + * @property (strong) NSArray *things; + * @param propertyName the name of the property + * @return Class the class used to deserialize the elements of the collection + * + * Example in Swift 3.0: + * override static func classForCollectionProperty(propertyName: String) -> AnyClass? { + * switch propertyName { + * case "childModel": + * return ChildModel.self + * default: + * return nil + * } + * } + */ ++ (Class)classForCollectionProperty:(NSString *)propertyName NS_SWIFT_NAME(classForCollectionProperty(propertyName:)); + +/** + * Merges values from the given dictionary into the model instance. + * @param dict dictionary with values + * @param useKeyMapping if YES the method will use the model's key mapper and the global key mapper, if NO + * it'll just try to match the dictionary keys to the model's properties + */ +- (BOOL)mergeFromDictionary:(NSDictionary *)dict useKeyMapping:(BOOL)useKeyMapping error:(NSError **)error; + +@end diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModel.m b/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModel.m new file mode 100755 index 0000000..4ae211a --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModel.m @@ -0,0 +1,1387 @@ +// +// JSONModel.m +// JSONModel +// + +#if !__has_feature(objc_arc) +#error The JSONMOdel framework is ARC only, you can enable ARC on per file basis. +#endif + + +#import <objc/runtime.h> +#import <objc/message.h> + + +#import "JSONModel.h" +#import "JSONModelClassProperty.h" + +#pragma mark - associated objects names +static const char * kMapperObjectKey; +static const char * kClassPropertiesKey; +static const char * kClassRequiredPropertyNamesKey; +static const char * kIndexPropertyNameKey; + +#pragma mark - class static variables +static NSArray* allowedJSONTypes = nil; +static NSArray* allowedPrimitiveTypes = nil; +static JSONValueTransformer* valueTransformer = nil; +static Class JSONModelClass = NULL; + +#pragma mark - model cache +static JSONKeyMapper* globalKeyMapper = nil; + +#pragma mark - JSONModel implementation +@implementation JSONModel +{ + NSString* _description; +} + +#pragma mark - initialization methods + ++(void)load +{ + static dispatch_once_t once; + dispatch_once(&once, ^{ + // initialize all class static objects, + // which are common for ALL JSONModel subclasses + + @autoreleasepool { + allowedJSONTypes = @[ + [NSString class], [NSNumber class], [NSDecimalNumber class], [NSArray class], [NSDictionary class], [NSNull class], //immutable JSON classes + [NSMutableString class], [NSMutableArray class], [NSMutableDictionary class] //mutable JSON classes + ]; + + allowedPrimitiveTypes = @[ + @"BOOL", @"float", @"int", @"long", @"double", @"short", + @"unsigned int", @"usigned long", @"long long", @"unsigned long long", @"unsigned short", @"char", @"unsigned char", + //and some famous aliases + @"NSInteger", @"NSUInteger", + @"Block" + ]; + + valueTransformer = [[JSONValueTransformer alloc] init]; + + // This is quite strange, but I found the test isSubclassOfClass: (line ~291) to fail if using [JSONModel class]. + // somewhat related: https://stackoverflow.com/questions/6524165/nsclassfromstring-vs-classnamednsstring + // //; seems to break the unit tests + + // Using NSClassFromString instead of [JSONModel class], as this was breaking unit tests, see below + //http://stackoverflow.com/questions/21394919/xcode-5-unit-test-seeing-wrong-class + JSONModelClass = NSClassFromString(NSStringFromClass(self)); + } + }); +} + +-(void)__setup__ +{ + //if first instance of this model, generate the property list + if (!objc_getAssociatedObject(self.class, &kClassPropertiesKey)) { + [self __inspectProperties]; + } + + //if there's a custom key mapper, store it in the associated object + id mapper = [[self class] keyMapper]; + if ( mapper && !objc_getAssociatedObject(self.class, &kMapperObjectKey) ) { + objc_setAssociatedObject( + self.class, + &kMapperObjectKey, + mapper, + OBJC_ASSOCIATION_RETAIN // This is atomic + ); + } +} + +-(id)init +{ + self = [super init]; + if (self) { + //do initial class setup + [self __setup__]; + } + return self; +} + +-(instancetype)initWithData:(NSData *)data error:(NSError *__autoreleasing *)err +{ + //check for nil input + if (!data) { + if (err) *err = [JSONModelError errorInputIsNil]; + return nil; + } + //read the json + JSONModelError* initError = nil; + id obj = [NSJSONSerialization JSONObjectWithData:data + options:kNilOptions + error:&initError]; + + if (initError) { + if (err) *err = [JSONModelError errorBadJSON]; + return nil; + } + + //init with dictionary + id objModel = [self initWithDictionary:obj error:&initError]; + if (initError && err) *err = initError; + return objModel; +} + +-(id)initWithString:(NSString*)string error:(JSONModelError**)err +{ + JSONModelError* initError = nil; + id objModel = [self initWithString:string usingEncoding:NSUTF8StringEncoding error:&initError]; + if (initError && err) *err = initError; + return objModel; +} + +-(id)initWithString:(NSString *)string usingEncoding:(NSStringEncoding)encoding error:(JSONModelError**)err +{ + //check for nil input + if (!string) { + if (err) *err = [JSONModelError errorInputIsNil]; + return nil; + } + + JSONModelError* initError = nil; + id objModel = [self initWithData:[string dataUsingEncoding:encoding] error:&initError]; + if (initError && err) *err = initError; + return objModel; + +} + +-(id)initWithDictionary:(NSDictionary*)dict error:(NSError**)err +{ + //check for nil input + if (!dict) { + if (err) *err = [JSONModelError errorInputIsNil]; + return nil; + } + + //invalid input, just create empty instance + if (![dict isKindOfClass:[NSDictionary class]]) { + if (err) *err = [JSONModelError errorInvalidDataWithMessage:@"Attempt to initialize JSONModel object using initWithDictionary:error: but the dictionary parameter was not an 'NSDictionary'."]; + return nil; + } + + //create a class instance + self = [self init]; + if (!self) { + + //super init didn't succeed + if (err) *err = [JSONModelError errorModelIsInvalid]; + return nil; + } + + //check incoming data structure + if (![self __doesDictionary:dict matchModelWithKeyMapper:self.__keyMapper error:err]) { + return nil; + } + + //import the data from a dictionary + if (![self __importDictionary:dict withKeyMapper:self.__keyMapper validation:YES error:err]) { + return nil; + } + + //run any custom model validation + if (![self validate:err]) { + return nil; + } + + //model is valid! yay! + return self; +} + +-(JSONKeyMapper*)__keyMapper +{ + //get the model key mapper + return objc_getAssociatedObject(self.class, &kMapperObjectKey); +} + +-(BOOL)__doesDictionary:(NSDictionary*)dict matchModelWithKeyMapper:(JSONKeyMapper*)keyMapper error:(NSError**)err +{ + //check if all required properties are present + NSArray* incomingKeysArray = [dict allKeys]; + NSMutableSet* requiredProperties = [self __requiredPropertyNames].mutableCopy; + NSSet* incomingKeys = [NSSet setWithArray: incomingKeysArray]; + + //transform the key names, if necessary + if (keyMapper || globalKeyMapper) { + + NSMutableSet* transformedIncomingKeys = [NSMutableSet setWithCapacity: requiredProperties.count]; + NSString* transformedName = nil; + + //loop over the required properties list + for (JSONModelClassProperty* property in [self __properties__]) { + + transformedName = (keyMapper||globalKeyMapper) ? [self __mapString:property.name withKeyMapper:keyMapper] : property.name; + + //check if exists and if so, add to incoming keys + id value; + @try { + value = [dict valueForKeyPath:transformedName]; + } + @catch (NSException *exception) { + value = dict[transformedName]; + } + + if (value) { + [transformedIncomingKeys addObject: property.name]; + } + } + + //overwrite the raw incoming list with the mapped key names + incomingKeys = transformedIncomingKeys; + } + + //check for missing input keys + if (![requiredProperties isSubsetOfSet:incomingKeys]) { + + //get a list of the missing properties + [requiredProperties minusSet:incomingKeys]; + + //not all required properties are in - invalid input + JMLog(@"Incoming data was invalid [%@ initWithDictionary:]. Keys missing: %@", self.class, requiredProperties); + + if (err) *err = [JSONModelError errorInvalidDataWithMissingKeys:requiredProperties]; + return NO; + } + + //not needed anymore + incomingKeys= nil; + requiredProperties= nil; + + return YES; +} + +-(NSString*)__mapString:(NSString*)string withKeyMapper:(JSONKeyMapper*)keyMapper +{ + if (keyMapper) { + //custom mapper + NSString* mappedName = [keyMapper convertValue:string]; + if (globalKeyMapper && [mappedName isEqualToString: string]) { + mappedName = [globalKeyMapper convertValue:string]; + } + string = mappedName; + } else if (globalKeyMapper) { + //global keymapper + string = [globalKeyMapper convertValue:string]; + } + + return string; +} + +-(BOOL)__importDictionary:(NSDictionary*)dict withKeyMapper:(JSONKeyMapper*)keyMapper validation:(BOOL)validation error:(NSError**)err +{ + //loop over the incoming keys and set self's properties + for (JSONModelClassProperty* property in [self __properties__]) { + + //convert key name to model keys, if a mapper is provided + NSString* jsonKeyPath = (keyMapper||globalKeyMapper) ? [self __mapString:property.name withKeyMapper:keyMapper] : property.name; + //JMLog(@"keyPath: %@", jsonKeyPath); + + //general check for data type compliance + id jsonValue; + @try { + jsonValue = [dict valueForKeyPath: jsonKeyPath]; + } + @catch (NSException *exception) { + jsonValue = dict[jsonKeyPath]; + } + + //check for Optional properties + if (isNull(jsonValue)) { + //skip this property, continue with next property + if (property.isOptional || !validation) continue; + + if (err) { + //null value for required property + NSString* msg = [NSString stringWithFormat:@"Value of required model key %@ is null", property.name]; + JSONModelError* dataErr = [JSONModelError errorInvalidDataWithMessage:msg]; + *err = [dataErr errorByPrependingKeyPathComponent:property.name]; + } + return NO; + } + + Class jsonValueClass = [jsonValue class]; + BOOL isValueOfAllowedType = NO; + + for (Class allowedType in allowedJSONTypes) { + if ( [jsonValueClass isSubclassOfClass: allowedType] ) { + isValueOfAllowedType = YES; + break; + } + } + + if (isValueOfAllowedType==NO) { + //type not allowed + JMLog(@"Type %@ is not allowed in JSON.", NSStringFromClass(jsonValueClass)); + + if (err) { + NSString* msg = [NSString stringWithFormat:@"Type %@ is not allowed in JSON.", NSStringFromClass(jsonValueClass)]; + JSONModelError* dataErr = [JSONModelError errorInvalidDataWithMessage:msg]; + *err = [dataErr errorByPrependingKeyPathComponent:property.name]; + } + return NO; + } + + //check if there's matching property in the model + if (property) { + + // check for custom setter, than the model doesn't need to do any guessing + // how to read the property's value from JSON + if ([self __customSetValue:jsonValue forProperty:property]) { + //skip to next JSON key + continue; + }; + + // 0) handle primitives + if (property.type == nil && property.structName==nil) { + + //generic setter + if (jsonValue != [self valueForKey:property.name]) { + [self setValue:jsonValue forKey: property.name]; + } + + //skip directly to the next key + continue; + } + + // 0.5) handle nils + if (isNull(jsonValue)) { + if ([self valueForKey:property.name] != nil) { + [self setValue:nil forKey: property.name]; + } + continue; + } + + + // 1) check if property is itself a JSONModel + if ([self __isJSONModelSubClass:property.type]) { + + //initialize the property's model, store it + JSONModelError* initErr = nil; + id value = [[property.type alloc] initWithDictionary: jsonValue error:&initErr]; + + if (!value) { + //skip this property, continue with next property + if (property.isOptional || !validation) continue; + + // Propagate the error, including the property name as the key-path component + if((err != nil) && (initErr != nil)) + { + *err = [initErr errorByPrependingKeyPathComponent:property.name]; + } + return NO; + } + if (![value isEqual:[self valueForKey:property.name]]) { + [self setValue:value forKey: property.name]; + } + + //for clarity, does the same without continue + continue; + + } else { + + // 2) check if there's a protocol to the property + // ) might or not be the case there's a built in transform for it + if (property.protocol) { + + //JMLog(@"proto: %@", p.protocol); + jsonValue = [self __transform:jsonValue forProperty:property error:err]; + if (!jsonValue) { + if ((err != nil) && (*err == nil)) { + NSString* msg = [NSString stringWithFormat:@"Failed to transform value, but no error was set during transformation. (%@)", property]; + JSONModelError* dataErr = [JSONModelError errorInvalidDataWithMessage:msg]; + *err = [dataErr errorByPrependingKeyPathComponent:property.name]; + } + return NO; + } + } + + // 3.1) handle matching standard JSON types + if (property.isStandardJSONType && [jsonValue isKindOfClass: property.type]) { + + //mutable properties + if (property.isMutable) { + jsonValue = [jsonValue mutableCopy]; + } + + //set the property value + if (![jsonValue isEqual:[self valueForKey:property.name]]) { + [self setValue:jsonValue forKey: property.name]; + } + continue; + } + + // 3.3) handle values to transform + if ( + (![jsonValue isKindOfClass:property.type] && !isNull(jsonValue)) + || + //the property is mutable + property.isMutable + || + //custom struct property + property.structName + ) { + + // searched around the web how to do this better + // but did not find any solution, maybe that's the best idea? (hardly) + Class sourceClass = [JSONValueTransformer classByResolvingClusterClasses:[jsonValue class]]; + + //JMLog(@"to type: [%@] from type: [%@] transformer: [%@]", p.type, sourceClass, selectorName); + + //build a method selector for the property and json object classes + NSString* selectorName = [NSString stringWithFormat:@"%@From%@:", + (property.structName? property.structName : property.type), //target name + sourceClass]; //source name + SEL selector = NSSelectorFromString(selectorName); + + //check for custom transformer + BOOL foundCustomTransformer = NO; + if ([valueTransformer respondsToSelector:selector]) { + foundCustomTransformer = YES; + } else { + //try for hidden custom transformer + selectorName = [NSString stringWithFormat:@"__%@",selectorName]; + selector = NSSelectorFromString(selectorName); + if ([valueTransformer respondsToSelector:selector]) { + foundCustomTransformer = YES; + } + } + + //check if there's a transformer with that name + if (foundCustomTransformer) { + IMP imp = [valueTransformer methodForSelector:selector]; + id (*func)(id, SEL, id) = (void *)imp; + jsonValue = func(valueTransformer, selector, jsonValue); + + if (![jsonValue isEqual:[self valueForKey:property.name]]) + [self setValue:jsonValue forKey:property.name]; + } else { + if (err) { + NSString* msg = [NSString stringWithFormat:@"%@ type not supported for %@.%@", property.type, [self class], property.name]; + JSONModelError* dataErr = [JSONModelError errorInvalidDataWithTypeMismatch:msg]; + *err = [dataErr errorByPrependingKeyPathComponent:property.name]; + } + return NO; + } + } else { + // 3.4) handle "all other" cases (if any) + if (![jsonValue isEqual:[self valueForKey:property.name]]) + [self setValue:jsonValue forKey:property.name]; + } + } + } + } + + return YES; +} + +#pragma mark - property inspection methods + +-(BOOL)__isJSONModelSubClass:(Class)class +{ +// http://stackoverflow.com/questions/19883472/objc-nsobject-issubclassofclass-gives-incorrect-failure +#ifdef UNIT_TESTING + return [@"JSONModel" isEqualToString: NSStringFromClass([class superclass])]; +#else + return [class isSubclassOfClass:JSONModelClass]; +#endif +} + +//returns a set of the required keys for the model +-(NSMutableSet*)__requiredPropertyNames +{ + //fetch the associated property names + NSMutableSet* classRequiredPropertyNames = objc_getAssociatedObject(self.class, &kClassRequiredPropertyNamesKey); + + if (!classRequiredPropertyNames) { + classRequiredPropertyNames = [NSMutableSet set]; + [[self __properties__] enumerateObjectsUsingBlock:^(JSONModelClassProperty* p, NSUInteger idx, BOOL *stop) { + if (!p.isOptional) [classRequiredPropertyNames addObject:p.name]; + }]; + + //persist the list + objc_setAssociatedObject( + self.class, + &kClassRequiredPropertyNamesKey, + classRequiredPropertyNames, + OBJC_ASSOCIATION_RETAIN // This is atomic + ); + } + return classRequiredPropertyNames; +} + +//returns a list of the model's properties +-(NSArray*)__properties__ +{ + //fetch the associated object + NSDictionary* classProperties = objc_getAssociatedObject(self.class, &kClassPropertiesKey); + if (classProperties) return [classProperties allValues]; + + //if here, the class needs to inspect itself + [self __setup__]; + + //return the property list + classProperties = objc_getAssociatedObject(self.class, &kClassPropertiesKey); + return [classProperties allValues]; +} + +//inspects the class, get's a list of the class properties +-(void)__inspectProperties +{ + //JMLog(@"Inspect class: %@", [self class]); + + NSMutableDictionary* propertyIndex = [NSMutableDictionary dictionary]; + + //temp variables for the loops + Class class = [self class]; + NSScanner* scanner = nil; + NSString* propertyType = nil; + + // inspect inherited properties up to the JSONModel class + while (class != [JSONModel class]) { + //JMLog(@"inspecting: %@", NSStringFromClass(class)); + + unsigned int propertyCount; + objc_property_t *properties = class_copyPropertyList(class, &propertyCount); + + //loop over the class properties + for (unsigned int i = 0; i < propertyCount; i++) { + + JSONModelClassProperty* p = [[JSONModelClassProperty alloc] init]; + + //get property name + objc_property_t property = properties[i]; + const char *propertyName = property_getName(property); + p.name = @(propertyName); + + //JMLog(@"property: %@", p.name); + + //get property attributes + const char *attrs = property_getAttributes(property); + NSString* propertyAttributes = @(attrs); + NSArray* attributeItems = [propertyAttributes componentsSeparatedByString:@","]; + + //ignore read-only properties + if ([attributeItems containsObject:@"R"]) { + continue; //to next property + } + + scanner = [NSScanner scannerWithString: propertyAttributes]; + + //JMLog(@"attr: %@", [NSString stringWithCString:attrs encoding:NSUTF8StringEncoding]); + [scanner scanUpToString:@"T" intoString: nil]; + [scanner scanString:@"T" intoString:nil]; + + //check if the property is an instance of a class + if ([scanner scanString:@"@\"" intoString: &propertyType]) { + + [scanner scanUpToCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:@"\"<"] + intoString:&propertyType]; + + //JMLog(@"type: %@", propertyClassName); + p.type = NSClassFromString(propertyType); + p.isMutable = ([propertyType rangeOfString:@"Mutable"].location != NSNotFound); + p.isStandardJSONType = [allowedJSONTypes containsObject:p.type]; + + //read through the property protocols + while ([scanner scanString:@"<" intoString:NULL]) { + + NSString* protocolName = nil; + + [scanner scanUpToString:@">" intoString: &protocolName]; + + if ([protocolName isEqualToString:@"Optional"]) { + p.isOptional = YES; + } else if([protocolName isEqualToString:@"Index"]) { +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + p.isIndex = YES; +#pragma GCC diagnostic pop + + objc_setAssociatedObject( + self.class, + &kIndexPropertyNameKey, + p.name, + OBJC_ASSOCIATION_RETAIN // This is atomic + ); + } else if([protocolName isEqualToString:@"Ignore"]) { + p = nil; + } else { + p.protocol = protocolName; + } + + [scanner scanString:@">" intoString:NULL]; + } + + } + //check if the property is a structure + else if ([scanner scanString:@"{" intoString: &propertyType]) { + [scanner scanCharactersFromSet:[NSCharacterSet alphanumericCharacterSet] + intoString:&propertyType]; + + p.isStandardJSONType = NO; + p.structName = propertyType; + + } + //the property must be a primitive + else { + + //the property contains a primitive data type + [scanner scanUpToCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:@","] + intoString:&propertyType]; + + //get the full name of the primitive type + propertyType = valueTransformer.primitivesNames[propertyType]; + + if (![allowedPrimitiveTypes containsObject:propertyType]) { + + //type not allowed - programmer mistaken -> exception + @throw [NSException exceptionWithName:@"JSONModelProperty type not allowed" + reason:[NSString stringWithFormat:@"Property type of %@.%@ is not supported by JSONModel.", self.class, p.name] + userInfo:nil]; + } + + } + + NSString *nsPropertyName = @(propertyName); + if([[self class] propertyIsOptional:nsPropertyName]){ + p.isOptional = YES; + } + + if([[self class] propertyIsIgnored:nsPropertyName]){ + p = nil; + } + + Class customClass = [[self class] classForCollectionProperty:nsPropertyName]; + if (customClass) { + p.protocol = NSStringFromClass(customClass); + } + + //few cases where JSONModel will ignore properties automatically + if ([propertyType isEqualToString:@"Block"]) { + p = nil; + } + + //add the property object to the temp index + if (p && ![propertyIndex objectForKey:p.name]) { + [propertyIndex setValue:p forKey:p.name]; + } + + // generate custom setters and getter + if (p) + { + NSString *name = [p.name stringByReplacingCharactersInRange:NSMakeRange(0, 1) withString:[p.name substringToIndex:1].uppercaseString]; + + // getter + SEL getter = NSSelectorFromString([NSString stringWithFormat:@"JSONObjectFor%@", name]); + + if ([self respondsToSelector:getter]) + p.customGetter = getter; + + // setters + p.customSetters = [NSMutableDictionary new]; + + SEL genericSetter = NSSelectorFromString([NSString stringWithFormat:@"set%@WithJSONObject:", name]); + + if ([self respondsToSelector:genericSetter]) + p.customSetters[@"generic"] = [NSValue valueWithBytes:&genericSetter objCType:@encode(SEL)]; + + for (Class type in allowedJSONTypes) + { + NSString *class = NSStringFromClass([JSONValueTransformer classByResolvingClusterClasses:type]); + + if (p.customSetters[class]) + continue; + + SEL setter = NSSelectorFromString([NSString stringWithFormat:@"set%@With%@:", name, class]); + + if ([self respondsToSelector:setter]) + p.customSetters[class] = [NSValue valueWithBytes:&setter objCType:@encode(SEL)]; + } + } + } + + free(properties); + + //ascend to the super of the class + //(will do that until it reaches the root class - JSONModel) + class = [class superclass]; + } + + //finally store the property index in the static property index + objc_setAssociatedObject( + self.class, + &kClassPropertiesKey, + [propertyIndex copy], + OBJC_ASSOCIATION_RETAIN // This is atomic + ); +} + +#pragma mark - built-in transformer methods +//few built-in transformations +-(id)__transform:(id)value forProperty:(JSONModelClassProperty*)property error:(NSError**)err +{ + Class protocolClass = NSClassFromString(property.protocol); + if (!protocolClass) { + + //no other protocols on arrays and dictionaries + //except JSONModel classes + if ([value isKindOfClass:[NSArray class]]) { + @throw [NSException exceptionWithName:@"Bad property protocol declaration" + reason:[NSString stringWithFormat:@"<%@> is not allowed JSONModel property protocol, and not a JSONModel class.", property.protocol] + userInfo:nil]; + } + return value; + } + + //if the protocol is actually a JSONModel class + if ([self __isJSONModelSubClass:protocolClass]) { + + //check if it's a list of models + if ([property.type isSubclassOfClass:[NSArray class]]) { + + // Expecting an array, make sure 'value' is an array + if(![[value class] isSubclassOfClass:[NSArray class]]) + { + if(err != nil) + { + NSString* mismatch = [NSString stringWithFormat:@"Property '%@' is declared as NSArray<%@>* but the corresponding JSON value is not a JSON Array.", property.name, property.protocol]; + JSONModelError* typeErr = [JSONModelError errorInvalidDataWithTypeMismatch:mismatch]; + *err = [typeErr errorByPrependingKeyPathComponent:property.name]; + } + return nil; + } + + //one shot conversion + JSONModelError* arrayErr = nil; + value = [[protocolClass class] arrayOfModelsFromDictionaries:value error:&arrayErr]; + if((err != nil) && (arrayErr != nil)) + { + *err = [arrayErr errorByPrependingKeyPathComponent:property.name]; + return nil; + } + } + + //check if it's a dictionary of models + if ([property.type isSubclassOfClass:[NSDictionary class]]) { + + // Expecting a dictionary, make sure 'value' is a dictionary + if(![[value class] isSubclassOfClass:[NSDictionary class]]) + { + if(err != nil) + { + NSString* mismatch = [NSString stringWithFormat:@"Property '%@' is declared as NSDictionary<%@>* but the corresponding JSON value is not a JSON Object.", property.name, property.protocol]; + JSONModelError* typeErr = [JSONModelError errorInvalidDataWithTypeMismatch:mismatch]; + *err = [typeErr errorByPrependingKeyPathComponent:property.name]; + } + return nil; + } + + NSMutableDictionary* res = [NSMutableDictionary dictionary]; + + for (NSString* key in [value allKeys]) { + JSONModelError* initErr = nil; + id obj = [[[protocolClass class] alloc] initWithDictionary:value[key] error:&initErr]; + if (obj == nil) + { + // Propagate the error, including the property name as the key-path component + if((err != nil) && (initErr != nil)) + { + initErr = [initErr errorByPrependingKeyPathComponent:key]; + *err = [initErr errorByPrependingKeyPathComponent:property.name]; + } + return nil; + } + [res setValue:obj forKey:key]; + } + value = [NSDictionary dictionaryWithDictionary:res]; + } + } + + return value; +} + +//built-in reverse transformations (export to JSON compliant objects) +-(id)__reverseTransform:(id)value forProperty:(JSONModelClassProperty*)property +{ + Class protocolClass = NSClassFromString(property.protocol); + if (!protocolClass) return value; + + //if the protocol is actually a JSONModel class + if ([self __isJSONModelSubClass:protocolClass]) { + + //check if should export list of dictionaries + if (property.type == [NSArray class] || property.type == [NSMutableArray class]) { + NSMutableArray* tempArray = [NSMutableArray arrayWithCapacity: [(NSArray*)value count] ]; + for (NSObject<AbstractJSONModelProtocol>* model in (NSArray*)value) { + if ([model respondsToSelector:@selector(toDictionary)]) { + [tempArray addObject: [model toDictionary]]; + } else + [tempArray addObject: model]; + } + return [tempArray copy]; + } + + //check if should export dictionary of dictionaries + if (property.type == [NSDictionary class] || property.type == [NSMutableDictionary class]) { + NSMutableDictionary* res = [NSMutableDictionary dictionary]; + for (NSString* key in [(NSDictionary*)value allKeys]) { + id<AbstractJSONModelProtocol> model = value[key]; + [res setValue: [model toDictionary] forKey: key]; + } + return [NSDictionary dictionaryWithDictionary:res]; + } + } + + return value; +} + +#pragma mark - custom transformations +- (BOOL)__customSetValue:(id <NSObject>)value forProperty:(JSONModelClassProperty *)property +{ + NSString *class = NSStringFromClass([JSONValueTransformer classByResolvingClusterClasses:[value class]]); + + SEL setter = nil; + [property.customSetters[class] getValue:&setter]; + + if (!setter) + [property.customSetters[@"generic"] getValue:&setter]; + + if (!setter) + return NO; + + IMP imp = [self methodForSelector:setter]; + void (*func)(id, SEL, id <NSObject>) = (void *)imp; + func(self, setter, value); + + return YES; +} + +- (BOOL)__customGetValue:(id *)value forProperty:(JSONModelClassProperty *)property +{ + SEL getter = property.customGetter; + + if (!getter) + return NO; + + IMP imp = [self methodForSelector:getter]; + id (*func)(id, SEL) = (void *)imp; + *value = func(self, getter); + + return YES; +} + +#pragma mark - persistance +-(void)__createDictionariesForKeyPath:(NSString*)keyPath inDictionary:(NSMutableDictionary**)dict +{ + //find if there's a dot left in the keyPath + NSUInteger dotLocation = [keyPath rangeOfString:@"."].location; + if (dotLocation==NSNotFound) return; + + //inspect next level + NSString* nextHierarchyLevelKeyName = [keyPath substringToIndex: dotLocation]; + NSDictionary* nextLevelDictionary = (*dict)[nextHierarchyLevelKeyName]; + + if (nextLevelDictionary==nil) { + //create non-existing next level here + nextLevelDictionary = [NSMutableDictionary dictionary]; + } + + //recurse levels + [self __createDictionariesForKeyPath:[keyPath substringFromIndex: dotLocation+1] + inDictionary:&nextLevelDictionary ]; + + //create the hierarchy level + [*dict setValue:nextLevelDictionary forKeyPath: nextHierarchyLevelKeyName]; +} + +-(NSDictionary*)toDictionary +{ + return [self toDictionaryWithKeys:nil]; +} + +-(NSString*)toJSONString +{ + return [self toJSONStringWithKeys:nil]; +} + +-(NSData*)toJSONData +{ + return [self toJSONDataWithKeys:nil]; +} + +//exports the model as a dictionary of JSON compliant objects +- (NSDictionary *)toDictionaryWithKeys:(NSArray <NSString *> *)propertyNames +{ + NSArray* properties = [self __properties__]; + NSMutableDictionary* tempDictionary = [NSMutableDictionary dictionaryWithCapacity:properties.count]; + + id value; + + //loop over all properties + for (JSONModelClassProperty* p in properties) { + + //skip if unwanted + if (propertyNames != nil && ![propertyNames containsObject:p.name]) + continue; + + //fetch key and value + NSString* keyPath = (self.__keyMapper||globalKeyMapper) ? [self __mapString:p.name withKeyMapper:self.__keyMapper] : p.name; + value = [self valueForKey: p.name]; + + //JMLog(@"toDictionary[%@]->[%@] = '%@'", p.name, keyPath, value); + + if ([keyPath rangeOfString:@"."].location != NSNotFound) { + //there are sub-keys, introduce dictionaries for them + [self __createDictionariesForKeyPath:keyPath inDictionary:&tempDictionary]; + } + + //check for custom getter + if ([self __customGetValue:&value forProperty:p]) { + //custom getter, all done + [tempDictionary setValue:value forKeyPath:keyPath]; + continue; + } + + //export nil when they are not optional values as JSON null, so that the structure of the exported data + //is still valid if it's to be imported as a model again + if (isNull(value)) { + + if (value == nil) + { + [tempDictionary removeObjectForKey:keyPath]; + } + else + { + [tempDictionary setValue:[NSNull null] forKeyPath:keyPath]; + } + continue; + } + + //check if the property is another model + if ([value isKindOfClass:JSONModelClass]) { + + //recurse models + value = [(JSONModel*)value toDictionary]; + [tempDictionary setValue:value forKeyPath: keyPath]; + + //for clarity + continue; + + } else { + + // 1) check for built-in transformation + if (p.protocol) { + value = [self __reverseTransform:value forProperty:p]; + } + + // 2) check for standard types OR 2.1) primitives + if (p.structName==nil && (p.isStandardJSONType || p.type==nil)) { + + //generic get value + [tempDictionary setValue:value forKeyPath: keyPath]; + + continue; + } + + // 3) try to apply a value transformer + if (YES) { + + //create selector from the property's class name + NSString* selectorName = [NSString stringWithFormat:@"%@From%@:", @"JSONObject", p.type?p.type:p.structName]; + SEL selector = NSSelectorFromString(selectorName); + + BOOL foundCustomTransformer = NO; + if ([valueTransformer respondsToSelector:selector]) { + foundCustomTransformer = YES; + } else { + //try for hidden transformer + selectorName = [NSString stringWithFormat:@"__%@",selectorName]; + selector = NSSelectorFromString(selectorName); + if ([valueTransformer respondsToSelector:selector]) { + foundCustomTransformer = YES; + } + } + + //check if there's a transformer declared + if (foundCustomTransformer) { + IMP imp = [valueTransformer methodForSelector:selector]; + id (*func)(id, SEL, id) = (void *)imp; + value = func(valueTransformer, selector, value); + + [tempDictionary setValue:value forKeyPath:keyPath]; + } else { + //in this case most probably a custom property was defined in a model + //but no default reverse transformer for it + @throw [NSException exceptionWithName:@"Value transformer not found" + reason:[NSString stringWithFormat:@"[JSONValueTransformer %@] not found", selectorName] + userInfo:nil]; + return nil; + } + } + } + } + + return [tempDictionary copy]; +} + +//exports model to a dictionary and then to a JSON string +- (NSData *)toJSONDataWithKeys:(NSArray <NSString *> *)propertyNames +{ + NSData* jsonData = nil; + NSError* jsonError = nil; + + @try { + NSDictionary* dict = [self toDictionaryWithKeys:propertyNames]; + jsonData = [NSJSONSerialization dataWithJSONObject:dict options:kNilOptions error:&jsonError]; + } + @catch (NSException *exception) { + //this should not happen in properly design JSONModel + //usually means there was no reverse transformer for a custom property + JMLog(@"EXCEPTION: %@", exception.description); + return nil; + } + + return jsonData; +} + +- (NSString *)toJSONStringWithKeys:(NSArray <NSString *> *)propertyNames +{ + return [[NSString alloc] initWithData: [self toJSONDataWithKeys: propertyNames] + encoding: NSUTF8StringEncoding]; +} + +#pragma mark - import/export of lists +//loop over an NSArray of JSON objects and turn them into models ++(NSMutableArray*)arrayOfModelsFromDictionaries:(NSArray*)array +{ + return [self arrayOfModelsFromDictionaries:array error:nil]; +} + ++ (NSMutableArray *)arrayOfModelsFromData:(NSData *)data error:(NSError **)err +{ + id json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:err]; + if (!json || ![json isKindOfClass:[NSArray class]]) return nil; + + return [self arrayOfModelsFromDictionaries:json error:err]; +} + ++ (NSMutableArray *)arrayOfModelsFromString:(NSString *)string error:(NSError **)err +{ + return [self arrayOfModelsFromData:[string dataUsingEncoding:NSUTF8StringEncoding] error:err]; +} + +// Same as above, but with error reporting ++(NSMutableArray*)arrayOfModelsFromDictionaries:(NSArray*)array error:(NSError**)err +{ + //bail early + if (isNull(array)) return nil; + + //parse dictionaries to objects + NSMutableArray* list = [NSMutableArray arrayWithCapacity: [array count]]; + + for (id d in array) + { + if ([d isKindOfClass:NSDictionary.class]) + { + JSONModelError* initErr = nil; + id obj = [[self alloc] initWithDictionary:d error:&initErr]; + if (obj == nil) + { + // Propagate the error, including the array index as the key-path component + if((err != nil) && (initErr != nil)) + { + NSString* path = [NSString stringWithFormat:@"[%lu]", (unsigned long)list.count]; + *err = [initErr errorByPrependingKeyPathComponent:path]; + } + return nil; + } + + [list addObject: obj]; + } else if ([d isKindOfClass:NSArray.class]) + { + [list addObjectsFromArray:[self arrayOfModelsFromDictionaries:d error:err]]; + } else + { + // This is very bad + } + + } + + return list; +} + ++ (NSMutableDictionary *)dictionaryOfModelsFromString:(NSString *)string error:(NSError **)err +{ + return [self dictionaryOfModelsFromData:[string dataUsingEncoding:NSUTF8StringEncoding] error:err]; +} + ++ (NSMutableDictionary *)dictionaryOfModelsFromData:(NSData *)data error:(NSError **)err +{ + id json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:err]; + if (!json || ![json isKindOfClass:[NSDictionary class]]) return nil; + + return [self dictionaryOfModelsFromDictionary:json error:err]; +} + ++ (NSMutableDictionary *)dictionaryOfModelsFromDictionary:(NSDictionary *)dictionary error:(NSError **)err +{ + NSMutableDictionary *output = [NSMutableDictionary dictionaryWithCapacity:dictionary.count]; + + for (NSString *key in dictionary.allKeys) + { + id object = dictionary[key]; + + if ([object isKindOfClass:NSDictionary.class]) + { + id obj = [[self alloc] initWithDictionary:object error:err]; + if (obj == nil) return nil; + output[key] = obj; + } + else if ([object isKindOfClass:NSArray.class]) + { + id obj = [self arrayOfModelsFromDictionaries:object error:err]; + if (obj == nil) return nil; + output[key] = obj; + } + else + { + if (err) { + *err = [JSONModelError errorInvalidDataWithTypeMismatch:@"Only dictionaries and arrays are supported"]; + } + return nil; + } + } + + return output; +} + +//loop over NSArray of models and export them to JSON objects ++(NSMutableArray*)arrayOfDictionariesFromModels:(NSArray*)array +{ + //bail early + if (isNull(array)) return nil; + + //convert to dictionaries + NSMutableArray* list = [NSMutableArray arrayWithCapacity: [array count]]; + + for (id<AbstractJSONModelProtocol> object in array) { + + id obj = [object toDictionary]; + if (!obj) return nil; + + [list addObject: obj]; + } + return list; +} + +//loop over NSArray of models and export them to JSON objects with specific properties ++(NSMutableArray*)arrayOfDictionariesFromModels:(NSArray*)array propertyNamesToExport:(NSArray*)propertyNamesToExport; +{ + //bail early + if (isNull(array)) return nil; + + //convert to dictionaries + NSMutableArray* list = [NSMutableArray arrayWithCapacity: [array count]]; + + for (id<AbstractJSONModelProtocol> object in array) { + + id obj = [object toDictionaryWithKeys:propertyNamesToExport]; + if (!obj) return nil; + + [list addObject: obj]; + } + return list; +} + ++(NSMutableDictionary *)dictionaryOfDictionariesFromModels:(NSDictionary *)dictionary +{ + //bail early + if (isNull(dictionary)) return nil; + + NSMutableDictionary *output = [NSMutableDictionary dictionaryWithCapacity:dictionary.count]; + + for (NSString *key in dictionary.allKeys) { + id <AbstractJSONModelProtocol> object = dictionary[key]; + id obj = [object toDictionary]; + if (!obj) return nil; + output[key] = obj; + } + + return output; +} + +#pragma mark - custom comparison methods + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +-(NSString*)indexPropertyName +{ + //custom getter for an associated object + return objc_getAssociatedObject(self.class, &kIndexPropertyNameKey); +} + +-(BOOL)isEqual:(id)object +{ + //bail early if different classes + if (![object isMemberOfClass:[self class]]) return NO; + + if (self.indexPropertyName) { + //there's a defined ID property + id objectId = [object valueForKey: self.indexPropertyName]; + return [[self valueForKey: self.indexPropertyName] isEqual:objectId]; + } + + //default isEqual implementation + return [super isEqual:object]; +} + +-(NSComparisonResult)compare:(id)object +{ + if (self.indexPropertyName) { + id objectId = [object valueForKey: self.indexPropertyName]; + if ([objectId respondsToSelector:@selector(compare:)]) { + return [[self valueForKey:self.indexPropertyName] compare:objectId]; + } + } + + //on purpose postponing the asserts for speed optimization + //these should not happen anyway in production conditions + NSAssert(self.indexPropertyName, @"Can't compare models with no <Index> property"); + NSAssert1(NO, @"The <Index> property of %@ is not comparable class.", [self class]); + return kNilOptions; +} + +- (NSUInteger)hash +{ + if (self.indexPropertyName) { + id val = [self valueForKey:self.indexPropertyName]; + + if (val) { + return [val hash]; + } + } + + return [super hash]; +} + +#pragma GCC diagnostic pop + +#pragma mark - custom data validation +-(BOOL)validate:(NSError**)error +{ + return YES; +} + +#pragma mark - custom recursive description +//custom description method for debugging purposes +-(NSString*)description +{ + NSMutableString* text = [NSMutableString stringWithFormat:@"<%@> \n", [self class]]; + + for (JSONModelClassProperty *p in [self __properties__]) { + + id value = ([p.name isEqualToString:@"description"])?self->_description:[self valueForKey:p.name]; + NSString* valueDescription = (value)?[value description]:@"<nil>"; + + if (p.isStandardJSONType && ![value respondsToSelector:@selector(count)] && [valueDescription length]>60) { + + //cap description for longer values + valueDescription = [NSString stringWithFormat:@"%@...", [valueDescription substringToIndex:59]]; + } + valueDescription = [valueDescription stringByReplacingOccurrencesOfString:@"\n" withString:@"\n "]; + [text appendFormat:@" [%@]: %@\n", p.name, valueDescription]; + } + + [text appendFormat:@"</%@>", [self class]]; + return text; +} + +#pragma mark - key mapping ++(JSONKeyMapper*)keyMapper +{ + return nil; +} + ++(void)setGlobalKeyMapper:(JSONKeyMapper*)globalKeyMapperParam +{ + globalKeyMapper = globalKeyMapperParam; +} + ++(BOOL)propertyIsOptional:(NSString*)propertyName +{ + return NO; +} + ++(BOOL)propertyIsIgnored:(NSString *)propertyName +{ + return NO; +} + ++(NSString*)protocolForArrayProperty:(NSString *)propertyName +{ + return nil; +} + ++(Class)classForCollectionProperty:(NSString *)propertyName +{ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + NSString *protocolName = [self protocolForArrayProperty:propertyName]; +#pragma GCC diagnostic pop + + if (!protocolName) + return nil; + + return NSClassFromString(protocolName); +} + +#pragma mark - working with incomplete models +- (void)mergeFromDictionary:(NSDictionary *)dict useKeyMapping:(BOOL)useKeyMapping +{ + [self mergeFromDictionary:dict useKeyMapping:useKeyMapping error:nil]; +} + +- (BOOL)mergeFromDictionary:(NSDictionary *)dict useKeyMapping:(BOOL)useKeyMapping error:(NSError **)error +{ + return [self __importDictionary:dict withKeyMapper:(useKeyMapping)? self.__keyMapper:nil validation:NO error:error]; +} + +#pragma mark - NSCopying, NSCoding +-(instancetype)copyWithZone:(NSZone *)zone +{ + return [NSKeyedUnarchiver unarchiveObjectWithData: + [NSKeyedArchiver archivedDataWithRootObject:self] + ]; +} + +-(instancetype)initWithCoder:(NSCoder *)decoder +{ + NSString* json; + + if ([decoder respondsToSelector:@selector(decodeObjectOfClass:forKey:)]) { + json = [decoder decodeObjectOfClass:[NSString class] forKey:@"json"]; + } else { + json = [decoder decodeObjectForKey:@"json"]; + } + + JSONModelError *error = nil; + self = [self initWithString:json error:&error]; + if (error) { + JMLog(@"%@",[error localizedDescription]); + } + return self; +} + +-(void)encodeWithCoder:(NSCoder *)encoder +{ + [encoder encodeObject:self.toJSONString forKey:@"json"]; +} + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +@end diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModel.podspec b/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModel.podspec new file mode 100755 index 0000000..f44aa9b --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModel.podspec @@ -0,0 +1,22 @@ +Pod::Spec.new do |s| + s.name = "JSONModel" + s.version = "1.8.0" + s.summary = "Magical Data Modelling Framework for JSON. Create rapidly powerful, atomic and smart data model classes." + s.homepage = "http://www.jsonmodel.com" + + s.license = { :type => 'MIT', :file => 'LICENSE' } + s.author = { "Marin Todorov" => "touch-code-magazine@underplot.com" } + + s.source = { :git => "https://github.com/jsonmodel/jsonmodel.git", :tag => s.version } + + s.ios.deployment_target = '6.0' + s.osx.deployment_target = '10.8' + s.watchos.deployment_target = '2.0' + s.tvos.deployment_target = '9.0' + + s.source_files = 'JSONModel/**/*.{m,h}' + s.public_header_files = 'JSONModel/**/*.h' + + s.requires_arc = true + +end diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModel.xcodeproj/project.pbxproj b/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModel.xcodeproj/project.pbxproj new file mode 100755 index 0000000..e342a72 --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModel.xcodeproj/project.pbxproj @@ -0,0 +1,860 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 01D68A031E4219B800CFE82F /* JSONModelLib.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC6F1B19A5B600D79B06 /* JSONModelLib.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01D68A041E4219BE00CFE82F /* JSONModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC641B19A5B600D79B06 /* JSONModel.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01D68A051E4219C300CFE82F /* JSONModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC651B19A5B600D79B06 /* JSONModel.m */; }; + 01D68A061E4219C800CFE82F /* JSONModelClassProperty.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC681B19A5B600D79B06 /* JSONModelClassProperty.h */; }; + 01D68A071E4219CC00CFE82F /* JSONModelClassProperty.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC691B19A5B600D79B06 /* JSONModelClassProperty.m */; }; + 01D68A081E4219D000CFE82F /* JSONModelError.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC6A1B19A5B600D79B06 /* JSONModelError.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01D68A091E4219D600CFE82F /* JSONModelError.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC6B1B19A5B600D79B06 /* JSONModelError.m */; }; + 01D68A0A1E4219DA00CFE82F /* JSONAPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC711B19A5B600D79B06 /* JSONAPI.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01D68A0B1E4219DF00CFE82F /* JSONAPI.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC721B19A5B600D79B06 /* JSONAPI.m */; }; + 01D68A0C1E4219E100CFE82F /* JSONHTTPClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC731B19A5B600D79B06 /* JSONHTTPClient.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01D68A0D1E4219E600CFE82F /* JSONHTTPClient.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC741B19A5B600D79B06 /* JSONHTTPClient.m */; }; + 01D68A0E1E4219E900CFE82F /* JSONModel+networking.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC751B19A5B600D79B06 /* JSONModel+networking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01D68A0F1E4219ED00CFE82F /* JSONModel+networking.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC761B19A5B600D79B06 /* JSONModel+networking.m */; }; + 01D68A101E4219F100CFE82F /* JSONKeyMapper.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC781B19A5B600D79B06 /* JSONKeyMapper.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01D68A111E4219F600CFE82F /* JSONKeyMapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC791B19A5B600D79B06 /* JSONKeyMapper.m */; }; + 01D68A121E4219F900CFE82F /* JSONValueTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC7A1B19A5B600D79B06 /* JSONValueTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01D68A131E4219FE00CFE82F /* JSONValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC7B1B19A5B600D79B06 /* JSONValueTransformer.m */; }; + 01D68A2F1E421B9000CFE82F /* JSONModelLib.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC6F1B19A5B600D79B06 /* JSONModelLib.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01D68A301E421B9300CFE82F /* JSONModelLib.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC6F1B19A5B600D79B06 /* JSONModelLib.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01D68A311E421B9A00CFE82F /* JSONModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC641B19A5B600D79B06 /* JSONModel.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01D68A321E421B9C00CFE82F /* JSONModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC641B19A5B600D79B06 /* JSONModel.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01D68A331E421BA100CFE82F /* JSONModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC651B19A5B600D79B06 /* JSONModel.m */; }; + 01D68A341E421BA100CFE82F /* JSONModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC651B19A5B600D79B06 /* JSONModel.m */; }; + 01D68A351E421BA500CFE82F /* JSONModelClassProperty.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC681B19A5B600D79B06 /* JSONModelClassProperty.h */; }; + 01D68A361E421BA500CFE82F /* JSONModelClassProperty.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC681B19A5B600D79B06 /* JSONModelClassProperty.h */; }; + 01D68A371E421BA800CFE82F /* JSONModelClassProperty.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC691B19A5B600D79B06 /* JSONModelClassProperty.m */; }; + 01D68A381E421BA900CFE82F /* JSONModelClassProperty.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC691B19A5B600D79B06 /* JSONModelClassProperty.m */; }; + 01D68A391E421BAB00CFE82F /* JSONModelError.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC6A1B19A5B600D79B06 /* JSONModelError.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01D68A3A1E421BAE00CFE82F /* JSONModelError.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC6A1B19A5B600D79B06 /* JSONModelError.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01D68A3B1E421BB300CFE82F /* JSONModelError.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC6B1B19A5B600D79B06 /* JSONModelError.m */; }; + 01D68A3C1E421BB300CFE82F /* JSONModelError.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC6B1B19A5B600D79B06 /* JSONModelError.m */; }; + 01D68A3D1E421BB600CFE82F /* JSONAPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC711B19A5B600D79B06 /* JSONAPI.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01D68A3E1E421BB900CFE82F /* JSONAPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC711B19A5B600D79B06 /* JSONAPI.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01D68A3F1E421BBE00CFE82F /* JSONAPI.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC721B19A5B600D79B06 /* JSONAPI.m */; }; + 01D68A401E421BBE00CFE82F /* JSONAPI.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC721B19A5B600D79B06 /* JSONAPI.m */; }; + 01D68A411E421BC100CFE82F /* JSONHTTPClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC731B19A5B600D79B06 /* JSONHTTPClient.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01D68A421E421BC300CFE82F /* JSONHTTPClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC731B19A5B600D79B06 /* JSONHTTPClient.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01D68A431E421BC800CFE82F /* JSONHTTPClient.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC741B19A5B600D79B06 /* JSONHTTPClient.m */; }; + 01D68A441E421BC800CFE82F /* JSONHTTPClient.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC741B19A5B600D79B06 /* JSONHTTPClient.m */; }; + 01D68A451E421BCB00CFE82F /* JSONModel+networking.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC751B19A5B600D79B06 /* JSONModel+networking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01D68A461E421BCD00CFE82F /* JSONModel+networking.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC751B19A5B600D79B06 /* JSONModel+networking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01D68A471E421BD200CFE82F /* JSONModel+networking.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC761B19A5B600D79B06 /* JSONModel+networking.m */; }; + 01D68A481E421BD200CFE82F /* JSONModel+networking.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC761B19A5B600D79B06 /* JSONModel+networking.m */; }; + 01D68A491E421BD500CFE82F /* JSONKeyMapper.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC781B19A5B600D79B06 /* JSONKeyMapper.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01D68A4A1E421BD800CFE82F /* JSONKeyMapper.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC781B19A5B600D79B06 /* JSONKeyMapper.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01D68A4B1E421BDD00CFE82F /* JSONKeyMapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC791B19A5B600D79B06 /* JSONKeyMapper.m */; }; + 01D68A4C1E421BDD00CFE82F /* JSONKeyMapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC791B19A5B600D79B06 /* JSONKeyMapper.m */; }; + 01D68A4D1E421BE000CFE82F /* JSONValueTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC7A1B19A5B600D79B06 /* JSONValueTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01D68A4E1E421BE300CFE82F /* JSONValueTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC7A1B19A5B600D79B06 /* JSONValueTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01D68A4F1E421BE900CFE82F /* JSONValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC7B1B19A5B600D79B06 /* JSONValueTransformer.m */; }; + 01D68A501E421BE900CFE82F /* JSONValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC7B1B19A5B600D79B06 /* JSONValueTransformer.m */; }; + 92C9BC7C1B19A5B600D79B06 /* JSONModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC641B19A5B600D79B06 /* JSONModel.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 92C9BC7D1B19A5B600D79B06 /* JSONModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC651B19A5B600D79B06 /* JSONModel.m */; }; + 92C9BC801B19A5B600D79B06 /* JSONModelClassProperty.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC681B19A5B600D79B06 /* JSONModelClassProperty.h */; }; + 92C9BC811B19A5B600D79B06 /* JSONModelClassProperty.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC691B19A5B600D79B06 /* JSONModelClassProperty.m */; }; + 92C9BC821B19A5B600D79B06 /* JSONModelError.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC6A1B19A5B600D79B06 /* JSONModelError.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 92C9BC831B19A5B600D79B06 /* JSONModelError.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC6B1B19A5B600D79B06 /* JSONModelError.m */; }; + 92C9BC861B19A5B600D79B06 /* JSONModelLib.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC6F1B19A5B600D79B06 /* JSONModelLib.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 92C9BC871B19A5B600D79B06 /* JSONAPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC711B19A5B600D79B06 /* JSONAPI.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 92C9BC881B19A5B600D79B06 /* JSONAPI.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC721B19A5B600D79B06 /* JSONAPI.m */; }; + 92C9BC891B19A5B600D79B06 /* JSONHTTPClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC731B19A5B600D79B06 /* JSONHTTPClient.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 92C9BC8A1B19A5B600D79B06 /* JSONHTTPClient.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC741B19A5B600D79B06 /* JSONHTTPClient.m */; }; + 92C9BC8B1B19A5B600D79B06 /* JSONModel+networking.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC751B19A5B600D79B06 /* JSONModel+networking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 92C9BC8C1B19A5B600D79B06 /* JSONModel+networking.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC761B19A5B600D79B06 /* JSONModel+networking.m */; }; + 92C9BC8D1B19A5B600D79B06 /* JSONKeyMapper.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC781B19A5B600D79B06 /* JSONKeyMapper.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 92C9BC8E1B19A5B600D79B06 /* JSONKeyMapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC791B19A5B600D79B06 /* JSONKeyMapper.m */; }; + 92C9BC8F1B19A5B600D79B06 /* JSONValueTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9BC7A1B19A5B600D79B06 /* JSONValueTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 92C9BC901B19A5B600D79B06 /* JSONValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C9BC7B1B19A5B600D79B06 /* JSONValueTransformer.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 01D689FB1E42150100CFE82F /* JSONModel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = JSONModel.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 01D689FE1E42150100CFE82F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; + 01D68A1A1E421A8400CFE82F /* JSONModel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = JSONModel.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 01D68A1D1E421A8500CFE82F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; + 01D68A271E421AC100CFE82F /* JSONModel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = JSONModel.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 01D68A2A1E421AC100CFE82F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; + 92C9BC3D1B19A51100D79B06 /* JSONModel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = JSONModel.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 92C9BC411B19A51100D79B06 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; + 92C9BC641B19A5B600D79B06 /* JSONModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSONModel.h; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 92C9BC651B19A5B600D79B06 /* JSONModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSONModel.m; sourceTree = "<group>"; }; + 92C9BC681B19A5B600D79B06 /* JSONModelClassProperty.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSONModelClassProperty.h; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 92C9BC691B19A5B600D79B06 /* JSONModelClassProperty.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSONModelClassProperty.m; sourceTree = "<group>"; }; + 92C9BC6A1B19A5B600D79B06 /* JSONModelError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSONModelError.h; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 92C9BC6B1B19A5B600D79B06 /* JSONModelError.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSONModelError.m; sourceTree = "<group>"; }; + 92C9BC6F1B19A5B600D79B06 /* JSONModelLib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSONModelLib.h; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 92C9BC711B19A5B600D79B06 /* JSONAPI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSONAPI.h; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 92C9BC721B19A5B600D79B06 /* JSONAPI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSONAPI.m; sourceTree = "<group>"; }; + 92C9BC731B19A5B600D79B06 /* JSONHTTPClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSONHTTPClient.h; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 92C9BC741B19A5B600D79B06 /* JSONHTTPClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSONHTTPClient.m; sourceTree = "<group>"; }; + 92C9BC751B19A5B600D79B06 /* JSONModel+networking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "JSONModel+networking.h"; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 92C9BC761B19A5B600D79B06 /* JSONModel+networking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "JSONModel+networking.m"; sourceTree = "<group>"; }; + 92C9BC781B19A5B600D79B06 /* JSONKeyMapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSONKeyMapper.h; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 92C9BC791B19A5B600D79B06 /* JSONKeyMapper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSONKeyMapper.m; sourceTree = "<group>"; }; + 92C9BC7A1B19A5B600D79B06 /* JSONValueTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSONValueTransformer.h; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 92C9BC7B1B19A5B600D79B06 /* JSONValueTransformer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSONValueTransformer.m; sourceTree = "<group>"; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 01D689F71E42150100CFE82F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 01D68A161E421A8400CFE82F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 01D68A231E421AC100CFE82F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 92C9BC391B19A51100D79B06 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 01D689FC1E42150100CFE82F /* JSONModel-mac */ = { + isa = PBXGroup; + children = ( + 01D689FE1E42150100CFE82F /* Info.plist */, + ); + path = "JSONModel-mac"; + sourceTree = "<group>"; + }; + 01D68A1B1E421A8400CFE82F /* JSONModel-watchOS */ = { + isa = PBXGroup; + children = ( + 01D68A1D1E421A8500CFE82F /* Info.plist */, + ); + path = "JSONModel-watchOS"; + sourceTree = "<group>"; + }; + 01D68A281E421AC100CFE82F /* JSONModel-tvOS */ = { + isa = PBXGroup; + children = ( + 01D68A2A1E421AC100CFE82F /* Info.plist */, + ); + path = "JSONModel-tvOS"; + sourceTree = "<group>"; + }; + 1A5B9D3F1D1C8D72006FE4B1 /* JSONModel */ = { + isa = PBXGroup; + children = ( + 92C9BC411B19A51100D79B06 /* Info.plist */, + 92C9BC6F1B19A5B600D79B06 /* JSONModelLib.h */, + 92C9BC631B19A5B600D79B06 /* JSONModel */, + 92C9BC701B19A5B600D79B06 /* JSONModelNetworking */, + 92C9BC771B19A5B600D79B06 /* JSONModelTransformations */, + ); + path = JSONModel; + sourceTree = "<group>"; + }; + 92C9BC331B19A51100D79B06 = { + isa = PBXGroup; + children = ( + 1A5B9D3F1D1C8D72006FE4B1 /* JSONModel */, + 01D689FC1E42150100CFE82F /* JSONModel-mac */, + 01D68A1B1E421A8400CFE82F /* JSONModel-watchOS */, + 01D68A281E421AC100CFE82F /* JSONModel-tvOS */, + 92C9BC3E1B19A51100D79B06 /* Products */, + ); + indentWidth = 4; + sourceTree = "<group>"; + tabWidth = 4; + usesTabs = 0; + }; + 92C9BC3E1B19A51100D79B06 /* Products */ = { + isa = PBXGroup; + children = ( + 92C9BC3D1B19A51100D79B06 /* JSONModel.framework */, + 01D689FB1E42150100CFE82F /* JSONModel.framework */, + 01D68A1A1E421A8400CFE82F /* JSONModel.framework */, + 01D68A271E421AC100CFE82F /* JSONModel.framework */, + ); + name = Products; + sourceTree = "<group>"; + }; + 92C9BC631B19A5B600D79B06 /* JSONModel */ = { + isa = PBXGroup; + children = ( + 92C9BC641B19A5B600D79B06 /* JSONModel.h */, + 92C9BC651B19A5B600D79B06 /* JSONModel.m */, + 92C9BC681B19A5B600D79B06 /* JSONModelClassProperty.h */, + 92C9BC691B19A5B600D79B06 /* JSONModelClassProperty.m */, + 92C9BC6A1B19A5B600D79B06 /* JSONModelError.h */, + 92C9BC6B1B19A5B600D79B06 /* JSONModelError.m */, + ); + path = JSONModel; + sourceTree = "<group>"; + }; + 92C9BC701B19A5B600D79B06 /* JSONModelNetworking */ = { + isa = PBXGroup; + children = ( + 92C9BC711B19A5B600D79B06 /* JSONAPI.h */, + 92C9BC721B19A5B600D79B06 /* JSONAPI.m */, + 92C9BC731B19A5B600D79B06 /* JSONHTTPClient.h */, + 92C9BC741B19A5B600D79B06 /* JSONHTTPClient.m */, + 92C9BC751B19A5B600D79B06 /* JSONModel+networking.h */, + 92C9BC761B19A5B600D79B06 /* JSONModel+networking.m */, + ); + path = JSONModelNetworking; + sourceTree = "<group>"; + }; + 92C9BC771B19A5B600D79B06 /* JSONModelTransformations */ = { + isa = PBXGroup; + children = ( + 92C9BC781B19A5B600D79B06 /* JSONKeyMapper.h */, + 92C9BC791B19A5B600D79B06 /* JSONKeyMapper.m */, + 92C9BC7A1B19A5B600D79B06 /* JSONValueTransformer.h */, + 92C9BC7B1B19A5B600D79B06 /* JSONValueTransformer.m */, + ); + path = JSONModelTransformations; + sourceTree = "<group>"; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 01D689F81E42150100CFE82F /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 01D68A061E4219C800CFE82F /* JSONModelClassProperty.h in Headers */, + 01D68A041E4219BE00CFE82F /* JSONModel.h in Headers */, + 01D68A0E1E4219E900CFE82F /* JSONModel+networking.h in Headers */, + 01D68A101E4219F100CFE82F /* JSONKeyMapper.h in Headers */, + 01D68A031E4219B800CFE82F /* JSONModelLib.h in Headers */, + 01D68A081E4219D000CFE82F /* JSONModelError.h in Headers */, + 01D68A0A1E4219DA00CFE82F /* JSONAPI.h in Headers */, + 01D68A121E4219F900CFE82F /* JSONValueTransformer.h in Headers */, + 01D68A0C1E4219E100CFE82F /* JSONHTTPClient.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 01D68A171E421A8400CFE82F /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 01D68A351E421BA500CFE82F /* JSONModelClassProperty.h in Headers */, + 01D68A311E421B9A00CFE82F /* JSONModel.h in Headers */, + 01D68A451E421BCB00CFE82F /* JSONModel+networking.h in Headers */, + 01D68A491E421BD500CFE82F /* JSONKeyMapper.h in Headers */, + 01D68A2F1E421B9000CFE82F /* JSONModelLib.h in Headers */, + 01D68A391E421BAB00CFE82F /* JSONModelError.h in Headers */, + 01D68A3D1E421BB600CFE82F /* JSONAPI.h in Headers */, + 01D68A4D1E421BE000CFE82F /* JSONValueTransformer.h in Headers */, + 01D68A411E421BC100CFE82F /* JSONHTTPClient.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 01D68A241E421AC100CFE82F /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 01D68A361E421BA500CFE82F /* JSONModelClassProperty.h in Headers */, + 01D68A321E421B9C00CFE82F /* JSONModel.h in Headers */, + 01D68A461E421BCD00CFE82F /* JSONModel+networking.h in Headers */, + 01D68A4A1E421BD800CFE82F /* JSONKeyMapper.h in Headers */, + 01D68A301E421B9300CFE82F /* JSONModelLib.h in Headers */, + 01D68A3A1E421BAE00CFE82F /* JSONModelError.h in Headers */, + 01D68A3E1E421BB900CFE82F /* JSONAPI.h in Headers */, + 01D68A4E1E421BE300CFE82F /* JSONValueTransformer.h in Headers */, + 01D68A421E421BC300CFE82F /* JSONHTTPClient.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 92C9BC3A1B19A51100D79B06 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 92C9BC8B1B19A5B600D79B06 /* JSONModel+networking.h in Headers */, + 92C9BC861B19A5B600D79B06 /* JSONModelLib.h in Headers */, + 92C9BC8F1B19A5B600D79B06 /* JSONValueTransformer.h in Headers */, + 92C9BC801B19A5B600D79B06 /* JSONModelClassProperty.h in Headers */, + 92C9BC871B19A5B600D79B06 /* JSONAPI.h in Headers */, + 92C9BC7C1B19A5B600D79B06 /* JSONModel.h in Headers */, + 92C9BC821B19A5B600D79B06 /* JSONModelError.h in Headers */, + 92C9BC891B19A5B600D79B06 /* JSONHTTPClient.h in Headers */, + 92C9BC8D1B19A5B600D79B06 /* JSONKeyMapper.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 01D689FA1E42150100CFE82F /* JSONModel-mac */ = { + isa = PBXNativeTarget; + buildConfigurationList = 01D68A021E42150100CFE82F /* Build configuration list for PBXNativeTarget "JSONModel-mac" */; + buildPhases = ( + 01D689F61E42150100CFE82F /* Sources */, + 01D689F71E42150100CFE82F /* Frameworks */, + 01D689F81E42150100CFE82F /* Headers */, + 01D689F91E42150100CFE82F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "JSONModel-mac"; + productName = "JSONModel-mac"; + productReference = 01D689FB1E42150100CFE82F /* JSONModel.framework */; + productType = "com.apple.product-type.framework"; + }; + 01D68A191E421A8400CFE82F /* JSONModel-watchOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 01D68A1F1E421A8500CFE82F /* Build configuration list for PBXNativeTarget "JSONModel-watchOS" */; + buildPhases = ( + 01D68A151E421A8400CFE82F /* Sources */, + 01D68A161E421A8400CFE82F /* Frameworks */, + 01D68A171E421A8400CFE82F /* Headers */, + 01D68A181E421A8400CFE82F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "JSONModel-watchOS"; + productName = "JSONModel-watchOS"; + productReference = 01D68A1A1E421A8400CFE82F /* JSONModel.framework */; + productType = "com.apple.product-type.framework"; + }; + 01D68A261E421AC100CFE82F /* JSONModel-tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 01D68A2C1E421AC100CFE82F /* Build configuration list for PBXNativeTarget "JSONModel-tvOS" */; + buildPhases = ( + 01D68A221E421AC100CFE82F /* Sources */, + 01D68A231E421AC100CFE82F /* Frameworks */, + 01D68A241E421AC100CFE82F /* Headers */, + 01D68A251E421AC100CFE82F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "JSONModel-tvOS"; + productName = "JSONModel-tvOS"; + productReference = 01D68A271E421AC100CFE82F /* JSONModel.framework */; + productType = "com.apple.product-type.framework"; + }; + 92C9BC3C1B19A51100D79B06 /* JSONModel */ = { + isa = PBXNativeTarget; + buildConfigurationList = 92C9BC531B19A51100D79B06 /* Build configuration list for PBXNativeTarget "JSONModel" */; + buildPhases = ( + 92C9BC381B19A51100D79B06 /* Sources */, + 92C9BC391B19A51100D79B06 /* Frameworks */, + 92C9BC3A1B19A51100D79B06 /* Headers */, + 92C9BC3B1B19A51100D79B06 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = JSONModel; + productName = JSONModel; + productReference = 92C9BC3D1B19A51100D79B06 /* JSONModel.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 92C9BC341B19A51100D79B06 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0720; + ORGANIZATIONNAME = com.jsonmodel; + TargetAttributes = { + 01D689FA1E42150100CFE82F = { + CreatedOnToolsVersion = 8.2.1; + ProvisioningStyle = Automatic; + }; + 01D68A191E421A8400CFE82F = { + CreatedOnToolsVersion = 8.2.1; + ProvisioningStyle = Automatic; + }; + 01D68A261E421AC100CFE82F = { + CreatedOnToolsVersion = 8.2.1; + ProvisioningStyle = Automatic; + }; + 92C9BC3C1B19A51100D79B06 = { + CreatedOnToolsVersion = 6.3.1; + }; + }; + }; + buildConfigurationList = 92C9BC371B19A51100D79B06 /* Build configuration list for PBXProject "JSONModel" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 92C9BC331B19A51100D79B06; + productRefGroup = 92C9BC3E1B19A51100D79B06 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 92C9BC3C1B19A51100D79B06 /* JSONModel */, + 01D689FA1E42150100CFE82F /* JSONModel-mac */, + 01D68A191E421A8400CFE82F /* JSONModel-watchOS */, + 01D68A261E421AC100CFE82F /* JSONModel-tvOS */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 01D689F91E42150100CFE82F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 01D68A181E421A8400CFE82F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 01D68A251E421AC100CFE82F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 92C9BC3B1B19A51100D79B06 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 01D689F61E42150100CFE82F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 01D68A0D1E4219E600CFE82F /* JSONHTTPClient.m in Sources */, + 01D68A0F1E4219ED00CFE82F /* JSONModel+networking.m in Sources */, + 01D68A0B1E4219DF00CFE82F /* JSONAPI.m in Sources */, + 01D68A131E4219FE00CFE82F /* JSONValueTransformer.m in Sources */, + 01D68A091E4219D600CFE82F /* JSONModelError.m in Sources */, + 01D68A111E4219F600CFE82F /* JSONKeyMapper.m in Sources */, + 01D68A051E4219C300CFE82F /* JSONModel.m in Sources */, + 01D68A071E4219CC00CFE82F /* JSONModelClassProperty.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 01D68A151E421A8400CFE82F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 01D68A431E421BC800CFE82F /* JSONHTTPClient.m in Sources */, + 01D68A471E421BD200CFE82F /* JSONModel+networking.m in Sources */, + 01D68A3F1E421BBE00CFE82F /* JSONAPI.m in Sources */, + 01D68A4F1E421BE900CFE82F /* JSONValueTransformer.m in Sources */, + 01D68A3B1E421BB300CFE82F /* JSONModelError.m in Sources */, + 01D68A4B1E421BDD00CFE82F /* JSONKeyMapper.m in Sources */, + 01D68A331E421BA100CFE82F /* JSONModel.m in Sources */, + 01D68A371E421BA800CFE82F /* JSONModelClassProperty.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 01D68A221E421AC100CFE82F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 01D68A441E421BC800CFE82F /* JSONHTTPClient.m in Sources */, + 01D68A481E421BD200CFE82F /* JSONModel+networking.m in Sources */, + 01D68A401E421BBE00CFE82F /* JSONAPI.m in Sources */, + 01D68A501E421BE900CFE82F /* JSONValueTransformer.m in Sources */, + 01D68A3C1E421BB300CFE82F /* JSONModelError.m in Sources */, + 01D68A4C1E421BDD00CFE82F /* JSONKeyMapper.m in Sources */, + 01D68A341E421BA100CFE82F /* JSONModel.m in Sources */, + 01D68A381E421BA900CFE82F /* JSONModelClassProperty.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 92C9BC381B19A51100D79B06 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 92C9BC8A1B19A5B600D79B06 /* JSONHTTPClient.m in Sources */, + 92C9BC831B19A5B600D79B06 /* JSONModelError.m in Sources */, + 92C9BC901B19A5B600D79B06 /* JSONValueTransformer.m in Sources */, + 92C9BC8E1B19A5B600D79B06 /* JSONKeyMapper.m in Sources */, + 92C9BC881B19A5B600D79B06 /* JSONAPI.m in Sources */, + 92C9BC7D1B19A5B600D79B06 /* JSONModel.m in Sources */, + 92C9BC811B19A5B600D79B06 /* JSONModelClassProperty.m in Sources */, + 92C9BC8C1B19A5B600D79B06 /* JSONModel+networking.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 01D68A001E42150100CFE82F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = A; + INFOPLIST_FILE = "JSONModel-mac/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MODULEMAP_FILE = "$(SRCROOT)/JSONModel/JSONModel.modulemap"; + PRODUCT_BUNDLE_IDENTIFIER = "com.jsonmodel.JSONModel-mac"; + PRODUCT_NAME = "$(PROJECT_NAME)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 01D68A011E42150100CFE82F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = A; + INFOPLIST_FILE = "JSONModel-mac/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MODULEMAP_FILE = "$(SRCROOT)/JSONModel/JSONModel.modulemap"; + PRODUCT_BUNDLE_IDENTIFIER = "com.jsonmodel.JSONModel-mac"; + PRODUCT_NAME = "$(PROJECT_NAME)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + }; + name = Release; + }; + 01D68A201E421A8500CFE82F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = ""; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "JSONModel-watchOS/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "$(SRCROOT)/JSONModel/JSONModel.modulemap"; + PRODUCT_BUNDLE_IDENTIFIER = "com.jsonmodel.JSONModel-watchOS"; + PRODUCT_NAME = "$(PROJECT_NAME)"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 3.1; + }; + name = Debug; + }; + 01D68A211E421A8500CFE82F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "JSONModel-watchOS/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "$(SRCROOT)/JSONModel/JSONModel.modulemap"; + PRODUCT_BUNDLE_IDENTIFIER = "com.jsonmodel.JSONModel-watchOS"; + PRODUCT_NAME = "$(PROJECT_NAME)"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 3.1; + }; + name = Release; + }; + 01D68A2D1E421AC100CFE82F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = ""; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "JSONModel-tvOS/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "$(SRCROOT)/JSONModel/JSONModel.modulemap"; + PRODUCT_BUNDLE_IDENTIFIER = "com.jsonmodel.JSONModel-tvOS"; + PRODUCT_NAME = "$(PROJECT_NAME)"; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 10.1; + }; + name = Debug; + }; + 01D68A2E1E421AC100CFE82F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "JSONModel-tvOS/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "$(SRCROOT)/JSONModel/JSONModel.modulemap"; + PRODUCT_BUNDLE_IDENTIFIER = "com.jsonmodel.JSONModel-tvOS"; + PRODUCT_NAME = "$(PROJECT_NAME)"; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 10.1; + }; + name = Release; + }; + 92C9BC511B19A51100D79B06 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 92C9BC521B19A51100D79B06 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 92C9BC541B19A51100D79B06 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = JSONModel/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "$(SRCROOT)/JSONModel/JSONModel.modulemap"; + PRODUCT_BUNDLE_IDENTIFIER = com.jsonmodel.JSONModel; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 92C9BC551B19A51100D79B06 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = JSONModel/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "$(SRCROOT)/JSONModel/JSONModel.modulemap"; + PRODUCT_BUNDLE_IDENTIFIER = com.jsonmodel.JSONModel; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 01D68A021E42150100CFE82F /* Build configuration list for PBXNativeTarget "JSONModel-mac" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 01D68A001E42150100CFE82F /* Debug */, + 01D68A011E42150100CFE82F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 01D68A1F1E421A8500CFE82F /* Build configuration list for PBXNativeTarget "JSONModel-watchOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 01D68A201E421A8500CFE82F /* Debug */, + 01D68A211E421A8500CFE82F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 01D68A2C1E421AC100CFE82F /* Build configuration list for PBXNativeTarget "JSONModel-tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 01D68A2D1E421AC100CFE82F /* Debug */, + 01D68A2E1E421AC100CFE82F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 92C9BC371B19A51100D79B06 /* Build configuration list for PBXProject "JSONModel" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 92C9BC511B19A51100D79B06 /* Debug */, + 92C9BC521B19A51100D79B06 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 92C9BC531B19A51100D79B06 /* Build configuration list for PBXNativeTarget "JSONModel" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 92C9BC541B19A51100D79B06 /* Debug */, + 92C9BC551B19A51100D79B06 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 92C9BC341B19A51100D79B06 /* Project object */; +} diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModel.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModel.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100755 index 0000000..c00329a --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModel.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Workspace + version = "1.0"> + <FileRef + location = "self:JSONModel.xcodeproj"> + </FileRef> +</Workspace> diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModel.xcodeproj/xcshareddata/xcschemes/JSONModel-mac.xcscheme b/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModel.xcodeproj/xcshareddata/xcschemes/JSONModel-mac.xcscheme new file mode 100755 index 0000000..661532d --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModel.xcodeproj/xcshareddata/xcschemes/JSONModel-mac.xcscheme @@ -0,0 +1,80 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Scheme + LastUpgradeVersion = "0820" + version = "1.3"> + <BuildAction + parallelizeBuildables = "YES" + buildImplicitDependencies = "YES"> + <BuildActionEntries> + <BuildActionEntry + buildForTesting = "YES" + buildForRunning = "YES" + buildForProfiling = "YES" + buildForArchiving = "YES" + buildForAnalyzing = "YES"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "01D689FA1E42150100CFE82F" + BuildableName = "JSONModel.framework" + BlueprintName = "JSONModel-mac" + ReferencedContainer = "container:JSONModel.xcodeproj"> + </BuildableReference> + </BuildActionEntry> + </BuildActionEntries> + </BuildAction> + <TestAction + buildConfiguration = "Debug" + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + shouldUseLaunchSchemeArgsEnv = "YES"> + <Testables> + </Testables> + <AdditionalOptions> + </AdditionalOptions> + </TestAction> + <LaunchAction + buildConfiguration = "Debug" + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + launchStyle = "0" + useCustomWorkingDirectory = "NO" + ignoresPersistentStateOnLaunch = "NO" + debugDocumentVersioning = "YES" + debugServiceExtension = "internal" + allowLocationSimulation = "YES"> + <MacroExpansion> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "01D689FA1E42150100CFE82F" + BuildableName = "JSONModel.framework" + BlueprintName = "JSONModel-mac" + ReferencedContainer = "container:JSONModel.xcodeproj"> + </BuildableReference> + </MacroExpansion> + <AdditionalOptions> + </AdditionalOptions> + </LaunchAction> + <ProfileAction + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES" + savedToolIdentifier = "" + useCustomWorkingDirectory = "NO" + debugDocumentVersioning = "YES"> + <MacroExpansion> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "01D689FA1E42150100CFE82F" + BuildableName = "JSONModel.framework" + BlueprintName = "JSONModel-mac" + ReferencedContainer = "container:JSONModel.xcodeproj"> + </BuildableReference> + </MacroExpansion> + </ProfileAction> + <AnalyzeAction + buildConfiguration = "Debug"> + </AnalyzeAction> + <ArchiveAction + buildConfiguration = "Release" + revealArchiveInOrganizer = "YES"> + </ArchiveAction> +</Scheme> diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModel.xcodeproj/xcshareddata/xcschemes/JSONModel-tvOS.xcscheme b/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModel.xcodeproj/xcshareddata/xcschemes/JSONModel-tvOS.xcscheme new file mode 100755 index 0000000..8cac74c --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModel.xcodeproj/xcshareddata/xcschemes/JSONModel-tvOS.xcscheme @@ -0,0 +1,80 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Scheme + LastUpgradeVersion = "0820" + version = "1.3"> + <BuildAction + parallelizeBuildables = "YES" + buildImplicitDependencies = "YES"> + <BuildActionEntries> + <BuildActionEntry + buildForTesting = "YES" + buildForRunning = "YES" + buildForProfiling = "YES" + buildForArchiving = "YES" + buildForAnalyzing = "YES"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "01D68A261E421AC100CFE82F" + BuildableName = "JSONModel.framework" + BlueprintName = "JSONModel-tvOS" + ReferencedContainer = "container:JSONModel.xcodeproj"> + </BuildableReference> + </BuildActionEntry> + </BuildActionEntries> + </BuildAction> + <TestAction + buildConfiguration = "Debug" + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + shouldUseLaunchSchemeArgsEnv = "YES"> + <Testables> + </Testables> + <AdditionalOptions> + </AdditionalOptions> + </TestAction> + <LaunchAction + buildConfiguration = "Debug" + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + launchStyle = "0" + useCustomWorkingDirectory = "NO" + ignoresPersistentStateOnLaunch = "NO" + debugDocumentVersioning = "YES" + debugServiceExtension = "internal" + allowLocationSimulation = "YES"> + <MacroExpansion> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "01D68A261E421AC100CFE82F" + BuildableName = "JSONModel.framework" + BlueprintName = "JSONModel-tvOS" + ReferencedContainer = "container:JSONModel.xcodeproj"> + </BuildableReference> + </MacroExpansion> + <AdditionalOptions> + </AdditionalOptions> + </LaunchAction> + <ProfileAction + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES" + savedToolIdentifier = "" + useCustomWorkingDirectory = "NO" + debugDocumentVersioning = "YES"> + <MacroExpansion> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "01D68A261E421AC100CFE82F" + BuildableName = "JSONModel.framework" + BlueprintName = "JSONModel-tvOS" + ReferencedContainer = "container:JSONModel.xcodeproj"> + </BuildableReference> + </MacroExpansion> + </ProfileAction> + <AnalyzeAction + buildConfiguration = "Debug"> + </AnalyzeAction> + <ArchiveAction + buildConfiguration = "Release" + revealArchiveInOrganizer = "YES"> + </ArchiveAction> +</Scheme> diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModel.xcodeproj/xcshareddata/xcschemes/JSONModel-watchOS.xcscheme b/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModel.xcodeproj/xcshareddata/xcschemes/JSONModel-watchOS.xcscheme new file mode 100755 index 0000000..0221e06 --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModel.xcodeproj/xcshareddata/xcschemes/JSONModel-watchOS.xcscheme @@ -0,0 +1,80 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Scheme + LastUpgradeVersion = "0820" + version = "1.3"> + <BuildAction + parallelizeBuildables = "YES" + buildImplicitDependencies = "YES"> + <BuildActionEntries> + <BuildActionEntry + buildForTesting = "YES" + buildForRunning = "YES" + buildForProfiling = "YES" + buildForArchiving = "YES" + buildForAnalyzing = "YES"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "01D68A191E421A8400CFE82F" + BuildableName = "JSONModel.framework" + BlueprintName = "JSONModel-watchOS" + ReferencedContainer = "container:JSONModel.xcodeproj"> + </BuildableReference> + </BuildActionEntry> + </BuildActionEntries> + </BuildAction> + <TestAction + buildConfiguration = "Debug" + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + shouldUseLaunchSchemeArgsEnv = "YES"> + <Testables> + </Testables> + <AdditionalOptions> + </AdditionalOptions> + </TestAction> + <LaunchAction + buildConfiguration = "Debug" + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + launchStyle = "0" + useCustomWorkingDirectory = "NO" + ignoresPersistentStateOnLaunch = "NO" + debugDocumentVersioning = "YES" + debugServiceExtension = "internal" + allowLocationSimulation = "YES"> + <MacroExpansion> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "01D68A191E421A8400CFE82F" + BuildableName = "JSONModel.framework" + BlueprintName = "JSONModel-watchOS" + ReferencedContainer = "container:JSONModel.xcodeproj"> + </BuildableReference> + </MacroExpansion> + <AdditionalOptions> + </AdditionalOptions> + </LaunchAction> + <ProfileAction + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES" + savedToolIdentifier = "" + useCustomWorkingDirectory = "NO" + debugDocumentVersioning = "YES"> + <MacroExpansion> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "01D68A191E421A8400CFE82F" + BuildableName = "JSONModel.framework" + BlueprintName = "JSONModel-watchOS" + ReferencedContainer = "container:JSONModel.xcodeproj"> + </BuildableReference> + </MacroExpansion> + </ProfileAction> + <AnalyzeAction + buildConfiguration = "Debug"> + </AnalyzeAction> + <ArchiveAction + buildConfiguration = "Release" + revealArchiveInOrganizer = "YES"> + </ArchiveAction> +</Scheme> diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModel.xcodeproj/xcshareddata/xcschemes/JSONModel.xcscheme b/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModel.xcodeproj/xcshareddata/xcschemes/JSONModel.xcscheme new file mode 100755 index 0000000..ca3fb1a --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModel.xcodeproj/xcshareddata/xcschemes/JSONModel.xcscheme @@ -0,0 +1,113 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Scheme + LastUpgradeVersion = "0720" + version = "1.3"> + <BuildAction + parallelizeBuildables = "YES" + buildImplicitDependencies = "YES"> + <BuildActionEntries> + <BuildActionEntry + buildForTesting = "YES" + buildForRunning = "YES" + buildForProfiling = "YES" + buildForArchiving = "YES" + buildForAnalyzing = "YES"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "92C9BC3C1B19A51100D79B06" + BuildableName = "JSONModel.framework" + BlueprintName = "JSONModel" + ReferencedContainer = "container:JSONModel.xcodeproj"> + </BuildableReference> + </BuildActionEntry> + <BuildActionEntry + buildForTesting = "YES" + buildForRunning = "YES" + buildForProfiling = "NO" + buildForArchiving = "NO" + buildForAnalyzing = "YES"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "92C9BC471B19A51100D79B06" + BuildableName = "JSONModelTests.xctest" + BlueprintName = "JSONModelTests" + ReferencedContainer = "container:JSONModel.xcodeproj"> + </BuildableReference> + </BuildActionEntry> + </BuildActionEntries> + </BuildAction> + <TestAction + buildConfiguration = "Debug" + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + shouldUseLaunchSchemeArgsEnv = "YES"> + <Testables> + <TestableReference + skipped = "NO"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "92C9BC471B19A51100D79B06" + BuildableName = "JSONModelTests.xctest" + BlueprintName = "JSONModelTests" + ReferencedContainer = "container:JSONModel.xcodeproj"> + </BuildableReference> + </TestableReference> + </Testables> + <MacroExpansion> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "92C9BC3C1B19A51100D79B06" + BuildableName = "JSONModel.framework" + BlueprintName = "JSONModel" + ReferencedContainer = "container:JSONModel.xcodeproj"> + </BuildableReference> + </MacroExpansion> + <AdditionalOptions> + </AdditionalOptions> + </TestAction> + <LaunchAction + buildConfiguration = "Debug" + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + launchStyle = "0" + useCustomWorkingDirectory = "NO" + ignoresPersistentStateOnLaunch = "NO" + debugDocumentVersioning = "YES" + debugServiceExtension = "internal" + allowLocationSimulation = "YES"> + <MacroExpansion> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "92C9BC3C1B19A51100D79B06" + BuildableName = "JSONModel.framework" + BlueprintName = "JSONModel" + ReferencedContainer = "container:JSONModel.xcodeproj"> + </BuildableReference> + </MacroExpansion> + <AdditionalOptions> + </AdditionalOptions> + </LaunchAction> + <ProfileAction + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES" + savedToolIdentifier = "" + useCustomWorkingDirectory = "NO" + debugDocumentVersioning = "YES"> + <MacroExpansion> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "92C9BC3C1B19A51100D79B06" + BuildableName = "JSONModel.framework" + BlueprintName = "JSONModel" + ReferencedContainer = "container:JSONModel.xcodeproj"> + </BuildableReference> + </MacroExpansion> + </ProfileAction> + <AnalyzeAction + buildConfiguration = "Debug"> + </AnalyzeAction> + <ArchiveAction + buildConfiguration = "Release" + revealArchiveInOrganizer = "YES"> + </ArchiveAction> +</Scheme> diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModelClassProperty.h b/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModelClassProperty.h new file mode 100755 index 0000000..67405ab --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModelClassProperty.h @@ -0,0 +1,48 @@ +// +// JSONModelClassProperty.h +// JSONModel +// + +#import <Foundation/Foundation.h> + +/** + * **You do not need to instantiate this class yourself.** This class is used internally by JSONModel + * to inspect the declared properties of your model class. + * + * Class to contain the information, representing a class property + * It features the property's name, type, whether it's a required property, + * and (optionally) the class protocol + */ +@interface JSONModelClassProperty : NSObject + +// deprecated +@property (assign, nonatomic) BOOL isIndex DEPRECATED_ATTRIBUTE; + +/** The name of the declared property (not the ivar name) */ +@property (copy, nonatomic) NSString *name; + +/** A property class type */ +@property (assign, nonatomic) Class type; + +/** Struct name if a struct */ +@property (strong, nonatomic) NSString *structName; + +/** The name of the protocol the property conforms to (or nil) */ +@property (copy, nonatomic) NSString *protocol; + +/** If YES, it can be missing in the input data, and the input would be still valid */ +@property (assign, nonatomic) BOOL isOptional; + +/** If YES - don't call any transformers on this property's value */ +@property (assign, nonatomic) BOOL isStandardJSONType; + +/** If YES - create a mutable object for the value of the property */ +@property (assign, nonatomic) BOOL isMutable; + +/** a custom getter for this property, found in the owning model */ +@property (assign, nonatomic) SEL customGetter; + +/** custom setters for this property, found in the owning model */ +@property (strong, nonatomic) NSMutableDictionary *customSetters; + +@end diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModelClassProperty.m b/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModelClassProperty.m new file mode 100755 index 0000000..5330c92 --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModelClassProperty.m @@ -0,0 +1,53 @@ +// +// JSONModelClassProperty.m +// JSONModel +// + +#import "JSONModelClassProperty.h" + +@implementation JSONModelClassProperty + +-(NSString*)description +{ + //build the properties string for the current class property + NSMutableArray* properties = [NSMutableArray arrayWithCapacity:8]; + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + if (self.isIndex) [properties addObject:@"Index"]; +#pragma GCC diagnostic pop + + if (self.isOptional) [properties addObject:@"Optional"]; + if (self.isMutable) [properties addObject:@"Mutable"]; + if (self.isStandardJSONType) [properties addObject:@"Standard JSON type"]; + if (self.customGetter) [properties addObject:[NSString stringWithFormat: @"Getter = %@", NSStringFromSelector(self.customGetter)]]; + + if (self.customSetters) + { + NSMutableArray *setters = [NSMutableArray array]; + + for (id obj in self.customSetters.allValues) + { + SEL selector; + [obj getValue:&selector]; + [setters addObject:NSStringFromSelector(selector)]; + } + + [properties addObject:[NSString stringWithFormat: @"Setters = [%@]", [setters componentsJoinedByString:@", "]]]; + } + + NSString* propertiesString = @""; + if (properties.count>0) { + propertiesString = [NSString stringWithFormat:@"(%@)", [properties componentsJoinedByString:@", "]]; + } + + //return the name, type and additional properties + return [NSString stringWithFormat:@"@property %@%@ %@ %@", + self.type?[NSString stringWithFormat:@"%@*",self.type]:(self.structName?self.structName:@"primitive"), + self.protocol?[NSString stringWithFormat:@"<%@>", self.protocol]:@"", + self.name, + propertiesString + ]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModelError.h b/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModelError.h new file mode 100755 index 0000000..266e6cc --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModelError.h @@ -0,0 +1,103 @@ +// +// JSONModelError.h +// JSONModel +// + +#import <Foundation/Foundation.h> + +///////////////////////////////////////////////////////////////////////////////////////////// +typedef NS_ENUM(int, kJSONModelErrorTypes) +{ + kJSONModelErrorInvalidData = 1, + kJSONModelErrorBadResponse = 2, + kJSONModelErrorBadJSON = 3, + kJSONModelErrorModelIsInvalid = 4, + kJSONModelErrorNilInput = 5 +}; + +///////////////////////////////////////////////////////////////////////////////////////////// +/** The domain name used for the JSONModelError instances */ +extern NSString *const JSONModelErrorDomain; + +/** + * If the model JSON input misses keys that are required, check the + * userInfo dictionary of the JSONModelError instance you get back - + * under the kJSONModelMissingKeys key you will find a list of the + * names of the missing keys. + */ +extern NSString *const kJSONModelMissingKeys; + +/** + * If JSON input has a different type than expected by the model, check the + * userInfo dictionary of the JSONModelError instance you get back - + * under the kJSONModelTypeMismatch key you will find a description + * of the mismatched types. + */ +extern NSString *const kJSONModelTypeMismatch; + +/** + * If an error occurs in a nested model, check the userInfo dictionary of + * the JSONModelError instance you get back - under the kJSONModelKeyPath + * key you will find key-path at which the error occurred. + */ +extern NSString *const kJSONModelKeyPath; + +///////////////////////////////////////////////////////////////////////////////////////////// +/** + * Custom NSError subclass with shortcut methods for creating + * the common JSONModel errors + */ +@interface JSONModelError : NSError + +@property (strong, nonatomic) NSHTTPURLResponse *httpResponse; + +@property (strong, nonatomic) NSData *responseData; + +/** + * Creates a JSONModelError instance with code kJSONModelErrorInvalidData = 1 + */ ++ (id)errorInvalidDataWithMessage:(NSString *)message; + +/** + * Creates a JSONModelError instance with code kJSONModelErrorInvalidData = 1 + * @param keys a set of field names that were required, but not found in the input + */ ++ (id)errorInvalidDataWithMissingKeys:(NSSet *)keys; + +/** + * Creates a JSONModelError instance with code kJSONModelErrorInvalidData = 1 + * @param mismatchDescription description of the type mismatch that was encountered. + */ ++ (id)errorInvalidDataWithTypeMismatch:(NSString *)mismatchDescription; + +/** + * Creates a JSONModelError instance with code kJSONModelErrorBadResponse = 2 + */ ++ (id)errorBadResponse; + +/** + * Creates a JSONModelError instance with code kJSONModelErrorBadJSON = 3 + */ ++ (id)errorBadJSON; + +/** + * Creates a JSONModelError instance with code kJSONModelErrorModelIsInvalid = 4 + */ ++ (id)errorModelIsInvalid; + +/** + * Creates a JSONModelError instance with code kJSONModelErrorNilInput = 5 + */ ++ (id)errorInputIsNil; + +/** + * Creates a new JSONModelError with the same values plus information about the key-path of the error. + * Properties in the new error object are the same as those from the receiver, + * except that a new key kJSONModelKeyPath is added to the userInfo dictionary. + * This key contains the component string parameter. If the key is already present + * then the new error object has the component string prepended to the existing value. + */ +- (instancetype)errorByPrependingKeyPathComponent:(NSString *)component; + +///////////////////////////////////////////////////////////////////////////////////////////// +@end diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModelError.m b/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModelError.m new file mode 100755 index 0000000..f357e70 --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/JSONModelError.m @@ -0,0 +1,82 @@ +// +// JSONModelError.m +// JSONModel +// + +#import "JSONModelError.h" + +NSString* const JSONModelErrorDomain = @"JSONModelErrorDomain"; +NSString* const kJSONModelMissingKeys = @"kJSONModelMissingKeys"; +NSString* const kJSONModelTypeMismatch = @"kJSONModelTypeMismatch"; +NSString* const kJSONModelKeyPath = @"kJSONModelKeyPath"; + +@implementation JSONModelError + ++(id)errorInvalidDataWithMessage:(NSString*)message +{ + message = [NSString stringWithFormat:@"Invalid JSON data: %@", message]; + return [JSONModelError errorWithDomain:JSONModelErrorDomain + code:kJSONModelErrorInvalidData + userInfo:@{NSLocalizedDescriptionKey:message}]; +} + ++(id)errorInvalidDataWithMissingKeys:(NSSet *)keys +{ + return [JSONModelError errorWithDomain:JSONModelErrorDomain + code:kJSONModelErrorInvalidData + userInfo:@{NSLocalizedDescriptionKey:@"Invalid JSON data. Required JSON keys are missing from the input. Check the error user information.",kJSONModelMissingKeys:[keys allObjects]}]; +} + ++(id)errorInvalidDataWithTypeMismatch:(NSString*)mismatchDescription +{ + return [JSONModelError errorWithDomain:JSONModelErrorDomain + code:kJSONModelErrorInvalidData + userInfo:@{NSLocalizedDescriptionKey:@"Invalid JSON data. The JSON type mismatches the expected type. Check the error user information.",kJSONModelTypeMismatch:mismatchDescription}]; +} + ++(id)errorBadResponse +{ + return [JSONModelError errorWithDomain:JSONModelErrorDomain + code:kJSONModelErrorBadResponse + userInfo:@{NSLocalizedDescriptionKey:@"Bad network response. Probably the JSON URL is unreachable."}]; +} + ++(id)errorBadJSON +{ + return [JSONModelError errorWithDomain:JSONModelErrorDomain + code:kJSONModelErrorBadJSON + userInfo:@{NSLocalizedDescriptionKey:@"Malformed JSON. Check the JSONModel data input."}]; +} + ++(id)errorModelIsInvalid +{ + return [JSONModelError errorWithDomain:JSONModelErrorDomain + code:kJSONModelErrorModelIsInvalid + userInfo:@{NSLocalizedDescriptionKey:@"Model does not validate. The custom validation for the input data failed."}]; +} + ++(id)errorInputIsNil +{ + return [JSONModelError errorWithDomain:JSONModelErrorDomain + code:kJSONModelErrorNilInput + userInfo:@{NSLocalizedDescriptionKey:@"Initializing model with nil input object."}]; +} + +- (instancetype)errorByPrependingKeyPathComponent:(NSString*)component +{ + // Create a mutable copy of the user info so that we can add to it and update it + NSMutableDictionary* userInfo = [self.userInfo mutableCopy]; + + // Create or update the key-path + NSString* existingPath = userInfo[kJSONModelKeyPath]; + NSString* separator = [existingPath hasPrefix:@"["] ? @"" : @"."; + NSString* updatedPath = (existingPath == nil) ? component : [component stringByAppendingFormat:@"%@%@", separator, existingPath]; + userInfo[kJSONModelKeyPath] = updatedPath; + + // Create the new error + return [JSONModelError errorWithDomain:self.domain + code:self.code + userInfo:[NSDictionary dictionaryWithDictionary:userInfo]]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/SettingsViewController.h b/code/iOS/ScriptorSprint3/ScriptorSprint2/SettingsViewController.h new file mode 100644 index 0000000..1c505e4 --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/SettingsViewController.h @@ -0,0 +1,20 @@ +// +// SettingsViewController.h +// ScriptorSprint2 +// +// Created by Adrian Garcia on 2/24/19. +// Copyright © 2019 Adrian Garcia. All rights reserved. +// + +#ifndef SettingsViewController_h +#define SettingsViewController_h + +#import <UIKit/UIKit.h> + +@interface SettingsViewController : UIViewController + +- (void) setChurch; + +@end +#endif /* SettingsViewController_h */ + diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/SettingsViewController.m b/code/iOS/ScriptorSprint3/ScriptorSprint2/SettingsViewController.m new file mode 100644 index 0000000..2b521ca --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/SettingsViewController.m @@ -0,0 +1,115 @@ +// +// SettingsViewController.m +// ScriptorSprint2 +// +// Created by Adrian Garcia on 2/24/19. +// Copyright © 2019 Adrian Garcia. All rights reserved. +// + +#import <Foundation/Foundation.h> +#import "SettingsViewController.h" +#import "ViewController.h" + +@interface SettingsViewController () + +@property (weak, nonatomic) IBOutlet UIButton *backButton; +@property (weak, nonatomic) IBOutlet UIStepper *fontStepper; +@property (weak, nonatomic) IBOutlet UILabel *exampleLabel; +@property (weak, nonatomic) IBOutlet UIButton *selectChurch; +@property (weak, nonatomic) IBOutlet UILabel *churchNameLabel; +@property (weak, nonatomic) IBOutlet UIDatePicker *dateSelector; + +@end + +@implementation SettingsViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + NSInteger val = 17; + NSUserDefaults *settings = [NSUserDefaults standardUserDefaults]; + val = [settings integerForKey:@"fontSize"]; + _exampleLabel.font = [UIFont systemFontOfSize:val]; + _fontStepper.value = val; + NSInteger *savedDay = (NSInteger) [settings integerForKey:@"selectedDay"]; + NSInteger *savedMonth = (NSInteger) [settings integerForKey:@"selectedMonth"]; + NSInteger *savedYear = (NSInteger) [settings integerForKey:@"selectedYear"]; + NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; + dateFormat.timeStyle = NSDateFormatterNoStyle; + dateFormat.dateFormat = @"MM/dd/yyyy"; + NSMutableString *dateString = [NSMutableString stringWithFormat:@""]; + if((long) savedMonth < 10){ + NSString *temp = [NSString stringWithFormat:@"0%ld", (long) savedMonth]; + int stopper = 0; + [dateString appendString:temp]; + } else { + NSString *temp = [NSString stringWithFormat:@"%ld", (long) savedMonth]; + int stopper = 0; + [dateString appendString:temp]; + } + if((long) savedDay < 10){ + NSString *temp = [NSString stringWithFormat:@"/0%ld", (long) savedDay]; + [dateString appendString:temp]; + } else { + NSString *temp = [NSString stringWithFormat:@"/%ld", (long) savedDay]; + [dateString appendString:temp]; + } + [dateString appendString:[NSString stringWithFormat:@"/%ld", (long) savedYear]]; + NSDate *savedDate = [dateFormat dateFromString:dateString]; + _dateSelector.date = savedDate; + // Do any additional setup after loading the view, typically from a nib. + +} + +- (void) viewDidAppear:(BOOL)animated{ + [self setChurch]; +} + +- (IBAction)backButtonPressed:(id)sender { + [self changeDate]; + + [self dismissViewControllerAnimated:YES completion: nil]; + +} + +- (IBAction)selectChurchPressed:(id)sender { + //open church selection screen... +} + +- (IBAction)changeSize:(id)sender { + //changes the font size + NSInteger val = _fontStepper.value; + NSUserDefaults *settings = [NSUserDefaults standardUserDefaults]; + [settings setInteger:val forKey:@"fontSize"]; + _exampleLabel.font = [UIFont systemFontOfSize: val]; + _exampleLabel.sizeToFit; + + +} + +- (void) changeDate { + NSUserDefaults *settings = [NSUserDefaults standardUserDefaults]; + NSDate *inputDate = _dateSelector.date; + NSDateComponents *inputDateComponents = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:inputDate]; + + //NSLog(@"%ld", (long)inputDateComponents.day); + //NSLog(@"%ld", (long)inputDateComponents.month); + //NSLog(@"%ld", (long)inputDateComponents.year); + [settings setInteger:inputDateComponents.day forKey:@"selectedDay"]; + [settings setInteger:inputDateComponents.month forKey:@"selectedMonth"]; + [settings setInteger:inputDateComponents.year forKey:@"selectedYear"]; +} + +- (void) setChurch { + NSUserDefaults *settings = [NSUserDefaults standardUserDefaults]; + NSString *churchName = [settings objectForKey:@"church"]; + _churchNameLabel.text = churchName; +} + +@end + + + + + + + diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/Songs.h b/code/iOS/ScriptorSprint3/ScriptorSprint2/Songs.h new file mode 100644 index 0000000..3525759 --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/Songs.h @@ -0,0 +1,18 @@ +// +// Songs.h +// SongsAdrian +// +// Created by Jower Garcia on 2/23/19. +// Copyright © 2019 Jower Garcia. All rights reserved. +// + +#import <Foundation/Foundation.h> + +NS_ASSUME_NONNULL_BEGIN + +@interface Songs : NSObject +@property (nonatomic, strong) NSString *mainText; + +@end + +NS_ASSUME_NONNULL_END diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/Songs.m b/code/iOS/ScriptorSprint3/ScriptorSprint2/Songs.m new file mode 100644 index 0000000..9fb28b9 --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/Songs.m @@ -0,0 +1,13 @@ +// +// Songs.m +// SongsAdrian +// +// Created by Jower Garcia on 2/23/19. +// Copyright © 2019 Jower Garcia. All rights reserved. +// + +#import "Songs.h" + +@implementation Songs + +@end diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/ViewController.h b/code/iOS/ScriptorSprint3/ScriptorSprint2/ViewController.h new file mode 100644 index 0000000..f02b9db --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/ViewController.h @@ -0,0 +1,20 @@ +// +// ViewController.h +// ScriptorSprint2 +// +// Created by Adrian Garcia on 2/20/19. +// Copyright © 2019 Adrian Garcia. All rights reserved. +// + +#import <UIKit/UIKit.h> + +@interface ViewController : UIViewController + + +@property (strong, nonatomic) IBOutlet UIView *mainView; + + +- (void) setFontSize; + +@end + diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/ViewController.m b/code/iOS/ScriptorSprint3/ScriptorSprint2/ViewController.m new file mode 100644 index 0000000..0cfbce7 --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/ViewController.m @@ -0,0 +1,238 @@ +// +// ViewController.m +// ScriptorSprint2 +// +// Created by Adrian Garcia on 2/20/19. +// Copyright © 2019 Adrian Garcia. All rights reserved. +// + +#import "ViewController.h" +#import <RestKit/RestKit.h> +#import "Songs.h" + +@interface ViewController () +@property (weak, nonatomic) IBOutlet UIButton *mainButton; +@property (weak, nonatomic) IBOutlet UIButton *secondaryButton; +@property (weak, nonatomic) IBOutlet UIButton *settingsButton; +@property (weak, nonatomic) IBOutlet UITextView *displayText; + +- (void) getJSON; + +@end + +@implementation ViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view, typically from a nib. + int stop = 0; + NSUserDefaults *settings = [NSUserDefaults standardUserDefaults]; + NSDate *initDate = [NSDate date]; //crashes here + NSDateComponents *initDateComponents = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:initDate]; + [settings setInteger:initDateComponents.day forKey:@"selectedDay"]; + [settings setInteger:initDateComponents.month forKey:@"selectedMonth"]; + [settings setInteger:initDateComponents.year forKey:@"selectedYear"]; + + //DEBUG DELETE LATER + //[settings setObject:@"Our Lady Of the Sign" forKey:@"church"]; + + + [self setFontSize]; +} + + +- (IBAction)mainButtonPressed:(id)sender { + _mainButton.hidden = true; + _secondaryButton.hidden = false; + _displayText.hidden = false; + [self getJSON]; + [self setFontSize]; + return; +} + +- (IBAction)settingsButtonPressed:(id)sender { + //changes to the settings page + + int freeze = 0; + [self performSegueWithIdentifier:@"toSettings" sender:nil]; + + +} + +- (void) viewDidAppear:(BOOL)animated{ + [self setFontSize]; +} + + +- (IBAction)secondaryButtonPressed:(id)sender { + [self getJSON]; + [self setFontSize]; + return; +} + +- (void) setFontSize { + NSInteger val = 0; + NSUserDefaults *settings = [NSUserDefaults standardUserDefaults]; + val = [settings integerForKey:@"fontSize"]; + _displayText.font = [UIFont systemFontOfSize: val]; +} + + +- (void) getJSON { + NSUserDefaults *settings = [NSUserDefaults standardUserDefaults]; + + NSString *testURL = @"http://34.73.45.124:8080/getData"; + + + NSString *churchName = [settings objectForKey:@"church"]; + NSInteger *day = [settings integerForKey:@"selectedDay"]; + NSInteger *month = [settings integerForKey:@"selectedMonth"]; + NSInteger *year = [settings integerForKey:@"selectedYear"]; + NSMutableString *path = [NSMutableString stringWithFormat:@"/getData"]; + //get churchAddress + NSString *churchAddress = [settings objectForKey:@"churchAddress"]; + + //abort if church or churchAddress is nil + if(churchName == nil || churchAddress == nil){ + _displayText.text = @"Please select a church in the settings menu."; + return; + } + + + //set up the currDate in the correct format + NSMutableString *tempDate = [NSMutableString stringWithFormat:@""]; + NSMutableString *tempTempMonth = [[NSMutableString alloc] initWithString:[NSString stringWithFormat:@"", (long) month]]; + NSMutableString *tempTempDay = [[NSMutableString alloc] initWithString:[NSString stringWithFormat:@"", (long) day]]; + if((long) month < 10){ + [tempTempMonth appendString:[NSString stringWithFormat:@"0%ld", (long) month]]; + } else { + [tempTempMonth appendString:[NSString stringWithFormat:@"%ld", (long) month]]; + } + if((long) day < 10){ + [tempTempDay appendString:[NSString stringWithFormat:@"0%ld", (long) day]]; + } else { + [tempTempDay appendString:[NSString stringWithFormat:@"%ld", (long) day]]; + } + NSString *tempMonth = [NSString stringWithFormat:@"%@", tempTempMonth]; + NSString *tempDay = [NSString stringWithFormat:@"_%@_", tempTempDay]; + NSString *tempYear = [NSString stringWithFormat:@"%ld", (long) year]; + [tempDate appendString:tempMonth]; + [tempDate appendString:tempDay]; + [tempDate appendString:tempYear]; + NSString *currDate = [NSString stringWithFormat:@"%@", tempDate]; + + NSString *encodedChurchAddress = [churchAddress stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]]; + + + NSMutableString *fullTestURL = [[NSMutableString alloc] initWithString:testURL]; + [path appendString:@"?church="]; + [fullTestURL appendString: @"?church="]; + NSString *encodedChurchName = [churchName stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]]; + [path appendString: encodedChurchName]; + [path appendString: @"&currDate="]; + [fullTestURL appendString: encodedChurchName]; + [fullTestURL appendString: @"&currDate="]; + NSString *encodedCurrDate = [currDate stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]]; + [path appendString: encodedCurrDate]; + [path appendString: @"&churchAddress="]; + [fullTestURL appendString: encodedCurrDate]; + [fullTestURL appendString: @"&churchAddress="]; + [path appendString: encodedChurchAddress]; + [fullTestURL appendString: encodedChurchAddress]; + NSString *daURL = [[NSString alloc] initWithString:fullTestURL]; + + NSString *staticPath = [[NSString alloc] initWithString:path]; + + NSURL *connectionURL = [NSURL URLWithString:daURL]; + + NSLog(@"%@", connectionURL); + + NSLog(@"-----------"); + + NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:connectionURL]; + [req setHTTPMethod:@"GET"]; + NSURLSession *session = [NSURLSession sharedSession]; + NSURLSessionDataTask *task = [session dataTaskWithRequest:req + completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { + if (error != nil){ + NSLog(@"%@", error.localizedDescription); + return; + } + int stopper = 0; + NSData *localData = data; + NSMutableString *toPrint = [NSMutableString stringWithFormat:@""]; + NSString *logger = [[NSString alloc] initWithData:localData encoding:NSUTF8StringEncoding]; + NSLog(@"%@", logger); + if([logger isEqualToString:@"N/A"]){ + dispatch_async(dispatch_get_main_queue(), ^{ + self->_displayText.text = logger; + + }); + } else { + //process the response... + + [[RKObjectManager sharedManager] getObjectsAtPath:staticPath parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { + + for(NSInteger i = 0; i < mappingResult.array.count; i++){ + Songs *song = mappingResult.array[i]; + [toPrint appendString: song.mainText]; + [toPrint appendString:@"\n\n"]; + } + dispatch_async(dispatch_get_main_queue(), ^{ + if(toPrint != nil){ + self->_displayText.text = toPrint; + } else { + self->_displayText.text = @"An Error Occured..."; + } + }); + } failure:^(RKObjectRequestOperation *operation, + NSError *error) { + NSLog(@"What do you mean by 'there is no coffee?': %@", error); + + }]; + + + } + }]; + + [task resume]; + return; + + +} + +@end + + + + /* + NSData *localData = data; + NSLog(@"%@", session); + NSString *jsonString = [[NSString alloc] initWithData:localData encoding:NSASCIIStringEncoding]; + + //jsonString contains the string-ed JSON + NSError *err = nil; + + NSMutableString *toPrint = [NSMutableString stringWithFormat: @""]; + + //--------- + [[RKObjectManager sharedManager] getObjectsAtPath:@"/getData" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { + + for(NSInteger i = 0; i < mappingResult.array.count; i++){ + Songs *song = mappingResult.array[i]; + [toPrint appendString: song.mainText]; + } + dispatch_async(dispatch_get_main_queue(), ^{ + if(toPrint != nil){ + self->_displayText.text = toPrint; + } else { + self->_displayText.text = @"An Error Occured..."; + } + }); + } + failure:^(RKObjectRequestOperation *operation, + NSError *error) { + NSLog(@"What do you mean by 'there is no coffee?': %@", error); + }];*/ + //------ + //ends the connection diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2/main.m b/code/iOS/ScriptorSprint3/ScriptorSprint2/main.m new file mode 100644 index 0000000..093d873 --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2/main.m @@ -0,0 +1,16 @@ +// +// main.m +// ScriptorSprint2 +// +// Created by Adrian Garcia on 2/20/19. +// Copyright © 2019 Adrian Garcia. All rights reserved. +// + +#import <UIKit/UIKit.h> +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2Tests/Info.plist b/code/iOS/ScriptorSprint3/ScriptorSprint2Tests/Info.plist new file mode 100644 index 0000000..6c40a6c --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2Tests/Info.plist @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>$(DEVELOPMENT_LANGUAGE)</string> + <key>CFBundleExecutable</key> + <string>$(EXECUTABLE_NAME)</string> + <key>CFBundleIdentifier</key> + <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>$(PRODUCT_NAME)</string> + <key>CFBundlePackageType</key> + <string>BNDL</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleVersion</key> + <string>1</string> +</dict> +</plist> diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2Tests/ScriptorSprint2Tests.m b/code/iOS/ScriptorSprint3/ScriptorSprint2Tests/ScriptorSprint2Tests.m new file mode 100644 index 0000000..1387a1c --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2Tests/ScriptorSprint2Tests.m @@ -0,0 +1,37 @@ +// +// ScriptorSprint2Tests.m +// ScriptorSprint2Tests +// +// Created by Adrian Garcia on 2/20/19. +// Copyright © 2019 Adrian Garcia. All rights reserved. +// + +#import <XCTest/XCTest.h> + +@interface ScriptorSprint2Tests : XCTestCase + +@end + +@implementation ScriptorSprint2Tests + +- (void)setUp { + // Put setup code here. This method is called before the invocation of each test method in the class. +} + +- (void)tearDown { + // Put teardown code here. This method is called after the invocation of each test method in the class. +} + +- (void)testExample { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. +} + +- (void)testPerformanceExample { + // This is an example of a performance test case. + [self measureBlock:^{ + // Put the code you want to measure the time of here. + }]; +} + +@end diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2UITests/Info.plist b/code/iOS/ScriptorSprint3/ScriptorSprint2UITests/Info.plist new file mode 100644 index 0000000..6c40a6c --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2UITests/Info.plist @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>$(DEVELOPMENT_LANGUAGE)</string> + <key>CFBundleExecutable</key> + <string>$(EXECUTABLE_NAME)</string> + <key>CFBundleIdentifier</key> + <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>$(PRODUCT_NAME)</string> + <key>CFBundlePackageType</key> + <string>BNDL</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleVersion</key> + <string>1</string> +</dict> +</plist> diff --git a/code/iOS/ScriptorSprint3/ScriptorSprint2UITests/ScriptorSprint2UITests.m b/code/iOS/ScriptorSprint3/ScriptorSprint2UITests/ScriptorSprint2UITests.m new file mode 100644 index 0000000..3282752 --- /dev/null +++ b/code/iOS/ScriptorSprint3/ScriptorSprint2UITests/ScriptorSprint2UITests.m @@ -0,0 +1,38 @@ +// +// ScriptorSprint2UITests.m +// ScriptorSprint2UITests +// +// Created by Adrian Garcia on 2/20/19. +// Copyright © 2019 Adrian Garcia. All rights reserved. +// + +#import <XCTest/XCTest.h> + +@interface ScriptorSprint2UITests : XCTestCase + +@end + +@implementation ScriptorSprint2UITests + +- (void)setUp { + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + self.continueAfterFailure = NO; + + // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. + [[[XCUIApplication alloc] init] launch]; + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. +} + +- (void)tearDown { + // Put teardown code here. This method is called after the invocation of each test method in the class. +} + +- (void)testExample { + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. +} + +@end diff --git a/code/iOS/tests/Manual Tests Performed Sprint 3 b/code/iOS/tests/Manual Tests Performed Sprint 3 new file mode 100644 index 0000000..7f64981 --- /dev/null +++ b/code/iOS/tests/Manual Tests Performed Sprint 3 @@ -0,0 +1,27 @@ + +Web Service: + +1. +Web Service was passed no parameters +Successfully returned "N/A" rather than crashing. + +2. +Web Service was passed garbage data as a parameters. +Successfully returned "N/A" rather than crashing. + +3. +Web Service was passed useful data as parameters. +Successfully found the appropriate songs and returned the lyrics. + +-------------------------------------------------------------------------------- + +App: +1. Invoking Web Service on first install +- Install App with no local data. +- Attempt to download songs by pressing the "Get Today's Songs" button. +- App should return an error message reequesting that a church be selected in the settings menu. + +2. Invoking Web Service with data for which there is no songs +- Select a church and date in settings for which no songs have been posted. +- Attempt to download songs by pressing the "Get Today's Songs" button. +- N/A should be displayed on the screen, as it was the server's response. diff --git a/code/server code/dummy.txt b/code/server code/dummy.txt new file mode 100644 index 0000000..a0c0571 --- /dev/null +++ b/code/server code/dummy.txt @@ -0,0 +1 @@ +dummy file here for folder creation diff --git a/code/server code/server.js b/code/server code/server.js new file mode 100644 index 0000000..9499d3a --- /dev/null +++ b/code/server code/server.js @@ -0,0 +1,199 @@ +var express = require('express'); +var app = express(); +var mysql = require('mysql'); +var admin = require("firebase-admin"); + +var firebase = require('firebase'); +var fireApp = firebase.initializeApp({ + apiKey: "AIzaSyBqvTFL0FUKUoLE0xQr3X-yhC4HsqLYZE0", + authDomain: "scriptor-a57b1.firebaseapp.com", + databaseURL: "https://scriptor-a57b1.firebaseio.com", + projectId: "scriptor-a57b1", + storageBucket: "scriptor-a57b1.appspot.com", + messagingSenderId: "357246850306" +}); + +var bodyParser = require("body-parser"); + +var fireDB = firebase.database(); + +var churchesRef = fireDB.ref("churches"); +var songsRef = fireDB.ref("songs"); +var scheduleRef = fireDB.ref("schedule"); +var rootRef = fireDB.ref(); + +app.use(bodyParser.urlencoded({ + extended: true +})); + +app.get('/', function (req, res) { + res.sendFile(__dirname + '/testForm.html'); +}); + +app.post('/sendData', function (req, res){ + + //what to write to database... + var info = req.body.content; + + var connection = mysql.createConnection({ + host: "jowerg.td2s.com", + user: "adrian", + password: "password", + database: "HOLDER" + }); + + connection.connect(); + + connection.query("UPDATE holderTable SET mainText = ?", info, function (err, result, fields){ + if (err) throw err; + console.log(result); + }); + connection.end(); + console.log(info); + res.send("Information Sent! You may close this window or go back to send something else."); +}); + +app.get('/getchurches', function (req, res){ + var toReturn = []; + rootRef.once("value").then(function(snapshot){ + var data = snapshot.toJSON(); + var churchList = data.churches; + for(let element in churchList){ + var temp = { + name: data.churches[element].churchName, + address: data.churches[element].address + }; + if(temp.name == undefined || temp.address == undefined){ + continue; + } else { + toReturn.push(temp); + } + } + res.send(toReturn); + }); +}); + +console.log("Listening on port 8080"); + +app.get('/getData', function (req, res){ + // get the date of the request, and the church + + //---------------------------------------- + + + var churchNamePara = req.query.church; + var datePara = req.query.currDate; + var churchAddressPara = req.query.churchAddress; + + if(churchNamePara == undefined || datePara == undefined || churchAddressPara == undefined){ + res.send("N/A"); + } + + //debug section -------- + + //churchNamePara = "Our Lady Of The Sign"; + //datePara = "4_4_2019"; + //churchAddressPara = "7311 Lyons Rd, Coconut Creek, FL 33073"; + + + + //END Debug section----- + + churchNamePara = decodeURIComponent(churchNamePara); + datePara = decodeURIComponent(datePara); + churchAddressPara = decodeURIComponent(churchAddressPara); + + churchNamePara = churchNamePara.toLowerCase(); + datePara = datePara.toLowerCase(); + churchAddressPara = churchAddressPara.toLowerCase(); + + //---------------------------------------- + + //set up variable to return; + var toReturn = []; + + rootRef.once("value").then(function(snapshot){ + // var data = snapshot.val(); + var data = snapshot.toJSON(); + var churchList = data.churches; + console.log("churchNamePara = " + churchNamePara); + console.log("churchAddressPara =" + churchAddressPara); + var holder = null; + for(let element in churchList){ + //if the name of the church is the one passed in AND the address is the one passed in... + if(data.churches[element].churchName == undefined || data.churches[element].address == undefined){ + continue; + } + var currChurchName = data.churches[element].churchName.toLowerCase(); + var currChurchAddress = data.churches[element].address.toLowerCase(); + console.log("currChurchName = " + currChurchName); + console.log("currChurchAddress = " + currChurchAddress); + + if(currChurchName == churchNamePara && currChurchAddress == churchAddressPara){ + // console.log(churchAddressPara); + // console.log(data.churches[element].address); + holder = element; + break; + } else { + continue; + } + } + + //holder now contains the correct churchID + var scheduleList = data.schedule; + var scheduleHolder; + + //debug + console.log(holder); + + + for(let element in scheduleList){ + //if the current ID matches the church's ID + if(element == holder){ + //in the correct church + var allSchedules = data.schedule[element]; + for(let dateElement in allSchedules){ + if (dateElement == datePara){ + //get children + scheduleHolder = allSchedules[dateElement]; + //abort + break; + } else { + + continue; + } + } + + } else { + continue; + } + } + //scheduleHolder contains the appropriate schedule + for(let element in scheduleHolder){ + + var songTitle = scheduleHolder[element]; + var songData = data.songs; + for(let songElement in songData){ + if(songElement == songTitle){ + //get the lyrcs + var temp = { + mainText: songData[songTitle].lyrics + } + toReturn.push(temp); + } + } + } + if (toReturn.length == 0){ + res.send("N/A"); + } else { + res.send(toReturn); + } + + }); + + + +}); + +app.listen(8080); + diff --git a/code/server code/server2.js b/code/server code/server2.js new file mode 100644 index 0000000..ed39ad2 --- /dev/null +++ b/code/server code/server2.js @@ -0,0 +1,199 @@ +var express = require('express'); +var app = express(); +var mysql = require('mysql'); +var admin = require("firebase-admin"); + +var firebase = require('firebase'); +var fireApp = firebase.initializeApp({ + apiKey: "AIzaSyBqvTFL0FUKUoLE0xQr3X-yhC4HsqLYZE0", + authDomain: "scriptor-a57b1.firebaseapp.com", + databaseURL: "https://scriptor-a57b1.firebaseio.com", + projectId: "scriptor-a57b1", + storageBucket: "scriptor-a57b1.appspot.com", + messagingSenderId: "357246850306" +}); + +var bodyParser = require("body-parser"); + +var fireDB = firebase.database(); + +var churchesRef = fireDB.ref("churches"); +var songsRef = fireDB.ref("songs"); +var scheduleRef = fireDB.ref("schedule"); +var rootRef = fireDB.ref(); + +app.use(bodyParser.urlencoded({ + extended: true +})); + +app.get('/', function (req, res) { + res.sendFile(__dirname + '/testForm.html'); +}); + +app.post('/sendData', function (req, res){ + + //what to write to database... + var info = req.body.content; + + var connection = mysql.createConnection({ + host: "jowerg.td2s.com", + user: "adrian", + password: "password", + database: "HOLDER" + }); + + connection.connect(); + + connection.query("UPDATE holderTable SET mainText = ?", info, function (err, result, fields){ + if (err) throw err; + console.log(result); + }); + connection.end(); + console.log(info); + res.send("Information Sent! You may close this window or go back to send something else."); +}); + +app.get('/getchurches', function (req, res){ + var toReturn = []; + rootRef.once("value").then(function(snapshot){ + var data = snapshot.toJSON(); + var churchList = data.churches; + for(let element in churchList){ + var temp = { + name: data.churches[element].churchName, + address: data.churches[element].address + }; + if(temp.name == undefined || temp.address == undefined){ + continue; + } else { + toReturn.push(temp); + } + } + res.send(toReturn); + }); +}); + +console.log("Listening on port 8080"); + +app.get('/getData', function (req, res){ + // get the date of the request, and the church + + //---------------------------------------- + + //DEBUG------ + + //----------- + + var churchNamePara = req.query.church; + var datePara = req.query.currDate; + var churchAddressPara = req.query.churchAddress; + var errFlag = false; + + //DEBUG------ + + //----------- + + + if(churchNamePara == undefined || datePara == undefined || churchAddressPara == undefined){ + errFlag = true; + res.send("N/A"); + + } + + // + + + churchNamePara = decodeURIComponent(churchNamePara); + datePara = decodeURIComponent(datePara); + churchAddressPara = decodeURIComponent(churchAddressPara); + + churchNamePara = churchNamePara.toLowerCase(); + datePara = datePara.toLowerCase(); + churchAddressPara = churchAddressPara.toLowerCase(); + + //---------------------------------------- + + //set up variable to return; + var toReturn = []; + + rootRef.once("value").then(function(snapshot){ + // var data = snapshot.val(); + var data = snapshot.toJSON(); + var churchList = data.churches; + var holder = null; + for(let element in churchList){ + //if the name of the church is the one passed in AND the address is the one passed in... + if(data.churches[element].churchName == undefined || data.churches[element].address == undefined){ + continue; + } + var currChurchName = data.churches[element].churchName.toLowerCase(); + var currChurchAddress = data.churches[element].address.toLowerCase(); + + if(currChurchName == churchNamePara && currChurchAddress == churchAddressPara){ + + holder = element; + break; + } else { + continue; + } + } + + //holder now contains the correct churchID + var scheduleList = data.schedule; + var scheduleHolder; + + //debug + + for(let element in scheduleList){ + //if the current ID matches the church's ID + + + if(element === holder){ + //in the correct church + var allSchedules = data.schedule[element]; + + for(let dateElement in allSchedules){ + if (dateElement === datePara){ + //get children + scheduleHolder = allSchedules[dateElement]; + + //abort + break; + } else { + + continue; + } + } + + } else { + continue; + } + } + //scheduleHolder contains the appropriate schedule + for(let element in scheduleHolder){ + var songTitle = scheduleHolder[element].songName; + var songData = data.songs; + for(let songElement in songData){ + if(songElement == songTitle){ + //get the lyrcs + var temp = { + mainText: songData[songTitle].lyrics + } + toReturn.push(temp); + } + } + } + if (toReturn.length == 0 && !errFlag){ + res.send("N/A"); + } else if(!errFlag) { + res.send(toReturn); + } + + }); + + + +}); + +app.listen(8080); +